baethon/phln

小型实用函数集合。受 Ramda 启发。

2.2.0 2020-03-10 10:52 UTC

This package is auto-updated.

Last update: 2024-08-28 05:35:46 UTC


README

Build Status Scrutinizer Code Quality

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