<?php
namespace nur\b\coll;

/**
 * Trait TGenericArray: méthodes supplémentaires à utiliser avec les traits
 * {@link TBaseArray} et {@link TIterableArray} pour que l'objet soit utilisable
 *
 */
trait TGenericArray {
  # ArrayAccess
  function has($key): bool { return $this->_has($key); }
  function &get($key, $default=null) { return $this->_get($key, $default); }
  function set($key, $value): IArray { return $this->_set($key, $value); }
  function add($value): IArray { return $this->_set(null, $value); }
  function del($key): IArray { return $this->_del($key); }
  # Iterator
  function key() { return $this->_key(); }
  function current() { return $this->_current(); }

  function addAll(?array $values): IArray {
    if ($values !== null) {
      $index = 0;
      foreach ($values as $key => $value) {
        if ($key === $index) {
          $this->add($value);
          $index++;
        } else {
          $this->set($key, $value);
        }
      }
    }
    return $this;
  }

  function resetAll(?array $values): IArray {
    $this->data = [];
    return $this->addAll($values);
  }
}