{- |

GraphViz (dot) rendering using the graphviz library.

-}

-- Copyright (c) 2009 Andy Gimblett - http://www.cs.swan.ac.uk/~csandy/
-- BSD Licence (see http://www.opensource.org/licenses/bsd-license.php)

module Data.FsmActions.GraphViz (
    fsmToDot
) where

import Data.GraphViz
import Data.Graph.Inductive.Graph (Graph)

import Data.FsmActions
import Data.FsmActions.FGL

-- | Turn an FSM into a 'Data.GraphViz.DotGraph', trimming any
-- self-loops which aren't sources of nondeterminism.
fsmToDot :: (Ord sy, Show sy) => FSM sy -> DotGraph
fsmToDot = fglDot . flip fsmToFGL Trim

-- Turn an FGL into a DotGraph with labelled edges.
fglDot :: (Ord b, Show b, Graph gr) => gr a b -> DotGraph
fglDot g = graphToDot g [] nodeFn edgeFn
    where nodeFn _ = []
          edgeFn (_, _, label) = [Label $ Left $ show label]