sig
  type 'a t
  type key
  type 'a elt = 'a
  type 'a cursor
  type ('a, 'b) result = 'a
  type 'a key_ = key
  type 'a elt_ = 'a
  type ('a, 'b) map = 'b t
  type ('a, 'b, 'c) result_ = ('a, 'c) result
  val empty : ('a, 'b) map
  val is_empty : ('a, 'b) map -> bool
  val mem : 'a key_ -> ('a, 'b) map -> (bool, 'a, 'b) result_
  val add : 'a key_ -> 'b elt_ -> ('a, 'b) map -> ('a, 'b) map
  val singleton : 'a key_ -> 'b elt_ -> ('a, 'b) map
  val remove : 'a key_ -> ('a, 'b) map -> ('a, 'b) map
  val find : 'a key_ -> ('a, 'b) map -> ('b elt_, 'a, 'b) result_
  val min_key : ('a, 'b) map -> ('a key_, 'a, 'b) result_
  val max_key : ('a, 'b) map -> ('a key_, 'a, 'b) result_
  val min_keyval : ('a, 'b) map -> ('a key_ * 'b elt_, 'a, 'b) result_
  val max_keyval : ('a, 'b) map -> ('a key_ * 'b elt_, 'a, 'b) result_
  val cardinal : ('a, 'b) map -> int
  val iter : ('a key_ -> 'b elt_ -> unit) -> ('a, 'b) map -> unit
  val fold : ('-> 'b key_ -> 'c elt_ -> 'a) -> '-> ('b, 'c) map -> 'a
  val map : ('a elt_ -> 'b elt_) -> ('c, 'a) map -> ('c, 'b) map
  val mapi : ('a key_ -> 'b elt_ -> 'c elt_) -> ('a, 'b) map -> ('a, 'c) map
  val union :
    ('a key_ -> 'b elt_ -> 'b elt_ -> 'b elt_) ->
    ('a, 'b) map -> ('a, 'b) map -> ('a, 'b) map
  val inter :
    ('a key_ -> 'b elt_ -> 'b elt_ -> 'b elt_) ->
    ('a, 'b) map -> ('a, 'b) map -> ('a, 'b) map
  val diff :
    ('a key_ -> 'b elt_ -> 'b elt_ -> bool) ->
    ('a, 'b) map -> ('a, 'b) map -> ('a, 'b) map
  val well_formed : ('a, 'b) map -> bool
  val of_result : ('a, 'b, 'c) result_ -> 'a
  type ('a, 'b) cursor_ = 'b cursor
  val to_cursor : ('a, 'b) map -> ('a, 'b) cursor_
  val from_cursor : ('a, 'b) cursor_ -> ('a, 'b) map
  val at_top : ('a, 'b) cursor_ -> bool
  val at_left : ('a, 'b) cursor_ -> bool
  val at_right : ('a, 'b) cursor_ -> bool
  val move_up : ('a, 'b) cursor_ -> ('a, 'b) cursor_
  val move_down_left : ('a, 'b) cursor_ -> ('a, 'b) cursor_
  val move_down_right : ('a, 'b) cursor_ -> ('a, 'b) cursor_
  val went_left : ('a, 'b) cursor_ -> bool
  val went_right : ('a, 'b) cursor_ -> bool
  val has_value : ('a, 'b) cursor_ -> bool
  val get_value : ('a, 'b) cursor_ -> 'a key_ * 'b elt_
  val compare_keys : 'a t -> 'a t -> int
  val compare : ('-> '-> int) -> 'a t -> 'a t -> int
  val to_string : ('-> string) -> 'a t -> string
  val gen2 :
    (?size:int -> Random.State.t -> key) ->
    (?size:int -> Random.State.t -> 'a) ->
    ?size:int -> Random.State.t -> 'a t
  val gen1 :
    (?size:int -> Random.State.t -> 'a) ->
    ?size:int -> Random.State.t -> 'a t
end