-
Notifications
You must be signed in to change notification settings - Fork 181
/
compose.ts
41 lines (40 loc) · 1.02 KB
/
compose.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
function compose<A, R1, R2, R3, R4, R5, R6, R7>(
f7: (a: R6) => R7,
f6: (a: R5) => R6,
f5: (a: R4) => R5,
f4: (a: R3) => R4,
f3: (a: R2) => R3,
f2: (a: R1) => R2,
f1: (a: A) => R1,
): (a: A) => R7
function compose<A, R1, R2, R3, R4, R5, R6>(
f6: (a: R5) => R6,
f5: (a: R4) => R5,
f4: (a: R3) => R4,
f3: (a: R2) => R3,
f2: (a: R1) => R2,
f1: (a: A) => R1,
): (a: A) => R6
function compose<A, R1, R2, R3, R4, R5>(
f5: (a: R4) => R5,
f4: (a: R3) => R4,
f3: (a: R2) => R3,
f2: (a: R1) => R2,
f1: (a: A) => R1,
): (a: A) => R5
function compose<A, R1, R2, R3, R4>(
f4: (a: R3) => R4,
f3: (a: R2) => R3,
f2: (a: R1) => R2,
f1: (a: A) => R1,
): (a: A) => R4
function compose<A, R1, R2, R3>(
f3: (a: R2) => R3,
f2: (a: R1) => R2,
f1: (a: A) => R1,
): (a: A) => R3
function compose<A, R1, R2>(f2: (a: R1) => R2, f1: (a: A) => R1): (a: A) => R2
function compose<A>(...funcs: Array<(a: A) => A>): (a: A) => A {
return funcs.reduce((acc, func) => arg => acc(func(arg)), arg => arg);
}
export default compose;