Skip to content

Commit 3b5ff7a

Browse files
authored
Add init and last methods to NonEmptyTuple (#13735)
1 parent d3a26e2 commit 3b5ff7a

File tree

8 files changed

+339
-8
lines changed

8 files changed

+339
-8
lines changed

library/src/scala/Tuple.scala

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package scala
2-
import annotation.showAsInfix
2+
3+
import annotation.{experimental, showAsInfix}
34
import compiletime._
45
import compiletime.ops.int._
56

@@ -82,11 +83,26 @@ object Tuple {
8283
case x *: _ => x
8384
}
8485

86+
/** Type of the initial part of the tuple without its last element */
87+
@experimental
88+
type Init[X <: Tuple] <: Tuple = X match {
89+
case _ *: EmptyTuple => EmptyTuple
90+
case x *: xs =>
91+
x *: Init[xs]
92+
}
93+
8594
/** Type of the tail of a tuple */
8695
type Tail[X <: NonEmptyTuple] <: Tuple = X match {
8796
case _ *: xs => xs
8897
}
8998

99+
/** Type of the last element of a tuple */
100+
@experimental
101+
type Last[X <: Tuple] = X match {
102+
case x *: EmptyTuple => x
103+
case _ *: xs => Last[xs]
104+
}
105+
90106
/** Type of the concatenation of two tuples */
91107
type Concat[X <: Tuple, +Y <: Tuple] <: Tuple = X match {
92108
case EmptyTuple => Y
@@ -269,6 +285,16 @@ sealed trait NonEmptyTuple extends Tuple {
269285
inline def head[This >: this.type <: NonEmptyTuple]: Head[This] =
270286
runtime.Tuples.apply(this, 0).asInstanceOf[Head[This]]
271287

288+
/** Get the initial part of the tuple without its last element */
289+
@experimental
290+
inline def init[This >: this.type <: NonEmptyTuple]: Init[This] =
291+
runtime.Tuples.init(this).asInstanceOf[Init[This]]
292+
293+
/** Get the last of this tuple */
294+
@experimental
295+
inline def last[This >: this.type <: NonEmptyTuple]: Last[This] =
296+
runtime.Tuples.last(this).asInstanceOf[Last[This]]
297+
272298
/** Get the tail of this tuple.
273299
* This operation is O(this.size)
274300
*/

library/src/scala/runtime/Tuples.scala

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,82 @@ object Tuples {
355355
case _ => specialCaseTail(self)
356356
}
357357

358+
// Init for TupleXXL
359+
private def xxlInit(xxl: TupleXXL): Tuple = {
360+
if (xxl.productArity == 23) {
361+
val elems = xxl.elems
362+
Tuple22(
363+
elems(0), elems(1), elems(2), elems(3), elems(4), elems(5),
364+
elems(6), elems(7), elems(8), elems(9), elems(10), elems(11),
365+
elems(12), elems(13), elems(14), elems(15), elems(16), elems(17),
366+
elems(18), elems(19), elems(20), elems(21)
367+
)
368+
} else {
369+
val arr = new Array[Object](xxl.elems.length - 1)
370+
System.arraycopy(xxl.elems, 0, arr, 0, xxl.elems.length - 1)
371+
TupleXXL.fromIArray(arr.asInstanceOf[IArray[Object]]).asInstanceOf[Tuple]
372+
}
373+
}
374+
375+
// Init for Tuple1 to Tuple22
376+
private def specialCaseInit(self: Tuple): Tuple = {
377+
(self: Any) match {
378+
case _: Tuple1[_] =>
379+
EmptyTuple
380+
case self: Tuple2[_, _] =>
381+
Tuple1(self._1)
382+
case self: Tuple3[_, _, _] =>
383+
Tuple2(self._1, self._2)
384+
case self: Tuple4[_, _, _, _] =>
385+
Tuple3(self._1, self._2, self._3)
386+
case self: Tuple5[_, _, _, _, _] =>
387+
Tuple4(self._1,self._2, self._3, self._4)
388+
case self: Tuple6[_, _, _, _, _, _] =>
389+
Tuple5(self._1, self._2, self._3, self._4, self._5)
390+
case self: Tuple7[_, _, _, _, _, _, _] =>
391+
Tuple6(self._1, self._2, self._3, self._4, self._5, self._6)
392+
case self: Tuple8[_, _, _, _, _, _, _, _] =>
393+
Tuple7(self._1, self._2, self._3, self._4, self._5, self._6, self._7)
394+
case self: Tuple9[_, _, _, _, _, _, _, _, _] =>
395+
Tuple8(self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8)
396+
case self: Tuple10[_, _, _, _, _, _, _, _, _, _] =>
397+
Tuple9(self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9)
398+
case self: Tuple11[_, _, _, _, _, _, _, _, _, _, _] =>
399+
Tuple10(self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10)
400+
case self: Tuple12[_, _, _, _, _, _, _, _, _, _, _, _] =>
401+
Tuple11(self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11)
402+
case self: Tuple13[_, _, _, _, _, _, _, _, _, _, _, _, _] =>
403+
Tuple12(self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12)
404+
case self: Tuple14[_, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
405+
Tuple13(self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13)
406+
case self: Tuple15[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
407+
Tuple14(self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14)
408+
case self: Tuple16[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
409+
Tuple15(self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15)
410+
case self: Tuple17[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
411+
Tuple16(self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16)
412+
case self: Tuple18[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
413+
Tuple17(self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17)
414+
case self: Tuple19[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
415+
Tuple18(self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18)
416+
case self: Tuple20[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
417+
Tuple19(self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19)
418+
case self: Tuple21[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
419+
Tuple20(self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19, self._20)
420+
case self: Tuple22[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
421+
Tuple21(self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19, self._20, self._21)
422+
}
423+
}
424+
425+
def init(self: NonEmptyTuple): Tuple = (self: Any) match {
426+
case xxl: TupleXXL => xxlInit(xxl)
427+
case _ => specialCaseInit(self)
428+
}
429+
430+
def last(self: NonEmptyTuple): Any = (self: Any) match {
431+
case self: Product => self.productElement(self.productArity - 1)
432+
}
433+
358434
def apply(self: NonEmptyTuple, n: Int): Any =
359435
self.productElement(n)
360436

project/Build.scala

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,15 @@ import sbt.ScriptedPlugin.autoImport._
1414
import xerial.sbt.pack.PackPlugin
1515
import xerial.sbt.pack.PackPlugin.autoImport._
1616
import xerial.sbt.Sonatype.autoImport._
17-
1817
import com.typesafe.tools.mima.plugin.MimaPlugin.autoImport._
19-
20-
import dotty.tools.sbtplugin.DottyIDEPlugin.{ installCodeExtension, prepareCommand, runProcess }
18+
import dotty.tools.sbtplugin.DottyIDEPlugin.{installCodeExtension, prepareCommand, runProcess}
2119
import dotty.tools.sbtplugin.DottyIDEPlugin.autoImport._
22-
2320
import org.scalajs.sbtplugin.ScalaJSPlugin
2421
import org.scalajs.sbtplugin.ScalaJSPlugin.autoImport._
25-
2622
import sbtbuildinfo.BuildInfoPlugin
2723
import sbtbuildinfo.BuildInfoPlugin.autoImport._
2824

2925
import scala.util.Properties.isJavaAtLeast
30-
3126
import org.portablescala.sbtplatformdeps.PlatformDepsPlugin.autoImport._
3227

3328
object DottyJSPlugin extends AutoPlugin {
@@ -1781,7 +1776,7 @@ object Build {
17811776
(Compile/doc/target).value
17821777
},
17831778
commonMiMaSettings,
1784-
mimaBinaryIssueFilters ++= MiMaFilters.Library,
1779+
mimaBinaryIssueFilters ++= MiMaFilters.Library
17851780
)
17861781
} else base
17871782
}

project/MiMaFilters.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@ import com.typesafe.tools.mima.core.ProblemFilters._
44

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

0 commit comments

Comments
 (0)