Skip to content

Commit 7fb94fa

Browse files
authored
feat: more variations to Curry (#15)
* Add tests and curry implementation 4-16 * Add generator * Add mention in the ReadMe
1 parent 62dfafe commit 7fb94fa

File tree

4 files changed

+516
-21
lines changed

4 files changed

+516
-21
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Fp-go is a collection of Functional Programming helpers powered by Golang [1.18]
1111
- [fp-ts](https://github.com/gcanti/fp-ts)
1212

1313
<p align="center">
14-
<img
14+
<img
1515
width="500"
1616
height="313"
1717
src="https://user-images.githubusercontent.com/9580458/162070974-4367f4b8-bb3d-451c-8114-dd578bad4e46.png"
@@ -232,7 +232,7 @@ Pipe2(fp.Filter(isPositive), fp.Map(sumTwo))([]int{1, 2, 3, -1})
232232

233233
Allow to transfrom a function that receives a certain amount of params in single functions that take one single param each.
234234

235-
Variations `Curry2`, `Curry3` and `Curry4` stating the number of params will be curried individually.
235+
Variations `Curry2` to `Curry16` stating the number of params will be curried individually.
236236

237237
```go
238238
curryedSum := Curry2(func(a int, b int) int { return a + b })

curry.go

+318-6
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,346 @@
11
package fp
22

3-
// Allow to transfrom a function that receives two params in single functions that take one single param each
3+
// Allow to transform a function that receives 2 params in a sequence of unary functions
44
func Curry2[T1, T2, R any](fn func(T1, T2) R) func(T1) func(T2) R {
55
return func(t1 T1) func(T2) R {
6-
return func(t2 T2) R {
6+
return func(t2 T2) R {
77
return fn(t1, t2)
88
}
99
}
1010
}
1111

12-
// Like Curry2 but with three params
12+
// Allow to transform a function that receives 3 params in a sequence of unary functions
1313
func Curry3[T1, T2, T3, R any](fn func(T1, T2, T3) R) func(T1) func(T2) func(T3) R {
1414
return func(t1 T1) func(T2) func(T3) R {
1515
return func(t2 T2) func(T3) R {
16-
return func(t3 T3) R {
16+
return func(t3 T3) R {
1717
return fn(t1, t2, t3)
1818
}
1919
}
2020
}
2121
}
2222

23-
// Like Curry2 but with four params
23+
// Allow to transform a function that receives 4 params in a sequence of unary functions
2424
func Curry4[T1, T2, T3, T4, R any](fn func(T1, T2, T3, T4) R) func(T1) func(T2) func(T3) func(T4) R {
2525
return func(t1 T1) func(T2) func(T3) func(T4) R {
2626
return func(t2 T2) func(T3) func(T4) R {
2727
return func(t3 T3) func(T4) R {
28-
return func(t4 T4) R {
28+
return func(t4 T4) R {
2929
return fn(t1, t2, t3, t4)
3030
}
3131
}
3232
}
3333
}
3434
}
35+
36+
// Allow to transform a function that receives 5 params in a sequence of unary functions
37+
func Curry5[T1, T2, T3, T4, T5, R any](fn func(T1, T2, T3, T4, T5) R) func(T1) func(T2) func(T3) func(T4) func(T5) R {
38+
return func(t1 T1) func(T2) func(T3) func(T4) func(T5) R {
39+
return func(t2 T2) func(T3) func(T4) func(T5) R {
40+
return func(t3 T3) func(T4) func(T5) R {
41+
return func(t4 T4) func(T5) R {
42+
return func(t5 T5) R {
43+
return fn(t1, t2, t3, t4, t5)
44+
}
45+
}
46+
}
47+
}
48+
}
49+
}
50+
51+
// Allow to transform a function that receives 6 params in a sequence of unary functions
52+
func Curry6[T1, T2, T3, T4, T5, T6, R any](fn func(T1, T2, T3, T4, T5, T6) R) func(T1) func(T2) func(T3) func(T4) func(T5) func(T6) R {
53+
return func(t1 T1) func(T2) func(T3) func(T4) func(T5) func(T6) R {
54+
return func(t2 T2) func(T3) func(T4) func(T5) func(T6) R {
55+
return func(t3 T3) func(T4) func(T5) func(T6) R {
56+
return func(t4 T4) func(T5) func(T6) R {
57+
return func(t5 T5) func(T6) R {
58+
return func(t6 T6) R {
59+
return fn(t1, t2, t3, t4, t5, t6)
60+
}
61+
}
62+
}
63+
}
64+
}
65+
}
66+
}
67+
68+
// Allow to transform a function that receives 7 params in a sequence of unary functions
69+
func Curry7[T1, T2, T3, T4, T5, T6, T7, R any](fn func(T1, T2, T3, T4, T5, T6, T7) R) func(T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) R {
70+
return func(t1 T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) R {
71+
return func(t2 T2) func(T3) func(T4) func(T5) func(T6) func(T7) R {
72+
return func(t3 T3) func(T4) func(T5) func(T6) func(T7) R {
73+
return func(t4 T4) func(T5) func(T6) func(T7) R {
74+
return func(t5 T5) func(T6) func(T7) R {
75+
return func(t6 T6) func(T7) R {
76+
return func(t7 T7) R {
77+
return fn(t1, t2, t3, t4, t5, t6, t7)
78+
}
79+
}
80+
}
81+
}
82+
}
83+
}
84+
}
85+
}
86+
87+
// Allow to transform a function that receives 8 params in a sequence of unary functions
88+
func Curry8[T1, T2, T3, T4, T5, T6, T7, T8, R any](fn func(T1, T2, T3, T4, T5, T6, T7, T8) R) func(T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) R {
89+
return func(t1 T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) R {
90+
return func(t2 T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) R {
91+
return func(t3 T3) func(T4) func(T5) func(T6) func(T7) func(T8) R {
92+
return func(t4 T4) func(T5) func(T6) func(T7) func(T8) R {
93+
return func(t5 T5) func(T6) func(T7) func(T8) R {
94+
return func(t6 T6) func(T7) func(T8) R {
95+
return func(t7 T7) func(T8) R {
96+
return func(t8 T8) R {
97+
return fn(t1, t2, t3, t4, t5, t6, t7, t8)
98+
}
99+
}
100+
}
101+
}
102+
}
103+
}
104+
}
105+
}
106+
}
107+
108+
// Allow to transform a function that receives 9 params in a sequence of unary functions
109+
func Curry9[T1, T2, T3, T4, T5, T6, T7, T8, T9, R any](fn func(T1, T2, T3, T4, T5, T6, T7, T8, T9) R) func(T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) R {
110+
return func(t1 T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) R {
111+
return func(t2 T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) R {
112+
return func(t3 T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) R {
113+
return func(t4 T4) func(T5) func(T6) func(T7) func(T8) func(T9) R {
114+
return func(t5 T5) func(T6) func(T7) func(T8) func(T9) R {
115+
return func(t6 T6) func(T7) func(T8) func(T9) R {
116+
return func(t7 T7) func(T8) func(T9) R {
117+
return func(t8 T8) func(T9) R {
118+
return func(t9 T9) R {
119+
return fn(t1, t2, t3, t4, t5, t6, t7, t8, t9)
120+
}
121+
}
122+
}
123+
}
124+
}
125+
}
126+
}
127+
}
128+
}
129+
}
130+
131+
// Allow to transform a function that receives 10 params in a sequence of unary functions
132+
func Curry10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R any](fn func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) R) func(T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) R {
133+
return func(t1 T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) R {
134+
return func(t2 T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) R {
135+
return func(t3 T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) R {
136+
return func(t4 T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) R {
137+
return func(t5 T5) func(T6) func(T7) func(T8) func(T9) func(T10) R {
138+
return func(t6 T6) func(T7) func(T8) func(T9) func(T10) R {
139+
return func(t7 T7) func(T8) func(T9) func(T10) R {
140+
return func(t8 T8) func(T9) func(T10) R {
141+
return func(t9 T9) func(T10) R {
142+
return func(t10 T10) R {
143+
return fn(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10)
144+
}
145+
}
146+
}
147+
}
148+
}
149+
}
150+
}
151+
}
152+
}
153+
}
154+
}
155+
156+
// Allow to transform a function that receives 11 params in a sequence of unary functions
157+
func Curry11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R any](fn func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) R) func(T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) R {
158+
return func(t1 T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) R {
159+
return func(t2 T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) R {
160+
return func(t3 T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) R {
161+
return func(t4 T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) R {
162+
return func(t5 T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) R {
163+
return func(t6 T6) func(T7) func(T8) func(T9) func(T10) func(T11) R {
164+
return func(t7 T7) func(T8) func(T9) func(T10) func(T11) R {
165+
return func(t8 T8) func(T9) func(T10) func(T11) R {
166+
return func(t9 T9) func(T10) func(T11) R {
167+
return func(t10 T10) func(T11) R {
168+
return func(t11 T11) R {
169+
return fn(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11)
170+
}
171+
}
172+
}
173+
}
174+
}
175+
}
176+
}
177+
}
178+
}
179+
}
180+
}
181+
}
182+
183+
// Allow to transform a function that receives 12 params in a sequence of unary functions
184+
func Curry12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R any](fn func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) R) func(T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) R {
185+
return func(t1 T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) R {
186+
return func(t2 T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) R {
187+
return func(t3 T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) R {
188+
return func(t4 T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) R {
189+
return func(t5 T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) R {
190+
return func(t6 T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) R {
191+
return func(t7 T7) func(T8) func(T9) func(T10) func(T11) func(T12) R {
192+
return func(t8 T8) func(T9) func(T10) func(T11) func(T12) R {
193+
return func(t9 T9) func(T10) func(T11) func(T12) R {
194+
return func(t10 T10) func(T11) func(T12) R {
195+
return func(t11 T11) func(T12) R {
196+
return func(t12 T12) R {
197+
return fn(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12)
198+
}
199+
}
200+
}
201+
}
202+
}
203+
}
204+
}
205+
}
206+
}
207+
}
208+
}
209+
}
210+
}
211+
212+
// Allow to transform a function that receives 13 params in a sequence of unary functions
213+
func Curry13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R any](fn func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) R) func(T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) R {
214+
return func(t1 T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) R {
215+
return func(t2 T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) R {
216+
return func(t3 T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) R {
217+
return func(t4 T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) R {
218+
return func(t5 T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) R {
219+
return func(t6 T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) R {
220+
return func(t7 T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) R {
221+
return func(t8 T8) func(T9) func(T10) func(T11) func(T12) func(T13) R {
222+
return func(t9 T9) func(T10) func(T11) func(T12) func(T13) R {
223+
return func(t10 T10) func(T11) func(T12) func(T13) R {
224+
return func(t11 T11) func(T12) func(T13) R {
225+
return func(t12 T12) func(T13) R {
226+
return func(t13 T13) R {
227+
return fn(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13)
228+
}
229+
}
230+
}
231+
}
232+
}
233+
}
234+
}
235+
}
236+
}
237+
}
238+
}
239+
}
240+
}
241+
}
242+
243+
// Allow to transform a function that receives 14 params in a sequence of unary functions
244+
func Curry14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R any](fn func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) R) func(T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) R {
245+
return func(t1 T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) R {
246+
return func(t2 T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) R {
247+
return func(t3 T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) R {
248+
return func(t4 T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) R {
249+
return func(t5 T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) R {
250+
return func(t6 T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) R {
251+
return func(t7 T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) R {
252+
return func(t8 T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) R {
253+
return func(t9 T9) func(T10) func(T11) func(T12) func(T13) func(T14) R {
254+
return func(t10 T10) func(T11) func(T12) func(T13) func(T14) R {
255+
return func(t11 T11) func(T12) func(T13) func(T14) R {
256+
return func(t12 T12) func(T13) func(T14) R {
257+
return func(t13 T13) func(T14) R {
258+
return func(t14 T14) R {
259+
return fn(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14)
260+
}
261+
}
262+
}
263+
}
264+
}
265+
}
266+
}
267+
}
268+
}
269+
}
270+
}
271+
}
272+
}
273+
}
274+
}
275+
276+
// Allow to transform a function that receives 15 params in a sequence of unary functions
277+
func Curry15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R any](fn func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) R) func(T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) R {
278+
return func(t1 T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) R {
279+
return func(t2 T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) R {
280+
return func(t3 T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) R {
281+
return func(t4 T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) R {
282+
return func(t5 T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) R {
283+
return func(t6 T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) R {
284+
return func(t7 T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) R {
285+
return func(t8 T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) R {
286+
return func(t9 T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) R {
287+
return func(t10 T10) func(T11) func(T12) func(T13) func(T14) func(T15) R {
288+
return func(t11 T11) func(T12) func(T13) func(T14) func(T15) R {
289+
return func(t12 T12) func(T13) func(T14) func(T15) R {
290+
return func(t13 T13) func(T14) func(T15) R {
291+
return func(t14 T14) func(T15) R {
292+
return func(t15 T15) R {
293+
return fn(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15)
294+
}
295+
}
296+
}
297+
}
298+
}
299+
}
300+
}
301+
}
302+
}
303+
}
304+
}
305+
}
306+
}
307+
}
308+
}
309+
}
310+
311+
// Allow to transform a function that receives 16 params in a sequence of unary functions
312+
func Curry16[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R any](fn func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) R) func(T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) func(T16) R {
313+
return func(t1 T1) func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) func(T16) R {
314+
return func(t2 T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) func(T16) R {
315+
return func(t3 T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) func(T16) R {
316+
return func(t4 T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) func(T16) R {
317+
return func(t5 T5) func(T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) func(T16) R {
318+
return func(t6 T6) func(T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) func(T16) R {
319+
return func(t7 T7) func(T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) func(T16) R {
320+
return func(t8 T8) func(T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) func(T16) R {
321+
return func(t9 T9) func(T10) func(T11) func(T12) func(T13) func(T14) func(T15) func(T16) R {
322+
return func(t10 T10) func(T11) func(T12) func(T13) func(T14) func(T15) func(T16) R {
323+
return func(t11 T11) func(T12) func(T13) func(T14) func(T15) func(T16) R {
324+
return func(t12 T12) func(T13) func(T14) func(T15) func(T16) R {
325+
return func(t13 T13) func(T14) func(T15) func(T16) R {
326+
return func(t14 T14) func(T15) func(T16) R {
327+
return func(t15 T15) func(T16) R {
328+
return func(t16 T16) R {
329+
return fn(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16)
330+
}
331+
}
332+
}
333+
}
334+
}
335+
}
336+
}
337+
}
338+
}
339+
}
340+
}
341+
}
342+
}
343+
}
344+
}
345+
}
346+
}

0 commit comments

Comments
 (0)