@@ -41,21 +41,22 @@ object Test extends App {
41
41
val j2 : 2 = i2
42
42
43
43
trait HList {
44
- def isEmpty : Boolean
44
+ transparent def isEmpty : Boolean = length == 0
45
+ def length : Int
45
46
def head : Any
46
47
def tail : HList
47
48
}
48
49
49
50
class HNil extends HList {
50
- transparent override def isEmpty = true
51
+ transparent override def length = 0
51
52
override def head : Nothing = ???
52
53
override def tail : Nothing = ???
53
54
}
54
55
55
56
lazy val HNil : HNil = new HNil
56
57
57
58
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
59
60
override def head : H = this .hd
60
61
override def tail : T = this .tl
61
62
}
@@ -79,8 +80,28 @@ object Test extends App {
79
80
if (xs.isEmpty) Z
80
81
else S (size(xs.tail))
81
82
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
+
82
99
val s0 = size(HNil )
83
100
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
84
105
85
106
transparent def index (xs : HList , inline idx : Int ): Any =
86
107
if (idx == 0 ) xs.head
@@ -92,10 +113,12 @@ object Test extends App {
92
113
var ss3 : String = s3
93
114
def s4 = index(xs, 2 )
94
115
def ss4 : Nothing = s4
116
+ val s5 = index(xs, xs.length - 1 )
117
+ val ss5 : String = s5
95
118
96
119
/** Does not work yet:
97
120
98
- implicit class HListDeco(xs: HList) {
121
+ implicit class HListDeco(transparent val xs: HList) {
99
122
transparent def ++ (ys: HList) = concat(xs, ys)
100
123
}
101
124
0 commit comments