sig
  type key
  type 'a t
  val empty : 'GMap.S.t
  val lookup : GMap.S.key -> 'GMap.S.t -> 'a
  val find : GMap.S.key -> 'GMap.S.t -> 'a
  val add : GMap.S.key -> '-> 'GMap.S.t -> 'GMap.S.t
  exception Unchanged
  val strict_add : GMap.S.key -> '-> 'GMap.S.t -> 'GMap.S.t
  type 'a decision = '-> '-> 'a
  val fine_add :
    'GMap.S.decision -> GMap.S.key -> '-> 'GMap.S.t -> 'GMap.S.t
  val mem : GMap.S.key -> 'GMap.S.t -> bool
  val singleton : GMap.S.key -> '-> 'GMap.S.t
  val is_empty : 'GMap.S.t -> bool
  val is_singleton : 'GMap.S.t -> (GMap.S.key * 'a) option
  val cardinal : 'GMap.S.t -> int
  val choose : 'GMap.S.t -> GMap.S.key * 'a
  val lookup_and_remove : GMap.S.key -> 'GMap.S.t -> 'a * 'GMap.S.t
  val find_and_remove : GMap.S.key -> 'GMap.S.t -> 'a * 'GMap.S.t
  val remove : GMap.S.key -> 'GMap.S.t -> 'GMap.S.t
  val union : 'GMap.S.t -> 'GMap.S.t -> 'GMap.S.t
  val fine_union :
    'GMap.S.decision -> 'GMap.S.t -> 'GMap.S.t -> 'GMap.S.t
  val iter : (GMap.S.key -> '-> unit) -> 'GMap.S.t -> unit
  val fold : (GMap.S.key -> '-> '-> 'b) -> 'GMap.S.t -> '-> 'b
  val fold_rev : (GMap.S.key -> '-> '-> 'b) -> 'GMap.S.t -> '-> 'b
  val iter2 :
    (GMap.S.key -> '-> '-> unit) -> 'GMap.S.t -> 'GMap.S.t -> unit
  val map : ('-> 'b) -> 'GMap.S.t -> 'GMap.S.t
  val endo_map : ('-> 'a) -> 'GMap.S.t -> 'GMap.S.t
  val compare : ('-> '-> int) -> 'GMap.S.t -> 'GMap.S.t -> int
  module Domain :
    sig
      type element = key
      type t
      val empty : t
      val is_empty : t -> bool
      val singleton : element -> t
      val cardinal : t -> int
      val choose : t -> element
      val mem : element -> t -> bool
      val add : element -> t -> t
      val remove : element -> t -> t
      val union : t -> t -> t
      val diff : t -> t -> t
      val inter : t -> t -> t
      val disjoint : t -> t -> bool
      val iter : (element -> unit) -> t -> unit
      val fold : (element -> '-> 'b) -> t -> '-> 'b
      val elements : t -> element list
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
    end
  val domain : 'GMap.S.t -> GMap.S.Domain.t
  val lift : (GMap.S.key -> 'a) -> GMap.S.Domain.t -> 'GMap.S.t
  val corestrict : 'GMap.S.t -> GMap.S.Domain.t -> 'GMap.S.t
end