Exemplo n.º 1
0
 /**
  * @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);
     }
 }
Exemplo n.º 2
0
 /**
  * @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");
             }
         }
     }
 }
Exemplo n.º 3
0
 /**
  * @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;
 }
Exemplo n.º 4
0
 /**
  * @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;
 }
Exemplo n.º 5
0
 /**
  * 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');
 }