# Functor Persistent.S.Concrete

    module Concrete: functor (V : Sig.COMPARABLE) -> Sig.P  with type V.t = V.t and type V.label = V.t and type E.t = V.t * V.t
    	  and type E.label = unit

Persistent Unlabeled Graphs.

Parameters:

`V` | : | `Sig.COMPARABLE`

    include Sig.G

A persistent graph is a graph.

    val empty : t

The empty graph.

    val add_vertex : t -> vertex -> t

`add_vertex g v` adds the vertex `v` to the graph `g`. Just return `g` if `v` is already in `g`.

    val remove_vertex : t -> vertex -> t

`remove g v` removes the vertex `v` from the graph `g` (and all the edges going from `v` in `g`). Just return `g` if `v` is not in `g`.

Time complexity for ocamlgraph implementations: O(|V|*ln(|V|)) for unlabeled graphs and O(|V|*max(ln(|V|),D)) for labeled graphs. D is the maximal degree of the graph.

    val add_edge : t -> vertex -> vertex -> t

`add_edge g v1 v2` adds an edge from the vertex `v1` to the vertex `v2` in the graph `g`. Add also `v1` (resp. `v2`) in `g` if `v1` (resp. `v2`) is not in `g`. Just return `g` if this edge is already in `g`.

    val add_edge_e : t -> edge -> t

`add_edge_e g e` adds the edge `e` in the graph `g`. Add also `E.src e` (resp. `E.dst e`) in `g` if `E.src e` (resp. `E.dst e`) is not in `g`. Just return `g` if `e` is already in `g`.

    val remove_edge : t -> vertex -> vertex -> t

`remove_edge g v1 v2` removes the edge going from `v1` to `v2` from the graph `g`. If the graph is labelled, all the edges going from `v1` to `v2` are removed from `g`. Just return `g` if this edge is not in `g`.
Raises `Invalid_argument` if `v1` or `v2` are not in `g`.

    val remove_edge_e : t -> edge -> t

`remove_edge_e g e` removes the edge `e` from the graph `g`. Just return `g` if `e` is not in `g`.
Raises `Invalid_argument` if `E.src e` or `E.dst e` are not in `g`.