UNPKG

@effect-ts/system

Version:

Effect-TS is a zero dependency set of libraries to write highly productive, purely functional TypeScript at scale.

130 lines (128 loc) 3.3 kB
// ets_tracing: off /* eslint-disable @typescript-eslint/no-non-null-assertion */ /* eslint-disable prefer-rest-params */ /** * Function composition (from left to right). * * @example * const len = (s: string): number => s.length * const double = (n: number): number => n * 2 * * const f = flow(len, double) * * assert.strictEqual(f('aaa'), 6) * * @ets_optimize flow */ export function flow<A extends ReadonlyArray<unknown>, B>( ab: (...a: A) => B ): (...a: A) => B export function flow<A extends ReadonlyArray<unknown>, B, C>( ab: (...a: A) => B, bc: (b: B) => C ): (...a: A) => C export function flow<A extends ReadonlyArray<unknown>, B, C, D>( ab: (...a: A) => B, bc: (b: B) => C, cd: (c: C) => D ): (...a: A) => D export function flow<A extends ReadonlyArray<unknown>, B, C, D, E>( ab: (...a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E ): (...a: A) => E export function flow<A extends ReadonlyArray<unknown>, B, C, D, E, F>( ab: (...a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F ): (...a: A) => F export function flow<A extends ReadonlyArray<unknown>, B, C, D, E, F, G>( ab: (...a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G ): (...a: A) => G export function flow<A extends ReadonlyArray<unknown>, B, C, D, E, F, G, H>( ab: (...a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H ): (...a: A) => H export function flow<A extends ReadonlyArray<unknown>, B, C, D, E, F, G, H, I>( ab: (...a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I ): (...a: A) => I export function flow<A extends ReadonlyArray<unknown>, B, C, D, E, F, G, H, I, J>( ab: (...a: A) => B, bc: (b: B) => C, cd: (c: C) => D, de: (d: D) => E, ef: (e: E) => F, fg: (f: F) => G, gh: (g: G) => H, hi: (h: H) => I, ij: (i: I) => J ): (...a: A) => J export function flow( ab: Function, bc?: Function, cd?: Function, de?: Function, ef?: Function, fg?: Function, gh?: Function, hi?: Function, ij?: Function ): unknown { switch (arguments.length) { case 1: return ab case 2: return function (this: unknown) { return bc!(ab.apply(this, arguments)) } case 3: return function (this: unknown) { return cd!(bc!(ab.apply(this, arguments))) } case 4: return function (this: unknown) { return de!(cd!(bc!(ab.apply(this, arguments)))) } case 5: return function (this: unknown) { return ef!(de!(cd!(bc!(ab.apply(this, arguments))))) } case 6: return function (this: unknown) { return fg!(ef!(de!(cd!(bc!(ab.apply(this, arguments)))))) } case 7: return function (this: unknown) { return gh!(fg!(ef!(de!(cd!(bc!(ab.apply(this, arguments))))))) } case 8: return function (this: unknown) { return hi!(gh!(fg!(ef!(de!(cd!(bc!(ab.apply(this, arguments)))))))) } case 9: return function (this: unknown) { return ij!(hi!(gh!(fg!(ef!(de!(cd!(bc!(ab.apply(this, arguments))))))))) } } return }