sig
  type 'a t
  type 'a tree
  type key
  val empty : 'a t
  val singleton : key -> '-> 'a t
  val of_alist : (key * 'a) list -> [ `Duplicate_key of key | `Ok of 'a t ]
  val of_alist_exn : (key * 'a) list -> 'a t
  val of_alist_multi : (key * 'a) list -> 'a list t
  val of_alist_fold :
    (key * 'a) list -> init:'-> f:('-> '-> 'b) -> 'b t
  val of_sorted_array : (key * 'a) array -> 'a t Or_error.t
  val of_sorted_array_unchecked : (key * 'a) array -> 'a t
  val of_tree : 'a tree -> 'a t
  val invariants : 'a t -> bool
  val is_empty : 'a t -> bool
  val length : 'a t -> int
  val add : 'a t -> key:key -> data:'-> 'a t
  val add_multi : 'a list t -> key:key -> data:'-> 'a list t
  val change : 'a t -> key -> ('a option -> 'a option) -> 'a t
  val find : 'a t -> key -> 'a option
  val find_exn : 'a t -> key -> 'a
  val remove : 'a t -> key -> 'a t
  val mem : 'a t -> key -> bool
  val iter : 'a t -> f:(key:key -> data:'-> unit) -> unit
  val iter2 :
    'a t ->
    'b t ->
    f:(key:key ->
       data:[ `Both of 'a * '| `Left of '| `Right of 'b ] -> unit) ->
    unit
  val map : 'a t -> f:('-> 'b) -> 'b t
  val mapi : 'a t -> f:(key:key -> data:'-> 'b) -> 'b t
  val fold : 'a t -> init:'-> f:(key:key -> data:'-> '-> 'b) -> 'b
  val fold_right :
    'a t -> init:'-> f:(key:key -> data:'-> '-> 'b) -> 'b
  val filter : 'a t -> f:(key:key -> data:'-> bool) -> 'a t
  val filter_map : 'a t -> f:('-> 'b option) -> 'b t
  val filter_mapi : 'a t -> f:(key:key -> data:'-> 'b option) -> 'b t
  val compare_direct : ('-> '-> int) -> 'a t -> 'a t -> int
  val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
  val keys : 'a t -> key list
  val data : 'a t -> 'a list
  val to_alist : 'a t -> (key * 'a) list
  val validate :
    name:(key -> string) -> 'Validate.check -> 'a t Validate.check
  val merge :
    'a t ->
    'b t ->
    f:(key:key ->
       [ `Both of 'a * '| `Left of '| `Right of 'b ] -> 'c option) ->
    'c t
  val symmetric_diff :
    'a t ->
    'a t ->
    data_equal:('-> '-> bool) ->
    (key * [ `Left of '| `Right of '| `Unequal of 'a * 'a ]) list
  val min_elt : 'a t -> (key * 'a) option
  val min_elt_exn : 'a t -> key * 'a
  val max_elt : 'a t -> (key * 'a) option
  val max_elt_exn : 'a t -> key * 'a
  val for_all : 'a t -> f:('-> bool) -> bool
  val exists : 'a t -> f:('-> bool) -> bool
  val fold_range_inclusive :
    'a t ->
    min:key -> max:key -> init:'-> f:(key:key -> data:'-> '-> 'b) -> 'b
  val range_to_alist : 'a t -> min:key -> max:key -> (key * 'a) list
  val prev_key : 'a t -> key -> (key * 'a) option
  val next_key : 'a t -> key -> (key * 'a) option
  val rank : 'a t -> key -> int option
  val to_tree : 'a t -> 'a tree
end