Copyright | (c) Ivan Lazar Miljenovic |
---|---|

License | 3-Clause BSD-style |

Maintainer | Ivan.Miljenovic@gmail.com |

Safe Haskell | None |

Language | Haskell2010 |

This module is based upon the *dotgen* library by Andy Gill:
http://hackage.haskell.org/package/dotgen

It provides a monadic interface for constructing generalised Dot
graphs. Note that this does *not* have an instance for `DotRepr`

(e.g. what would be the point of the `fromCanonical`

function, as
you can't do anything with the result): it is purely for
construction purposes. Use the generalised Dot graph instance for
printing, etc.

Note that the generalised Dot graph types are *not* re-exported, in
case it causes a clash with other modules you may choose to import.

The example graph in Data.GraphViz.Types can be written as:

digraph (Str "G") $ do cluster (Int 0) $ do graphAttrs [style filled, color LightGray] nodeAttrs [style filled, color White] "a0" --> "a1" "a1" --> "a2" "a2" --> "a3" graphAttrs [textLabel "process #1"] cluster (Int 1) $ do nodeAttrs [style filled] "b0" --> "b1" "b1" --> "b2" "b2" --> "b3" graphAttrs [textLabel "process #2", color Blue] "start" --> "a0" "start" --> "b0" "a1" --> "b3" "b2" --> "a3" "a3" --> "end" "b3" --> "end" node "start" [shape MDiamond] node "end" [shape MSquare]

## Synopsis

- type Dot n = DotM n ()
- data DotM n a
- data GraphID
- digraph :: GraphID -> DotM n a -> DotGraph n
- digraph' :: DotM n a -> DotGraph n
- graph :: GraphID -> DotM n a -> DotGraph n
- graph' :: DotM n a -> DotGraph n
- graphAttrs :: Attributes -> Dot n
- nodeAttrs :: Attributes -> Dot n
- edgeAttrs :: Attributes -> Dot n
- subgraph :: GraphID -> DotM n a -> Dot n
- anonSubgraph :: DotM n a -> Dot n
- cluster :: GraphID -> DotM n a -> Dot n
- node :: n -> Attributes -> Dot n
- node' :: n -> Dot n
- edge :: n -> n -> Attributes -> Dot n
- (-->) :: n -> n -> Dot n
- (<->) :: n -> n -> Dot n

# Documentation

The actual monad; as with `Dot`

but allows you to return a value
within the do-block. The actual implementation is based upon the
Writer monad.

A polymorphic type that covers all possible ID values allowed by
Dot syntax. Note that whilst the `ParseDot`

and `PrintDot`

instances for `String`

will properly take care of the special
cases for numbers, they are treated differently here.

# Creating a generalised DotGraph.

digraph :: GraphID -> DotM n a -> DotGraph n Source #

Create a directed dot graph with the specified graph ID.

graph :: GraphID -> DotM n a -> DotGraph n Source #

Create a undirected dot graph with the specified graph ID.

# Adding global attributes.

graphAttrs :: Attributes -> Dot n Source #

Add graph/sub-graph/cluster attributes.

nodeAttrs :: Attributes -> Dot n Source #

Add global node attributes.

edgeAttrs :: Attributes -> Dot n Source #

Add global edge attributes

# Adding items to the graph.

## Subgraphs and clusters

anonSubgraph :: DotM n a -> Dot n Source #

Add an anonymous subgraph to the graph.

It is highly recommended you use `subgraph`

instead.

## Nodes

node :: n -> Attributes -> Dot n Source #

Add a node to the graph.

## Edges

If you wish to use something analogous to Dot's ability to write multiple edges with in-line subgraphs such as:

{a b c} -> {d e f}

Then you can use `-->`

and `<->`

in combination with monadic
traversal functions such as `traverse_`

, `for_`

, `mapM_`

, `forM_`

and `zipWithM_`

; for example:

("a" -->) `traverse_` ["d", "e", "f"] ["a", "b", "c"] `for_` (--> "d") zipWithM_ (-->) ["a", "b", "c"] ["d", "e", "f"]

edge :: n -> n -> Attributes -> Dot n Source #

Add an edge to the graph.