Skip to content

Commit 12a85d9

Browse files
committed
Expand test
1 parent 237a620 commit 12a85d9

File tree

1 file changed

+49
-6
lines changed

1 file changed

+49
-6
lines changed

tests/run/typelevel.scala

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
object Test extends App {
22

3-
trait Nat
3+
trait Nat {
4+
def toInt: Int
5+
}
6+
7+
case object Z extends Nat {
8+
transparent def toInt = 0
9+
}
410

5-
case object Z extends Nat
611
type Z = Z.type
7-
case class S[N <: Nat](n: Nat) extends Nat
12+
case class S[N <: Nat](n: N) extends Nat {
13+
transparent def toInt = n.toInt + 1
14+
}
815

916
abstract class HasResult[T] { type Result = T }
1017
case class ToNat[+T](val value: T) extends HasResult[T]
@@ -13,7 +20,7 @@ object Test extends App {
1320
if n == 0 then new ToNat(Z)
1421
else {
1522
val n1 = ToNat(n - 1)
16-
new ToNat[S[n1.Result]](S(n1.value))
23+
new ToNat(S(n1.value))
1724
}
1825

1926
val x0 = ToNat(0)
@@ -28,6 +35,10 @@ object Test extends App {
2835
println(x0)
2936
println(x1)
3037
println(x2)
38+
transparent val i0 = y0.toInt
39+
val j0: 0 = i0
40+
transparent val i2 = y2.toInt
41+
val j2: 2 = i2
3142

3243
trait HList {
3344
def isEmpty: Boolean
@@ -41,7 +52,7 @@ object Test extends App {
4152
override def tail: Nothing = ???
4253
}
4354

44-
case object HNil extends HNil
55+
lazy val HNil: HNil = new HNil
4556

4657
case class HCons[H, T <: HList](hd: H, tl: T) extends HList {
4758
transparent override def isEmpty = false
@@ -61,6 +72,38 @@ object Test extends App {
6172
val r3 = concat(xs, xs)
6273

6374
val r4 = concat(HNil, HCons(1, HCons("a", HNil)))
64-
val r5 = concat(HCons(1, HCons("a", HNil)), HNil)
75+
val r5 = concat(HCons(1, HCons("a", HNil)) , HNil)
6576
val r6 = concat(HCons(1, HCons("a", HNil)), HCons(1, HCons("a", HNil)))
77+
78+
transparent def size(xs: HList): Nat =
79+
if (xs.isEmpty) Z
80+
else S(size(xs.tail))
81+
82+
val s0 = size(HNil)
83+
val s1 = size(xs)
84+
85+
transparent def index(xs: HList, inline idx: Int): Any =
86+
if (idx == 0) xs.head
87+
else index(xs.tail, idx - 1)
88+
89+
val s2 = index(xs, 0)
90+
val ss2: Int = s2
91+
val s3 = index(xs, 1)
92+
var ss3: String = s3
93+
def s4 = index(xs, 2)
94+
def ss4: Nothing = s4
95+
96+
/** Does not work yet:
97+
98+
implicit class HListDeco(xs: HList) {
99+
transparent def ++ (ys: HList) = concat(xs, ys)
100+
}
101+
102+
val rr0 = HNil ++ HNil
103+
val rr1 = HNil ++ xs
104+
val rr2 = xs ++ HNil
105+
val rr3 = xs ++ xs
106+
val rr3a: HCons[Int, HCons[String, HCons[Int, HCons[String, HNil]]]] = rr3
107+
108+
*/
66109
}

0 commit comments

Comments
 (0)