* @template TItem */ class Collection implements Countable, IteratorAggregate { /** * @param TItem[] $items */ final public function __construct(protected array $items = []) { } public function count(): int { return count($this->items); } /** * @return self */ public function filter(callable $callback): self { return new static( array_filter( array: $this->items, callback: $callback, ) ); } public function getIterator(): Iterator { return new ArrayIterator($this->items); } /** * @return TItem[] */ public function toArray(): array { return $this->items; } }