for testing and deploying your application
for finding and fixing issues
for empowering human code reviews
<?php
namespace MaxGoryunov\SavingIterator\Src;
use Iterator;
/**
* Adding iterator which stores values in an array.
* @template TKey
* @template TValue
* @implements AddingIterator<TKey, TValue>
*/
final class ArrayAddingIterator implements AddingIterator
{
* Ctor.
*
* @phpstan-param array<TKey, TValue> $added
* @param mixed[] $added added values.
public function __construct(
* Added values.
* @var mixed[]
private array $added = []
) {
}
* {@inheritDoc}
public function from(Iterator $source): AddingIterator
* @todo #66:20min Add a decorator for AddingIterator which does not
* allow to add values if source is not valid.
if ($source->valid()) {
$this->added[$source->key()] ??= $source->current();
return new self($this->added);
public function current(): mixed
return current($this->added);
* @phpstan-return int|string|null
public function key(): mixed
return key($this->added);
public function next(): void
next($this->added);
public function valid(): bool
return $this->key() !== null;
public function rewind(): void
reset($this->added);