1313function partial (callable $ func /** args **/ ) {
1414 $ rest = _array \rest (func_get_args ());
1515 return function () use ($ func , $ rest ) {
16- return call_user_func_array ($ func , array_merge ($ rest , func_get_args ()));
16+ return call_user_func_array ($ func , _array \concat ($ rest , func_get_args ()));
1717 };
1818}
1919
@@ -26,7 +26,7 @@ function partial(callable $func /** args **/) {
2626function partialRight (callable $ func /** args **/ ) {
2727 $ rest = _array \rest (func_get_args ());
2828 return function () use ($ func , $ rest ) {
29- return call_user_func_array ($ func , array_merge (func_get_args (), $ rest ));
29+ return call_user_func_array ($ func , _array \concat (func_get_args (), array_reverse ( $ rest) ));
3030 };
3131}
3232
@@ -61,7 +61,7 @@ function curry1(callable $func) {
6161function curry2 (callable $ func , $ order = 0 ) {
6262 return function ($ arg1 ) use ($ func , $ order ) {
6363 return function () use ($ func , $ arg1 , $ order ) {
64- $ args = ($ order > 0 ) ? array_merge (func_get_args (), [$ arg1 ]) : array_merge ([$ arg1 ], func_get_args ());
64+ $ args = ($ order > 0 ) ? _array \concat (func_get_args (), [$ arg1 ]) : _array \concat ([$ arg1 ], func_get_args ());
6565 return call_user_func_array ($ func , $ args );
6666 };
6767 };
@@ -78,7 +78,7 @@ function curry3(callable $func, $order = 0) {
7878 return function ($ arg1 ) use ($ func , $ order ) {
7979 return function ($ arg2 ) use ($ func , $ arg1 , $ order ) {
8080 return function () use ($ func , $ arg1 , $ arg2 , $ order ) {
81- $ args = ($ order > 0 ) ? array_merge (func_get_args (), [$ arg2 , $ arg1 ]) : array_merge ([$ arg1 , $ arg2 ], func_get_args ());
81+ $ args = ($ order > 0 ) ? _array \concat (func_get_args (), [$ arg2 , $ arg1 ]) : _array \concat ([$ arg1 , $ arg2 ], func_get_args ());
8282 return call_user_func_array ($ func , $ args );
8383 };
8484 };
@@ -107,4 +107,21 @@ function curry(callable $func, $arity = 1) {
107107function curryRight (callable $ func , $ arity = 1 ) {
108108 $ fn = __NAMESPACE__ . '\\' . "curry $ arity " ;
109109 return (function_exists ($ fn )) ? call_user_func_array ($ fn , [$ func , 1 ]) : false ;
110+ }
111+
112+ /**
113+ * Compose a group of functions such that every
114+ * function is called with the result of the function to
115+ * it's right
116+ *
117+ * @return callable
118+ */
119+ function compose (/** functions */ ) {
120+ $ functions = array_filter (func_get_args (), 'is_callable ' );
121+ return function () use ($ functions ) {
122+ $ result = func_get_args ();
123+ while ($ fn = array_pop ($ functions ))
124+ $ result = [call_user_func_array ($ fn , $ result )];
125+ return $ result [0 ];
126+ };
110127}
0 commit comments