@@ -37,13 +37,6 @@ object codegen {
37
37
s " $g.flatMap(( $t: $T) => $acc) "
38
38
}
39
39
40
- def flatMappedGeneratorsWithFun (i : Int , f : String , s : Seq [(String , String )]): String =
41
- s.init.foldRight(s " ${s.last._2}.map { ${s.last._1} => $f( ${vals(i)}) } " ) {
42
- case ((t, g), acc) =>
43
- val T = t.toUpperCase
44
- s " $g.flatMap(( $t: $T) => $acc) "
45
- }
46
-
47
40
def vals (i : Int ) = csv(idents(" t" , i))
48
41
49
42
def coImplicits (i : Int ) = (1 to i).map(n => s " co $n: Cogen[T $n] " ).mkString(" ," )
@@ -114,14 +107,30 @@ object codegen {
114
107
}
115
108
116
109
def zipWith (i : Int ) = {
117
- val gens = flatMappedGeneratorsWithFun(i, " f" , idents(" t" , i) zip idents(" g" , i))
110
+ val f = " f"
111
+ val tR = " R"
112
+ val ts = idents(" t" , i) // Seq(t1, ... ti)
113
+ val tTs = idents(" T" , i) // Seq(T1, ..., Ti)
114
+ val gs = idents(" g" , i) // Seq(g1, ..., gi)
115
+ val tTsCsv = csv(tTs) // "T1, ..., Ti"
116
+ val tsCsv = csv(ts) // "t1, ..., ti"
117
+ val tTts = tTs.zip(ts) // Seq((T1, t1), ..., (Ti, ti))
118
+ val tTtgs = tTts.zip(gs) // Seq(((T1, t1), g1), ..., ((Ti, ti), gi))
119
+
120
+ val ((_, ti), gi) = tTtgs.last
121
+ val gens =
122
+ tTtgs.init.foldRight(s " $gi.map { $ti => $f( $tsCsv) } " ) {
123
+ case (((tT, t), g), acc) =>
124
+ s " $g.flatMap(( $t: $tT) => $acc) "
125
+ }
126
+
118
127
s """
119
128
| /** Combines the given generators into a new generator of the given result type
120
129
| * with help of the given mapping function. */
121
- | def zipWith[ ${types(i)} ,R ](
130
+ | def zipWith[ $tTsCsv , $tR ](
122
131
| ${wrappedArgs(" Gen" , i)}
123
132
| )(
124
- | f: ( ${types(i)} ) => R
133
+ | $ f: ( $tTsCsv ) => $tR
125
134
| ): Gen[R] =
126
135
| $gens
127
136
| """ .stripMargin
0 commit comments