2010-06-01 14:38:56 +02:00
|
|
|
/* sbt -- Simple Build Tool
|
|
|
|
|
* Copyright 2010 Mark Harrah
|
|
|
|
|
*/
|
2010-05-31 00:42:58 +02:00
|
|
|
package sbt
|
|
|
|
|
|
|
|
|
|
import Types._
|
|
|
|
|
|
|
|
|
|
sealed trait HList
|
|
|
|
|
{
|
2010-06-25 00:09:07 +02:00
|
|
|
type Wrap[M[_]] <: HList
|
2010-05-31 00:42:58 +02:00
|
|
|
}
|
|
|
|
|
sealed trait HNil extends HList
|
|
|
|
|
{
|
2010-06-25 00:09:07 +02:00
|
|
|
type Wrap[M[_]] = HNil
|
2010-05-31 00:42:58 +02:00
|
|
|
def :+: [G](g: G): G :+: HNil = HCons(g, this)
|
|
|
|
|
}
|
|
|
|
|
object HNil extends HNil
|
|
|
|
|
final case class HCons[H, T <: HList](head : H, tail : T) extends HList
|
|
|
|
|
{
|
2010-06-25 00:09:07 +02:00
|
|
|
type Wrap[M[_]] = M[H] :+: T#Wrap[M]
|
2010-05-31 00:42:58 +02:00
|
|
|
def :+: [G](g: G): G :+: H :+: T = HCons(g, this)
|
2010-06-10 14:14:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
object HList
|
|
|
|
|
{
|
|
|
|
|
// contains no type information: not even A
|
|
|
|
|
implicit def fromList[A](list: Traversable[A]): HList = ((HNil: HList) /: list) ( (hl,v) => HCons(v, hl) )
|
2010-05-31 00:42:58 +02:00
|
|
|
}
|