@ 2014-10-30T08:00:42Z <?php
/*
span :: (a -> Bool) -> [a] -> ([a],[a])
span _ xs@[] = (xs, xs)
span p xs@(x:xs')
| p x = let (ys,zs) = span p xs' in (x:ys,zs)
| otherwise = ([],xs)
*/
function span($p, $xs) {
if (empty($xs)) {
return [[], []];
}
$xs_ = $xs;
$x = array_shift($xs_);
if ($p($x)) {
list($ys, $zs) = span($p, $xs_);
return [array_merge([$x], $ys), $zs];
}
return [[], $xs];
}
/*
groupBy :: (a -> a -> Bool) -> [a] -> [[a]]
groupBy _ [] = []
groupBy eq (x:xs) = (x:ys) : groupBy eq zs
where (ys,zs) = span (eq x) xs
*/
function array_group(callable $eq, array $xs) {
if (empty($xs)) {
return [];
}
$x = array_shift($xs);
// curry of $eq
$eqx = function ($y) use ($eq, $x) { return $eq($x, $y); };
list($ys, $zs) = span($eqx, $xs);
return array_merge([array_merge([$x], $ys)], array_group($eq, $zs));
}
function it($m,$p){echo ($p?'OK':'NO')." It $m\n"; if(!$p){$GLOBALS['f']=1;}}
function done(){if(@$GLOBALS['f'])die(1);}
it('spans elements which match', span(function ($x) { return $x < 3; }, [1, 2, 3]) === [[1, 2], [3]]);
it('spans elements which match from the start', span(function ($x) { return $x == 3; }, [1, 6, 3, 3]) === [[], [1, 2, 3, 3]]);
it('spans returns empty lists on empty list', span(function ($x) { return false; }, []) === [[], []]);
it('groups elements recursively', array_group(function ($a, $b) { return $a <= ($b-1); }, [1, 1, 2, 1]) === [[1, 1], [2], [1]]);
Enable javascript to submit You have javascript disabled. You will not be able to edit any code.
Output for 5.4.0 - 5.4.45 , 5.5.24 - 5.5.35 , 5.6.7 - 5.6.28 , 7.0.0 - 7.0.20 , 7.1.0 - 7.1.20 , 7.2.0 - 7.2.33 , 7.3.16 - 7.3.33 , 7.4.0 - 7.4.33 , 8.0.0 - 8.0.30 , 8.1.0 - 8.1.28 , 8.2.0 - 8.2.18 , 8.3.0 - 8.3.4 , 8.3.6 OK It spans elements which match
NO It spans elements which match from the start
OK It spans returns empty lists on empty list
NO It groups elements recursively
Output for 8.3.5 Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
OK It spans elements which match
NO It spans elements which match from the start
OK It spans returns empty lists on empty list
NO It groups elements recursively
Output for 4.4.2 - 4.4.9 , 5.1.0 - 5.1.6 , 5.2.0 - 5.2.17 , 5.3.0 - 5.3.29 Parse error: syntax error, unexpected '[' in /in/R58qO on line 12
Process exited with code 255 . Output for 4.3.0 - 4.3.1 , 4.3.5 - 4.3.11 , 4.4.0 - 4.4.1 , 5.0.0 - 5.0.5 Parse error: parse error, unexpected '[' in /in/R58qO on line 12
Process exited with code 255 . Output for 4.3.2 - 4.3.4 Parse error: parse error in /in/R58qO on line 12
Process exited with code 255 . preferences:dark mode live preview
206.37 ms | 401 KiB | 313 Q