Skip to content

Instantly share code, notes, and snippets.

@DylanLukes
Created April 26, 2017 03:51
Show Gist options
  • Save DylanLukes/c4ef5165b0803a4bd10c6204641f5b22 to your computer and use it in GitHub Desktop.
Save DylanLukes/c4ef5165b0803a4bd10c6204641f5b22 to your computer and use it in GitHub Desktop.
package com.emg.slidedeck.agent.safeindex
import scala.language.{higherKinds, implicitConversions}
import scalaz.Alpha.{F, G, T}
sealed trait TCBox[TC[_]] {
type T
val value: T
val evidence: TC[T]
}
object TCBox {
def apply[T, TC[_]](value: T)(implicit ev: TC[T]): TCBox[TC] =
MkTCBox(value)
def unapply[TC[_]](box: TCBox[TC]): Option[(box.T, TC[box.T])] =
Some(box.value -> box.evidence)
implicit def anyToBox[TC[_], A: TC](value: A): TCBox[TC] = TCBox(value)
}
private case class MkTCBox[A, TC[_]](value: A)(implicit val evidence: TC[A])
extends TCBox[TC] {
type T = A
}
sealed trait TCBoxF[TC[_[_], _]] {
type T
type F[_]
val value: T
val evidence: TC[F, T]
}
object TCBoxF {
type Aux[TC[_[_], _], F0[_]] = TCBoxF[TC] {type F[A] = F0[A]}
def apply[TC[_[_], _], F[_], T](value: T)(implicit ev: TC[F, T]): TCBoxF[TC] =
MkTCBoxF(value)
def unapply[TC[_[_], _]](box: TCBoxF[TC]): Option[(box.T, TC[box.F, box.T])] =
Some(box.value -> box.evidence)
implicit def anyToBoxF[TC[_[_],_], F[_], A](value: A)(implicit ev: TC[F, A]): TCBoxF[TC] = TCBoxF(value)
}
private case class MkTCBoxF[F0[_], A, TC[_[_], _]](value: A)(implicit val evidence: TC[F0, A])
extends TCBoxF[TC] {
type T = A
type F[X] = F0[X]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment