diff --git a/src/curry.ts b/src/curry.ts index 2c72bb9..9494d40 100644 --- a/src/curry.ts +++ b/src/curry.ts @@ -1,9 +1,31 @@ -export const curry = any>(fn: F) => { - const result = args => { +type Fn1 = (a: T1) => R; +type Fn2C1 = (a: T1) => Fn1; +type Fn2 = (a: T1, b: T2) => R; +type Fn3 = (a: T1, b: T2, c: T3) => R; +type Fn3C1 = (a: T1) => Fn2C1 & Fn2; +type Fn3C2 = (a: T1, b: T2) => Fn1; +type Fn4 = (a: T1, b: T2, c: T3, d: T4) => R; +type Fn4C1 = (a: T1) => Fn3 & Fn3C2 & Fn3C1; +type Fn4C2 = (a: T1, b: T2) => Fn2C1 & Fn2; +type Fn4C3 = (a: T1, b: T2, c: T3) => Fn1; +type Fn5 = (a: T1, b: T2, c: T3, d: T4, e: T5) => R; +type Fn5C1 = (a: T1) => Fn4 & Fn4C1 & Fn4C2 & Fn4C3; +type Fn5C2 = (a: T1, b: T2) => Fn3 & Fn3C1 & Fn3C2; +type Fn5C3 = (a: T1, b: T2, c: T3) => Fn2 & Fn2C1; +type Fn5C4 = (a: T1, b: T2, c: T3, d: T4) => Fn1; + +export function curry(fn: Fn1): Fn1; +export function curry(fn: Fn2): (Fn2 & Fn2C1); +export function curry(fn: Fn3): (Fn3 & Fn3C1 & Fn3C2); +export function curry(fn: Fn4): (Fn4 & Fn4C1 & Fn4C2 & Fn4C3); +export function curry(fn: Fn5): (Fn5 & Fn5C1 & Fn5C2 & Fn5C3 & Fn5C4); + +export function curry(fn) { + const result = (args) => { if (args.length >= fn.length) { return fn(...args); } - return (...secArgs) => result([...args, ...secArgs]); + return (...remaining) => result([...args, ...remaining]); }; return (...args) => result(args);