<?php
// Everything you enter here will be executed by our servers. Try it!
function iterator_pipeline(\Traversable $source, $steps)
{
$gen = $source;
foreach ($steps as $step) {
if (is_array($step) and !is_callable($step)) {
$g = array_shift($step);
array_unshift($step, $gen);
if (class_exists($g)) {
$class = new \ReflectionClass($className);
$gen = $class->newInstanceArgs($step);
} else if (is_callable($g)) {
$gen = call_user_func_array($g, $step);
}
} else if (is_callable($step)) {
$gen = $step($gen);
}
}
return $gen;
}
function iterator_chunk(\Traversable $it, $chunkSize)
{
$chunk = [];
$steps = range(1, $chunkSize);
while (true) {
foreach ($steps as $_) {
if (!$it->valid()) {
break 2;
}
$chunk[] = $it->current();
$it->next();
}
yield $chunk;
$chunk = [];
}
if ($chunk) {
yield $chunk;
}
}
function iterator_consume(\Traversable $it)
{
foreach ($it as $key => $value) {}
}
function iterator_pass(\Traversable $it)
{
foreach ($it as $key => $value) {
yield $key => $value;
}
}
function iterator_tee(\Traversable $source, array $drains)
{
foreach ($source as $key => $value) {
foreach ($drains as $gen) {
$gen->send($value);
}
yield $key => $value;
}
}
$receiver = function () {
for (;;) {
echo "TEE:\n";
print_r((yield));
}
};
$receiver2 = function () {
for (;;) {
echo "Received!\n";
(yield);
}
};
$steps = [
function ($it) {
foreach ($it as $val) {
yield $val * 2;
}
},
"iterator_pass",
["iterator_chunk", 32],
["iterator_tee", [$receiver(), $receiver2()]]
];
$it = iterator_pipeline(new \ArrayIterator(range(0, 127)), $steps);
iterator_consume($it);
preferences:
63.7 ms | 402 KiB | 5 Q