<?php
function curry(\Closure $f) {
$rf = new \ReflectionFunction($f);
$arity = $rf->getNumberOfParameters();
function acc($f, $arity, $args=[]) {
return function(...$acc) use($f, $arity, $args) {
$acc = array_merge($args, $acc);
return (count($acc) >= $arity) ? $f(...$acc) : acc($f, $arity, $acc);
};
};
return acc($f, $arity);
};
// ==================================================
$sum_func = function($a,$b,$c) {
return $a+$b+$c;
};
$cur = curry($sum_func);
var_dump($cur(1,2,3));
var_dump($cur(1,2)(3));
var_dump($cur(1)(2)(3));
var_dump($cur()(1)()(2)()(3));
var_dump($cur()()()()(1)()(2)()(3,4,5));
- Output for 7.2.0 - 7.2.34, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.33, 8.2.0 - 8.2.29, 8.3.0 - 8.3.26, 8.4.1 - 8.4.13
- int(6)
int(6)
int(6)
int(6)
int(6)
preferences:
142.77 ms | 407 KiB | 5 Q