/* eslint-disable @typescript-eslint/max-params -- `compose` needs many parameters in its signature. */
import { pipe } from './pipe.js';
/**
* Composes functions left-to-right. The parameter of the first function must be annotated.
*
* @example
* compose(
* (arr: number[]) => arr.map(x => x * 2),
* arr => arr.join(','),
* )([1, 2, 3, 4]); // => '2,4,6,8'
*/
export function compose(fn1: (value: A) => B): (value: A) => B;
export function compose(fn1: (value: A) => B, fn2: (value: B) => C): (value: A) => C;
export function compose(
fn1: (value: A) => B,
fn2: (value: B) => C,
fn3: (value: C) => D,
): (value: A) => D;
export function compose(
fn1: (value: A) => B,
fn2: (value: B) => C,
fn3: (value: C) => D,
fn4: (value: D) => E,
): (value: A) => E;
export function compose(
fn1: (value: A) => B,
fn2: (value: B) => C,
fn3: (value: C) => D,
fn4: (value: D) => E,
fn5: (value: E) => F,
): (value: A) => F;
export function compose(
fn1: (value: A) => B,
fn2: (value: B) => C,
fn3: (value: C) => D,
fn4: (value: D) => E,
fn5: (value: E) => F,
fn6: (value: F) => G,
): (value: A) => G;
export function compose(
fn1: (value: A) => B,
fn2: (value: B) => C,
fn3: (value: C) => D,
fn4: (value: D) => E,
fn5: (value: E) => F,
fn6: (value: F) => G,
fn7: (value: G) => H,
): (value: A) => H;
export function compose(...functions: ReadonlyArray<(value: unknown) => unknown>): unknown {
// @ts-expect-error (ts2556) pipe's type definition is overloaded for users
return value => pipe(value, ...functions);
}