for testing and deploying your application
for finding and fixing issues
for empowering human code reviews
<?php
declare(strict_types=1);
namespace loophp\collection\Operation;
use Closure;
use Generator;
use loophp\collection\Contract\Operation;
use loophp\collection\Iterator\IterableIterator;
use function count;
/**
* Class Product.
*/
final class Product implements Operation
{
* @var iterable[]
private $iterables;
* Product constructor.
*
* @param iterable ...$iterables
public function __construct(iterable ...$iterables)
$this->iterables = $iterables;
}
* {@inheritdoc}
public function on(iterable $collection): Closure
$iterables = $this->iterables;
$cartesian = function (iterable $input) {
return $this->cartesian($input);
};
return static function () use ($iterables, $collection, $cartesian): Generator {
$its = [$collection];
foreach ($iterables as $iterable) {
$its[] = new IterableIterator($iterable);
yield from $cartesian($its);
* @param $iterable
* @return Generator|void
private function cartesian(iterable $iterable)
$u = array_pop($iterable);
$iterable
iterable
array
$array
array_pop()
If this is a false-positive, you can also ignore this issue in your code via the ignore-type annotation
ignore-type
$u = array_pop(/** @scrutinizer ignore-type */ $iterable);
if (null === $u) {
yield [];
return;
foreach ($this->cartesian($iterable) as $p) {
foreach ($u as $v) {
yield $p + [count($p) => $v];