1
1
import annotation .showAsInfix
2
2
3
+ object typelevel {
4
+ erased def erasedValue [T ]: T = ???
5
+ class Typed [T ](val value : T ) { type Type = T }
6
+ }
7
+
3
8
sealed trait Tuple
9
+ object Empty extends Tuple
4
10
5
- object Tuple {
6
- object Empty extends Tuple
11
+ @ showAsInfix
12
+ final case class *: [ H , T <: Tuple ]( hd : H , tl : T ) extends Tuple
7
13
14
+ object Tuple {
15
+ import typelevel ._
8
16
type Empty = Empty .type
9
17
10
- @ showAsInfix
11
- final case class *: [H , T <: Tuple ](hd : H , tl : T ) extends Tuple
18
+ class TupleOps (val xs : Tuple ) extends AnyVal {
19
+ transparent def *: [H ] (x : H ): Tuple = new *: (x, xs)
20
+ transparent def size : Int = xs match {
21
+ case Empty => 0
22
+ case _ *: xs1 => xs1.size + 1
23
+ }
24
+ transparent def apply (n : Int ): Any = xs match {
25
+ case x *: _ if n == 0 => x
26
+ case _ *: xs1 if n > 0 => xs1.apply(n - 1 )
27
+ }
28
+ transparent def **: (ys : Tuple ): Tuple = ys match {
29
+ case Empty => xs
30
+ case y *: ys1 => y *: (ys1 **: xs)
31
+ }
32
+ transparent def head = xs match {
33
+ case x *: _ => x
34
+ }
35
+ transparent def tail = xs match {
36
+ case _ *: xs => xs
37
+ }
38
+ }
12
39
13
- class HListDeco (val xs : Tuple ) extends AnyVal {
14
- transparent def *: [H ] (x : H ): Tuple = Tuple .*: .apply(x, xs)
40
+ val emptyArray = Array [Object ]()
15
41
16
- transparent def size : Int = Tuple .size(xs)
17
- }
42
+ transparent def toObj (t : Any ) = t.asInstanceOf [Object ]
18
43
19
- transparent def size (xs : Tuple ): Int = xs match {
20
- case Empty => 0
21
- case _ *: xs1 => size(xs1) + 1
44
+ transparent def toArray (t : Tuple ): Array [Object ] = t.size match {
45
+ case 0 => emptyArray
46
+ case 1 => Array (toObj(t(0 )))
47
+ case 2 => Array (toObj(t(0 )), toObj(t(1 )))
48
+ case 3 => Array (toObj(t(0 )), toObj(t(1 )), toObj(t(2 )))
49
+ case 4 => Array (toObj(t(0 )), toObj(t(1 )), toObj(t(2 )), toObj(t(3 )))
22
50
}
23
51
24
- transparent implicit def hlistDeco (xs : Tuple ): HListDeco = new HListDeco (xs)
52
+ transparent implicit def tupleDeco (xs : Tuple ): TupleOps = new TupleOps (xs)
25
53
26
54
transparent def apply (): Tuple = Empty
27
55
transparent def apply (x1 : Any ): Tuple = x1 *: Empty
28
56
transparent def apply (x1 : Any , x2 : Any ) = x1 *: x2 *: Empty
57
+ transparent def apply (x1 : Any , x2 : Any , x3 : Any ) = x1 *: x2 *: x3 *: Empty
29
58
30
59
val xs0 = Tuple ()
31
60
val xs1 = Tuple (2 )
32
61
val xs2 = Tuple (2 , " a" )
33
- val s0 = xs0.size
34
- val s1 = xs1.size
35
- val s2 = xs2.size
62
+ val xs3 = Tuple (true , 1 , 2.0 )
63
+ transparent val s0 = xs0.size; val s0c : 0 = s0
64
+ transparent val s1 = xs1.size; val s1c : 1 = s1
65
+ transparent val s2 = xs2.size; val s2c : 2 = s2
66
+ transparent val s3 = xs3.size; val s3c : 3 = s3
67
+ val e0 = xs3(0 ); val e0c : Boolean = e0
68
+ val e1 = xs3(1 ); val e1c : Int = e1
69
+ val e2 = xs3(2 ); val e2c : Double = e2
70
+
71
+ val conc0 = xs0 **: xs3
72
+ val conc1 = xs3 **: xs0
73
+ val conc2 = xs2 **: xs3
74
+ val e3c : Int = conc0(1 )
75
+ val e4c : Int = conc1(1 )
76
+ val e5c : Int = conc2(0 )
77
+ val e6c : Double = conc2(4 )
78
+
36
79
}
37
80
38
81
object Test extends App
0 commit comments