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) ) )
复制代码