Skip to content

Instantly share code, notes, and snippets.

@fResult
Created January 24, 2024 06:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fResult/e6e666b3d4042a0f67ba4dd6391d05bb to your computer and use it in GitHub Desktop.
Save fResult/e6e666b3d4042a0f67ba4dd6391d05bb to your computer and use it in GitHub Desktop.
export type UnaryFn<T, R> = (arg: T) => R;
export function compose<R>(fn: UnaryFn<any, R>): UnaryFn<any, R>;
export function compose<T1, R>(fn1: UnaryFn<T1, R>): UnaryFn<T1, R>;
export function compose<T1, T2, R>(
fn2: UnaryFn<T2, R>,
fn1: UnaryFn<T1, T2>
): UnaryFn<T1, R>;
export function compose<T1, T2, T3, R>(
fn3: UnaryFn<T3, R>,
fn2: UnaryFn<T2, T3>,
fn1: UnaryFn<T1, T2>
): UnaryFn<T1, R>;
export function compose<T1, T2, T3, T4, R>(
fn4: UnaryFn<T4, R>,
fn3: UnaryFn<T3, T4>,
fn2: UnaryFn<T2, T3>,
fn1: UnaryFn<T1, T2>
): UnaryFn<T1, R>;
export function compose<T1, T2, T3, T4, T5, R>(
fn5: UnaryFn<T5, R>,
fn4: UnaryFn<T4, T5>,
fn3: UnaryFn<T3, T4>,
fn2: UnaryFn<T2, T3>,
fn1: UnaryFn<T1, T2>
): UnaryFn<T1, R>;
export function compose<T1, T2, T3, T4, T5, T6, R>(
fn6: UnaryFn<T6, R>,
fn5: UnaryFn<T5, T6>,
fn4: UnaryFn<T4, T5>,
fn3: UnaryFn<T3, T4>,
fn2: UnaryFn<T2, T3>,
fn1: UnaryFn<T1, T2>
): UnaryFn<T1, R>;
export function compose<T1, T2, T3, T4, T5, T6, T7, R>(
fn7: UnaryFn<T7, R>,
fn6: UnaryFn<T6, T7>,
fn5: UnaryFn<T5, T6>,
fn4: UnaryFn<T4, T5>,
fn3: UnaryFn<T3, T4>,
fn2: UnaryFn<T2, T3>,
fn1: UnaryFn<T1, T2>
): UnaryFn<T1, R>;
export function compose<T = any, R = any>(
...fns: ((arg: any) => any)[]
): UnaryFn<T, R>;
export function compose(...fns: Function[]): Function {
return (arg: any) => fns.reduceRight((result, fn) => fn(result), arg);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment