Irmin, a distributed database that follows the same design principles as Git
Module Irmin . Node . Graph


module N : Store


Node Graphs

type 'a t = 'a N.t

The type for store handles.

type metadata = N.Metadata.t

The type for node metadata.

val metadata_t : metadata Type.t
type contents_key = N.Contents.key

The type of user-defined contents.

val contents_key_t : contents_key Type.t
type node_key = N.key

The type for node values.

val node_key_t : node_key Type.t
type step = N.Path.step

The type of steps. A step is used to pass from one node to another.

val step_t : step Type.t
type path = N.Path.t

The type of store paths. A path is composed of steps.

val path_t : path Type.t
type value = [
| `Node of node_key
| `Contents of contents_key * metadata

The type for store values.

val value_t : value Type.t
val empty : [> Perms.write ] t -> node_key Lwt.t

The empty node.

val v : [> Perms.write ] t -> (step * value) list -> node_key Lwt.t

v t n is a new node containing n.

val list : [> ] t -> node_key -> (step * value) list Lwt.t

list t n is the contents of the node n.

val find : [> ] t -> node_key -> path -> value option Lwt.t

find t n p is the contents of the path p starting form n.

val add : [> Perms.read_write ] t -> node_key -> path -> value -> node_key Lwt.t

add t n p v is the node x such that find t x p is Some v and it behaves the same n for other operations.

val remove : [> Perms.read_write ] t -> node_key -> path -> node_key Lwt.t

remove t n path is the node x such that find t x is None and it behhaves then same as n for other operations.

val closure : [> ] t -> min:node_key list -> max:node_key list -> node_key list Lwt.t

closure t min max is the unordered list of nodes n reachable from a node of max along a path which: (i) either contains no min or (ii) it ends with a min.

Note: Both min and max are subsets of n.

val iter : [> ] t -> min:node_key list -> max:node_key list -> ?node:( node_key -> unit Lwt.t ) -> ?contents:( contents_key -> unit Lwt.t ) -> ?edge:( node_key -> node_key -> unit Lwt.t ) -> ?skip_node:( node_key -> bool Lwt.t ) -> ?skip_contents:( contents_key -> bool Lwt.t ) -> ?rev:bool -> unit -> unit Lwt.t

iter t min max node edge skip rev () iterates in topological order over the closure of t.

It applies the following functions while traversing the graph: node on the nodes; edge n predecessor_of_n on the directed edges; skip_node n to not include a node n, its predecessors and the outgoing edges of n and skip_contents c to not include content c.

If rev is true (the default) then the graph is traversed in the reverse order: node n is applied only after it was applied on all its predecessors; edge n p is applied after node n. Note that edge n p is applied even if p is skipped.