functor (Key : Key->
  sig
    module Key :
      sig
        type t = Key.t
        val compare : t -> t -> int
        val t_of_sexp : Sexplib.Sexp.t -> t
        val sexp_of_t : t -> Sexplib.Sexp.t
        type comparator
        val comparator : (t, comparator) Comparator.t_
      end
    type ('a, 'b, 'c) map = ('a, 'b, 'c) t
    type ('a, 'b, 'c) tree = ('a, 'b, 'c) tree
    type 'v t = (Key.t, 'v, Key.comparator) map
    type ('k, 'v, 'comparator) t_ = 'v t
    type 'a key_ = Key.t
    type ('a, 'b, 'c) options = ('a, 'b, 'c) Core_map_intf.without_comparator
    val empty :
      ('k, 'comparator, ('k, 'a, 'comparator) t_)
      Core_map_intf.without_comparator
    val singleton :
      ('k, 'comparator, 'k key_ -> '-> ('k, 'v, 'comparator) t_)
      Core_map_intf.without_comparator
    val of_sorted_array :
      ('k, 'comparator,
       ('k key_ * 'v) array -> ('k, 'v, 'comparator) t_ Or_error.t)
      Core_map_intf.without_comparator
    val of_sorted_array_unchecked :
      ('k, 'comparator, ('k key_ * 'v) array -> ('k, 'v, 'comparator) t_)
      Core_map_intf.without_comparator
    val of_alist :
      ('k, 'comparator,
       ('k key_ * 'v) list ->
       [ `Duplicate_key of 'k key_ | `Ok of ('k, 'v, 'comparator) t_ ])
      Core_map_intf.without_comparator
    val of_alist_exn :
      ('k, 'comparator, ('k key_ * 'v) list -> ('k, 'v, 'comparator) t_)
      Core_map_intf.without_comparator
    val of_alist_multi :
      ('k, 'comparator, ('k key_ * 'v) list -> ('k, 'v list, 'comparator) t_)
      Core_map_intf.without_comparator
    val of_alist_fold :
      ('k, 'comparator,
       ('k key_ * 'v1) list ->
       init:'v2 -> f:('v2 -> 'v1 -> 'v2) -> ('k, 'v2, 'comparator) t_)
      Core_map_intf.without_comparator
    val of_tree :
      ('k, 'comparator,
       ('k key_, 'v, 'comparator) tree -> ('k, 'v, 'comparator) t_)
      Core_map_intf.without_comparator
    val invariants :
      ('k, 'comparator, ('k, 'v, 'comparator) t_ -> bool)
      Core_map_intf.without_comparator
    val is_empty : ('a, 'b, 'c) t_ -> bool
    val length : ('a, 'b, 'c) t_ -> int
    val add :
      ('k, 'comparator,
       ('k, 'v, 'comparator) t_ ->
       key:'k key_ -> data:'-> ('k, 'v, 'comparator) t_)
      Core_map_intf.without_comparator
    val add_multi :
      ('k, 'comparator,
       ('k, 'v list, 'comparator) t_ ->
       key:'k key_ -> data:'-> ('k, 'v list, 'comparator) t_)
      Core_map_intf.without_comparator
    val change :
      ('k, 'comparator,
       ('k, 'v, 'comparator) t_ ->
       'k key_ -> ('v option -> 'v option) -> ('k, 'v, 'comparator) t_)
      Core_map_intf.without_comparator
    val find :
      ('k, 'comparator, ('k, 'v, 'comparator) t_ -> 'k key_ -> 'v option)
      Core_map_intf.without_comparator
    val find_exn :
      ('k, 'comparator, ('k, 'v, 'comparator) t_ -> 'k key_ -> 'v)
      Core_map_intf.without_comparator
    val remove :
      ('k, 'comparator,
       ('k, 'v, 'comparator) t_ -> 'k key_ -> ('k, 'v, 'comparator) t_)
      Core_map_intf.without_comparator
    val mem :
      ('k, 'comparator, ('k, 'a, 'comparator) t_ -> 'k key_ -> bool)
      Core_map_intf.without_comparator
    val iter : ('k, 'v, 'a) t_ -> f:(key:'k key_ -> data:'-> unit) -> unit
    val iter2 :
      ('k, 'comparator,
       ('k, 'v1, 'comparator) t_ ->
       ('k, 'v2, 'comparator) t_ ->
       f:(key:'k key_ ->
          data:[ `Both of 'v1 * 'v2 | `Left of 'v1 | `Right of 'v2 ] -> unit) ->
       unit)
      Core_map_intf.without_comparator
    val map :
      ('k, 'v1, 'comparator) t_ ->
      f:('v1 -> 'v2) -> ('k, 'v2, 'comparator) t_
    val mapi :
      ('k, 'v1, 'comparator) t_ ->
      f:(key:'k key_ -> data:'v1 -> 'v2) -> ('k, 'v2, 'comparator) t_
    val fold :
      ('k, 'v, 'b) t_ ->
      init:'-> f:(key:'k key_ -> data:'-> '-> 'a) -> 'a
    val fold_right :
      ('k, 'v, 'b) t_ ->
      init:'-> f:(key:'k key_ -> data:'-> '-> 'a) -> 'a
    val filter :
      ('k, 'comparator,
       ('k, 'v, 'comparator) t_ ->
       f:(key:'k key_ -> data:'-> bool) -> ('k, 'v, 'comparator) t_)
      Core_map_intf.without_comparator
    val filter_map :
      ('k, 'comparator,
       ('k, 'v1, 'comparator) t_ ->
       f:('v1 -> 'v2 option) -> ('k, 'v2, 'comparator) t_)
      Core_map_intf.without_comparator
    val filter_mapi :
      ('k, 'comparator,
       ('k, 'v1, 'comparator) t_ ->
       f:(key:'k key_ -> data:'v1 -> 'v2 option) -> ('k, 'v2, 'comparator) t_)
      Core_map_intf.without_comparator
    val compare_direct :
      ('k, 'comparator,
       ('-> '-> int) ->
       ('k, 'v, 'comparator) t_ -> ('k, 'v, 'comparator) t_ -> int)
      Core_map_intf.without_comparator
    val equal :
      ('k, 'comparator,
       ('-> '-> bool) ->
       ('k, 'v, 'comparator) t_ -> ('k, 'v, 'comparator) t_ -> bool)
      Core_map_intf.without_comparator
    val keys : ('k, 'a, 'b) t_ -> 'k key_ list
    val data : ('a, 'v, 'b) t_ -> 'v list
    val to_alist : ('k, 'v, 'a) t_ -> ('k key_ * 'v) list
    val merge :
      ('k, 'comparator,
       ('k, 'v1, 'comparator) t_ ->
       ('k, 'v2, 'comparator) t_ ->
       f:(key:'k key_ ->
          [ `Both of 'v1 * 'v2 | `Left of 'v1 | `Right of 'v2 ] -> 'v3 option) ->
       ('k, 'v3, 'comparator) t_)
      Core_map_intf.without_comparator
    val min_elt : ('k, 'v, 'a) t_ -> ('k key_ * 'v) option
    val min_elt_exn : ('k, 'v, 'a) t_ -> 'k key_ * 'v
    val max_elt : ('k, 'v, 'a) t_ -> ('k key_ * 'v) option
    val max_elt_exn : ('k, 'v, 'a) t_ -> 'k key_ * 'v
    val for_all : ('k, 'v, 'a) t_ -> f:('-> bool) -> bool
    val exists : ('k, 'v, 'a) t_ -> f:('-> bool) -> bool
    val fold_range_inclusive :
      ('k, 'comparator,
       ('k, 'v, 'comparator) t_ ->
       min:'k key_ ->
       max:'k key_ -> init:'-> f:(key:'k key_ -> data:'-> '-> 'a) -> 'a)
      Core_map_intf.without_comparator
    val range_to_alist :
      ('k, 'comparator,
       ('k, 'v, 'comparator) t_ ->
       min:'k key_ -> max:'k key_ -> ('k key_ * 'v) list)
      Core_map_intf.without_comparator
    val prev_key :
      ('k, 'comparator,
       ('k, 'v, 'comparator) t_ -> 'k key_ -> ('k key_ * 'v) option)
      Core_map_intf.without_comparator
    val next_key :
      ('k, 'comparator,
       ('k, 'v, 'comparator) t_ -> 'k key_ -> ('k key_ * 'v) option)
      Core_map_intf.without_comparator
    val rank :
      ('k, 'comparator, ('k, 'v, 'comparator) t_ -> 'k key_ -> int option)
      Core_map_intf.without_comparator
    val to_tree : ('k, 'v, 'comparator) t_ -> ('k key_, 'v, 'comparator) tree
    module Tree :
      sig
        type 'v t = (Key.t, 'v, Key.comparator) tree
        type ('k, 'v, 'c) t_ = 'v t
        val empty :
          ('k, 'comparator, ('k, 'a, 'comparator) t_)
          Core_map_intf.without_comparator
        val singleton :
          ('k, 'comparator, 'k key_ -> '-> ('k, 'v, 'comparator) t_)
          Core_map_intf.without_comparator
        val of_sorted_array :
          ('k, 'comparator,
           ('k key_ * 'v) array -> ('k, 'v, 'comparator) t_ Or_error.t)
          Core_map_intf.without_comparator
        val of_sorted_array_unchecked :
          ('k, 'comparator, ('k key_ * 'v) array -> ('k, 'v, 'comparator) t_)
          Core_map_intf.without_comparator
        val of_alist :
          ('k, 'comparator,
           ('k key_ * 'v) list ->
           [ `Duplicate_key of 'k key_ | `Ok of ('k, 'v, 'comparator) t_ ])
          Core_map_intf.without_comparator
        val of_alist_exn :
          ('k, 'comparator, ('k key_ * 'v) list -> ('k, 'v, 'comparator) t_)
          Core_map_intf.without_comparator
        val of_alist_multi :
          ('k, 'comparator,
           ('k key_ * 'v) list -> ('k, 'v list, 'comparator) t_)
          Core_map_intf.without_comparator
        val of_alist_fold :
          ('k, 'comparator,
           ('k key_ * 'v1) list ->
           init:'v2 -> f:('v2 -> 'v1 -> 'v2) -> ('k, 'v2, 'comparator) t_)
          Core_map_intf.without_comparator
        val of_tree :
          ('k, 'comparator,
           ('k key_, 'v, 'comparator) tree -> ('k, 'v, 'comparator) t_)
          Core_map_intf.without_comparator
        val invariants :
          ('k, 'comparator, ('k, 'v, 'comparator) t_ -> bool)
          Core_map_intf.without_comparator
        val is_empty : ('a, 'b, 'c) t_ -> bool
        val length : ('a, 'b, 'c) t_ -> int
        val add :
          ('k, 'comparator,
           ('k, 'v, 'comparator) t_ ->
           key:'k key_ -> data:'-> ('k, 'v, 'comparator) t_)
          Core_map_intf.without_comparator
        val add_multi :
          ('k, 'comparator,
           ('k, 'v list, 'comparator) t_ ->
           key:'k key_ -> data:'-> ('k, 'v list, 'comparator) t_)
          Core_map_intf.without_comparator
        val change :
          ('k, 'comparator,
           ('k, 'v, 'comparator) t_ ->
           'k key_ -> ('v option -> 'v option) -> ('k, 'v, 'comparator) t_)
          Core_map_intf.without_comparator
        val find :
          ('k, 'comparator, ('k, 'v, 'comparator) t_ -> 'k key_ -> 'v option)
          Core_map_intf.without_comparator
        val find_exn :
          ('k, 'comparator, ('k, 'v, 'comparator) t_ -> 'k key_ -> 'v)
          Core_map_intf.without_comparator
        val remove :
          ('k, 'comparator,
           ('k, 'v, 'comparator) t_ -> 'k key_ -> ('k, 'v, 'comparator) t_)
          Core_map_intf.without_comparator
        val mem :
          ('k, 'comparator, ('k, 'a, 'comparator) t_ -> 'k key_ -> bool)
          Core_map_intf.without_comparator
        val iter :
          ('k, 'v, 'a) t_ -> f:(key:'k key_ -> data:'-> unit) -> unit
        val iter2 :
          ('k, 'comparator,
           ('k, 'v1, 'comparator) t_ ->
           ('k, 'v2, 'comparator) t_ ->
           f:(key:'k key_ ->
              data:[ `Both of 'v1 * 'v2 | `Left of 'v1 | `Right of 'v2 ] ->
              unit) ->
           unit)
          Core_map_intf.without_comparator
        val map :
          ('k, 'v1, 'comparator) t_ ->
          f:('v1 -> 'v2) -> ('k, 'v2, 'comparator) t_
        val mapi :
          ('k, 'v1, 'comparator) t_ ->
          f:(key:'k key_ -> data:'v1 -> 'v2) -> ('k, 'v2, 'comparator) t_
        val fold :
          ('k, 'v, 'b) t_ ->
          init:'-> f:(key:'k key_ -> data:'-> '-> 'a) -> 'a
        val fold_right :
          ('k, 'v, 'b) t_ ->
          init:'-> f:(key:'k key_ -> data:'-> '-> 'a) -> 'a
        val filter :
          ('k, 'comparator,
           ('k, 'v, 'comparator) t_ ->
           f:(key:'k key_ -> data:'-> bool) -> ('k, 'v, 'comparator) t_)
          Core_map_intf.without_comparator
        val filter_map :
          ('k, 'comparator,
           ('k, 'v1, 'comparator) t_ ->
           f:('v1 -> 'v2 option) -> ('k, 'v2, 'comparator) t_)
          Core_map_intf.without_comparator
        val filter_mapi :
          ('k, 'comparator,
           ('k, 'v1, 'comparator) t_ ->
           f:(key:'k key_ -> data:'v1 -> 'v2 option) ->
           ('k, 'v2, 'comparator) t_)
          Core_map_intf.without_comparator
        val compare_direct :
          ('k, 'comparator,
           ('-> '-> int) ->
           ('k, 'v, 'comparator) t_ -> ('k, 'v, 'comparator) t_ -> int)
          Core_map_intf.without_comparator
        val equal :
          ('k, 'comparator,
           ('-> '-> bool) ->
           ('k, 'v, 'comparator) t_ -> ('k, 'v, 'comparator) t_ -> bool)
          Core_map_intf.without_comparator
        val keys : ('k, 'a, 'b) t_ -> 'k key_ list
        val data : ('a, 'v, 'b) t_ -> 'v list
        val to_alist : ('k, 'v, 'a) t_ -> ('k key_ * 'v) list
        val merge :
          ('k, 'comparator,
           ('k, 'v1, 'comparator) t_ ->
           ('k, 'v2, 'comparator) t_ ->
           f:(key:'k key_ ->
              [ `Both of 'v1 * 'v2 | `Left of 'v1 | `Right of 'v2 ] ->
              'v3 option) ->
           ('k, 'v3, 'comparator) t_)
          Core_map_intf.without_comparator
        val min_elt : ('k, 'v, 'a) t_ -> ('k key_ * 'v) option
        val min_elt_exn : ('k, 'v, 'a) t_ -> 'k key_ * 'v
        val max_elt : ('k, 'v, 'a) t_ -> ('k key_ * 'v) option
        val max_elt_exn : ('k, 'v, 'a) t_ -> 'k key_ * 'v
        val for_all : ('k, 'v, 'a) t_ -> f:('-> bool) -> bool
        val exists : ('k, 'v, 'a) t_ -> f:('-> bool) -> bool
        val fold_range_inclusive :
          ('k, 'comparator,
           ('k, 'v, 'comparator) t_ ->
           min:'k key_ ->
           max:'k key_ ->
           init:'-> f:(key:'k key_ -> data:'-> '-> 'a) -> 'a)
          Core_map_intf.without_comparator
        val range_to_alist :
          ('k, 'comparator,
           ('k, 'v, 'comparator) t_ ->
           min:'k key_ -> max:'k key_ -> ('k key_ * 'v) list)
          Core_map_intf.without_comparator
        val prev_key :
          ('k, 'comparator,
           ('k, 'v, 'comparator) t_ -> 'k key_ -> ('k key_ * 'v) option)
          Core_map_intf.without_comparator
        val next_key :
          ('k, 'comparator,
           ('k, 'v, 'comparator) t_ -> 'k key_ -> ('k key_ * 'v) option)
          Core_map_intf.without_comparator
        val rank :
          ('k, 'comparator,
           ('k, 'v, 'comparator) t_ -> 'k key_ -> int option)
          Core_map_intf.without_comparator
        val to_tree :
          ('k, 'v, 'comparator) t_ -> ('k key_, 'v, 'comparator) tree
        val t_of_sexp : (Sexplib.Sexp.t -> 'v) -> Sexplib.Sexp.t -> 'v t
        val sexp_of_t : ('-> Sexplib.Sexp.t) -> 'v t -> Sexplib.Sexp.t
      end
    val compare : ('-> '-> int) -> 'v t -> 'v t -> int
    val t_of_sexp : (Sexplib.Sexp.t -> 'v) -> Sexplib.Sexp.t -> 'v t
    val sexp_of_t : ('-> Sexplib.Sexp.t) -> 'v t -> Sexplib.Sexp.t
  end