fancadescala/tagless/src/main/scala/tf/bug/fancadetagless/Fancade.scala

57 lines
1.5 KiB
Scala

package tf.bug.fancadetagless
import cats._
import cats.implicits._
import higherkindness.droste._
import polymorphic._
import tf.bug.fancadegraph.PinDefinition
import tf.bug.fancadegraph.Level
import tf.bug.fancadegraph.Block
import tf.bug.fancadegraph.Template
import tf.bug.fancadescodec.Position
sealed trait Fancade[A] {
val template: Exists[Template]
val pins: Vector[PinDefinition]
}
object Fancade {
implicit val fancadeFunctor: Functor[Fancade] = new Functor[Fancade] {
override def map[A, B](fa: Fancade[A])(f: A => B): Fancade[B] =
fa match {
case Capture(template, pins) =>
Capture(template, pins)
case Use(children, template, inputs, pins) =>
Use(children.map(f), template, inputs, pins)
}
}
case class Capture[A](template: Exists[Template], pins: Vector[PinDefinition]) extends Fancade[A]
case class Use[A](children: Vector[A], template: Exists[Template], inputs: Vector[PinDefinition], pins: Vector[PinDefinition]) extends Fancade[A]
def flatten: Algebra[Fancade, PointerChain[Fancade]] = Algebra {
case Capture(template, pins) =>
PointerChain.single(Capture(template, pins))
case Use(children, template, inputs, pins) =>
???
}
val stack: FancadeF => PointerChain[Fancade] = scheme.cata(flatten)
def render(f: FancadeF): Level = {
val pointerChain = stack(f)
val blocks = pointerChain.map {
case (ind, fc) =>
Block(
Position(0, ind, 0),
fc.template
)
}
Level(
blocks.toSet,
???
)
}
}