map: association tables over ordered types

This module implements applicative association tables, also known as finite maps or dictionaries, given a total ordering function over the keys. All operations over maps are purely applicative (no side-effects). The implementation uses balanced binary trees, and therefore searching and insertion take time logarithmic in the size of the map.
type ('a, 'b) t
The type of maps from type 'a to type 'b.
value empty: ('a -> 'a -> int) -> ('a, 'b) t
The empty map. The argument is a total ordering function over the set elements. This is a two-argument function f such that f e1 e2 is zero if the elements e1 and e2 are equal, f e1 e2 is strictly negative if e1 is smaller than e2, and f e1 e2 is strictly positive if e1 is greater than e2. Examples: a suitable ordering function for type int is prefix -. You can also use the generic structural comparison function eq__compare.
value add: 'a -> 'b -> ('a, 'b) t -> ('a, 'b) t
add x y m returns a map containing the same bindings as m, plus a binding of x to y. Previous bindings for x in m are not removed, but simply hidden: they reappear after performing a remove operation. (This is the semantics of association lists.)
value find:'a -> ('a, 'b) t -> 'b
find x m returns the current binding of x in m, or raises Not_found if no such binding exists.
value remove: 'a -> ('a, 'b) t -> ('a, 'b) t
remove x m returns a map containing the same bindings as m except the current binding for x. The previous binding for x is restored if it exists. m is returned unchanged if x is not bound in m.
value iter: ('a -> 'b -> unit) -> ('a, 'b) t -> unit
iter f m applies f to all bindings in map m, discarding the results. f receives the key as first argument, and the associated value as second argument. The order in which the bindings are passed to f is unspecified. Only current bindings are presented to f: bindings hidden by more recent bindings are not passed to f.