sbt/tasks/TList.scala

37 lines
1.1 KiB
Scala
Raw Normal View History

2009-12-12 00:56:09 +01:00
package xsbt
import Task.{bindTask, mapTask}
sealed trait TList
{
type Head
type Tail <: TList
type HListType <: HList
private[xsbt] def tasks: List[Task[_]]
private[xsbt] def get(results: Results): HListType
}
sealed class TNil extends TList
{
type Head = Nothing
type Tail = TNil
type HListType = HNil
def ::[A](t: Task[A]) = TCons[A,HNil,TNil](t, this)
private[xsbt] def tasks = Nil
private[xsbt] def get(results: Results) = HNil
}
final case class TCons[H, HL <: HList, T <: TList { type HListType = HL}](head: Task[H], tail: T) extends TList
{
type Head = H
type Tail = T
type HListType = HCons[H,HL]
type This = TCons[H, HL, T]
def ::[A](t: Task[A]) = TCons[A,HListType,This](t, this)
private[xsbt] def tasks = head :: tail.tasks
private[xsbt] def get(results: Results) = HCons(results(head), tail.get(results))
private def getF = get _
def map[X](f: HListType => X): Task[X] = mapTask(tasks: _*)(f compose getF)
def bind[X](f: HListType => Result[X]): Task[X] = bindTask(tasks: _*)(f compose getF)
def join: Task[HListType] = map(identity[HListType])
}
object TNil extends TNil