signature TREE = sig type ('k, 'v) t val empty: ('k, 'v) t val insert: ('k -> 'k -> order) -> ('k, 'v) t -> 'k -> 'v -> 'v option * ('k, 'v) t val lookup: ('k -> 'k -> order) -> ('k, 'v) t -> 'k -> 'v option val lookup2: ('k -> 'k -> order) -> ('k, 'v) t -> 'k -> ('v -> 'v option * 'a) * 'a -> 'a * ('k, 'v) t val print: ('k, 'v) t -> ('k -> string) -> ('v -> string) -> unit end