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