functor
  (Data : sig
            type 'a t
            val sexp_of_t :
              ('-> Sexplib.Sexp.t) -> 'Univ_map.Make.t -> Sexplib.Sexp.t
          end->
  sig
    type t
    type 'a data = 'Data.t
    val invariant : t Invariant_intf.inv
    val empty : t
    val is_empty : t -> bool
    val set : t -> 'Key.t -> 'a data -> t
    val mem : t -> 'Key.t -> bool
    val find : t -> 'Key.t -> 'a data option
    val find_exn : t -> 'Key.t -> 'a data
    val add : t -> 'Key.t -> 'a data -> [ `Duplicate | `Ok of t ]
    val add_exn : t -> 'Key.t -> 'a data -> t
    val change : t -> 'Key.t -> ('a data option -> 'a data option) -> t
    val change_exn : t -> 'Key.t -> ('a data -> 'a data) -> t
    module Packed : sig type t = T : 'Key.t * 'a data -> t end
    val to_alist : t -> Packed.t list
    val sexp_of_t : t -> Sexplib.Sexp.t
  end