Pipe(): identity
Combine functions, passing return value of each step as first argument to next step.
When there's an async step in the pipeline, the pipeline transparently becomes asynchronous.
Example: const param = "hello" const op = Pipe(f1, f2, f3);
equal(await op(p), f3(await f2(f1(p))));
function f1 (p) { ... } async function f2 (p) { ... } function f3 (p) { ... }
TODO: Use conditional typing to support passing non-function as first argument, resulting in immediate evaluation.
Pipe<Y,Z,>(y: Y,z: Z,): Z extends (_: infer B) => infer C ? Y extends (_: infer A) => B ? Fn<[A], C> : C : never
Pipe<X,Y,Z,>(x: X,y: Y,z: Z,): Z extends (_: infer C) => infer D ? Y extends (_: infer B) => C ? X extends (_: infer A) => B ? Fn<[A], D> : D : never : never
Pipe<W,X,Y,Z,>(w: W,x: X,y: Y,z: Z,): Z extends (_: infer D) => infer E ? Y extends (_: infer C) => D ? X extends (_: infer B) => C ? W extends (_: infer A) => B ? Fn<[A], E> : E : never : never : never