sig
  type key = C.t
  type 'a t = 'Core_map.Make(C).t
  module T : sig type 'a key = key type ('a, 'b) t = 'b t end
  type 'a sexpable = 'a t
  val sexp_of_t : ('-> Sexplib.Sexp.t) -> 'a sexpable -> Sexplib.Sexp.t
  val t_of_sexp : (Sexplib.Sexp.t -> 'a) -> Sexplib.Sexp.t -> 'a sexpable
  val empty : 'a t
  val singleton : key -> '-> 'a t
  val is_empty : 'a t -> bool
  val cardinal : 'a t -> int
  val add : key:key -> data:'-> 'a t -> 'a t
  val add_multi : key:key -> data:'-> 'a list t -> 'a list t
  val change : 'a t -> key -> ('a option -> 'a option) -> 'a t
  val find_exn : 'a t -> key -> 'a
  val find : 'a t -> key -> 'a option
  val remove : 'a t -> key -> 'a t
  val mem : 'a t -> key -> bool
  val iter : f:(key:key -> data:'-> unit) -> 'a t -> unit
  val map : f:('-> 'b) -> 'a t -> 'b t
  val mapi : f:(key:key -> data:'-> 'b) -> 'a t -> 'b t
  val fold : f:(key:key -> data:'-> '-> 'b) -> 'a t -> init:'-> 'b
  val fold_right :
    f:(key:key -> data:'-> '-> 'b) -> 'a t -> init:'-> 'b
  val filter : f:(key:key -> data:'-> bool) -> 'a t -> 'a t
  val filter_map : f:('-> 'b option) -> 'a t -> 'b t
  val filter_mapi : f:(key:key -> data:'-> 'b option) -> 'a t -> 'b t
  val compare : ('-> '-> int) -> 'a t -> 'a t -> int
  val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
  val keys : 'a t -> key list
  val has_key : 'a t -> key -> bool
  val data : 'a t -> 'a list
  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 to_alist : 'a t -> (key * 'a) list
  val combine_alist :
    (key * 'a) list -> init:'-> f:('-> '-> 'b) -> 'b t
  val merge :
    f:(key:key -> 'a option -> 'b option -> 'c option) ->
    'a t -> 'b t -> 'c t
  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 : f:('-> bool) -> 'a t -> bool
  val exists : f:('-> bool) -> 'a t -> 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 option
  val next_key : 'a t -> key -> key option
  val rank : 'a t -> key -> int option
end