Passed
Push — master ( a2fa16...8a4497 )
by Pol
11:27
created

Product::toArray()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 10
Ratio 100 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
dl 10
loc 10
ccs 5
cts 5
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 5
nc 2
nop 0
crap 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace drupol\phpermutations\Iterators;
6
7
use ArrayIterator;
8
use drupol\phpermutations\Iterators;
9
use Iterator;
10
11
use function count;
12
13
/**
14
 * Class Product.
15
 */
16
class Product extends Iterators
17
{
18
    /**
19
     * The iterators.
20
     *
21
     * @var Iterator[]
22
     */
23
    protected $iterators = [];
24
25
    /**
26
     * Product constructor.
27
     *
28
     * @param array<int, mixed> $datasetArray
29
     *                            The array of dataset
30
     */
31
    public function __construct(array $datasetArray)
32
    {
33 4
        parent::__construct($datasetArray);
34
35 4
        foreach ($datasetArray as $dataset) {
36
            $this->iterators[] = new ArrayIterator($dataset);
37 4
        }
38 4
39
        $this->key = 0;
40
    }
41 4
42 4
    /**
43
     * {@inheritdoc}
44
     */
45
    public function count()
46
    {
47 4
        $product = 1;
48
49 4
        foreach ($this->getDataset() as $dataset) {
50
            $product *= count($dataset);
51 4
        }
52 4
53
        return $product;
54
    }
55 4
56
    /**
57
     * {@inheritdoc}
58
     */
59
    public function current()
60
    {
61 4
        $tuple = [];
62
63 4
        foreach ($this->iterators as $iterator) {
64 4
            $tuple[] = $iterator->current();
65 4
        }
66 4
67 4
        return $tuple;
68 4
    }
69 4
70
    /**
71
     * {@inheritdoc}
72
     */
73 4
    public function next()
74
    {
75
        foreach (array_reverse($this->iterators) as $key => $iterator) {
76
            $iterator->next();
77 4
78 4
            if ($iterator->valid()) {
79
                $count_iterators = count($this->iterators);
80
81
                foreach ($this->iterators as $key2 => $iterator2) {
82
                    if ($count_iterators - $key2 <= $key) {
83 4
                        $iterator2->rewind();
84
                    }
85 4
                }
86
87 4
                break;
88 4
            }
89 4
        }
90
91
        ++$this->key;
92
    }
93 4
94
    /**
95
     * {@inheritdoc}
96
     */
97
    public function rewind()
98
    {
99 4
        foreach ($this->iterators as $iterator) {
100
            $iterator->rewind();
101 4
        }
102 4
103
        $this->key = 0;
104
    }
105 4
106 4
    /**
107
     * {@inheritdoc}
108
     */
109
    public function valid()
110
    {
111 4
        $isUnlessOneValid = false;
112
113 4
        foreach ($this->iterators as $iterator) {
114
            if ($iterator->valid()) {
115 4
                $isUnlessOneValid = true;
116 4
            }
117
        }
118
119 4
        return $isUnlessOneValid;
120
    }
121
}
122