<?php namespace PHPixme; /** * Take a callable and produce a curried \Closure * @param int $arity * @param callable = $hof * @return \Closure * @sig Integer -> Callable (*-> x) -> \Closure (* -> x) */ function curry($arity = null, callable $hof = null) { return call_user_func_array(__PRIVATE__::$instance[curry], func_get_args()); } const curry = __NAMESPACE__ . '\\curry'; __PRIVATE__::$instance[curry] = __PRIVATE__::curryExactly2(function ($arity, $callable) { __CONTRACT__::argIsAPositiveOrZeroInt($arity); __CONTRACT__::argIsACallable($callable, 1); // The function is static so that is easier to recurse, // as it shares no state with itself outside its arguments. return __PRIVATE__::curryGiven([], $arity, $callable); });
<?php /** * Created by PhpStorm. * User: rgladson * Date: 5/12/2016 * Time: 12:03 PM */ namespace PHPixme; /** * Wrap a function in an argument that will eat all but n arguments * @param int $arity * @param callable = $hof * @return \Closure * @sig Integer -> Callable (* -> x) -> \Closure (* -> x) */ function nAry($arity = null, callable $hof = null) { return call_user_func_array(__PRIVATE__::$instance[nAry], func_get_args()); } const nAry = __NAMESPACE__ . '\\nAry'; __PRIVATE__::$instance[nAry] = __PRIVATE__::curryExactly2(function ($number = 0, $hof = null) { __CONTRACT__::argIsAPositiveOrZeroInt($number); __CONTRACT__::argIsACallable($hof, 1); return function () use($number, $hof) { $args = func_get_args(); return call_user_func_array($hof, array_slice($args, 0, $number)); }; });