pipe简单实现

pipe数据管道

// 组合两个函数
export function compose<L=any, R=any>(fn: (...values: any[]) => L):
    (gn: (...values: any[]) => R) => (...args: any[]) => L;
export function compose<L=any, R=any>(fn: (...values: any[]) => L, gn: (...values: any[]) => R):
    (...args: any[]) => L;
export function compose<L=any, R=any>(fn: (...values: any[]) => L, gn?: (...values: any[]) => R) {
    if (gn) {
        return (...args: any[]) => fn(gn(...args))
    } else {
        return (gn: (...values: any[]) => R) => (...args: any[]) => fn(gn(args));
    }
}
复制代码

从由向左执行

f1 = a(x)
f2 = b(x)
compose(f1,f2)=>a(b(x))
复制代码
// 组合多个函数
import { compose } from './compose';
/**
 * 函数F=P->R
 * 集合P->F->集合R
 */
export type IFunction<P=any, R=any> = {
    (value: P): R;
}
export function pipe<P1=any, R1=any>(f1: IFunction<P1, R1>): IFunction<P1, R1>;
export function pipe<P1=any, R1=any, R2=any>(
    f1: IFunction<P1, R1>,
    f2: IFunction<R1, R2>
): IFunction<P1, R2>;
export function pipe<P1=any, R1=any, R2=any, R3=any>(
    f1: IFunction<P1, R1>,
    f2: IFunction<R1, R2>,
    f3: IFunction<R2, R3>
): IFunction<P1, R3>;
export function pipe<R=any>(
    ...fns: IFunction<any, any>[]
): IFunction<any, R> | undefined;
export function pipe<R=any>(
    ...fns: IFunction<any, any>[]
): IFunction<any, R> | undefined {
    let value: IFunction<any, R>;
    // 拷贝
    const [...nFns] = fns;
    // 反序
    nFns.reverse().map(fn => {
        if (!value) {
            value = fn
        } else {
            value = compose(value, fn)
        }
    })
    return value;
}
复制代码
f1 = a(x)
f2 = b(x)
f3 = c(x)
pipe(f1,f2,f3)=c( b( a(x) ) )
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值