diff --git a/src/util/curry.ts b/src/util/curry.ts new file mode 100644 index 0000000..1c34029 --- /dev/null +++ b/src/util/curry.ts @@ -0,0 +1,50 @@ +export const curry2 = + (fn: (arg1: T1, arg2: T2) => TReturn) => + (a1: T1) => + (a2: T2) => + fn(a1, a2) + +export const curry3 = + (fn: (arg1: T1, arg2: T2, arg3: T3) => TReturn) => + (a1: T1) => + (a2: T2) => + (a3: T3) => + fn(a1, a2, a3) + +export const curry4 = + (fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => TReturn) => + (a1: T1) => + (a2: T2) => + (a3: T3) => + (a4: T4) => + fn(a1, a2, a3, a4) + +export const curry5 = + (fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => TReturn) => + (a1: T1) => + (a2: T2) => + (a3: T3) => + (a4: T4) => + (a5: T5) => + fn(a1, a2, a3, a4, a5) + +export const curry6 = + (fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => TReturn) => + (a1: T1) => + (a2: T2) => + (a3: T3) => + (a4: T4) => + (a5: T5) => + (a6: T6) => + fn(a1, a2, a3, a4, a5, a6) + +export const curry7 = + (fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => TReturn) => + (a1: T1) => + (a2: T2) => + (a3: T3) => + (a4: T4) => + (a5: T5) => + (a6: T6) => + (a7: T7) => + fn(a1, a2, a3, a4, a5, a6, a7) \ No newline at end of file diff --git a/src/util/index.ts b/src/util/index.ts index 3db4a0d..0e6ba39 100644 --- a/src/util/index.ts +++ b/src/util/index.ts @@ -1 +1,9 @@ -export { maybeEnv } from './maybe-env' \ No newline at end of file +export { maybeEnv } from './maybe-env' +export { + curry2, + curry3, + curry4, + curry5, + curry6, + curry7 +} from './curry' \ No newline at end of file diff --git a/test/util/curry.spec.ts b/test/util/curry.spec.ts new file mode 100644 index 0000000..07a9ab7 --- /dev/null +++ b/test/util/curry.spec.ts @@ -0,0 +1,50 @@ +import { curry2, curry3, curry4, curry5, curry6, curry7 } from '../../src/util/curry' + +describe('curry', () => { + it('should work with 2 arguments', () => { + const add = (a: number, b: number) => a + b + const add1to = curry2(add)(1) + + expect(add1to(2)).toEqual(3) + }) + + it('should work with 3 arguments', () => { + const add = (a: number, b: number, c: number) => a + b + c + const addCurried = curry3(add) + const add3to = addCurried(1)(2) + + expect(add3to(2)).toEqual(5) + }) + + it('should work with 4 arguments', () => { + const add = (a: number, b: number, c: number, d: number) => a + b + c + d + const addCurried = curry4(add) + const add3to = addCurried(1)(1)(1) + + expect(add3to(2)).toEqual(5) + }) + + it('should work with 5 arguments', () => { + const add = (a: number, b: number, c: number, d: number, e: number) => a + b + c + d + e + const addCurried = curry5(add) + const add4to = addCurried(1)(1)(1)(1) + + expect(add4to(1)).toEqual(5) + }) + + it('should work with 6 arguments', () => { + const add = (a: number, b: number, c: number, d: number, e: number, f: number) => a + b + c + d + e + f + const addCurried = curry6(add) + const add5to = addCurried(1)(1)(1)(1)(1) + + expect(add5to(1)).toEqual(6) + }) + + it('should work with 7 arguments', () => { + const add = (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => a + b + c + d + e + f + g + const addCurried = curry7(add) + const add6to = addCurried(1)(1)(1)(1)(1)(1) + + expect(add6to(1)).toEqual(7) + }) +}) \ No newline at end of file