@@ -85,6 +85,89 @@ sealed trait Tuple extends Any {
8585
8686 rewrite def genericConcat [T <: Tuple ](xs : Tuple , ys : Tuple ): Tuple =
8787 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+ }
88171}
89172
90173object Tuple {
@@ -167,91 +250,7 @@ object Tuple {
167250}
168251
169252@ 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
255254
256255object *: {
257256 rewrite def unapply [H , T <: Tuple ](x : H *: T ) = (x.head, x.tail)
0 commit comments