| import { identity } from './identity'; |
| import { UnaryFunction } from '../types'; |
| |
| export function pipe(): typeof identity; |
| export function pipe<T, A>(fn1: UnaryFunction<T, A>): UnaryFunction<T, A>; |
| export function pipe<T, A, B>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>): UnaryFunction<T, B>; |
| export function pipe<T, A, B, C>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>): UnaryFunction<T, C>; |
| export function pipe<T, A, B, C, D>( |
| fn1: UnaryFunction<T, A>, |
| fn2: UnaryFunction<A, B>, |
| fn3: UnaryFunction<B, C>, |
| fn4: UnaryFunction<C, D> |
| ): UnaryFunction<T, D>; |
| export function pipe<T, A, B, C, D, E>( |
| fn1: UnaryFunction<T, A>, |
| fn2: UnaryFunction<A, B>, |
| fn3: UnaryFunction<B, C>, |
| fn4: UnaryFunction<C, D>, |
| fn5: UnaryFunction<D, E> |
| ): UnaryFunction<T, E>; |
| export function pipe<T, A, B, C, D, E, F>( |
| fn1: UnaryFunction<T, A>, |
| fn2: UnaryFunction<A, B>, |
| fn3: UnaryFunction<B, C>, |
| fn4: UnaryFunction<C, D>, |
| fn5: UnaryFunction<D, E>, |
| fn6: UnaryFunction<E, F> |
| ): UnaryFunction<T, F>; |
| export function pipe<T, A, B, C, D, E, F, G>( |
| fn1: UnaryFunction<T, A>, |
| fn2: UnaryFunction<A, B>, |
| fn3: UnaryFunction<B, C>, |
| fn4: UnaryFunction<C, D>, |
| fn5: UnaryFunction<D, E>, |
| fn6: UnaryFunction<E, F>, |
| fn7: UnaryFunction<F, G> |
| ): UnaryFunction<T, G>; |
| export function pipe<T, A, B, C, D, E, F, G, H>( |
| fn1: UnaryFunction<T, A>, |
| fn2: UnaryFunction<A, B>, |
| fn3: UnaryFunction<B, C>, |
| fn4: UnaryFunction<C, D>, |
| fn5: UnaryFunction<D, E>, |
| fn6: UnaryFunction<E, F>, |
| fn7: UnaryFunction<F, G>, |
| fn8: UnaryFunction<G, H> |
| ): UnaryFunction<T, H>; |
| export function pipe<T, A, B, C, D, E, F, G, H, I>( |
| fn1: UnaryFunction<T, A>, |
| fn2: UnaryFunction<A, B>, |
| fn3: UnaryFunction<B, C>, |
| fn4: UnaryFunction<C, D>, |
| fn5: UnaryFunction<D, E>, |
| fn6: UnaryFunction<E, F>, |
| fn7: UnaryFunction<F, G>, |
| fn8: UnaryFunction<G, H>, |
| fn9: UnaryFunction<H, I> |
| ): UnaryFunction<T, I>; |
| export function pipe<T, A, B, C, D, E, F, G, H, I>( |
| fn1: UnaryFunction<T, A>, |
| fn2: UnaryFunction<A, B>, |
| fn3: UnaryFunction<B, C>, |
| fn4: UnaryFunction<C, D>, |
| fn5: UnaryFunction<D, E>, |
| fn6: UnaryFunction<E, F>, |
| fn7: UnaryFunction<F, G>, |
| fn8: UnaryFunction<G, H>, |
| fn9: UnaryFunction<H, I>, |
| ...fns: UnaryFunction<any, any>[] |
| ): UnaryFunction<T, unknown>; |
| |
| /** |
| * pipe() can be called on one or more functions, each of which can take one argument ("UnaryFunction") |
| * and uses it to return a value. |
| * It returns a function that takes one argument, passes it to the first UnaryFunction, and then |
| * passes the result to the next one, passes that result to the next one, and so on. |
| */ |
| export function pipe(...fns: Array<UnaryFunction<any, any>>): UnaryFunction<any, any> { |
| return pipeFromArray(fns); |
| } |
| |
| /** @internal */ |
| export function pipeFromArray<T, R>(fns: Array<UnaryFunction<T, R>>): UnaryFunction<T, R> { |
| if (fns.length === 0) { |
| return identity as UnaryFunction<any, any>; |
| } |
| |
| if (fns.length === 1) { |
| return fns[0]; |
| } |
| |
| return function piped(input: T): R { |
| return fns.reduce((prev: any, fn: UnaryFunction<T, R>) => fn(prev), input as any); |
| }; |
| } |