Skip to content

Commit

Permalink
Merge pull request #696
Browse files Browse the repository at this point in the history
  • Loading branch information
alcaeus committed Nov 15, 2019
2 parents 32cfb9b + 964954e commit 98fcbea
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 27 deletions.
28 changes: 9 additions & 19 deletions src/Model/CachingIterator.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@
namespace MongoDB\Model;

use Countable;
use Generator;
use Iterator;
use IteratorIterator;
use Traversable;
use function count;
use function current;
Expand All @@ -41,7 +41,7 @@ class CachingIterator implements Countable, Iterator
/** @var array */
private $items = [];

/** @var Generator */
/** @var IteratorIterator */
private $iterator;

/** @var boolean */
Expand All @@ -61,7 +61,9 @@ class CachingIterator implements Countable, Iterator
*/
public function __construct(Traversable $traversable)
{
$this->iterator = $this->wrapTraversable($traversable);
$this->iterator = new IteratorIterator($traversable);

$this->iterator->rewind();
$this->storeCurrentItem();
}

Expand Down Expand Up @@ -101,8 +103,12 @@ public function key()
public function next()
{
if (! $this->iteratorExhausted) {
$this->iteratorAdvanced = true;
$this->iterator->next();

$this->storeCurrentItem();

$this->iteratorExhausted = ! $this->iterator->valid();
}

next($this->items);
Expand Down Expand Up @@ -156,20 +162,4 @@ private function storeCurrentItem()

$this->items[$key] = $this->iterator->current();
}

/**
* Wraps the Traversable with a Generator.
*
* @param Traversable $traversable
* @return Generator
*/
private function wrapTraversable(Traversable $traversable)
{
foreach ($traversable as $key => $value) {
yield $key => $value;
$this->iteratorAdvanced = true;
}

$this->iteratorExhausted = true;
}
}
9 changes: 1 addition & 8 deletions tests/Model/CachingIteratorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public function testIterationWithEmptySet()

public function testPartialIterationDoesNotExhaust()
{
$traversable = $this->getTraversableThatThrows([1, 2, new Exception()]);
$traversable = $this->getTraversable([1, 2, new Exception()]);
$iterator = new CachingIterator($traversable);

$expectedKey = 0;
Expand Down Expand Up @@ -110,13 +110,6 @@ public function testCountWithEmptySet()
}

private function getTraversable($items)
{
foreach ($items as $item) {
yield $item;
}
}

private function getTraversableThatThrows($items)
{
foreach ($items as $item) {
if ($item instanceof Exception) {
Expand Down

0 comments on commit 98fcbea

Please sign in to comment.