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 :: forall a b (gr :: * -> * -> *).
(Show a, Show b, Graph gr) =>
gr a b -> Dot ()
fglToDot gr a b
gr = gr a b
-> (a -> String)
-> (b -> String)
-> ([(String, String)] -> [(String, String)])
-> Dot ()
forall (gr :: * -> * -> *) a b.
Graph gr =>
gr a b
-> (a -> String)
-> (b -> String)
-> ([(String, String)] -> [(String, String)])
-> Dot ()
fglToDotGeneric gr a b
gr a -> String
forall a. Show a => a -> String
show b -> String
forall a. Show a => a -> String
show [(String, String)] -> [(String, String)]
forall a. a -> a
id
fglToDotString :: Graph gr => gr String String -> Dot ()
fglToDotString :: forall (gr :: * -> * -> *). Graph gr => gr String String -> Dot ()
fglToDotString gr String String
gr = gr String String
-> (String -> String)
-> (String -> String)
-> ([(String, String)] -> [(String, String)])
-> Dot ()
forall (gr :: * -> * -> *) a b.
Graph gr =>
gr a b
-> (a -> String)
-> (b -> String)
-> ([(String, String)] -> [(String, String)])
-> Dot ()
fglToDotGeneric gr String String
gr String -> String
forall a. a -> a
id String -> String
forall a. a -> a
id [(String, String)] -> [(String, String)]
forall a. a -> a
id
fglToDotUnlabeled :: Graph gr => gr a b -> Dot ()
fglToDotUnlabeled :: forall (gr :: * -> * -> *) a b. Graph gr => gr a b -> Dot ()
fglToDotUnlabeled gr a b
gr = gr a b
-> (a -> String)
-> (b -> String)
-> ([(String, String)] -> [(String, String)])
-> Dot ()
forall (gr :: * -> * -> *) a b.
Graph gr =>
gr a b
-> (a -> String)
-> (b -> String)
-> ([(String, String)] -> [(String, String)])
-> Dot ()
fglToDotGeneric gr a b
gr a -> String
forall a. HasCallStack => a
undefined b -> String
forall a. HasCallStack => a
undefined ([(String, String)] -> [(String, String)] -> [(String, String)]
forall a b. a -> b -> a
const [])
fglToDotGeneric :: Graph gr => gr a b -> (a -> String) -> (b -> String) -> ([(String,String)] -> [(String,String)]) -> Dot ()
fglToDotGeneric :: forall (gr :: * -> * -> *) a b.
Graph gr =>
gr a b
-> (a -> String)
-> (b -> String)
-> ([(String, String)] -> [(String, String)])
-> Dot ()
fglToDotGeneric gr a b
gr a -> String
nodeConv b -> String
edgeConv [(String, String)] -> [(String, String)]
attrConv = do
let es :: [LEdge b]
es = gr a b -> [LEdge b]
forall a b. gr a b -> [LEdge b]
forall (gr :: * -> * -> *) a b. Graph gr => gr a b -> [LEdge b]
labEdges gr a b
gr
ns :: [LNode a]
ns = gr a b -> [LNode a]
forall a b. gr a b -> [LNode a]
forall (gr :: * -> * -> *) a b. Graph gr => gr a b -> [LNode a]
labNodes gr a b
gr
(LNode a -> Dot ()) -> [LNode a] -> Dot ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(Int
n,a
p) -> NodeId -> [(String, String)] -> Dot ()
userNode (Int -> NodeId
userNodeId Int
n) ([(String, String)] -> [(String, String)]
attrConv [(String
"label", a -> String
nodeConv a
p)])) [LNode a]
ns
(LEdge b -> Dot ()) -> [LEdge b] -> Dot ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\(Int
a,Int
b,b
p) -> NodeId -> NodeId -> [(String, String)] -> Dot ()
edge (Int -> NodeId
userNodeId Int
a) (Int -> NodeId
userNodeId Int
b) ([(String, String)] -> [(String, String)]
attrConv [(String
"label", b -> String
edgeConv b
p)])) [LEdge b]
es