@@ -85,6 +85,89 @@ sealed trait Tuple extends Any {
85
85
86
86
rewrite def genericConcat [T <: Tuple ](xs : Tuple , ys : Tuple ): Tuple =
87
87
fromArray[T ](xs.toArray ++ ys.toArray)
88
+
89
+ rewrite def head : Any = {
90
+ erased val resTpe = Typed (_head(this ))
91
+ val resVal = rewrite _size(this ) match {
92
+ case 1 =>
93
+ val t = asInstanceOf [Tuple1 [_]]
94
+ t._1
95
+ case 2 =>
96
+ val t = asInstanceOf [Tuple2 [_, _]]
97
+ t._1
98
+ case 3 =>
99
+ val t = asInstanceOf [Tuple3 [_, _, _]]
100
+ t._1
101
+ case 4 =>
102
+ val t = asInstanceOf [Tuple4 [_, _, _, _]]
103
+ t._1
104
+ case n if n > 4 && n <= $MaxSpecialized =>
105
+ asInstanceOf [Product ].productElement(0 )
106
+ case n if n > $MaxSpecialized =>
107
+ val t = asInstanceOf [TupleXXL ]
108
+ t.elems(0 )
109
+ }
110
+ resVal.asInstanceOf [resTpe.Type ]
111
+ }
112
+
113
+ rewrite def tail : Tuple = {
114
+ erased val resTpe = Typed (_tail(this ))
115
+ rewrite _size(this ) match {
116
+ case 1 =>
117
+ ()
118
+ case 2 =>
119
+ val t = asInstanceOf [Tuple2 [_, _]]
120
+ Tuple1 (t._2).asInstanceOf [resTpe.Type ]
121
+ case 3 =>
122
+ val t = asInstanceOf [Tuple3 [_, _, _]]
123
+ Tuple2 (t._2, t._3).asInstanceOf [resTpe.Type ]
124
+ case 4 =>
125
+ val t = asInstanceOf [Tuple4 [_, _, _, _]]
126
+ Tuple3 (t._2, t._3, t._4).asInstanceOf [resTpe.Type ]
127
+ case 5 =>
128
+ val t = asInstanceOf [Tuple5 [_, _, _, _, _]]
129
+ Tuple4 (t._2, t._3, t._4, t._5).asInstanceOf [resTpe.Type ]
130
+ case n if n > 5 =>
131
+ fromArray[resTpe.Type ](toArray.tail)
132
+ }
133
+ }
134
+
135
+ rewrite def apply (n : Int ): Any = {
136
+ erased val resTpe = Typed (_index(this , n))
137
+ type Result = resTpe.Type
138
+ rewrite _size(this ) match {
139
+ case 1 =>
140
+ val t = asInstanceOf [Tuple1 [_]]
141
+ rewrite n match {
142
+ case 0 => t._1.asInstanceOf [Result ]
143
+ }
144
+ case 2 =>
145
+ val t = asInstanceOf [Tuple2 [_, _]]
146
+ rewrite n match {
147
+ case 0 => t._1.asInstanceOf [Result ]
148
+ case 1 => t._2.asInstanceOf [Result ]
149
+ }
150
+ case 3 =>
151
+ val t = asInstanceOf [Tuple3 [_, _, _]]
152
+ rewrite n match {
153
+ case 0 => t._1.asInstanceOf [Result ]
154
+ case 1 => t._2.asInstanceOf [Result ]
155
+ case 2 => t._3.asInstanceOf [Result ]
156
+ }
157
+ case 4 =>
158
+ val t = asInstanceOf [Tuple4 [_, _, _, _]]
159
+ rewrite n match {
160
+ case 0 => t._1.asInstanceOf [Result ]
161
+ case 1 => t._2.asInstanceOf [Result ]
162
+ case 2 => t._3.asInstanceOf [Result ]
163
+ case 3 => t._4.asInstanceOf [Result ]
164
+ }
165
+ case s if s > 4 && s <= $MaxSpecialized && n >= 0 && n < s =>
166
+ asInstanceOf [Product ].productElement(n).asInstanceOf [Result ]
167
+ case s if s > $MaxSpecialized && n >= 0 && n < s =>
168
+ asInstanceOf [TupleXXL ].elems(n).asInstanceOf [Result ]
169
+ }
170
+ }
88
171
}
89
172
90
173
object Tuple {
@@ -167,91 +250,7 @@ object Tuple {
167
250
}
168
251
169
252
@ showAsInfix
170
- sealed class *: [+ H , + T <: Tuple ] extends Tuple {
171
- import Tuple ._
172
-
173
- rewrite def head : Any = {
174
- erased val resTpe = Typed (_head(this ))
175
- val resVal = rewrite _size(this ) match {
176
- case 1 =>
177
- val t = asInstanceOf [Tuple1 [_]]
178
- t._1
179
- case 2 =>
180
- val t = asInstanceOf [Tuple2 [_, _]]
181
- t._1
182
- case 3 =>
183
- val t = asInstanceOf [Tuple3 [_, _, _]]
184
- t._1
185
- case 4 =>
186
- val t = asInstanceOf [Tuple4 [_, _, _, _]]
187
- t._1
188
- case n if n > 4 && n <= $MaxSpecialized =>
189
- asInstanceOf [Product ].productElement(0 )
190
- case n if n > $MaxSpecialized =>
191
- val t = asInstanceOf [TupleXXL ]
192
- t.elems(0 )
193
- }
194
- resVal.asInstanceOf [resTpe.Type ]
195
- }
196
-
197
- rewrite def tail : Tuple = {
198
- erased val resTpe = Typed (_tail(this ))
199
- rewrite _size(this ) match {
200
- case 1 =>
201
- ()
202
- case 2 =>
203
- val t = asInstanceOf [Tuple2 [_, _]]
204
- Tuple1 (t._2).asInstanceOf [resTpe.Type ]
205
- case 3 =>
206
- val t = asInstanceOf [Tuple3 [_, _, _]]
207
- Tuple2 (t._2, t._3).asInstanceOf [resTpe.Type ]
208
- case 4 =>
209
- val t = asInstanceOf [Tuple4 [_, _, _, _]]
210
- Tuple3 (t._2, t._3, t._4).asInstanceOf [resTpe.Type ]
211
- case 5 =>
212
- val t = asInstanceOf [Tuple5 [_, _, _, _, _]]
213
- Tuple4 (t._2, t._3, t._4, t._5).asInstanceOf [resTpe.Type ]
214
- case n if n > 5 =>
215
- fromArray[resTpe.Type ](toArray.tail)
216
- }
217
- }
218
-
219
- rewrite def apply (n : Int ): Any = {
220
- erased val resTpe = Typed (_index(this , n))
221
- rewrite _size(this ) match {
222
- case 1 =>
223
- val t = asInstanceOf [Tuple1 [_]]
224
- rewrite n match {
225
- case 0 => t._1.asInstanceOf [resTpe.Type ]
226
- }
227
- case 2 =>
228
- val t = asInstanceOf [Tuple2 [_, _]]
229
- rewrite n match {
230
- case 0 => t._1.asInstanceOf [resTpe.Type ]
231
- case 1 => t._2.asInstanceOf [resTpe.Type ]
232
- }
233
- case 3 =>
234
- val t = asInstanceOf [Tuple3 [_, _, _]]
235
- rewrite n match {
236
- case 0 => t._1.asInstanceOf [resTpe.Type ]
237
- case 1 => t._2.asInstanceOf [resTpe.Type ]
238
- case 2 => t._3.asInstanceOf [resTpe.Type ]
239
- }
240
- case 4 =>
241
- val t = asInstanceOf [Tuple4 [_, _, _, _]]
242
- rewrite n match {
243
- case 0 => t._1.asInstanceOf [resTpe.Type ]
244
- case 1 => t._2.asInstanceOf [resTpe.Type ]
245
- case 2 => t._3.asInstanceOf [resTpe.Type ]
246
- case 3 => t._4.asInstanceOf [resTpe.Type ]
247
- }
248
- case s if s > 4 && s <= $MaxSpecialized && n >= 0 && n < s =>
249
- asInstanceOf [Product ].productElement(n).asInstanceOf [resTpe.Type ]
250
- case s if s > $MaxSpecialized && n >= 0 && n < s =>
251
- asInstanceOf [TupleXXL ].elems(n).asInstanceOf [resTpe.Type ]
252
- }
253
- }
254
- }
253
+ sealed class *: [+ H , + T <: Tuple ] extends Tuple
255
254
256
255
object *: {
257
256
rewrite def unapply [H , T <: Tuple ](x : H *: T ) = (x.head, x.tail)
0 commit comments