Skip to content

Commit 4efb18a

Browse files
committed
function composition and array concat
1 parent 20bb543 commit 4efb18a

File tree

3 files changed

+48
-4
lines changed

3 files changed

+48
-4
lines changed

src/Brianium/Phunc/Arrays.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,14 @@
99
*/
1010
function rest(array $array) {
1111
return array_slice($array, 1);
12+
}
13+
14+
/**
15+
* Concat all supplied arrays
16+
*
17+
* @return array|mixed
18+
*/
19+
function concat(/** arrays **/) {
20+
$arrays = array_filter(func_get_args(), 'is_array');
21+
return call_user_func_array('array_merge', $arrays);
1222
}

src/Brianium/Phunc/Functions.php

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
function 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 **/) {
2626
function 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) {
6161
function 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) {
107107
function 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
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
namespace Brianium\Phunc\Functions;
3+
loadModule('Functions');
4+
5+
class ComposeTest extends \PHPUnit_Framework_TestCase
6+
{
7+
public function test_compose_passes_results_from_end_to_first()
8+
{
9+
$makeCool = function($name) {
10+
return $name . ' is cool.';
11+
};
12+
$subject = 'brian:scaturro';
13+
$findNameAndMakeItCool = compose($makeCool, 'ucfirst', partialRight('strstr', true, ':'));
14+
$result = $findNameAndMakeItCool($subject);
15+
$this->assertEquals('Brian is cool.', $result);
16+
}
17+
}

0 commit comments

Comments
 (0)