@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
text/typescript
// 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
}