Wallogit.com
2017 © Pedro Peláez
Customizable function composition for PHP.
ComposeMixins is a tiny but extendable PHP library for function composition., (*1)
# in your project root composer require reasno/compose-mixins
use function Reasno\Helpers\composeMixins;
use Reasno\Helpers\Recipe;
$c = composeMixins(new Recipe('pipe'), /* callable */ $a, /* callable */ $b);
$result = $c($input); //Use the composed function
$c becomes a composition of function $a and function $b. You can verify it with the following snippet., (*2)
$result1 = $c($input); $result2 = $a($b($input)); var_dump($result1 === $result2); //true
function composeMixins(Recipe $recipe, callable ...$mixins)
This library comes with a few (most frequently used) built in recipes. These recipes define how functions are composed together., (*3)
To use any recipe, create new instance with their names passed into constructor., (*4)
new Recipe('map');
You can create new recipes on the fly. Just pass in a closure., (*5)
/* use a different handler each time the composed function is called */
$r = Recipe::fromCallable(function(...$fns){
static $i = 0;
return function($input) use (&$i, $fns){
try{
return $fns[$i++]($input);
} catch( Error $e ){
return null;
}
};
});
You can define your own RecipeHandlers in your own code, and pass it to the recipe constructor., (*6)
Class MyRecipeHandler{
//...
}
$CustomRecipe = new Recipe('fancy', ['handler' => 'MyRecipeHandler']);
Please take a look at RecipeHandler.php in this library to learn how to write your own handlers., (*7)
map and collapse recipes also accept Traversable as input.all and any recipes, all functions are always evaluated regardless of their return values.PHPUnit is overkill for this project. To do a simple test, execute php tests/composeMixinsTest.php and see if all assertions pass., (*8)