sig
  module type S =
    sig
      type element
      type t
      val empty : GSet.S.t
      val is_empty : GSet.S.t -> bool
      val singleton : GSet.S.element -> GSet.S.t
      val cardinal : GSet.S.t -> int
      val choose : GSet.S.t -> GSet.S.element
      val mem : GSet.S.element -> GSet.S.t -> bool
      val add : GSet.S.element -> GSet.S.t -> GSet.S.t
      val remove : GSet.S.element -> GSet.S.t -> GSet.S.t
      val union : GSet.S.t -> GSet.S.t -> GSet.S.t
      val diff : GSet.S.t -> GSet.S.t -> GSet.S.t
      val inter : GSet.S.t -> GSet.S.t -> GSet.S.t
      val disjoint : GSet.S.t -> GSet.S.t -> bool
      val iter : (GSet.S.element -> unit) -> GSet.S.t -> unit
      val fold : (GSet.S.element -> '-> 'b) -> GSet.S.t -> '-> 'b
      val elements : GSet.S.t -> GSet.S.element list
      val compare : GSet.S.t -> GSet.S.t -> int
      val equal : GSet.S.t -> GSet.S.t -> bool
      val subset : GSet.S.t -> GSet.S.t -> bool
    end
end