{-# LANGUAGE OverloadedStrings #-} module CBN.Trace.Graph (render) where import CBN.Eval import CBN.Heap import CBN.Pretty import CBN.Trace import qualified CBN.Util.Doc as Doc import qualified CBN.Util.Doc.Rendered as Rendered import CBN.Util.Doc.Style import Data.Monoid ((<>)) import Data.Set (Set) import qualified Data.Set as Set import qualified Data.Text as T render :: Trace -> String render tr = "digraph G {\n" ++ "node [ fontname=monospace, shape=plaintext ];\n" ++ go 0 tr ++ "}" where go :: Int -> Trace -> String go index (Trace (hp, t) cont) = case cont of TraceWHNF _ -> mkFrame Set.empty "whnf" TraceStuck err -> mkFrame Set.empty (mkErr err) TraceStopped -> mkFrame Set.empty "stopped" TraceStep d tr' -> mkFrame Set.empty (mkDesc d) ++ go (index + 1) tr' TraceGC ps tr' -> mkFrame ps "gc" ++ go (index + 1) tr' where mkFrame :: Set Ptr -> T.Text -> String mkFrame garbage status = T.unpack $ setLabel index ("<