sig
  type ('key, 'a, 'cmp) t = private ('key, 'a, 'cmp) Std_internal.Map.t
  val to_map :
    ('key, 'a, 'cmp) Total_map.t -> ('key, 'a, 'cmp) Std_internal.Map.t
  val map :
    ('key, 'a, 'cmp) Total_map.t ->
    f:('-> 'b) -> ('key, 'b, 'cmp) Total_map.t
  val mapi :
    ('key, 'a, 'cmp) Total_map.t ->
    f:(key:'key -> data:'-> 'b) -> ('key, 'b, 'cmp) Total_map.t
  val map2 :
    ('key, 'a, 'cmp) Total_map.t ->
    ('key, 'b, 'cmp) Total_map.t ->
    f:('-> '-> 'c) -> ('key, 'c, 'cmp) Total_map.t
  val iter :
    ('key, 'a, 'b) Total_map.t -> f:(key:'key -> data:'-> unit) -> unit
  val iter2 :
    ('key, 'a, 'cmp) Total_map.t ->
    ('key, 'b, 'cmp) Total_map.t -> f:(key:'key -> '-> '-> unit) -> unit
  val set :
    ('key, 'a, 'cmp) Total_map.t ->
    'key -> '-> ('key, 'a, 'cmp) Total_map.t
  val to_alist : ('key, 'a, 'b) Total_map.t -> ('key * 'a) list
  val find : ('key, 'a, 'b) Total_map.t -> 'key -> 'a
  val change :
    ('key, 'a, 'cmp) Total_map.t ->
    'key -> ('-> 'a) -> ('key, 'a, 'cmp) Total_map.t
  module type Key =
    sig
      type t
      val all : Total_map.Key.t list
      val compare : Total_map.Key.t -> Total_map.Key.t -> int
      val bin_t : Total_map.Key.t Bin_prot.Type_class.t
      val bin_read_t : Total_map.Key.t Bin_prot.Read.reader
      val __bin_read_t__ : (int -> Total_map.Key.t) Bin_prot.Read.reader
      val bin_reader_t : Total_map.Key.t Bin_prot.Type_class.reader
      val bin_size_t : Total_map.Key.t Bin_prot.Size.sizer
      val bin_write_t : Total_map.Key.t Bin_prot.Write.writer
      val bin_writer_t : Total_map.Key.t Bin_prot.Type_class.writer
      val t_of_sexp : Sexplib.Sexp.t -> Total_map.Key.t
      val sexp_of_t : Total_map.Key.t -> Sexplib.Sexp.t
    end
  module type S =
    sig
      module Key : Key
      type comparator_witness
      type 'a t = (Key.t, 'a, comparator_witness) t
      val return : '-> 'a t
      val apply : ('-> 'b) t -> 'a t -> 'b t
      val map : 'a t -> f:('-> 'b) -> 'b t
      val map2 : 'a t -> 'b t -> f:('-> '-> 'c) -> 'c t
      val map3 : 'a t -> 'b t -> 'c t -> f:('-> '-> '-> 'd) -> 'd t
      val all : 'a t list -> 'a list t
      val both : 'a t -> 'b t -> ('a * 'b) t
      module Applicative_infix :
        sig
          val ( <*> ) : ('-> 'b) t -> 'a t -> 'b t
          val ( <* ) : 'a t -> unit t -> 'a t
          val ( *> ) : unit t -> 'a t -> 'a t
        end
      val ( <*> ) : ('-> 'b) t -> 'a t -> 'b t
      val ( <* ) : 'a t -> unit t -> 'a t
      val ( *> ) : unit t -> 'a t -> 'a t
      val create : (Total_map.Key.t -> 'a) -> 'Total_map.t
      val compare :
        ('-> '-> int) -> 'Total_map.t -> 'Total_map.t -> int
      val bin_t :
        'Bin_prot.Type_class.t -> 'Total_map.t Bin_prot.Type_class.t
      val bin_read_t :
        'Bin_prot.Read.reader -> 'Total_map.t Bin_prot.Read.reader
      val __bin_read_t__ :
        'Bin_prot.Read.reader ->
        (int -> 'Total_map.t) Bin_prot.Read.reader
      val bin_reader_t :
        'Bin_prot.Type_class.reader ->
        'Total_map.t Bin_prot.Type_class.reader
      val bin_size_t :
        'Bin_prot.Size.sizer -> 'Total_map.t Bin_prot.Size.sizer
      val bin_write_t :
        'Bin_prot.Write.writer -> 'Total_map.t Bin_prot.Write.writer
      val bin_writer_t :
        'Bin_prot.Type_class.writer ->
        'Total_map.t Bin_prot.Type_class.writer
      val t_of_sexp :
        (Sexplib.Sexp.t -> 'a) -> Sexplib.Sexp.t -> 'Total_map.t
      val sexp_of_t :
        ('-> Sexplib.Sexp.t) -> 'Total_map.t -> Sexplib.Sexp.t
    end
  module Make :
    functor (Key : Key->
      sig
        module Key :
          sig
            type t = Key.t
            val all : t list
            val compare : t -> t -> int
            val bin_t : t Bin_prot.Type_class.t
            val bin_read_t : t Bin_prot.Read.reader
            val __bin_read_t__ : (int -> t) Bin_prot.Read.reader
            val bin_reader_t : t Bin_prot.Type_class.reader
            val bin_size_t : t Bin_prot.Size.sizer
            val bin_write_t : t Bin_prot.Write.writer
            val bin_writer_t : t Bin_prot.Type_class.writer
            val t_of_sexp : Sexplib.Sexp.t -> t
            val sexp_of_t : t -> Sexplib.Sexp.t
          end
        type comparator_witness
        type 'a t = (Key.t, 'a, comparator_witness) t
        val return : '-> 'a t
        val apply : ('-> 'b) t -> 'a t -> 'b t
        val map : 'a t -> f:('-> 'b) -> 'b t
        val map2 : 'a t -> 'b t -> f:('-> '-> 'c) -> 'c t
        val map3 : 'a t -> 'b t -> 'c t -> f:('-> '-> '-> 'd) -> 'd t
        val all : 'a t list -> 'a list t
        val both : 'a t -> 'b t -> ('a * 'b) t
        module Applicative_infix :
          sig
            val ( <*> ) : ('-> 'b) t -> 'a t -> 'b t
            val ( <* ) : 'a t -> unit t -> 'a t
            val ( *> ) : unit t -> 'a t -> 'a t
          end
        val ( <*> ) : ('-> 'b) t -> 'a t -> 'b t
        val ( <* ) : 'a t -> unit t -> 'a t
        val ( *> ) : unit t -> 'a t -> 'a t
        val create : (Key.t -> 'a) -> 'a t
        val compare : ('-> '-> int) -> 'a t -> 'a t -> int
        val bin_t : 'Bin_prot.Type_class.t -> 'a t Bin_prot.Type_class.t
        val bin_read_t : 'Bin_prot.Read.reader -> 'a t Bin_prot.Read.reader
        val __bin_read_t__ :
          'Bin_prot.Read.reader -> (int -> 'a t) Bin_prot.Read.reader
        val bin_reader_t :
          'Bin_prot.Type_class.reader -> 'a t Bin_prot.Type_class.reader
        val bin_size_t : 'Bin_prot.Size.sizer -> 'a t Bin_prot.Size.sizer
        val bin_write_t :
          'Bin_prot.Write.writer -> 'a t Bin_prot.Write.writer
        val bin_writer_t :
          'Bin_prot.Type_class.writer -> 'a t Bin_prot.Type_class.writer
        val t_of_sexp : (Sexplib.Sexp.t -> 'a) -> Sexplib.Sexp.t -> 'a t
        val sexp_of_t : ('-> Sexplib.Sexp.t) -> 'a t -> Sexplib.Sexp.t
      end
end