zonuexe/functools

函数工具箱

0.2.0 2015-11-23 10:49 UTC

This package is not auto-updated.

Last update: 2024-09-14 16:29:28 UTC


README

Package version Build Status Packagist Coverage Status

PHP的函数工具箱

安装

Composer

composer require zonuexe/functools

特性

  • Functools\Operator
    • 运算符表达式包装器
      • 二元运算符 1 + 2 $a === "abc" $date instanceof '\Datetime'
      • 条件运算符 $cond ? $then : $else
      • 惰性条件运算符 $cond($v) ? $then($v) : $else($v) (thunk)
    • 引用透明版本的排序数组函数
      • 你可以 array_map(f::op('ksort'), $arrays) !
    • 语言构造包装器
      • echo, print, eval, require, require_once, include, include_once
      • 有限支持: array, isset, empty
  • Functools::partial(callable $callback, array $arguments, int $pos)
    • callable提供部分应用(arary_map友好)
  • Functools::arity(callable $callback)
    • 分析$callbackarity(参数数量)。
  • Functools::curry(callable $callback)
  • Functools::op(string $symbol, [array $arguments, int $pos])
    • 获取可调用对象(以及部分应用)。
  • Functools::compose(callable $callback,...)
  • Functools::pipe(mixed $value, callable $callback...)
  • Functools::tuple(mixed $item,...)
  • Functools::fix(callable $callback)
  • Functools::memoize(callable $callback, [array $cache])
    • 使用Memoization的函数优化器。
    • 此功能将有助于优化透明引用显式定义方程的优化。

迭代

此库没有迭代器。你可以通过选择喜欢的迭代器库来组合它。

使用方法

日语版本:http://qiita.com/tadsan/items/abc52f0739ab5b4e781b

简短语法

use Teto\Functools as f;

f::partial()

$comma = f::partial("implode", [", "]);
$comma(range(1, 10));
// "1, 2, 3, 4, 5, 6, 7, 8, 9, 10"

$join_10 = f::partial("implode", [1 => range(1, 10)], 0);
$join_10("@");
// "1@2@3@4@5@6@7@8@9@10"
$join_10("\\");
=> "1\\2\\3\\4\\5\\6\\7\\8\\9\\10"

$sleep3 = f::partial("sleep", [3]);
$sleep3();
$sleep3("foo"); // Error!

$sleep3 = f::partial("sleep", [3], -1);
$sleep3("foo"); // OK!

f::op()

$add = f::op("+");
$add(2, 3); // (2 + 3) === 5

$add_1 = f::op("+", [1]);
$add_1(4);  // (1 + 4) === 5

$half = f::op("/", [1 => 2], 0);
$half(10);  // (10 / 2) === 5

f::tuple()

$teto  = f::tuple("Teto Kasane",  31, "2008-04-01", "Baguette");
$ritsu = f::tuple("Ritsu Namine", 6,  "2009-10-02", "Napa cabbage");

// index access
$teto[0]; // "Teto Kasane"
$teto[1]; // 31
$teto[2]; // "2008-04-01"
$teto[3]; // "Baguette"

// property access

$tetop  = f::tuple("name", "Teto Kasane",  "age", 31, "birthday", "2008-04-01", "item", "Baguette");
$ritsup = f::tuple("name", "Ritsu Namine", "age",  6, "birthday", "2009-10-02", "item", "Napa cabbage");
$tetop->pget("name");     // "Teto Kasane"
$tetop->pget("age");      // 31
$tetop->pget("birthday"); // "2008-04-01"
$tetop->pget("item");     // "Baguette"

f::fix()

$fib = f::fix(function ($fib) {
    return function ($x) use ($fib) {
        return ($x < 2) ? 1 : $fib($x - 1) + $fib($x -2);
    };
});

$fib(6); // 13

f::memoize()

// simple fibonacci function. But, very very slow.
$fib1 = function ($n) use (&$fib1) {
    return ($n < 2) ? $n : $fib1($n - 1) + $fib1($n - 2);
};

// simple fibonacci function too. very fast!
$fib2 = f::memoize(function ($n) use (&$fib2) {
    return ($n < 2) ? $n : $fib2($n - 1) + $fib2($n - 2);
}, [0, 1]);

版权

./LICENSE

Functional toolbox
Copyright (c) 2015 USAMI Kenta <tadsan@zonu.me>

テト・カサネ

我喜欢テト・カサネ。(日文:[http://kasaneteto.jp/](http://kasaneteto.jp/))

       r /
  __ , --ヽ!-- .、_
 !  `/::::;::::ヽ l
 !二二!::/}::::丿ハニ|
 !ニニ.|:/ ノ/ }::::}コ
 L二lイ  0´ 0 ,':ノコ
 lヽノ/ヘ、 '' ▽_ノイ ソ
  ソ´ /}`ス / ̄ ̄ ̄ ̄/
   .(_:;つ/  0401 / カタカタ
  ̄ ̄ ̄ ̄ ̄\/____/