Copyright | (c) Andrey Mokhov 2016-2017 |
---|---|

License | MIT (see the file LICENSE) |

Maintainer | andrey.mokhov@gmail.com |

Stability | experimental |

Safe Haskell | None |

Language | Haskell2010 |

**Alga** is a library for algebraic construction and manipulation of graphs
in Haskell. See this paper for the
motivation behind the library, the underlying theory, and implementation details.

This module defines basic data types and functions for exporting graphs in textual and binary formats. Algebra.Graph.Export.Dot provides DOT-specific functionality.

- data Doc s
- literal :: s -> Doc s
- render :: Monoid s => Doc s -> s
- (<+>) :: (Eq s, IsString s, Monoid s) => Doc s -> Doc s -> Doc s
- brackets :: IsString s => Doc s -> Doc s
- doubleQuotes :: IsString s => Doc s -> Doc s
- indent :: IsString s => Int -> Doc s -> Doc s
- unlines :: IsString s => [Doc s] -> Doc s
- export :: (Ord a, ToGraph g, ToVertex g ~ a) => (a -> Doc s) -> (a -> a -> Doc s) -> g -> Doc s

# Constructing and exporting documents

An abstract document type, where `s`

is the type of strings or words (text
or binary). `Doc`

`s`

is a `Monoid`

, therefore `mempty`

corresponds to the
empty document and two documents can be concatenated with `mappend`

(or
operator `<>`

). Note that most functions on `Doc`

`s`

require
that the underlying type `s`

is also a `Monoid`

.

literal :: s -> Doc s Source #

Construct a document comprising a single string or word. If `s`

is an
instance of class `IsString`

, then documents of type `Doc`

`s`

can be
constructed directly from string literals (see the second example below).

literal "Hello, " <> literal "World!" == literal "Hello, World!" literal "I am just a string literal" == "I am just a string literal" literal`mempty`

==`mempty`

`render`

. literal ==`id`

literal .`render`

==`id`

# Common combinators for text documents

brackets :: IsString s => Doc s -> Doc s Source #

Wrap a document in square brackets.

```
brackets "i" == "[i]"
brackets
````mempty`

== "[]"

doubleQuotes :: IsString s => Doc s -> Doc s Source #

Wrap a document into double quotes.

```
doubleQuotes "/path/with spaces" == "\"/path/with spaces\""
doubleQuotes (doubleQuotes
````mempty`

) == "\"\"\"\""

# Generic graph export

export :: (Ord a, ToGraph g, ToVertex g ~ a) => (a -> Doc s) -> (a -> a -> Doc s) -> g -> Doc s Source #

Export a graph into a document given two functions that construct documents
for individual vertices and edges. The order of export is: vertices, sorted
by `Ord`

`a`

, and then edges, sorted by `Ord`

`(a, a)`

.

For example:

vDoc x =`literal`

(`show`

x) <> "\n" eDoc x y =`literal`

(`show`

x) <> " -> " <>`literal`

(`show`

y) <> "\n" > putStrLn $`render`

$ export vDoc eDoc (1 + 2 * (3 + 4) ::`Graph`

Int) 1 2 3 4 2 -> 3 2 -> 4