pipe简单实现

254 阅读1分钟

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) ) )