Skip to content

Commit b72dfb5

Browse files
authored
Add reverse method to NonEmptyTuple (#13752)
In Scala 2, there is a method `swap` on `Tuple2`. In Scala 3, we could have it generalized version for any non-empty tuple as a whole.
1 parent 009bb33 commit b72dfb5

File tree

6 files changed

+247
-3
lines changed

6 files changed

+247
-3
lines changed

library/src/scala/Tuple.scala

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package scala
22

3-
import annotation.showAsInfix
3+
import annotation.{experimental, showAsInfix}
44
import compiletime._
55
import compiletime.ops.int._
66

@@ -78,6 +78,13 @@ sealed trait Tuple extends Product {
7878
*/
7979
inline def splitAt[This >: this.type <: Tuple](n: Int): Split[This, n.type] =
8080
runtime.Tuples.splitAt(this, n).asInstanceOf[Split[This, n.type]]
81+
82+
/** Given a tuple `(a1, ..., am)`, returns the reversed tuple `(am, ..., a1)`
83+
* consisting all its elements.
84+
*/
85+
@experimental
86+
inline def reverse[This >: this.type <: Tuple]: Reverse[This] =
87+
runtime.Tuples.reverse(this).asInstanceOf[Reverse[This]]
8188
}
8289

8390
object Tuple {
@@ -193,6 +200,19 @@ object Tuple {
193200
*/
194201
type IsMappedBy[F[_]] = [X <: Tuple] =>> X =:= Map[InverseMap[X, F], F]
195202

203+
/** Type of the reversed tuple */
204+
@experimental
205+
type Reverse[X <: Tuple] = Helpers.ReverseImpl[EmptyTuple, X]
206+
207+
@experimental
208+
object Helpers:
209+
210+
/** Type of the reversed tuple */
211+
@experimental
212+
type ReverseImpl[Acc <: Tuple, X <: Tuple] <: Tuple = X match
213+
case x *: xs => ReverseImpl[x *: Acc, xs]
214+
case EmptyTuple => Acc
215+
196216
/** Transforms a tuple `(T1, ..., Tn)` into `(T1, ..., Ti)`. */
197217
type Take[T <: Tuple, N <: Int] <: Tuple = N match {
198218
case 0 => EmptyTuple
@@ -297,7 +317,6 @@ sealed trait NonEmptyTuple extends Tuple {
297317
*/
298318
inline def tail[This >: this.type <: NonEmptyTuple]: Tail[This] =
299319
runtime.Tuples.tail(this).asInstanceOf[Tail[This]]
300-
301320
}
302321

303322
@showAsInfix

library/src/scala/runtime/Tuples.scala

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package scala.runtime
22

3+
import scala.annotation.experimental
4+
35
object Tuples {
46

57
inline val MaxSpecialized = 22
@@ -447,6 +449,68 @@ object Tuples {
447449
}
448450
}
449451

452+
// Reverse for TupleXXL
453+
private def xxlReverse(xxl: TupleXXL): Tuple =
454+
TupleXXL.fromIArray(xxl.elems.reverse.asInstanceOf[IArray[Object]]).asInstanceOf[Tuple]
455+
456+
// Reverse for Tuple0 to Tuple22
457+
private def specialCaseReverse(self: Tuple): Tuple = {
458+
(self: Any) match {
459+
case EmptyTuple =>
460+
EmptyTuple
461+
case self: Tuple1[_] =>
462+
self
463+
case self: Tuple2[_, _] =>
464+
Tuple2(self._2, self._1)
465+
case self: Tuple3[_, _, _] =>
466+
Tuple3(self._3, self._2, self._1)
467+
case self: Tuple4[_, _, _, _] =>
468+
Tuple4(self._4, self._3, self._2, self._1)
469+
case self: Tuple5[_, _, _, _, _] =>
470+
Tuple5(self._5, self._4, self._3, self._2, self._1)
471+
case self: Tuple6[_, _, _, _, _, _] =>
472+
Tuple6(self._6, self._5, self._4, self._3, self._2, self._1)
473+
case self: Tuple7[_, _, _, _, _, _, _] =>
474+
Tuple7(self._7, self._6, self._5, self._4, self._3, self._2, self._1)
475+
case self: Tuple8[_, _, _, _, _, _, _, _] =>
476+
Tuple8(self._8, self._7, self._6, self._5, self._4, self._3, self._2, self._1)
477+
case self: Tuple9[_, _, _, _, _, _, _, _, _] =>
478+
Tuple9(self._9, self._8, self._7, self._6, self._5, self._4, self._3, self._2, self._1)
479+
case self: Tuple10[_, _, _, _, _, _, _, _, _, _] =>
480+
Tuple10(self._10, self._9, self._8, self._7, self._6, self._5, self._4, self._3, self._2, self._1)
481+
case self: Tuple11[_, _, _, _, _, _, _, _, _, _, _] =>
482+
Tuple11(self._11, self._10, self._9, self._8, self._7, self._6, self._5, self._4, self._3, self._2, self._1)
483+
case self: Tuple12[_, _, _, _, _, _, _, _, _, _, _, _] =>
484+
Tuple12(self._12, self._11, self._10, self._9, self._8, self._7, self._6, self._5, self._4, self._3, self._2, self._1)
485+
case self: Tuple13[_, _, _, _, _, _, _, _, _, _, _, _, _] =>
486+
Tuple13(self._13, self._12, self._11, self._10, self._9, self._8, self._7, self._6, self._5, self._4, self._3, self._2, self._1)
487+
case self: Tuple14[_, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
488+
Tuple14(self._14, self._13, self._12, self._11, self._10, self._9, self._8, self._7, self._6, self._5, self._4, self._3, self._2, self._1)
489+
case self: Tuple15[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
490+
Tuple15(self._15, self._14, self._13, self._12, self._11, self._10, self._9, self._8, self._7, self._6, self._5, self._4, self._3, self._2, self._1)
491+
case self: Tuple16[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
492+
Tuple16(self._16, self._15, self._14, self._13, self._12, self._11, self._10, self._9, self._8, self._7, self._6, self._5, self._4, self._3, self._2, self._1)
493+
case self: Tuple17[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
494+
Tuple17(self._17, self._16, self._15, self._14, self._13, self._12, self._11, self._10, self._9, self._8, self._7, self._6, self._5, self._4, self._3, self._2, self._1)
495+
case self: Tuple18[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
496+
Tuple18(self._18, self._17, self._16, self._15, self._14, self._13, self._12, self._11, self._10, self._9, self._8, self._7, self._6, self._5, self._4, self._3, self._2, self._1)
497+
case self: Tuple19[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
498+
Tuple19(self._19, self._18, self._17, self._16, self._15, self._14, self._13, self._12, self._11, self._10, self._9, self._8, self._7, self._6, self._5, self._4, self._3, self._2, self._1)
499+
case self: Tuple20[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
500+
Tuple20(self._20, self._19, self._18, self._17, self._16, self._15, self._14, self._13, self._12, self._11, self._10, self._9, self._8, self._7, self._6, self._5, self._4, self._3, self._2, self._1)
501+
case self: Tuple21[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
502+
Tuple21(self._21, self._20, self._19, self._18, self._17, self._16, self._15, self._14, self._13, self._12, self._11, self._10, self._9, self._8, self._7, self._6, self._5, self._4, self._3, self._2, self._1)
503+
case self: Tuple22[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
504+
Tuple22(self._22, self._21, self._20, self._19, self._18, self._17, self._16, self._15, self._14, self._13, self._12, self._11, self._10, self._9, self._8, self._7, self._6, self._5, self._4, self._3, self._2, self._1)
505+
}
506+
}
507+
508+
@experimental
509+
def reverse(self: Tuple): Tuple = (self: Any) match {
510+
case xxl: TupleXXL => xxlReverse(xxl)
511+
case _ => specialCaseReverse(self)
512+
}
513+
450514
// Init for Tuple1 to Tuple22
451515
private def specialCaseInit(self: Tuple): Tuple = {
452516
(self: Any) match {

project/MiMaFilters.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ object MiMaFilters {
1313
ProblemFilters.exclude[MissingClassProblem]("scala.runtime.stdLibPatches.language$experimental$clauseInterleaving$"),
1414
ProblemFilters.exclude[MissingFieldProblem]("scala.runtime.stdLibPatches.language#experimental.relaxedExtensionImports"),
1515
ProblemFilters.exclude[MissingClassProblem]("scala.runtime.stdLibPatches.language$experimental$relaxedExtensionImports$"),
16+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.runtime.Tuples.reverse"),
17+
ProblemFilters.exclude[MissingFieldProblem]("scala.Tuple.Helpers"),
1618
// end of New experimental features in 3.3.X
1719
)
1820
val TastyCore: Seq[ProblemFilter] = Seq(

tests/run-custom-args/tasty-inspector/stdlibExperimentalDefinitions.scala

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,15 @@ val experimentalDefinitionInLibrary = Set(
9999
"scala.quoted.Quotes.reflectModule.MethodTypeMethods.hasErasedParams",
100100
"scala.quoted.Quotes.reflectModule.TermParamClauseMethods.erasedArgs",
101101
"scala.quoted.Quotes.reflectModule.TermParamClauseMethods.hasErasedArgs",
102-
"scala.quoted.Quotes.reflectModule.defnModule.ErasedFunctionClass"
102+
"scala.quoted.Quotes.reflectModule.defnModule.ErasedFunctionClass",
103+
104+
// New feature: reverse method on Tuple
105+
"scala.Tuple.reverse",
106+
"scala.Tuple$.Helpers",
107+
"scala.Tuple$.Helpers$",
108+
"scala.Tuple$.Helpers$.ReverseImpl",
109+
"scala.Tuple$.Reverse",
110+
"scala.runtime.Tuples$.reverse"
103111
)
104112

105113

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
(0)
2+
(0,0)
3+
(1,0,0)
4+
(2,1,0,0)
5+
(3,2,1,0,0)
6+
(4,3,2,1,0,0)
7+
(5,4,3,2,1,0,0)
8+
(6,5,4,3,2,1,0,0)
9+
(7,6,5,4,3,2,1,0,0)
10+
(8,7,6,5,4,3,2,1,0,0)
11+
(9,8,7,6,5,4,3,2,1,0,0)
12+
(10,9,8,7,6,5,4,3,2,1,0,0)
13+
(11,10,9,8,7,6,5,4,3,2,1,0,0)
14+
(12,11,10,9,8,7,6,5,4,3,2,1,0,0)
15+
(13,12,11,10,9,8,7,6,5,4,3,2,1,0,0)
16+
(14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,0)
17+
(15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,0)
18+
(16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,0)
19+
(17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,0)
20+
(18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,0)
21+
(19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,0)
22+
(20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,0)
23+
(21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,0)
24+
(22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,0)
25+
(23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,0)
26+
(24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,0)
27+
()
28+
(1)
29+
(2,1)
30+
(3,2,1)
31+
(4,3,2,1)
32+
(5,4,3,2,1)
33+
(6,5,4,3,2,1)
34+
(7,6,5,4,3,2,1)
35+
(8,7,6,5,4,3,2,1)
36+
(9,8,7,6,5,4,3,2,1)
37+
(10,9,8,7,6,5,4,3,2,1)
38+
(11,10,9,8,7,6,5,4,3,2,1)
39+
(12,11,10,9,8,7,6,5,4,3,2,1)
40+
(13,12,11,10,9,8,7,6,5,4,3,2,1)
41+
(14,13,12,11,10,9,8,7,6,5,4,3,2,1)
42+
(15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
43+
(16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
44+
(17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
45+
(18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
46+
(19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
47+
(20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
48+
(21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
49+
(22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
50+
(23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
51+
(24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
52+
(25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
53+
()
54+
(1)
55+
(2,1)
56+
(3,2,1)
57+
(4,3,2,1)
58+
(5,4,3,2,1)
59+
(6,5,4,3,2,1)
60+
(7,6,5,4,3,2,1)
61+
(8,7,6,5,4,3,2,1)
62+
(9,8,7,6,5,4,3,2,1)
63+
(10,9,8,7,6,5,4,3,2,1)
64+
(11,10,9,8,7,6,5,4,3,2,1)
65+
(12,11,10,9,8,7,6,5,4,3,2,1)
66+
(13,12,11,10,9,8,7,6,5,4,3,2,1)
67+
(14,13,12,11,10,9,8,7,6,5,4,3,2,1)
68+
(15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
69+
(16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
70+
(17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
71+
(18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
72+
(19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
73+
(20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
74+
(21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
75+
(22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
76+
(23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
77+
(24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
78+
(25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import scala.reflect.ClassTag
2+
3+
object Test {
4+
def main(args: Array[String]): Unit = {
5+
6+
def testArray[T: ClassTag](n: Int, elem: Int => T): Unit = {
7+
val t: Int *: Tuple = 0 *: Tuple.fromArray(Array.tabulate(n)(elem))
8+
println(t.reverse)
9+
}
10+
11+
for (i <- 0 to 25)
12+
testArray(i, j => j)
13+
14+
val tuple: Tuple3[Int, Boolean, String] = (1, true, "hello")
15+
val reversedTuple: Tuple3[String, Boolean, Int] = tuple.reverse
16+
17+
assert(reversedTuple == ("hello", true, 1))
18+
19+
println(EmptyTuple.reverse)
20+
println(Tuple1(1).reverse)
21+
println((1, 2).reverse)
22+
println((1, 2, 3).reverse)
23+
println((1, 2, 3, 4).reverse)
24+
println((1, 2, 3, 4, 5).reverse)
25+
println((1, 2, 3, 4, 5, 6).reverse)
26+
println((1, 2, 3, 4, 5, 6, 7).reverse)
27+
println((1, 2, 3, 4, 5, 6, 7, 8).reverse)
28+
println((1, 2, 3, 4, 5, 6, 7, 8, 9).reverse)
29+
println((1, 2, 3, 4, 5, 6, 7, 8, 9, 10).reverse)
30+
println((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11).reverse)
31+
println((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12).reverse)
32+
println((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13).reverse)
33+
println((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14).reverse)
34+
println((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15).reverse)
35+
println((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16).reverse)
36+
println((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17).reverse)
37+
println((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18).reverse)
38+
println((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19).reverse)
39+
println((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20).reverse)
40+
println((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21).reverse)
41+
println((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22).reverse)
42+
println((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23).reverse)
43+
println((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24).reverse)
44+
println((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25).reverse)
45+
46+
println(Tuple().reverse)
47+
println((1 *: Tuple()).reverse)
48+
println((1 *: 2 *: Tuple()).reverse)
49+
println((1 *: 2 *: 3 *: Tuple()).reverse)
50+
println((1 *: 2 *: 3 *: 4 *: Tuple()).reverse)
51+
println((1 *: 2 *: 3 *: 4 *: 5 *: Tuple()).reverse)
52+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: Tuple()).reverse)
53+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: Tuple()).reverse)
54+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: Tuple()).reverse)
55+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: Tuple()).reverse)
56+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: Tuple()).reverse)
57+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: Tuple()).reverse)
58+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: 12 *: Tuple()).reverse)
59+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: 12 *: 13 *: Tuple()).reverse)
60+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: 12 *: 13 *: 14 *: Tuple()).reverse)
61+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: 12 *: 13 *: 14 *: 15 *: Tuple()).reverse)
62+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: 12 *: 13 *: 14 *: 15 *: 16 *: Tuple()).reverse)
63+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: 12 *: 13 *: 14 *: 15 *: 16 *: 17 *: Tuple()).reverse)
64+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: 12 *: 13 *: 14 *: 15 *: 16 *: 17 *: 18 *: Tuple()).reverse)
65+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: 12 *: 13 *: 14 *: 15 *: 16 *: 17 *: 18 *: 19 *: Tuple()).reverse)
66+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: 12 *: 13 *: 14 *: 15 *: 16 *: 17 *: 18 *: 19 *: 20 *: Tuple()).reverse)
67+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: 12 *: 13 *: 14 *: 15 *: 16 *: 17 *: 18 *: 19 *: 20 *: 21 *: Tuple()).reverse)
68+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: 12 *: 13 *: 14 *: 15 *: 16 *: 17 *: 18 *: 19 *: 20 *: 21 *: 22 *: Tuple()).reverse)
69+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: 12 *: 13 *: 14 *: 15 *: 16 *: 17 *: 18 *: 19 *: 20 *: 21 *: 22 *: 23 *: Tuple()).reverse)
70+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: 12 *: 13 *: 14 *: 15 *: 16 *: 17 *: 18 *: 19 *: 20 *: 21 *: 22 *: 23 *: 24 *: Tuple()).reverse)
71+
println((1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: 12 *: 13 *: 14 *: 15 *: 16 *: 17 *: 18 *: 19 *: 20 *: 21 *: 22 *: 23 *: 24 *: 25 *: Tuple()).reverse)
72+
}
73+
}

0 commit comments

Comments
 (0)