Module type Imperative.S

module type S = sig .. end
Signature of imperative graphs.


Edges may be labeled or not: Vertices may be concrete or abstract: How to choose between concrete and abstract vertices for my graph implementation?

Usually, if you fall into one of the following cases, use abstract vertices:

In other cases, it is certainly easier to use concrete vertices.
module Concrete: 
functor (V : Sig.COMPARABLE) -> Sig.I 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
Imperative Unlabeled Graphs.
module Abstract: 
functor (V : Sig.ANY_TYPE) -> Sig.IM with type V.label = V.t and type E.label = unit
Abstract Imperative Unlabeled Graphs.
module ConcreteLabeled: 
functor (V : Sig.COMPARABLE) ->
functor (E : Sig.ORDERED_TYPE_DFT) -> Sig.I with type V.t = V.t and type V.label = V.t and type E.t = V.t * E.t * V.t and type E.label = E.t
Imperative Labeled Graphs.
module AbstractLabeled: 
functor (V : Sig.ANY_TYPE) ->
functor (E : Sig.ORDERED_TYPE_DFT) -> Sig.IM with type V.label = V.t and type E.label = E.t
Abstract Imperative Labeled Graphs.