/* eslint-disable @typescript-eslint/max-params -- `pipe` needs many parameters in its signature. */
/**
* Pipes a value to a series of operations. Operations are applied left-to-right.
* @example
* pipe(
* [1, 2, 3, 4],
* arr => arr.map(x => x * 2),
* arr => arr.join(','),
* ); // => '2,4,6,8'
*/
export function pipe(value: A, op1: (value: A) => B): B;
export function pipe(value: A, op1: (value: A) => B, op2: (value: B) => C): C;
export function pipe(
value: A,
op1: (value: A) => B,
op2: (value: B) => C,
op3: (value: C) => D,
): D;
export function pipe(
value: A,
op1: (value: A) => B,
op2: (value: B) => C,
op3: (value: C) => D,
op4: (value: D) => E,
): E;
export function pipe(
value: A,
op1: (value: A) => B,
op2: (value: B) => C,
op3: (value: C) => D,
op4: (value: D) => E,
op5: (value: E) => F,
): F;
export function pipe(
value: A,
op1: (value: A) => B,
op2: (value: B) => C,
op3: (value: C) => D,
op4: (value: D) => E,
op5: (value: E) => F,
op6: (value: F) => G,
): G;
export function pipe(
value: A,
op1: (value: A) => B,
op2: (value: B) => C,
op3: (value: C) => D,
op4: (value: D) => E,
op5: (value: E) => F,
op6: (value: F) => G,
op7: (value: G) => H,
): H;
export function pipe(
value: A,
op1: (value: A) => B,
op2: (value: B) => C,
op3: (value: C) => D,
op4: (value: D) => E,
op5: (value: E) => F,
op6: (value: F) => G,
op7: (value: G) => H,
op8: (value: H) => I,
): I;
export function pipe(
value: A,
op1: (value: A) => B,
op2: (value: B) => C,
op3: (value: C) => D,
op4: (value: D) => E,
op5: (value: E) => F,
op6: (value: F) => G,
op7: (value: G) => H,
op8: (value: H) => I,
op9: (value: I) => J,
): J;
export function pipe(
value: A,
op01: (value: A) => B,
op02: (value: B) => C,
op03: (value: C) => D,
op04: (value: D) => E,
op05: (value: E) => F,
op06: (value: F) => G,
op07: (value: G) => H,
op08: (value: H) => I,
op09: (value: I) => J,
op10: (value: J) => K,
): K;
export function pipe(
value: A,
op01: (value: A) => B,
op02: (value: B) => C,
op03: (value: C) => D,
op04: (value: D) => E,
op05: (value: E) => F,
op06: (value: F) => G,
op07: (value: G) => H,
op08: (value: H) => I,
op09: (value: I) => J,
op10: (value: J) => K,
op11: (value: K) => L,
): L;
export function pipe(
value: A,
op01: (value: A) => B,
op02: (value: B) => C,
op03: (value: C) => D,
op04: (value: D) => E,
op05: (value: E) => F,
op06: (value: F) => G,
op07: (value: G) => H,
op08: (value: H) => I,
op09: (value: I) => J,
op10: (value: J) => K,
op11: (value: K) => L,
op12: (value: L) => M,
): M;
export function pipe(
value: A,
op01: (value: A) => B,
op02: (value: B) => C,
op03: (value: C) => D,
op04: (value: D) => E,
op05: (value: E) => F,
op06: (value: F) => G,
op07: (value: G) => H,
op08: (value: H) => I,
op09: (value: I) => J,
op10: (value: J) => K,
op11: (value: K) => L,
op12: (value: L) => M,
op13: (value: M) => N,
): N;
export function pipe(
value: A,
op01: (value: A) => B,
op02: (value: B) => C,
op03: (value: C) => D,
op04: (value: D) => E,
op05: (value: E) => F,
op06: (value: F) => G,
op07: (value: G) => H,
op08: (value: H) => I,
op09: (value: I) => J,
op10: (value: J) => K,
op11: (value: K) => L,
op12: (value: L) => M,
op13: (value: M) => N,
op14: (value: N) => O,
): O;
export function pipe(
value: A,
op01: (value: A) => B,
op02: (value: B) => C,
op03: (value: C) => D,
op04: (value: D) => E,
op05: (value: E) => F,
op06: (value: F) => G,
op07: (value: G) => H,
op08: (value: H) => I,
op09: (value: I) => J,
op10: (value: J) => K,
op11: (value: K) => L,
op12: (value: L) => M,
op13: (value: M) => N,
op14: (value: N) => O,
op15: (value: O) => P,
): P;
export function pipe(
value: unknown,
...operations: ReadonlyArray<(value: unknown) => unknown>
): unknown {
let result = value;
for (const operation of operations) {
result = operation(result);
}
return result;
}