source = $source; } elseif (is_null($source)) { $this->source = static::empty(); } else { $this->source = $this->getArrayableItems($source); } } public function getIterator(): Traversable { return $this->makeIterator($this->source); } protected function makeIterator($source) { if ($source instanceof Closure) { $source = $source(); } if (is_array($source)) { return new ArrayIterator($source); } return $source; } public static function make($source = null) { return new static($source instanceof Closure ? $source() : $source); } public function each(callable $callback) { foreach ($this->getIterator() as $key => $value) { if ($callback($value, $key) === false) { break; } } return $this; } protected function getArrayableItems($items) { if (is_array($items)) { return $items; } elseif ($items instanceof Traversable) { return iterator_to_array($items); } elseif (is_object($items) && method_exists($items, 'toArray')) { return $items->toArray(); } return (array) $items; } }