pageIterator = $pageIterator; } /** * Fetch the token used to get the next set of results. * * @return string|null */ public function nextResultToken() { return method_exists($this->pageIterator, 'nextResultToken') ? $this->pageIterator->nextResultToken() : null; } /** * Iterate over the results on a per page basis. * * @return \Iterator */ public function iterateByPage() { return $this->pageIterator; } /** * Rewind the iterator. * * @return null */ #[\ReturnTypeWillChange] public function rewind() { $this->pageIndex = 0; $this->position = 0; $this->pageIterator->rewind(); } /** * Get the current item. * * @return mixed */ #[\ReturnTypeWillChange] public function current() { $page = $this->pageIterator->current(); return isset($page[$this->pageIndex]) ? $page[$this->pageIndex] : null; } /** * Get the key current item's key. * * @return int */ #[\ReturnTypeWillChange] public function key() { return $this->position; } /** * Advances to the next item. * * @return null */ #[\ReturnTypeWillChange] public function next() { $this->pageIndex++; $this->position++; if (count($this->pageIterator->current()) <= $this->pageIndex && $this->nextResultToken()) { $this->pageIterator->next(); $this->pageIndex = 0; } } /** * Determines if the current position is valid. * * @return bool */ #[\ReturnTypeWillChange] public function valid() { $page = $this->pageIterator->current(); if (isset($page[$this->pageIndex])) { return true; } // If there are no results, but a token for the next page // exists let's continue paging until there are results. while ($this->nextResultToken()) { $this->pageIterator->next(); $page = $this->pageIterator->current(); if (isset($page[$this->pageIndex])) { return true; } } return false; } }