# Module type Univ_map_intf.S1

    module type S1 = sig .. end

    type 's t

The `'s` parameter is shared across all values stored in the map.

    type ('s, 'a) data

    val invariant : 'a t -> unit

    val empty : 'a t

    val is_empty : 'a t -> bool

    val set : 's t ->
           'a Key.t -> ('s, 'a) data -> 's t

    val mem : 'a t -> 'b Key.t -> bool

    val find : 's t -> 'a Key.t -> ('s, 'a) data option

    val find_exn : 's t -> 'a Key.t -> ('s, 'a) data

    val add : 's t ->
           'a Key.t ->
           ('s, 'a) data ->
           [ `Duplicate | `Ok of 's t ]

    val add_exn : 's t ->
           'a Key.t -> ('s, 'a) data -> 's t

    val change : 's t ->
           'a Key.t ->
           (('s, 'a) data option ->
            ('s, 'a) data option) ->
           's t

    val change_exn : 's t ->
           'a Key.t ->
           (('s, 'a) data -> ('s, 'a) data) ->
           's t

    module Packed: sig .. end

    val to_alist : 's t -> 's Packed.t list

    val sexp_of_t : ('s -> Sexplib.Sexp.t) -> 's t -> Sexplib.Sexp.t