sig
  type ('a, 'b) t
  type ('a, 'b) sexpable = ('a, 'b) t
  val sexp_of_t :
    ('-> Sexplib.Sexp.t) ->
    ('-> Sexplib.Sexp.t) -> ('a, 'b) sexpable -> Sexplib.Sexp.t
  val t_of_sexp :
    (Sexplib.Sexp.t -> 'a) ->
    (Sexplib.Sexp.t -> 'b) -> Sexplib.Sexp.t -> ('a, 'b) sexpable
  type ('a, 'b) binable = ('a, 'b) t
  val bin_size_t : ('a, 'b, ('a, 'b) binable) Bin_prot.Size.sizer2
  val bin_write_t : ('a, 'b, ('a, 'b) binable) Bin_prot.Map_to_safe.writer2
  val bin_write_t_ :
    ('a, 'b, ('a, 'b) binable) Bin_prot.Unsafe_write_c.writer2
  val bin_read_t : ('a, 'b, ('a, 'b) binable) Bin_prot.Map_to_safe.reader2
  val bin_read_t_ : ('a, 'b, ('a, 'b) binable) Bin_prot.Unsafe_read_c.reader2
  val bin_read_t__ :
    ('a, 'b, int -> ('a, 'b) binable) Bin_prot.Unsafe_read_c.reader2
  val bin_writer_t : ('a, 'b, ('a, 'b) binable) Bin_prot.Type_class.S2.writer
  val bin_reader_t : ('a, 'b, ('a, 'b) binable) Bin_prot.Type_class.S2.reader
  val bin_t : ('a, 'b, ('a, 'b) binable) Bin_prot.Type_class.S2.t
  val create : unit -> ('a, 'b) Rmap.t
  val invariant : ('a, 'b) Rmap.t -> unit
  val add : ('a, 'b) Rmap.t -> key:'-> data:'-> unit
  val remove : ('a, 'b) Rmap.t -> '-> unit
  val find : ('a, 'b) Rmap.t -> '-> 'b option
  val fold :
    ('a, 'b) Rmap.t -> init:'-> f:(key:'-> data:'-> '-> 'c) -> 'c
  val iter : ('a, 'b) Rmap.t -> f:(key:'-> data:'-> unit) -> unit
  module type Key =
    sig
      type t
      type sexpable = t
      val sexp_of_t : sexpable -> Sexplib.Sexp.t
      val t_of_sexp : Sexplib.Sexp.t -> sexpable
      val compare : Rmap.Key.t -> Rmap.Key.t -> int
    end
  module type S =
    sig
      type key
      type 'a t
      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 create : unit -> 'Rmap.S.t
      val invariant : 'Rmap.S.t -> unit
      val add : 'Rmap.S.t -> key:Rmap.S.key -> data:'-> unit
      val remove : 'Rmap.S.t -> Rmap.S.key -> unit
      val find : 'Rmap.S.t -> Rmap.S.key -> 'a option
      val fold :
        'Rmap.S.t ->
        init:'-> f:(key:Rmap.S.key -> data:'-> '-> 'b) -> 'b
      val iter : 'Rmap.S.t -> f:(key:Rmap.S.key -> data:'-> unit) -> unit
    end
  module Make :
    functor (Key : Key->
      sig
        type key = Key.t
        type 'a t
        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 create : unit -> 'a t
        val invariant : 'a t -> unit
        val add : 'a t -> key:key -> data:'-> unit
        val remove : 'a t -> key -> unit
        val find : 'a t -> key -> 'a option
        val fold :
          'a t -> init:'-> f:(key:key -> data:'-> '-> 'b) -> 'b
        val iter : 'a t -> f:(key:key -> data:'-> unit) -> unit
      end
end