57 lines
1.5 KiB
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,
|
|
???
|
|
)
|
|
}
|
|
|
|
}
|