{-# LANGUAGE OverloadedStrings #-} module CBN.Trace.Graph (render) where import Data.Set (Set) import Data.Maybe (listToMaybe) import qualified Data.Set as Set import qualified Data.Text as T import CBN.Eval import CBN.Heap import CBN.Pretty import CBN.Trace import CBN.Util.Doc.Style import qualified CBN.Util.Doc as Doc import qualified CBN.Util.Doc.Rendered as Rendered 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 Nothing "whnf" TraceStuck err -> mkFrame Set.empty Nothing (mkErr err) TraceStopped -> mkFrame Set.empty Nothing "stopped" TraceStep d tr' -> mkFrame Set.empty (mkFocus d) (mkDesc d) ++ go (index + 1) tr' TraceGC ps tr' -> mkFrame ps Nothing "gc" ++ go (index + 1) tr' TraceSelThunk _ ps tr' -> mkFrame ps Nothing "selector" ++ go (index + 1) tr' TraceInline ps tr' -> mkFrame ps Nothing "inline" ++ go (index + 1) tr' where mkFrame :: Set Ptr -> Maybe Ptr -> T.Text -> String mkFrame garbage focus status = T.unpack $ setLabel index ("<