*/ class ResourceChain implements CollectionInterface, ResourceReaderInterface { public function __construct( /** * @var IdentifierInterface[] */ private readonly array $items, ) { } public function getMetadata(int $count, ?string $lastIdentifier = null): iterable { $found = null === $lastIdentifier; foreach ($this->items as $item) { if (!$item instanceof MetadataInterface) { continue; } if (false === $found) { $found = $item->getUri() === $lastIdentifier; continue; } yield $item; if (--$count <= 0) { break; } } if (!$found) { throw new InvalidCursorException($lastIdentifier); } } public function read(ResourceRead $input): ResourceReadResult { foreach ($this->items as $item) { if ($item instanceof ResourceReaderInterface && $input->uri === $item->getUri()) { try { return $item->read($input); } catch (\Throwable $e) { throw new ResourceReadException($input, $e); } } } throw new ResourceNotFoundException($input); } }