mirror of https://github.com/sbt/sbt.git
37 lines
1.1 KiB
Scala
37 lines
1.1 KiB
Scala
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 |