Module Context.Tree

Tree provides immutable, in-memory partial mirror of the context, with lazy reads and delayed writes.

Trees are immutable and non-persistent (they disappear if the host crash), held in memory for efficiency, where reads are done lazily and writes are done only when needed, e.g. on Context.commit. If a key is modified twice, only the last value will be written to disk on commit.

include VIEW with type t := tree and type tree := tree with type key := key with type value := value

Getters

val mem : tree -> key -> bool Lwt.t

mem t k is an Lwt promise that resolves to true iff k is bound to a value in t.

val mem_tree : tree -> key -> bool Lwt.t

mem_tree t k is like mem but for trees.

val find : tree -> key -> value option Lwt.t

find t k is an Lwt promise that resolves to Some v if k is bound to the value v in t and None otherwise.

val find_tree : tree -> key -> tree option Lwt.t

find_tree t k is like find but for trees.

val list : tree -> ?offset:int -> ?length:int -> key -> (string * tree) list Lwt.t

list t key is the list of files and sub-nodes stored under k in t. The result order is not specified but is stable.

offset and length are used for pagination.

Setters

val add : tree -> key -> value -> tree Lwt.t

add t k v is an Lwt promise that resolves to c such that:

  • k is bound to v in c;
  • and c is similar to t otherwise.

If k was already bound in t to a value that is physically equal to v, the result of the function is a promise that resolves to t. Otherwise, the previous binding of k in t disappears.

val add_tree : tree -> key -> tree -> tree Lwt.t

add_tree is like add but for trees.

val remove : tree -> key -> tree Lwt.t

remove t k v is an Lwt promise that resolves to c such that:

  • k is unbound in c;
  • and c is similar to t otherwise.

Folding

val fold : ?depth:[ `Eq of int | `Le of int | `Lt of int | `Ge of int | `Gt of int ] -> tree -> key -> init:'a -> f:(key -> tree -> 'a -> 'a Lwt.t) -> 'a Lwt.t

fold ?depth t root ~init ~f recursively folds over the trees and values of t. The f callbacks are called with a key relative to root. f is never called with an empty key for values; i.e., folding over a value is a no-op.

Elements are traversed in lexical order of keys.

The depth is 0-indexed. If depth is set (by default it is not), then f is only called when the conditions described by the parameter is true:

  • Eq d folds over nodes and contents of depth exactly d.
  • Lt d folds over nodes and contents of depth strictly less than d.
  • Le d folds over nodes and contents of depth less than or equal to d.
  • Gt d folds over nodes and contents of depth strictly more than d.
  • Ge d folds over nodes and contents of depth more than or equal to d.
val empty : t -> tree

empty _ is the empty tree.

val is_empty : tree -> bool

is_empty t is true iff t is empty _.

val kind : tree -> [ `Value | `Tree ]

kind t is t's kind. It's either a tree node or a leaf value.

val to_value : tree -> value option Lwt.t

to_value t is an Lwt promise that resolves to Some v if t is a leaf tree and None otherwise. It is equivalent to find t [].

val of_value : t -> value -> tree Lwt.t

of_value _ v is an Lwt promise that resolves to the leaf tree v. Is is equivalent to add (empty _) [] v.

val hash : tree -> Context_hash.t

hash t is t's Merkle hash.

val equal : tree -> tree -> bool

equal x y is true iff x and y have the same Merkle hash.

Caches

val clear : ?depth:int -> tree -> unit

clear ?depth t clears all caches in the tree t for subtrees with a depth higher than depth. If depth is not set, all of the subtrees are cleared.