<?php
namespace nur;

use nur\b\values\IValueState;

/**
 * Class base: méthodes générales de base
 */
class base {
  static final function z($value): bool { return SV::z($value); }
  static final function nz($value): bool { return SV::nz($value); }
  static final function n($value): bool { return SV::n($value); }
  static final function nn($value): bool { return SV::nn($value); }
  static final function t($value): bool { return SV::t($value); }
  static final function f($value): bool { return SV::f($value); }
  static final function vf($value) { return SV::vf($value); }
  static final function vn($value) { return SV::vn($value); }
  static final function firstv(...$values) { return SV::firstv(...$values); }
  static final function t2($value): bool { return SV::pt($value); }
  static final function f2($value): bool { return SV::pf($value); }

  /** retourner $value si elle est vraie selon les règles de PHP, false sinon */
  static final function vf2($value) {
    return $value?: false;
  }

  /** retourner $value si elle est vraie selon les règles de PHP, null sinon */
  static final function vn2($value) {
    return $value?: null;
  }

  static final function firstv2(...$values) { return SV::firstpv(...$values); }
  static final function compare($a, $b): int { return SV::compare($a, $b); }
  static final function set_nn(&$dest, $value) { return SV::set_nn($dest, $value); }
  static final function set_nz(&$dest, $value) { return SV::set_nz($dest, $value); }
  static final function update_n(&$dest, $value) { return SV::update_n($dest, $value); }
  static final function update_z(&$dest, $value) { return SV::update_z($dest, $value); }

  /**
   * vérifier si $value est assimilée indéfinie, c'est à dire si elle vaut false
   * ou si c'est une instance de {@link IValueState} dont la méthode isUndef()
   * retourne true
   */
  static final function is_undef($value): bool {
    if ($value instanceof IValueState) return $value->isUndef();
    else return $value === false;
  }

  /**
   * vérifier si $value est assimilée nulle, c'est à dire si elle vaut null
   * ou si c'est une instance de {@link IValueState} dont la méthode isNull()
   * retourne true
   */
  static final function is_null($value): bool {
    if ($value instanceof IValueState) return $value->isNull();
    else return $value === null;
  }

  /**
   * vérifier si $value est assimilée valuée, c'est à dire si elle ne vaut ni
   * false ni null, ou si c'est une instance de {@link IValueState} dont aucune
   * des méthodes isUndef() et isNull() ne retournent true
   */
  static final function is_value($value): bool {
    if ($value instanceof IValueState) {
      return !$value->isUndef() && !$value->isNull();
    } else {
      return $value !== false && $value !== null;
    }
  }
  
  static final function check_bool($value): ?bool { return SV::check_bool($value); }
  static final function check_int($value): ?int { return SV::check_int($value); }
  static final function check_string($value): ?string { return SV::check_string($value); }
  static final function check_array($value): ?array { return SV::check_array($value); }
  static final function check_key($value, ?string $prefix=null, bool $throw_exception=true): array { return SV::check_key($value, $prefix, $throw_exception); }
  static final function check_bsa($value, ?string $prefix=null, bool $throw_exception=true): array { return SV::check_bsa($value, $prefix, $throw_exception); }
}
