baethon / phln
小型实用函数集合。受 Ramda 启发。
2.2.0
2020-03-10 10:52 UTC
Requires
- php: >=7.4
Requires (Dev)
- doctrine/instantiator: ~1.0.5
- illuminate/console: ^5.4
- illuminate/view: ^5.4
- phpdocumentor/reflection-docblock: ^3.1
- phpunit/phpunit: ^6.5
- squizlabs/php_codesniffer: ^3.3
- symfony/console: ^3.2
- symfony/process: ^3.3
README
baethon/phln
小型实用函数集合。
深受 Ramda.js 启发,专为 PHP 需求调整。
安装
composer require baethon/phln
示例用法
use Baethon\Phln\Phln as P; $aboveMinPoints = P::compose(P::lte(50), P::prop('score')); $onlyPhp = P::pathEq('language.name', 'PHP'); $topScores = collect($users) ->filter(P::both($aboveMinPoints, $onlyPhp));
注意:在文档中,P
将用作 Baethon\Phln\Phln
的别名。
柯里化
Phln
方法大致实现了柯里化。一个 N-ary
方法将在所有参数提供之前返回一个函数。
$foo = P::curryN(2, function ($left, $right) { return $left + $right; }); $foo(1); // returns instance of \Closure $foo(1, 2); // 3 $foo(1)(2); // 3
部分应用
通过组合 P::partial()
和 P::__
常量,可以实现部分应用。部分应用返回一个函数,该函数接受应该“填补”可调用对象中缺失参数的参数。
$foos = [1, 2, 3]; $mapFoos = P::partial('\\array_map', [P::__, $foos]); $mapFoos(function ($f) { return $f + 100; }); // [100, 200, 300]
函数组合
对于函数组合,phln
提供了 pipe()
和 compose()
函数。
$allFoos = P::pipe( P::filter(P::lte(5)), P::map(P::always('foo')) ); $firstFoo = P::compose(P::head(), $allFoos); $allFoos([4, 5, 6]); // ['foo', 'foo'] $firstFoo([4, 5, 6]); // 'foo'
将方法用作引用
一些 phln
方法接受 callable
作为参数。
要传递另一个宏作为 引用,请不带任何参数调用它。
$collection = [1, 2, 3, 4]; P::reduce(P::sum(), $collection); // 10
此外,您还可以使用 P::raw()
方法,它返回未柯里化的宏或指向 Phln
方法的指针。
扩展
Baethon\Phln\Phln
是可 宏化 的。这意味着可以使用 macro()
方法进行扩展。
P::macro('foo', function () { return 'foo'; }); P::foo(); // 'foo'
关于对象说明
该库采用 Ramda 的术语。在大多数情况下,这是完全可以接受的,直到涉及到 对象 的概念。
Ramda 将 对象 视为字典。在 JavaScript 中,只有一种类型可以作为字典使用。它是 ... object
。
在 PHP 中情况变得复杂。可以使用数组和对象作为字典。这样,Phln
必须将这两种类型都视为 对象。
出于兼容性原因,所有返回 对象 的函数都将返回 array
。
测试
./vendor/bin/phpunit