summaryrefslogtreecommitdiff
path: root/test/files/pos/typerep-stephane.scala
blob: 2cb899591afcfefc68c09eadfad3a1d2ab1c5ad0 (plain) (blame)
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
object typerep {

 class TypeRep[T] {
   def getType: TypeRep[T] = this
 }

 object BooleanRep extends TypeRep[Boolean] {
   override def toString = "Boolean"
 }
 object CharRep extends TypeRep[Char] {
   override def toString = "Char"
 }
 object IntRep  extends TypeRep[Int] {
   override def toString = "Int"
 }
 object LongRep extends TypeRep[Long] {
   override def toString = "Long"
 }
 object FloatRep extends TypeRep[Float] {
   override def toString = "Float"
 }
 object DoubleRep extends TypeRep[Double] {
   override def toString = "Double"
 }
 class ListRep[U, T <: List[U]](val elemRep: TypeRep[U]) extends TypeRep[T] {
   override def toString = "List[" + elemRep + "]"
 }

 implicit def typeRep(x: Boolean): TypeRep[Boolean] = BooleanRep
 implicit def typeRep(x: Char   ): TypeRep[Char   ] = CharRep
 implicit def typeRep(x: Long   ): TypeRep[Long   ] = LongRep
 implicit def typeRep(x: Float  ): TypeRep[Float  ] = FloatRep
 implicit def typeRep(x: Double ): TypeRep[Double ] = DoubleRep
 implicit def typeRep(x: Int    ): TypeRep[Int    ] = IntRep
/*
 implicit def typeRep[T](xs: List[T])(implicit rep: T => TypeRep[T]): TypeRep[List[T]] =
   new ListRep(rep(xs.head))
*/
 implicit def typeRep[T <% TypeRep[T]](xs: List[T]): TypeRep[List[T]] =
   new ListRep(xs.head)

}

object test extends App {
 import typerep._
 println(3.getType)
 println(List(3).getType)
}