6 declare(strict_types=1);
18 private $dimensionsIterators = [];
23 private $dimensionsDataProviders = [];
28 private $dimensionsProvidersCount = 0;
35 foreach ($dimensionProviders as $dimensionDataProvider) {
36 $this->addDimensionDataProvider($dimensionDataProvider);
49 if ($this->dimensionsProvidersCount === 0) {
58 if (!$this->hasCurrentDimension()) {
59 throw new \LogicException(
'Can`t multiple dimensions because some of them are empty.');
63 while ($this->hasCurrentDimension()) {
64 yield $this->getCurrentDimension();
65 $this->setNextDimension();
74 private function getCurrentDimension(): array
78 foreach ($this->dimensionsIterators as $dimensionIterator) {
80 $dimension = $dimensionIterator->current();
81 $dimensions[$dimension->getName()] = $dimension;
93 private function setNextDimension()
95 $this->dimensionsIterators[$this->dimensionsProvidersCount - 1]->next();
97 for (
$i = ($this->dimensionsProvidersCount - 1);
$i > 0;
$i--) {
98 if (!$this->dimensionsIterators[
$i]->valid()) {
99 $this->dimensionsIterators[
$i] = $this->dimensionsDataProviders[
$i]->getIterator();
100 $this->dimensionsIterators[
$i-1]->next();
110 private function rewind()
112 $this->dimensionsIterators = [];
114 foreach ($this->dimensionsDataProviders as $dimensionDataProvider) {
115 $this->dimensionsIterators[] = $dimensionDataProvider->getIterator();
129 private function hasCurrentDimension(): bool
133 foreach ($this->dimensionsIterators as $dimensionsIterator) {
135 if (!$dimensionsIterator->valid()) {
151 private function addDimensionDataProvider(DimensionProviderInterface $dimensionDataProvider)
153 $this->dimensionsDataProviders[] = $dimensionDataProvider;
154 $this->dimensionsProvidersCount++;
__construct(array $dimensionProviders=[])