/** ***************************************** * Created by edonet@163.com * Created on 2021-03-23 23:10:37 ***************************************** */ 'use strict'; /** ***************************************** * 元子函数 ***************************************** */ type P = (state: unknown) => unknown; /** ***************************************** * 函数参数 ***************************************** */ type A = T extends (argv: infer P) => unknown ? P : never; /** ***************************************** * 函数返回值 ***************************************** */ type R = T extends (argv: unknown) => infer P ? P : void; /** ***************************************** * 函数列表 ***************************************** */ type Fn = ( T extends [] ? [] : T extends [P] ? T : T extends [infer U, infer V] ? [U, (argv: R) => R] : T extends [...rest: infer W, argv1: infer U, argv2: infer V] ? [...Fn<[...W, U]>, (argv: R) => R] : P[] ); /** ***************************************** * 组合函数 ***************************************** */ type Flow = ( T extends [] ? () => void : T extends [infer U] ? U : T extends [head: infer U, ...rest: unknown[], tail: infer V] ? (argv: A) => R : () => void ); /** ***************************************** * 组合函数 ***************************************** */ export function flow(...args: Fn): Flow { // 校验参数 args.forEach(handler => { if (typeof handler !== 'function') { throw new Error('expect handler to be a function!'); } }); // 定义函数 function fn(state: unknown): unknown { return args.reduce((result, handler) => handler(result), state); } // 返回函数 return fn as Flow; }