sig
  module type HashedType =
    sig
      type t
      val equal : Hashcons.HashedType.t -> Hashcons.HashedType.t -> bool
      val hash : Hashcons.HashedType.t -> int
      val tag : int -> Hashcons.HashedType.t -> unit
    end
  module type S =
    sig
      type elt
      val hashcons : Hashcons.S.elt -> Hashcons.S.elt
      val mem : Hashcons.S.elt -> bool
      val fresh_unique_id : unit -> int
      val stats : unit -> int * int * int * int * int * int
    end
  module Make :
    functor (X : HashedType->
      sig
        type elt = X.t
        val hashcons : elt -> elt
        val mem : elt -> bool
        val fresh_unique_id : unit -> int
        val stats : unit -> int * int * int * int * int * int
      end
  module MakeNonWeak :
    functor (X : HashedType->
      sig
        type elt = X.t
        val hashcons : elt -> elt
        val mem : elt -> bool
        val fresh_unique_id : unit -> int
        val stats : unit -> int * int * int * int * int * int
      end
end