module Pretty (pretty,prettyDef,prettyGraph,prettyNodes,prettyNode) where
import Text.PrettyPrint.HughesPJ
import Graph
import Control.Monad (liftM2)
import Control.Monad.Reader () -- Monad ((->) e)

pretty::[(String,Graph)]->Doc
pretty units = vcat (map prettyDef units)

prettyGraph graph = prettyDef ("?",graph)

prettyDef::(String,Graph)->Doc
prettyDef (name,graph) =
    foldl (<+>) (text "def") (map text (inlets graph ++ ["["++name++"]"] ++ outlets graph ++ ["="])) $+$
    nest 2 (prettyNodes (nodes graph))

prettyNodes nodes =
  (vcat $ punctuate (text ";") $ map prettyNode nodes) <> text "."

prettyNode::Node->Doc
prettyNode node =
    sep (map text (inputs node)) <+>
    (case (op node) of
       Add -> text "+"
       Sub -> text "-"
       Mul -> text "*"
       Div -> text "/"
       Get var -> text "["<>text"get"<+>text var<>text"]"
       Put var -> text "["<>text"put"<+>text var<>text"]"
       App fn -> text "[" <>text fn<>text"]") <+>
    sep (map text (outputs node))
