@@ -41,21 +41,22 @@ object Test extends App {
4141 val j2 : 2 = i2
4242
4343 trait HList {
44- def isEmpty : Boolean
44+ transparent def isEmpty : Boolean = length == 0
45+ def length : Int
4546 def head : Any
4647 def tail : HList
4748 }
4849
4950 class HNil extends HList {
50- transparent override def isEmpty = true
51+ transparent override def length = 0
5152 override def head : Nothing = ???
5253 override def tail : Nothing = ???
5354 }
5455
5556 lazy val HNil : HNil = new HNil
5657
5758 case class HCons [H , T <: HList ](hd : H , tl : T ) extends HList {
58- transparent override def isEmpty = false
59+ transparent override def length = 1 + tl.length
5960 override def head : H = this .hd
6061 override def tail : T = this .tl
6162 }
@@ -79,8 +80,28 @@ object Test extends App {
7980 if (xs.isEmpty) Z
8081 else S (size(xs.tail))
8182
83+ transparent def sizeDefensive (xs : HList ): Nat = xs.isEmpty match {
84+ case true => Z
85+ case false => S (sizeDefensive(xs.tail))
86+ }
87+ /*
88+ transparent def toInt1[T]: Nat = type T match {
89+ case Z => 0
90+ case S[type N] => toInt[N] + 1
91+ }
92+
93+ transparent def toInt1[T]: Nat = implicit match {
94+ case T <:< Z => 0
95+ case T <:< S[type N] => toInt[N] + 1
96+ }
97+ */
98+
8299 val s0 = size(HNil )
83100 val s1 = size(xs)
101+ transparent val l0 = HNil .length
102+ val l0a : 0 = l0
103+ transparent val l1 = xs.length
104+ val l1a : 2 = l1
84105
85106 transparent def index (xs : HList , inline idx : Int ): Any =
86107 if (idx == 0 ) xs.head
@@ -92,10 +113,12 @@ object Test extends App {
92113 var ss3 : String = s3
93114 def s4 = index(xs, 2 )
94115 def ss4 : Nothing = s4
116+ val s5 = index(xs, xs.length - 1 )
117+ val ss5 : String = s5
95118
96119/** Does not work yet:
97120
98- implicit class HListDeco(xs: HList) {
121+ implicit class HListDeco(transparent val xs: HList) {
99122 transparent def ++ (ys: HList) = concat(xs, ys)
100123 }
101124
0 commit comments