`Tree.Make`

*Functor* building an implementation of the tree structure. The *functor* returns a structure containing a type `hash`

of digests and a type `t`

of trees (structurally equal to `t`

).

`module Hash : sig ... end`

`type hash = Hash.t`

`entry ~name perm node`

is the entry to `node`

with the name `name`

and the *mode* `perm`

.

`v entries`

ties all `entries`

into one tree object. It does not remove duplicate but re-order the given list such as:

```
Tree.digest (Tree.v [ { name= a; _ }; { name= b; _ }] ) ;;
- : hash = 8d14531846b95bfa3564b58ccfb7913a034323b8
Tree.digest (Tree.v [ { name= b; _ }; { name= a; _ }] ) ;;
- : hash = 8d14531846b95bfa3564b58ccfb7913a034323b8
```

`add entry tree`

returns a tree containing all elements of `tree`

, plus `entry`

. If `entry`

was already in `tree`

, `tree`

is unchanged.

`remove ~name tree`

returns a `tree`

containing all elements of `tree`

, except one with the name `name`

. If any entries of the given `tree`

don't have the name `name`

, `tree`

is returned unchanged.

`val is_empty : t -> bool`

`is_empty tree`

tests whether the given `tree`

is empty or not.

`digest t`

associates a `hash`

to any value of `t`

. It is guaranteed that if `x = y`

or `compare x y = 0`

, then `digest x = digest y`

.

`val hash : t -> int`

`hash blob`

associates a non-negative integer to any value of `t`

. It is guaranteed that if `x = y`

or `compare x y = 0`

, then `hash x = hash y`

.

`module Set : Stdlib.Set.S with type elt = t`

`module Map : Stdlib.Map.S with type key = t`

`val length : t -> int64`

`length tree`

is the length of the given tree object.