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 :
    ('a -> Sexplib.Sexp.t) ->
    ('b -> Sexplib.Sexp.t) -> ('a, 'b) t -> Sexplib.Sexp.t
  val empty : ('k, 'v) Multi_map.t
  val singleton : 'k -> 'v -> ('k, 'v) Multi_map.t
  val is_empty : ('k, 'v) Multi_map.t -> bool
  val add : key:'k -> data:'v -> ('k, 'v) Multi_map.t -> ('k, 'v) Multi_map.t
  val find : ('k, 'v) Multi_map.t -> 'k -> 'v list
  val remove : ('k, 'v) Multi_map.t -> 'k -> ('k, 'v) Multi_map.t
  val set :
    key:'k -> data:'v list -> ('k, 'v) Multi_map.t -> ('k, 'v) Multi_map.t
  val mem : ('k, 'v) Multi_map.t -> 'k -> bool
  val keys : ('k, 'v) Multi_map.t -> 'k list
  val iter : f:(key:'k -> data:'v -> unit) -> ('k, 'v) Multi_map.t -> unit
  val map : f:('a -> 'b) -> ('k, 'a) Multi_map.t -> ('k, 'b) Multi_map.t
  val mapi :
    f:(key:'k -> data:'a -> 'b) ->
    ('k, 'a) Multi_map.t -> ('k, 'b) Multi_map.t
  val fold :
    f:(key:'k -> data:'v -> 'a -> 'a) ->
    ('k, 'v) Multi_map.t -> init:'a -> 'a
  val filter :
    f:(key:'k -> data:'v -> 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
end