Passed
Branch feature/67 (10cd22)
by Max
02:22
created

ArrayAddingIterator::key()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 1
c 1
b 0
f 1
nc 1
nop 0
dl 0
loc 3
rs 10
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