baltree: basic balanced binary trees

This module implements balanced ordered binary trees.
All operations over binary trees are applicative (no sideeffects).
The set and map modules are based on this module.
This modules gives a more direct access to the internals of the
binary tree implementation than the set and map abstractions,
but is more delicate to use and not as safe. For advanced users only.
type 'a t = Empty  Node of 'a t * 'a * 'a t * int

The type of trees containing elements of type 'a.
Empty is the empty tree (containing no elements).
type 'a contents = Nothing  Something of 'a

Used with the functions modify and split, to represent
the presence or the absence of an element in a tree.
value add: ('a > int) > 'a > 'a t > 'a t

add f x t inserts the element x into the tree t.
f is an ordering function: f y must return 0 if
x and y are equal (or equivalent), a negative integer if
x is smaller than y, and a positive integer if x is
greater than y. The tree t is returned unchanged if
it already contains an element equivalent to x (that is,
an element y such that f y is 0).
The ordering f must be consistent with the orderings used
to build t with add, remove, modify or split
operations.
value contains: ('a > int) > 'a t > bool

contains f t checks whether t contains an element
satisfying f, that is, an element x such
that f x is 0. f is an ordering function with the same
constraints as for add. It can be coarser (identify more
elements) than the orderings used to build t, but must be
consistent with them.
value find: ('a > int) > 'a t > 'a

Same as contains, except that find f t returns the element x
such that f x is 0, or raises Not_found if none has been
found.
value remove: ('a > int) > 'a t > 'a t

remove f t removes one element x of t such that f x is 0.
f is an ordering function with the same constraints as for add.
t is returned unchanged if it does not contain any element
satisfying f. If several elements of t satisfy f,
only one is removed.
value modify: ('a > int) > ('a contents > 'a contents) > 'a t > 'a t

General insertion/modification/deletion function.
modify f g t searchs t for an element x satisfying the
ordering function f. If one is found, g is applied to
Something x; if g returns Nothing, the element x
is removed; if g returns Something y, the element y
replaces x in the tree. (It is assumed that x and y
are equivalent, in particular, that f y is 0.)
If the tree does not contain any x satisfying f,
g is applied to Nothing; if it returns Nothing,
the tree is returned unchanged; if it returns Something x,
the element x is inserted in the tree. (It is assumed that
f x is 0.) The functions add and remove are special cases
of modify, slightly more efficient.
value split: ('a > int) > 'a t > 'a t * 'a contents * 'a t

split f t returns a triple (less, elt, greater) where
less is a tree containing all elements x of t such that
f x is negative, greater is a tree containing all
elements x of t such that f x is positive, and elt
is Something x if t contains an element x such that
f x is 0, and Nothing otherwise.
value compare: ('a > 'a > int) > 'a t > 'a t > int

Compare two trees. The first argument f is a comparison function
over the tree elements: f e1 e2 is zero if the elements e1 and
e2 are equal, negative if e1 is smaller than e2,
and positive if e1 is greater than e2. compare f t1 t2
compares the fringes of t1 and t2 by lexicographic extension
of f.