sig
  module type S =
    sig
      type set
      type elt
      val empty : set
      val is_empty : set -> bool
      val mem : elt -> set -> bool
      val add : elt -> set -> set
      val singleton : elt -> set
      val remove : elt -> set -> set
      val union : set -> set -> set
      val inter : set -> set -> set
      val diff : set -> set -> set
      val compare : set -> set -> int
      val equal : set -> set -> bool
      val subset : set -> set -> bool
      val iter : (elt -> unit) -> set -> unit
      val fold : (elt -> '-> 'a) -> set -> '-> 'a
      val for_all : (elt -> bool) -> set -> bool
      val exists : (elt -> bool) -> set -> bool
      val filter : (elt -> bool) -> set -> set
      val partition : (elt -> bool) -> set -> set * set
      val cardinal : set -> int
      val elements : set -> elt list
      val min_elt : set -> elt
      val max_elt : set -> elt
      val choose : set -> elt
      val split : elt -> set -> set * bool * set
      val of_seq : elt Sequence.t -> Sequence.Set.S.set
      val to_seq : Sequence.Set.S.set -> elt Sequence.t
    end
  module Adapt :
    functor (X : Set.S->
      sig
        type set = X.t
        type elt = X.elt
        val empty : set
        val is_empty : set -> bool
        val mem : elt -> set -> bool
        val add : elt -> set -> set
        val singleton : elt -> set
        val remove : elt -> set -> set
        val union : set -> set -> set
        val inter : set -> set -> set
        val diff : set -> set -> set
        val compare : set -> set -> int
        val equal : set -> set -> bool
        val subset : set -> set -> bool
        val iter : (elt -> unit) -> set -> unit
        val fold : (elt -> '-> 'a) -> set -> '-> 'a
        val for_all : (elt -> bool) -> set -> bool
        val exists : (elt -> bool) -> set -> bool
        val filter : (elt -> bool) -> set -> set
        val partition : (elt -> bool) -> set -> set * set
        val cardinal : set -> int
        val elements : set -> elt list
        val min_elt : set -> elt
        val max_elt : set -> elt
        val choose : set -> elt
        val split : elt -> set -> set * bool * set
        val of_seq : elt t -> set
        val to_seq : set -> elt t
      end
  module Make :
    functor (X : Set.OrderedType->
      sig
        type set
        type elt = X.t
        val empty : set
        val is_empty : set -> bool
        val mem : elt -> set -> bool
        val add : elt -> set -> set
        val singleton : elt -> set
        val remove : elt -> set -> set
        val union : set -> set -> set
        val inter : set -> set -> set
        val diff : set -> set -> set
        val compare : set -> set -> int
        val equal : set -> set -> bool
        val subset : set -> set -> bool
        val iter : (elt -> unit) -> set -> unit
        val fold : (elt -> '-> 'a) -> set -> '-> 'a
        val for_all : (elt -> bool) -> set -> bool
        val exists : (elt -> bool) -> set -> bool
        val filter : (elt -> bool) -> set -> set
        val partition : (elt -> bool) -> set -> set * set
        val cardinal : set -> int
        val elements : set -> elt list
        val min_elt : set -> elt
        val max_elt : set -> elt
        val choose : set -> elt
        val split : elt -> set -> set * bool * set
        val of_seq : elt t -> set
        val to_seq : set -> elt t
      end
end