module Data.Graph.Inductive.Dot
( fglToDot, fglToDotString, fglToDotUnlabeled, fglToDotGeneric
, showDot
) where
import Control.Monad
import Data.Graph.Inductive
import Text.Dot
fglToDot :: (Show a, Show b, Graph gr) => gr a b -> Dot ()
fglToDot gr = fglToDotGeneric gr show show id
fglToDotString :: Graph gr => gr String String -> Dot ()
fglToDotString gr = fglToDotGeneric gr id id id
fglToDotUnlabeled :: Graph gr => gr a b -> Dot ()
fglToDotUnlabeled gr = fglToDotGeneric gr undefined undefined (const [])
fglToDotGeneric :: Graph gr => gr a b -> (a -> String) -> (b -> String) -> ([(String,String)] -> [(String,String)]) -> Dot ()
fglToDotGeneric gr nodeConv edgeConv attrConv = do
let es = labEdges gr
ns = labNodes gr
mapM_ (\(n,p) -> userNode (userNodeId n) (attrConv [("label", nodeConv p)])) ns
mapM_ (\(a,b,p) -> edge (userNodeId a) (userNodeId b) (attrConv [("label", edgeConv p)])) es