(* All of the operations offered by Objective Caml's standard [Map]
   module are available here. Consult [Map.S] in Objective Caml's
   documentation. *)

include Map.S with type key = string

(* [addm m1 m2] adds the bindings in the map [m1] to the map [m2],
   overriding any previous binding if [m1] and [m2] have common
   keys. *)

val addm: 'a t -> 'a t -> 'a t

(* [of_association_list l] turns an association list into a map.
   It raises [Duplicate key] if a key appears twice in the list.
   [to_association_list m] turns a map into an association list. *)

exception Duplicate of key
val of_association_list: (key * 'a) list -> 'a t
val to_association_list: 'a t -> (key * 'a) list

(* [domain m] is the domain of the map [m], that is, the set of keys
   that are defined. *)

val domain: 'a t -> StringSet.t

(* [lift f s] turns the set [s] into a map where every element [x]
   is mapped to [f x]. *)

val lift: (key -> 'a) -> StringSet.t -> 'a t