fancadescala/core/src/main/scala/tf/bug/fancadetagless/Encoding.scala

42 lines
1.4 KiB
Scala

package tf.bug.fancadetagless
import cats.effect.Sync
import shapeless._
trait Encoding[A] {
def pins: Vector[PinType]
def encodeConstant(a: A): Vector[Make]
}
object Encoding extends ProductTypeClassCompanion[Encoding] {
object typeClass extends ProductTypeClass[Encoding] {
override def product[H, T <: HList](ch: Encoding[H], ct: Encoding[T]): Encoding[H :: T] = new Encoding[H :: T] {
override def pins: Vector[PinType] = ch.pins ++ ct.pins
override def encodeConstant(a: H :: T): Vector[Make] = ch.encodeConstant(a.head) ++ ct.encodeConstant(a.tail)
}
override def emptyProduct: Encoding[HNil] = new Encoding[HNil] {
override def pins: Vector[PinType] = Vector.empty
override def encodeConstant(a: HNil): Vector[Make] = Vector.empty
}
override def project[F, G](instance: => Encoding[G], to: F => G, from: G => F): Encoding[F] = new Encoding[F] {
override def pins: Vector[PinType] = instance.pins
override def encodeConstant(a: F): Vector[Make] = instance.encodeConstant(to(a))
}
}
implicit val floatEncoding: Encoding[Float] = new Encoding[Float] {
override def pins: Vector[PinType] = Vector(PinType.Number)
override def encodeConstant(a: Float): Vector[Make] =
Vector(Make.Builtin(s"Value[Number]($a)", pins.map((_, PinDirection.Outward))))
}
}