Skip to content

Instantly share code, notes, and snippets.

@yilinwei
Created June 10, 2017 15:16
Show Gist options
  • Save yilinwei/c1375c480b8af4e7c98670e946299883 to your computer and use it in GitHub Desktop.
Save yilinwei/c1375c480b8af4e7c98670e946299883 to your computer and use it in GitHub Desktop.
def tree[F[_[_]]](implicit T: BirecursiveT[F]): Algebra[SExp, F[RTree[String, ?]]] = {
case Nil => RTree.Node(List.empty[F[RTree[String, ?]]]).embed
case True => RTree.Leaf("t").narrow[F[RTree[String, ?]]].embed
case Int(v) => RTree.Leaf(v.toString).narrow[F[RTree[String, ?]]].embed
case Keyword(k) => RTree.Leaf(s":$k").narrow[F[RTree[String, ?]]].embed
case Symbol(s) => RTree.Leaf(s"'$s").narrow[F[RTree[String, ?]]].embed
case Char(c) => RTree.Leaf(s"?$c").narrow[F[RTree[String, ?]]].embed
case Pair(l, r) => r.project match {
case RTree.Node(t) => RTree.Node(l :: t).embed
case RTree.Leaf(r) => RTree.Leaf(s"($l . $r)").narrow[F[RTree[String, ?]]].embed
}
}
val show: Algebra[RTree[String, ?], String] = {
case Node(Nil) => "nil"
case Node(xs) => s"""(${xs.mkString(" ")})"""
case Leaf(s) => s
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment