*/ readonly final class Events implements \IteratorAggregate { public function filter(\Closure $callback): self { return new self(array_filter( array: $this->events, callback: $callback, )); } public function first(): Event { return array_values($this->events)[0]; } public function getIterator(): \Traversable { return new \ArrayIterator($this->events); } /** * @param Event[] $events */ public static function fromEvents(array $events): self { return new self($events); } /** * @param Event[] $events */ private function __construct(private array $events) { Assert::allIsInstanceOf($events, Event::class); } }