*/ final class LoaderQueryPaginator implements PaginatorInterface { /** * @param LoaderInterface $loader * @param Query $query * @param int<0, max> $results */ public function __construct( private readonly LoaderInterface $loader, private readonly Query $query, private readonly int $results ) { } public function getNbResults(): int { return $this->results; } /** * @return iterable */ public function getSlice(int $offset, int $length): iterable { /** @var Query $query */ $query = $this->query ->setFirstResult($offset) ->setMaxResults($length); return $this->getResults($query); } /** * @param Query $query * @return iterable */ private function getResults(Query $query): iterable { /** @var array $results */ $results = $query->execute(); $this->loader->loadResults($results); return $results; } /** * @return iterable */ public function getAll(): iterable { return $this->getResults($this->query); } }