Created
April 26, 2017 03:51
-
-
Save DylanLukes/c4ef5165b0803a4bd10c6204641f5b22 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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