add more doc and functions to CCGraph

This commit is contained in:
Simon Cruanes 2015-06-12 17:11:05 +02:00
parent 271cbff3e3
commit f50846209b
2 changed files with 39 additions and 3 deletions

View file

@ -646,7 +646,13 @@ module type MAP = sig
val remove_edge : vertex -> vertex -> t -> t val remove_edge : vertex -> vertex -> t -> t
val add : vertex -> t -> t
(** Add a vertex, possibly with no outgoing edge *)
val remove : vertex -> t -> t val remove : vertex -> t -> t
(** Remove the vertex and all its outgoing edges.
Edges that point to the vertex are {b NOT} removed, they must be
manually removed with {!remove_edge} *)
val union : t -> t -> t val union : t -> t -> t
@ -656,10 +662,14 @@ module type MAP = sig
val of_list : (vertex * vertex) list -> t val of_list : (vertex * vertex) list -> t
val add_list : (vertex * vertex) list -> t -> t
val to_list : t -> (vertex * vertex) list val to_list : t -> (vertex * vertex) list
val of_seq : (vertex * vertex) sequence -> t val of_seq : (vertex * vertex) sequence -> t
val add_seq : (vertex * vertex) sequence -> t -> t
val to_seq : t -> (vertex * vertex) sequence val to_seq : t -> (vertex * vertex) sequence
end end
@ -700,6 +710,8 @@ module Map(O : Map.OrderedType) = struct
else {m with edges=M.add v1 set m.edges} else {m with edges=M.add v1 set m.edges}
with Not_found -> m with Not_found -> m
let add v m = { m with vertices=S.add v m.vertices }
let remove v m = let remove v m =
{ edges=M.remove v m.edges; vertices=S.remove v m.vertices } { edges=M.remove v m.edges; vertices=S.remove v m.vertices }
@ -718,14 +730,18 @@ module Map(O : Map.OrderedType) = struct
let vertices_l m = S.fold (fun v acc -> v::acc) m.vertices [] let vertices_l m = S.fold (fun v acc -> v::acc) m.vertices []
let of_list l = List.fold_left (fun m (v1,v2) -> add_edge v1 v2 m) empty l let add_list l m = List.fold_left (fun m (v1,v2) -> add_edge v1 v2 m) m l
let of_list l = add_list l empty
let to_list m = let to_list m =
M.fold M.fold
(fun v set acc -> S.fold (fun v' acc -> (v,v')::acc) set acc) (fun v set acc -> S.fold (fun v' acc -> (v,v')::acc) set acc)
m.edges [] m.edges []
let of_seq seq = Seq.fold (fun m (v1,v2) -> add_edge v1 v2 m) empty seq let add_seq seq m = Seq.fold (fun m (v1,v2) -> add_edge v1 v2 m) m seq
let of_seq seq = add_seq seq empty
let to_seq m k = M.iter (fun v set -> S.iter (fun v' -> k(v,v')) set) m.edges let to_seq m k = M.iter (fun v set -> S.iter (fun v' -> k(v,v')) set) m.edges
end end

View file

@ -37,6 +37,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This abstract notion of graph makes it possible to run the algorithms This abstract notion of graph makes it possible to run the algorithms
on any user-specific type that happens to have a graph structure. on any user-specific type that happens to have a graph structure.
Many graph algorithms here take a sequence of vertices as input.
If the user only has a single vertex (e.g., for a topological sort
from a given vertex), she can use [Seq.return x] to build a sequence
of one element.
@since NEXT_RELEASE *) @since NEXT_RELEASE *)
type 'a sequence = ('a -> unit) -> unit type 'a sequence = ('a -> unit) -> unit
@ -337,7 +342,12 @@ val mk_mut_tbl : ?eq:('v -> 'v -> bool) ->
('v, ('v * 'a * 'v)) mut_graph ('v, ('v * 'a * 'v)) mut_graph
(** make a new mutable graph from a Hashtbl. Edges are labelled with type ['a] *) (** make a new mutable graph from a Hashtbl. Edges are labelled with type ['a] *)
(** {2 Immutable Graph} *) (** {2 Immutable Graph}
A classic implementation of a graph structure on totally ordered vertices,
with unlabelled edges. The graph allows to add and remove edges and vertices,
and to iterate on edges and vertices.
*)
module type MAP = sig module type MAP = sig
type vertex type vertex
@ -352,7 +362,13 @@ module type MAP = sig
val remove_edge : vertex -> vertex -> t -> t val remove_edge : vertex -> vertex -> t -> t
val add : vertex -> t -> t
(** Add a vertex, possibly with no outgoing edge *)
val remove : vertex -> t -> t val remove : vertex -> t -> t
(** Remove the vertex and all its outgoing edges.
Edges that point to the vertex are {b NOT} removed, they must be
manually removed with {!remove_edge} *)
val union : t -> t -> t val union : t -> t -> t
@ -362,10 +378,14 @@ module type MAP = sig
val of_list : (vertex * vertex) list -> t val of_list : (vertex * vertex) list -> t
val add_list : (vertex * vertex) list -> t -> t
val to_list : t -> (vertex * vertex) list val to_list : t -> (vertex * vertex) list
val of_seq : (vertex * vertex) sequence -> t val of_seq : (vertex * vertex) sequence -> t
val add_seq : (vertex * vertex) sequence -> t -> t
val to_seq : t -> (vertex * vertex) sequence val to_seq : t -> (vertex * vertex) sequence
end end