1
0
mirror of https://github.com/IBM/fp-go.git synced 2025-06-17 00:07:49 +02:00

fix: use code generation instead of hardcoded variants

Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com>
This commit is contained in:
Dr. Carsten Leue
2023-07-10 12:40:27 +02:00
parent 691ceb0675
commit 288422ecf1
9 changed files with 1590 additions and 256 deletions

View File

@ -1,147 +1,7 @@
package function
// what a mess, golang does not have proper types ...
func Pipe1[A, R any](a A, f1 func(a A) R) R {
// return f1(a)
r1 := f1(a)
return r1
}
func Pipe2[A, T1, R any](a A, f1 func(a A) T1, f2 func(t1 T1) R) R {
// return f2(f1(a))
r1 := f1(a)
r2 := f2(r1)
return r2
}
func Pipe3[A, T1, T2, R any](a A, f1 func(a A) T1, f2 func(t1 T1) T2, f3 func(t2 T2) R) R {
// return f3(f2(f1(a)))
r1 := f1(a)
r2 := f2(r1)
r3 := f3(r2)
return r3
}
func Pipe4[A, T1, T2, T3, R any](a A, f1 func(a A) T1, f2 func(t1 T1) T2, f3 func(t2 T2) T3, f4 func(t3 T3) R) R {
// return f4(f3(f2(f1(a))))
r1 := f1(a)
r2 := f2(r1)
r3 := f3(r2)
r4 := f4(r3)
return r4
}
func Pipe5[A, T1, T2, T3, T4, R any](a A, f1 func(a A) T1, f2 func(t1 T1) T2, f3 func(t2 T2) T3, f4 func(t3 T3) T4, f5 func(t4 T4) R) R {
// return f5(f4(f3(f2(f1(a)))))
r1 := f1(a)
r2 := f2(r1)
r3 := f3(r2)
r4 := f4(r3)
r5 := f5(r4)
return r5
}
func Pipe6[A, T1, T2, T3, T4, T5, R any](a A, f1 func(a A) T1, f2 func(t1 T1) T2, f3 func(t2 T2) T3, f4 func(t3 T3) T4, f5 func(t4 T4) T5, f6 func(t5 T5) R) R {
// return f6(f5(f4(f3(f2(f1(a))))))
r1 := f1(a)
r2 := f2(r1)
r3 := f3(r2)
r4 := f4(r3)
r5 := f5(r4)
r6 := f6(r5)
return r6
}
func Pipe7[A, T1, T2, T3, T4, T5, T6, R any](a A, f1 func(a A) T1, f2 func(t1 T1) T2, f3 func(t2 T2) T3, f4 func(t3 T3) T4, f5 func(t4 T4) T5, f6 func(t5 T5) T6, f7 func(t6 T6) R) R {
// return f7(f6(f5(f4(f3(f2(f1(a)))))))
r1 := f1(a)
r2 := f2(r1)
r3 := f3(r2)
r4 := f4(r3)
r5 := f5(r4)
r6 := f6(r5)
r7 := f7(r6)
return r7
}
func Pipe8[A, T1, T2, T3, T4, T5, T6, T7, R any](a A, f1 func(a A) T1, f2 func(t1 T1) T2, f3 func(t2 T2) T3, f4 func(t3 T3) T4, f5 func(t4 T4) T5, f6 func(t5 T5) T6, f7 func(t6 T6) T7, f8 func(t7 T7) R) R {
// return f8(f7(f6(f5(f4(f3(f2(f1(a))))))))
r1 := f1(a)
r2 := f2(r1)
r3 := f3(r2)
r4 := f4(r3)
r5 := f5(r4)
r6 := f6(r5)
r7 := f7(r6)
r8 := f8(r7)
return r8
}
func Pipe9[A, T1, T2, T3, T4, T5, T6, T7, T8, R any](a A, f1 func(a A) T1, f2 func(t1 T1) T2, f3 func(t2 T2) T3, f4 func(t3 T3) T4, f5 func(t4 T4) T5, f6 func(t5 T5) T6, f7 func(t6 T6) T7, f8 func(t7 T7) T8, f9 func(t8 T8) R) R {
// return f9(f8(f7(f6(f5(f4(f3(f2(f1(a)))))))))
r1 := f1(a)
r2 := f2(r1)
r3 := f3(r2)
r4 := f4(r3)
r5 := f5(r4)
r6 := f6(r5)
r7 := f7(r6)
r8 := f8(r7)
r9 := f9(r8)
return r9
}
func Flow1[A, R any](f1 func(a A) R) func(a A) R {
return f1
}
func Flow2[A, T1, R any](f1 func(a A) T1, f2 func(t1 T1) R) func(a A) R {
return func(a A) R {
return Pipe2(a, f1, f2)
}
}
func Flow3[A, T1, T2, R any](f1 func(a A) T1, f2 func(t1 T1) T2, f3 func(t2 T2) R) func(a A) R {
return func(a A) R {
return Pipe3(a, f1, f2, f3)
}
}
func Flow4[A, T1, T2, T3, R any](f1 func(a A) T1, f2 func(t1 T1) T2, f3 func(t2 T2) T3, f4 func(t3 T3) R) func(a A) R {
return func(a A) R {
return Pipe4(a, f1, f2, f3, f4)
}
}
func Flow5[A, T1, T2, T3, T4, R any](f1 func(a A) T1, f2 func(t1 T1) T2, f3 func(t2 T2) T3, f4 func(t3 T3) T4, f5 func(t4 T4) R) func(a A) R {
return func(a A) R {
return Pipe5(a, f1, f2, f3, f4, f5)
}
}
func Flow6[A, T1, T2, T3, T4, T5, R any](f1 func(a A) T1, f2 func(t1 T1) T2, f3 func(t2 T2) T3, f4 func(t3 T3) T4, f5 func(t4 T4) T5, f6 func(t5 T5) R) func(a A) R {
return func(a A) R {
return Pipe6(a, f1, f2, f3, f4, f5, f6)
}
}
func Flow7[A, T1, T2, T3, T4, T5, T6, R any](f1 func(a A) T1, f2 func(t1 T1) T2, f3 func(t2 T2) T3, f4 func(t3 T3) T4, f5 func(t4 T4) T5, f6 func(t5 T5) T6, f7 func(t6 T6) R) func(a A) R {
return func(a A) R {
return Pipe7(a, f1, f2, f3, f4, f5, f6, f7)
}
}
func Flow8[A, T1, T2, T3, T4, T5, T6, T7, R any](f1 func(a A) T1, f2 func(t1 T1) T2, f3 func(t2 T2) T3, f4 func(t3 T3) T4, f5 func(t4 T4) T5, f6 func(t5 T5) T6, f7 func(t6 T6) T7, f8 func(t7 T7) R) func(a A) R {
return func(a A) R {
return Pipe8(a, f1, f2, f3, f4, f5, f6, f7, f8)
}
}
func Flow9[A, T1, T2, T3, T4, T5, T6, T7, T8, R any](f1 func(a A) T1, f2 func(t1 T1) T2, f3 func(t2 T2) T3, f4 func(t3 T3) T4, f5 func(t4 T4) T5, f6 func(t5 T5) T6, f7 func(t6 T6) T7, f8 func(t7 T7) T8, f9 func(t8 T8) R) func(a A) R {
return func(a A) R {
return Pipe9(a, f1, f2, f3, f4, f5, f6, f7, f8, f9)
}
func Pipe0[T0 any](t0 T0) T0 {
return t0
}
// Identity returns the value 'a'
@ -194,25 +54,3 @@ func First[T1, T2 any](t1 T1, _ T2) T1 {
func Second[T1, T2 any](_ T1, t2 T2) T2 {
return t2
}
func Nullary1[R any](f1 func() R) func() R {
return f1
}
func Nullary2[T1, R any](f1 func() T1, f2 func(t1 T1) R) func() R {
return func() R {
return Pipe1(f1(), f2)
}
}
func Nullary3[T1, T2, R any](f1 func() T1, f2 func(t1 T1) T2, f3 func(t2 T2) R) func() R {
return func() R {
return Pipe2(f1(), f2, f3)
}
}
func Nullary4[T1, T2, T3, R any](f1 func() T1, f2 func(t1 T1) T2, f3 func(t2 T2) T3, f4 func(t3 T3) R) func() R {
return func() R {
return Pipe3(f1(), f2, f3, f4)
}
}