package shapeless
sealed trait Coproduct
sealed trait :+:[+H, +T <: Coproduct] extends Coproduct
final case class Inl[+H, +T <: Coproduct](head : H) extends :+:[H, T] {
override def toString = head.toString
}
final case class Inr[+H, +T <: Coproduct](tail : T) extends :+:[H, T] {
override def toString = tail.toString
}
sealed trait CNil extends Coproduct
object Coproduct {
import ops.coproduct.Inject
import syntax.CoproductOps
class MkCoproduct[C <: Coproduct] {
def apply[T](t: T)(implicit inj: Inject[C, T]): C = inj(t)
}
def apply[C <: Coproduct] = new MkCoproduct[C]
implicit def cpOps[C <: Coproduct](c: C) = new CoproductOps(c)
}