/** * @param \Traversable $iterator * * @return IGenerator */ public static function adapter(\Traversable $iterator) { if ($iterator instanceof IGenerator) { return $iterator; } elseif ($iterator instanceof IIterator) { return new IIteratorAdapter($iterator); } elseif ($iterator instanceof \ArrayIterator) { return new ArrayIteratorAdapter($iterator); } elseif ($iterator instanceof \IteratorAggregate) { return static::adapter($iterator->getIterator()); } else { return new IteratorAdapter($iterator); } }
/** * @param array|\Traversable $xs * @return \Iterator * @throws \InvalidArgumentException */ public static function iterator($xs) { if ($xs instanceof \Iterator) { return $xs; } else { if ($xs instanceof \IteratorAggregate) { return $xs->getIterator(); } else { if (is_array($xs)) { return new \ArrayIterator($xs); } else { $t = gettype($xs); throw new \InvalidArgumentException("'{$t}' object is not iterable"); } } } }
/** * @param \Traversable $x * @param int $chunkSize */ public function __construct($x, $chunkSize) { if ($x instanceof \Iterator) { $this->it = $x; } else { if ($x instanceof \IteratorAggregate) { $this->it = $x->getIterator(); } else { if (is_array($x)) { $this->it = new \ArrayIterator($x); } else { $t = gettype($x); throw new \InvalidArgumentException(sprintf('%s object is not iterable', $t)); } } } if ($chunkSize < 1) { throw new \InvalidArgumentException('chunkSize must be greater than 0'); } $this->chunkSize = $chunkSize; }
/** * @param \Traversable $traversable * @return array|\Traversable */ public static function copyTransversable($traversable) { // Allow for generators to be used once. Better than always throwing an error. // Best to assume the user knows how to use Generators correctly, // and might even be sending an empty iterator if ($traversable instanceof \Generator) { // We should NOT check the generator before it enters a foreach // As with any PHP built in, observing it changes the outcome. // Touching any method on an empty generator will cause a foreach to // Throw rather than silently not iterating. return $traversable; } return $traversable instanceof \IteratorAggregate ? $traversable->getIterator() : clone $traversable; }
/** * Just utils to convert any iterable to iterator object, used when slicing. * * @param \Traversable|array $iterable */ private function toIterator($iterable) { if ($iterable instanceof Iterator) { return $iterable; } if ($iterable instanceof IteratorAggregate) { return $iterable->getIterator(); } if (is_array($iterable)) { return new \ArrayIterator($iterable); } throw new \InvalidArgumentException('Argument must be iterable'); }