sig
  module type HashedType =
    sig
      type t
      val equal : Hashset.HashedType.t -> Hashset.HashedType.t -> bool
      val to_string : Hashset.HashedType.t -> string
      val hash : Hashset.HashedType.t -> int
    end
  module type S =
    sig
      type elt
      type t
      val create : int -> Hashset.S.t
      val clear : Hashset.S.t -> unit
      val copy : Hashset.S.t -> Hashset.S.t
      val add : Hashset.S.t -> Hashset.S.elt -> unit
      val remove : Hashset.S.t -> Hashset.S.elt -> unit
      val mem : Hashset.S.t -> Hashset.S.elt -> bool
      val cardinal : Hashset.S.t -> int
      val iter : (Hashset.S.elt -> unit) -> Hashset.S.t -> unit
      val fold : (Hashset.S.elt -> '-> 'a) -> Hashset.S.t -> '-> 'a
      val exists : (Hashset.S.elt -> bool) -> Hashset.S.t -> bool
      val for_all : (Hashset.S.elt -> bool) -> Hashset.S.t -> bool
      val left_union : Hashset.S.t -> Hashset.S.t -> Hashset.S.t
      val is_empty : Hashset.S.t -> bool
      val filter : (Hashset.S.elt -> bool) -> Hashset.S.t -> unit
      val to_string : Hashset.S.t -> string
      val of_list : Hashset.S.elt list -> Hashset.S.t
      val to_list : Hashset.S.t -> Hashset.S.elt list
      val map_to :
        ('-> '-> 'a) -> '-> (Hashset.S.elt -> 'b) -> Hashset.S.t -> 'a
    end
  module Make :
    functor (H : HashedType->
      sig
        type elt = H.t
        type t
        val create : int -> t
        val clear : t -> unit
        val copy : t -> t
        val add : t -> elt -> unit
        val remove : t -> elt -> unit
        val mem : t -> elt -> bool
        val cardinal : t -> int
        val iter : (elt -> unit) -> t -> unit
        val fold : (elt -> '-> 'a) -> t -> '-> 'a
        val exists : (elt -> bool) -> t -> bool
        val for_all : (elt -> bool) -> t -> bool
        val left_union : t -> t -> t
        val is_empty : t -> bool
        val filter : (elt -> bool) -> t -> unit
        val to_string : t -> string
        val of_list : elt list -> t
        val to_list : t -> elt list
        val map_to : ('-> '-> 'a) -> '-> (elt -> 'b) -> t -> 'a
      end
end