mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-07 11:45:31 -05:00
add more doc and functions to CCGraph
This commit is contained in:
parent
271cbff3e3
commit
f50846209b
2 changed files with 39 additions and 3 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue