<?php
function chain($iterable, array $functions)
{
foreach ($functions as $function) {
$iterable = $function(as_iterator($iterable));
}
}
function as_iterator($iterable)
{
if ($iterable instanceof \Iterator) {
return $iterable;
}
if (is_array($iterable)) {
return new \ArrayIterator($iterable);
}
if (is_string($iterable)) {
return new \ArrayIterator(str_split($iterable));
}
throw new \Exception();
}
function do_map(callable $function)
{
return function(Iterator $iterator) use ($function) {
foreach ($iterator as $key => $value) {
yield $key => $value;
}
};
}
function do_filter(callable $function)
{
return function(Iterator $iterator) use($function) {
foreach ($iterator as $key => $value) {
if ($function($value, $key)) {
yield $key => $value;
}
}
};
}
function do_concat($iterable)
{
return function(Iterator $iterator) use ($iterable) {
foreach ($iterator as $value) {
yield $value;
}
foreach (as_iterator($iterable) as $value) {
yield $value;
}
};
}
function do_as_array()
{
return function(Iterator $iterator) {
return iterator_to_array($iterator);
};
}
$array = chain([1, 2, 3, 4], [
do_concat([5, 6, 7, 8]),
do_filter(function ($v) { return $v % 2 == 0; }),
do_map(function ($v) { return $v * 3; }),
do_as_array(),
]);
preferences:
38.94 ms | 402 KiB | 5 Q