$c = compose(with($x), 'plus'); return $c($y) !== $x + $y; }, 'sum' => function () { return sum($xs = range(0, mt_rand(1, 100))) !== array_reduce($xs, 'plus', 0); }, 'random1' => function () { return !is_int(random(null)); }, 'mem1' => function () { return mem('true') <= 0; }, 'upto1' => function ($n) { return count(upto($n % 100)) !== $n % 100; }, 'between1' => function () { return between(5, 10) !== [5, 6, 7, 8, 9, 10]; }, 'b_then' => function ($n) { return branch(thunk($n), null, thunk(true), null) !== $n; }, 'b_else' => function ($n) { return branch(null, thunk($n), thunk(false), null) !== $n; }, 'until1' => function ($n) { $x = $n % 8; return until(function ($args) use($x) { list($m, $arr) = $args; return [$m === $x, [$m + 1, snoc($m, $arr)]]; }, [0, []]) !== [$x + 1, upto($x + 1)]; }, 'trampoline1' => function ($n) { $x = $n % 8; return trampoline(y(function ($f, $m, $n, $_) { return $m < $n ? [false, $f($m + 1, $n)] : [true, $m]; }, 0, $x)) !== $x; }, 'loop1' => function ($x) { $n = $x % 8; $lhs = loop(function ($x, $m) use($n) { return [$m >= $n, snoc($m, $x)];
return function ($x) use($funcs, $f) { static $curried = true; return array_reduce($funcs, function ($x, $f) { return call_user_func(op($f), $x); }, call_user_func_array($f, func_get_args())); }; } defun('implode_', 'implode'); defun('join_', implode_('')); defun('concat', function ($n) { return compose('join_', array_($n)); }); defun('thunk', function ($x, $_) { return $x; }); defun('nil', thunk([])); defuns(['filter' => flip(nary('array_filter', 2)), 'sum' => nary('array_sum', 1)]); defuns(['keys' => nary('array_keys', 1), 'values' => nary('array_values', 1), 'merge' => nary('array_merge', 2), 'foldr' => function ($f, $zero, $arr) { // Take args in a sane order return array_reduce($arr, $f, $zero); }, 'key_foldr' => function ($f, $zero) { return compose(foldr($f, $zero), key_map(array_(2))); }, 'subscript' => function ($x, $y) { return $x[$y]; }, 'take' => function ($n, $a) { return array_slice($a, 0, $n); }, 'cons' => function ($x, $y) { return merge([$x], $y); }, 'snoc' => function ($x, $y) { return merge($y, [$x]); }, 'echo_' => function ($x) {