module Data.Comp.Render where
import Data.Comp
import Data.Comp.Derive
import Data.Comp.Show ()
import Data.Foldable (toList)
import Data.Tree (Tree (..))
import Data.Tree.View
class (Functor f, Foldable f, ShowConstr f) => Render f where
stringTreeAlg :: Alg f (Tree String)
stringTreeAlg f = Node (showConstr f) $ toList f
stringTree :: Render f => Term f -> Tree String
stringTree = cata stringTreeAlg
showTerm :: Render f => Term f -> String
showTerm = showTree . stringTree
drawTerm :: Render f => Term f -> IO ()
drawTerm = putStrLn . showTerm
writeHtmlTerm :: Render f => FilePath -> Term f -> IO ()
writeHtmlTerm file = writeHtmlTree file . fmap (\n -> NodeInfo n "") . stringTree
$(derive [liftSum] [''Render])