reasno / compose-mixins
为PHP提供的可自定义的函数组合。
0.1.1
2018-01-27 08:01 UTC
Requires
- php: >=5.6
README
ComposeMixins 是一个小型但可扩展的PHP库,用于函数组合。
安装
# 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 变成函数 $a 和函数 $b 的组合。您可以通过以下代码片段进行验证。
$result1 = $c($input); $result2 = $a($b($input)); var_dump($result1 === $result2); //true
API
function composeMixins(Recipe $recipe, callable ...$mixins)
食谱
此库包含一些(最常使用的)内置食谱。这些食谱定义了函数如何组合在一起。
- pipe: h(x) = g(f(x))
- map: h(list) = array_map(g, (array_map(f, list)))
- all: 如果所有函数(例如,f(x),g(x)...)都返回true,则返回true。
- any: 如果任何函数返回true,则返回true。
要使用任何食谱,请将它们的名称传递给构造函数以创建新实例。
new Recipe('map');
您可以在运行时创建新的食谱。只需传递一个闭包。
/* 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; } }; });
您可以在自己的代码中定义自己的RecipeHandlers,并将其传递给食谱构造函数。
Class MyRecipeHandler{ //... } $CustomRecipe = new Recipe('fancy', ['handler' => 'MyRecipeHandler']);
请参阅此库中的 RecipeHandler.php 以了解如何编写自己的处理器。
注意
- 使用
map和collapse食谱组合的函数也接受Traversable作为输入。 - 对于
all和any食谱,无论函数的返回值如何,都会始终评估所有函数。
测试
PHPUnit 对于此项目来说过于冗余。要进行简单测试,请执行 php tests/composeMixinsTest.php 并查看所有断言是否通过。