type Fn = (value: I) => O; type Chainer = { (fn1: Fn): R; (fn1: Fn, fn2: Fn): R; (fn1: Fn, fn2: Fn, fn3: Fn): R; (fn1: Fn, fn2: Fn, fn3: Fn, fn4: Fn): R; (fn1: Fn, fn2: Fn, fn3: Fn, fn4: Fn, fn5: Fn): R; (fn1: Fn, fn2: Fn, fn3: Fn, fn4: Fn, fn5: Fn, fn6: Fn): R; (fn1: Fn, fn2: Fn, fn3: Fn, fn4: Fn, fn5: Fn, fn6: Fn, fn7: Fn): R; (fn1: Fn, fn2: Fn, fn3: Fn, fn4: Fn, fn5: Fn, fn6: Fn, fn7: Fn, fn8: Fn): R; (fn1: Fn, fn2: Fn, fn3: Fn, fn4: Fn, fn5: Fn, fn6: Fn, fn7: Fn, fn8: Fn, fn9: Fn): R; (fn1: Fn, fn2: Fn, fn3: Fn, fn4: Fn, fn5: Fn, fn6: Fn, fn7: Fn, fn8: Fn, fn9: Fn, ...fns: Array>): unknown; }; /** * A value-first syntatic twist on the classic FP pipe pattern. * * Accepts a single initial value and returns a function that accepts a * list of single-argument functions and instantly pipes the initial * value through them. * * ```js * const result = chain(value)( * fn1, * fn2, * fn3, * ... * ); * ``` */ declare const chain: (value?: D | undefined) => Chainer; export default chain; /** / // Type Testing: const ret: number = chain()( () => 'Jim', (n?: string) => 'hi ' + n, (n: string) => n.length, (n: number) => Math.ceil(n / 10) ); const ret2: unknown = chain('string')( (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) ); const retE = chain('string')( (n: string) => 'hi ' + n, (n: number) => n * 2, (n: number) => Math.ceil(n / 10) ); console.log(ret, ret2, retE); /**/