reasno/compose-mixins

为PHP提供的可自定义的函数组合。

0.1.1 2018-01-27 08:01 UTC

This package is auto-updated.

Last update: 2024-08-29 04:54:17 UTC


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 以了解如何编写自己的处理器。

注意

  • 使用 mapcollapse 食谱组合的函数也接受 Traversable 作为输入。
  • 对于 allany 食谱,无论函数的返回值如何,都会始终评估所有函数。

测试

PHPUnit 对于此项目来说过于冗余。要进行简单测试,请执行 php tests/composeMixinsTest.php 并查看所有断言是否通过。