12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- <?php
- namespace App\Yr\Forecast\Tabular;
- use App\Yr\Forecast\Tabular\Time\DiffInterface;
- use App\Yr\Forecast\Tabular\Variation\Variation;
- /**
- * Removes superfluous forecast data in an Time-object
- * only storing changes.
- *
- * @author Joachim M. Giæver (joachim[]giaever.org)
- */
- class Variations implements \IteratorAggregate {
- private $time;
- private $data = [];
- /**
- * @param array $t Array of Time-objects
- */
- public function __construct(array $t) {
- $time = array_shift($t);
- if (!$time instanceof Time)
- return;
- $this->time = $time;
- $var = new Variation($time);
- foreach($time as $entity)
- $var->addEntity($entity, null);
- $this->data[] = $var;
- foreach ($t as $time) {
- $var = new Variation($time);
- foreach($time as $entity)
- $this->match($var, $entity);
- if (!$var->isEmpty())
- $this->data[] = $var;
- }
- array_shift($this->data);
- }
- private function match(Variation $var, DiffInterface $entity): void {
- foreach(array_reverse($this->data) as $data) {
- foreach ($data as $dentity) {
- if ($entity instanceof $dentity) {
- if ($entity->diff($dentity))
- $var->addEntity($entity, $data == null ? "NULL" : $data);
- return;
- }
- }
- }
- }
- public function getTime(): Time {
- return $this->time;
- }
- /**
- * Filter on types, example usage
- * ```
- * $variations->filter(function ($entity) {
- * return $entity instanceof Temperature;
- * );
- * ```
- *
- * @return \Generator
- */
- public function filter(callable $filterFn): \Generator {
- foreach ($this as $data)
- if (($match = $data->filter($filterFn)) != null)
- yield $match;
- return null;
- }
- /**
- * {@inheritDoc}
- */
- public function getIterator(): \Generator {
- foreach ($this->data as $data)
- yield $data;
- }
- }
|