sig
  type ('k, 'v) t
  val t_of_sexp :
    (Sexplib.Sexp.t -> 'a) ->
    (Sexplib.Sexp.t -> 'b) -> Sexplib.Sexp.t -> ('a, 'b) t
  val sexp_of_t :
    ('-> Sexplib.Sexp.t) ->
    ('-> Sexplib.Sexp.t) -> ('a, 'b) t -> Sexplib.Sexp.t
  val empty : ('k, 'v) Multi_map.t
  val singleton : '-> '-> ('k, 'v) Multi_map.t
  val is_empty : ('k, 'v) Multi_map.t -> bool
  val add : key:'-> data:'-> ('k, 'v) Multi_map.t -> ('k, 'v) Multi_map.t
  val find : ('k, 'v) Multi_map.t -> '-> 'v list
  val remove : ('k, 'v) Multi_map.t -> '-> ('k, 'v) Multi_map.t
  val set :
    key:'-> data:'v list -> ('k, 'v) Multi_map.t -> ('k, 'v) Multi_map.t
  val mem : ('k, 'v) Multi_map.t -> '-> bool
  val keys : ('k, 'v) Multi_map.t -> 'k list
  val iter : f:(key:'-> data:'-> unit) -> ('k, 'v) Multi_map.t -> unit
  val map : f:('-> 'b) -> ('k, 'a) Multi_map.t -> ('k, 'b) Multi_map.t
  val mapi :
    f:(key:'-> data:'-> 'b) ->
    ('k, 'a) Multi_map.t -> ('k, 'b) Multi_map.t
  val fold :
    f:(key:'-> data:'-> '-> 'a) ->
    ('k, 'v) Multi_map.t -> init:'-> 'a
  val filter :
    f:(key:'-> data:'-> bool) ->
    ('k, 'v) Multi_map.t -> ('k, 'v) Multi_map.t
  val reduce :
    f:('v list -> 'r) -> ('k, 'v) Multi_map.t -> ('k, 'r) Core.Std.Map.Poly.t
  val ounit_tests : unit -> OUnit.test
end