type Fn = (value: I) => O; type FnOpt = (value?: I) => O; type IfAny = 0 extends 1 & T ? Y : N; type IfUndef = Extract extends never ? N : Y; type FnX = IfAny, IfUndef, Fn>>; type Piper = { (fn1: Fn): FnX; (fn1: Fn, fn2: Fn): FnX; (fn1: Fn, fn2: Fn, fn3: Fn): FnX; (fn1: Fn, fn2: Fn, fn3: Fn, fn4: Fn): FnX; (fn1: Fn, fn2: Fn, fn3: Fn, fn4: Fn, fn5: Fn): FnX; (fn1: Fn, fn2: Fn, fn3: Fn, fn4: Fn, fn5: Fn, fn6: Fn): FnX; (fn1: Fn, fn2: Fn, fn3: Fn, fn4: Fn, fn5: Fn, fn6: Fn, fn7: Fn): FnX; (fn1: Fn, fn2: Fn, fn3: Fn, fn4: Fn, fn5: Fn, fn6: Fn, fn7: Fn, fn8: Fn): FnX; (fn1: Fn, fn2: Fn, fn3: Fn, fn4: Fn, fn5: Fn, fn6: Fn, fn7: Fn, fn8: Fn, fn9: Fn): FnX; (fn1: Fn, fn2: Fn, fn3: Fn, fn4: Fn, fn5: Fn, fn6: Fn, fn7: Fn, fn8: Fn, fn9: Fn, ...fns: Array>): FnX; }; /** * Classic FP pipe function. * * Accepts a list of single-argument functions * and strings them together forming a pipe. * * Returns a reusable function that feeds * its input value through the pipe. * * ```js * const hof = pipe(fn1, fn2, fn3, ...); * const result = hof(value); * const result2 = hof(value2); * ``` */ declare const pipe: Piper; export default pipe; /** / // Type Testing: const ret: number = pipe( (n: undefined) => n||'Jim', (n: string, o?: boolean) => o ? 'hi ' : n, (n: string) => n.length, (n: number) => Math.ceil(n / 10) )(); const ret2: number = pipe( (n: string) => 'hi ' + n, (n: string) => n.length, (n: number) => Math.ceil(n / 10) )('string'); const ret3: unknown = pipe( (n: string) => 'hi ' + n, (n: string) => n.length, (n: number) => n, (n: number) => n, (n: number) => n, (n: number) => n, (n: number) => n, (n: number) => n, (n: number) => n, (n: number) => n, (n: number) => n, (n: number) => Math.ceil(n / 10) )('string'); const error2: number = pipe( (n: string) => 'hi ' + n, (n: string) => n.length, (n: number) => Math.ceil(n / 10) )(); const error: number = pipe( (n: string) => 'hi ' + n, (n: number) => n * 2, (n: number) => Math.ceil(n / 10) )('string'); console.log(ret, ret2, ret3, error, error2); /**/