type Pipe = { (source: T): T; (source: T, a: (value: T) => A): A; (source: T, a: (value: T) => A, b: (value: A) => B): B; ( source: T, a: (value: T) => A, b: (value: A) => B, c: (value: B) => C, ): C; ( source: T, a: (value: T) => A, b: (value: A) => B, c: (value: B) => C, d: (value: C) => D, ): D; ( source: T, a: (value: T) => A, b: (value: A) => B, c: (value: B) => C, d: (value: C) => D, e: (value: D) => E, ): E; ( source: T, a: (value: T) => A, b: (value: A) => B, c: (value: B) => C, d: (value: C) => D, e: (value: D) => E, f: (value: E) => F, ): F; ( source: T, a: (value: T) => A, b: (value: A) => B, c: (value: B) => C, d: (value: C) => D, e: (value: D) => E, f: (value: E) => F, g: (value: F) => G, ): G; ( source: T, a: (value: T) => A, b: (value: A) => B, c: (value: B) => C, d: (value: C) => D, e: (value: D) => E, f: (value: E) => F, g: (value: F) => G, h: (value: G) => H, ): H; ( source: T, a: (value: T) => A, b: (value: A) => B, c: (value: B) => C, d: (value: C) => D, e: (value: D) => E, f: (value: E) => F, g: (value: F) => G, h: (value: G) => H, i: (value: H) => I, ): I; ( source: T, a: (value: T) => A, b: (value: A) => B, c: (value: B) => C, d: (value: C) => D, e: (value: D) => E, f: (value: E) => F, g: (value: F) => G, h: (value: G) => H, i: (value: H) => I, j: (value: I) => J, ): J; ( source: T, a: (value: T) => A, b: (value: A) => B, c: (value: B) => C, d: (value: C) => D, e: (value: D) => E, f: (value: E) => F, g: (value: F) => G, h: (value: G) => H, i: (value: H) => I, j: (value: I) => J, k: (value: J) => K, ): K; }; export const pipe: Pipe = (source, ...fns) => fns.reduce((accumulator, element) => element(accumulator), source);