Skip to content

Commit 2b4e391

Browse files
feat(util): introduce curry helper functions (#24)
1 parent 5a52b91 commit 2b4e391

File tree

3 files changed

+109
-1
lines changed

3 files changed

+109
-1
lines changed

src/util/curry.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
export const curry2 =
2+
<T1, T2, TReturn>(fn: (arg1: T1, arg2: T2) => TReturn) =>
3+
(a1: T1) =>
4+
(a2: T2) =>
5+
fn(a1, a2)
6+
7+
export const curry3 =
8+
<T1, T2, T3, TReturn>(fn: (arg1: T1, arg2: T2, arg3: T3) => TReturn) =>
9+
(a1: T1) =>
10+
(a2: T2) =>
11+
(a3: T3) =>
12+
fn(a1, a2, a3)
13+
14+
export const curry4 =
15+
<T1, T2, T3, T4, TReturn>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => TReturn) =>
16+
(a1: T1) =>
17+
(a2: T2) =>
18+
(a3: T3) =>
19+
(a4: T4) =>
20+
fn(a1, a2, a3, a4)
21+
22+
export const curry5 =
23+
<T1, T2, T3, T4, T5, TReturn>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => TReturn) =>
24+
(a1: T1) =>
25+
(a2: T2) =>
26+
(a3: T3) =>
27+
(a4: T4) =>
28+
(a5: T5) =>
29+
fn(a1, a2, a3, a4, a5)
30+
31+
export const curry6 =
32+
<T1, T2, T3, T4, T5, T6, TReturn>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => TReturn) =>
33+
(a1: T1) =>
34+
(a2: T2) =>
35+
(a3: T3) =>
36+
(a4: T4) =>
37+
(a5: T5) =>
38+
(a6: T6) =>
39+
fn(a1, a2, a3, a4, a5, a6)
40+
41+
export const curry7 =
42+
<T1, T2, T3, T4, T5, T6, T7, TReturn>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => TReturn) =>
43+
(a1: T1) =>
44+
(a2: T2) =>
45+
(a3: T3) =>
46+
(a4: T4) =>
47+
(a5: T5) =>
48+
(a6: T6) =>
49+
(a7: T7) =>
50+
fn(a1, a2, a3, a4, a5, a6, a7)

src/util/index.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,9 @@
1-
export { maybeEnv } from './maybe-env'
1+
export { maybeEnv } from './maybe-env'
2+
export {
3+
curry2,
4+
curry3,
5+
curry4,
6+
curry5,
7+
curry6,
8+
curry7
9+
} from './curry'

test/util/curry.spec.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { curry2, curry3, curry4, curry5, curry6, curry7 } from '../../src/util/curry'
2+
3+
describe('curry', () => {
4+
it('should work with 2 arguments', () => {
5+
const add = (a: number, b: number) => a + b
6+
const add1to = curry2(add)(1)
7+
8+
expect(add1to(2)).toEqual(3)
9+
})
10+
11+
it('should work with 3 arguments', () => {
12+
const add = (a: number, b: number, c: number) => a + b + c
13+
const addCurried = curry3(add)
14+
const add3to = addCurried(1)(2)
15+
16+
expect(add3to(2)).toEqual(5)
17+
})
18+
19+
it('should work with 4 arguments', () => {
20+
const add = (a: number, b: number, c: number, d: number) => a + b + c + d
21+
const addCurried = curry4(add)
22+
const add3to = addCurried(1)(1)(1)
23+
24+
expect(add3to(2)).toEqual(5)
25+
})
26+
27+
it('should work with 5 arguments', () => {
28+
const add = (a: number, b: number, c: number, d: number, e: number) => a + b + c + d + e
29+
const addCurried = curry5(add)
30+
const add4to = addCurried(1)(1)(1)(1)
31+
32+
expect(add4to(1)).toEqual(5)
33+
})
34+
35+
it('should work with 6 arguments', () => {
36+
const add = (a: number, b: number, c: number, d: number, e: number, f: number) => a + b + c + d + e + f
37+
const addCurried = curry6(add)
38+
const add5to = addCurried(1)(1)(1)(1)(1)
39+
40+
expect(add5to(1)).toEqual(6)
41+
})
42+
43+
it('should work with 7 arguments', () => {
44+
const add = (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => a + b + c + d + e + f + g
45+
const addCurried = curry7(add)
46+
const add6to = addCurried(1)(1)(1)(1)(1)(1)
47+
48+
expect(add6to(1)).toEqual(7)
49+
})
50+
})

0 commit comments

Comments
 (0)