Passed
Branch feature/68 (9171bd)
by Max
03:10
created

ArrayAddingIterator   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 73
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 2
Metric Value
wmc 8
eloc 9
c 2
b 0
f 2
dl 0
loc 73
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 1
A current() 0 3 1
A from() 0 10 2
A next() 0 3 1
A key() 0 3 1
A rewind() 0 3 1
A valid() 0 3 1
1
<?php
2
3
namespace MaxGoryunov\SavingIterator\Src;
4
5
use Iterator;
6
7
/**
8
 * Adding iterator which stores values in an array.
9
 * @template TKey
10
 * @template TValue
11
 * @implements AddingIterator<TKey, TValue>
12
 */
13
final class ArrayAddingIterator implements AddingIterator
14
{
15
16
    /**
17
     * Ctor.
18
     * 
19
     * @phpstan-param array<TKey, TValue> $added
20
     * @param mixed[] $added added values.
21
     */
22
    public function __construct(
23
        /**
24
         * Added values.
25
         *
26
         * @var mixed[]
27
         */
28
        private array $added = []
29
    ) {
30
    }
31
32
    /**
33
     * {@inheritDoc}
34
     */
35
    public function from(Iterator $source): AddingIterator
36
    {
37
        /**
38
         * @todo #66:20min Add a decorator for AddingIterator which does not
39
         *  allow to add values if source is not valid.
40
         */
41
        if ($source->valid()) {
42
            $this->added[$source->key()] ??= $source->current();
43
        }
44
        return new self($this->added);
45
    }
46
47
    /**
48
     * {@inheritDoc}
49
     */
50
    public function current(): mixed
51
    {
52
        return current($this->added);
53
    }
54
55
    /**
56
     * {@inheritDoc}
57
     * @phpstan-return int|string|null
58
     */
59
    public function key(): mixed
60
    {
61
        return key($this->added);
62
    }
63
64
    /**
65
     * {@inheritDoc}
66
     */
67
    public function next(): void
68
    {
69
        next($this->added);
70
    }
71
72
    /**
73
     * {@inheritDoc}
74
     */
75
    public function valid(): bool
76
    {
77
        return $this->key() !== null;
78
    }
79
80
    /**
81
     * {@inheritDoc}
82
     */
83
    public function rewind(): void
84
    {
85
        reset($this->added);
86
    }
87
}
88