<?php
namespace nulib\cache;

use nulib\cl;
use nulib\php\func;
use Traversable;

class CacheData {
  /** @var string identifiant de cette donnée */
  const NAME = null;

  /** @var callable une fonction permettant de calculer la donnée */
  const COMPUTE = null;

  function __construct($compute=null, ?string $name=null) {
    $this->name = $name ?? static::NAME ?? "";
    $this->compute = func::withn($compute ?? static::COMPUTE);
  }

  protected string $name;

  protected ?func $compute;

  protected function compute() {
    $compute = $this->compute;
    return $compute !== null? $compute->invoke(): null;
  }

  function getName() : string {
    return $this->name;
  }

  /** obtenir la donnée, en l'itérant au préalable si elle est traversable */
  function get($compute=null) {
    $this->compute ??= func::withn($compute);
    $data = $this->compute();
    if ($data instanceof Traversable) {
      $data = cl::all($data);
    }
    return $data;
  }

  /** obtenir un itérateur sur la donnée ou null s'il n'y a pas de données */
  function all($compute=null): ?iterable {
    $this->compute ??= func::withn($compute);
    $data = $this->compute();
    if ($data !== null && !is_iterable($data)) $data = [$data];
    return $data;
  }
}
