107 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\b\date;
 | |
| 
 | |
| use nur\A;
 | |
| use nur\b\coll\BaseArray;
 | |
| use nur\b\IllegalAccessException;
 | |
| 
 | |
| /**
 | |
|  * Class Trange: une plage horaire identifiée par une heure de début et une
 | |
|  * heure de fin (non incluse)
 | |
|  */
 | |
| class Trange extends BaseArray {
 | |
|   /**
 | |
|    * @return int|null le nombre d'unités par défaut d'une période, si la borne
 | |
|    * $end n'est pas spécifiée. l'unité utilisée est celle de la borne $start
 | |
|    */
 | |
|   protected function TRANGE_SIZE(): ?int {
 | |
|     return static::TRANGE_SIZE;
 | |
|   } const TRANGE_SIZE = null;
 | |
| 
 | |
|   function __construct(Time $start, ?Time $end=null, ?array $data=null) {
 | |
|     if ($end === null) {
 | |
|       $size = $this->TRANGE_SIZE();
 | |
|       if ($size !== null) $end = $start->addu($size);
 | |
|     }
 | |
|     if ($end === null) $end = Time::undef();
 | |
|     if (!$end->after($start)) [$start, $end] = [$end, $start];
 | |
|     $period = [$start, $end];
 | |
|     A::update_n($period, $data);
 | |
|     parent::__construct($period);
 | |
|   }
 | |
| 
 | |
|   function start(): Time {
 | |
|     return $this->data[0];
 | |
|   }
 | |
| 
 | |
|   function end(): Time {
 | |
|     return $this->data[1];
 | |
|   }
 | |
| 
 | |
|   function __toString(): string {
 | |
|     return strval($this->data[0])." - ".strval($this->data[1]);
 | |
|   }
 | |
| 
 | |
|   function diff(): Time {
 | |
|     $delay = new Delay($this->start());
 | |
|     return $delay->until($this->end());
 | |
|   }
 | |
| 
 | |
|   /** vérifier si cette plage est strictement située avant l'heure spécifiée */
 | |
|   function before(Time $time): bool {
 | |
|     if ($time->isNull() || $time->isUndef()) return false;
 | |
|     $end = $this->end();
 | |
|     if (!$end->isUndef()) return $end->before($time);
 | |
|     $start = $this->start();
 | |
|     return !$start->isUndef() && $start->before($time);
 | |
|   }
 | |
| 
 | |
|   /** vérifier si cette plage contient l'heure spécifiée */
 | |
|   function contains(Time $time): bool {
 | |
|     if ($time->isNull() || $time->isUndef()) return false;
 | |
|     $start = $this->start();
 | |
|     if (!$start->isUndef() && !$start->before($time)) return false;
 | |
|     $end = $this->end();
 | |
|     if (!$end->isUndef() && $end->before($time)) return false;
 | |
|     return true;
 | |
|   }
 | |
| 
 | |
|   /** vérifier si cette plage est strictement située après l'heure spécifiée */
 | |
|   function after(Time $time): bool {
 | |
|     if ($time->isNull() || $time->isUndef()) return false;
 | |
|     $start = $this->start();
 | |
|     if (!$start->isUndef()) return !$start->before($time);
 | |
|     $end = $this->end();
 | |
|     return !$end->isUndef() && !$end->before($time);
 | |
|   }
 | |
| 
 | |
|   #############################################################################
 | |
|   const KEY_MAP = [
 | |
|     "start" => 0,
 | |
|     "end" => 1,
 | |
|   ];
 | |
| 
 | |
|   function _has($key): bool {
 | |
|     $key = A::get(self::KEY_MAP, $key, $key);
 | |
|     return parent::_has($key);
 | |
|   }
 | |
| 
 | |
|   function &_get($key, $default=null) {
 | |
|     $key = A::get(self::KEY_MAP, $key, $key);
 | |
|     return parent::_get($key, $default);
 | |
|   }
 | |
| 
 | |
|   function _set($key, $value) {
 | |
|     throw IllegalAccessException::immutable_object();
 | |
|   }
 | |
|   function _del($key) {
 | |
|     throw IllegalAccessException::immutable_object();
 | |
|   }
 | |
| 
 | |
|   function has($key): bool { return $this->_has($key); }
 | |
|   function get($key, ?Time $default=null): ?Time { return $this->_get($key, $default); }
 | |
|   function set($key, ?Time $value): self { return $this->_set($key, $value); }
 | |
|   function add(?Time $value): self { return $this->_set(null, $value); }
 | |
|   function del($key): self { return $this->_del($key); }
 | |
| }
 |