sig
  type tag
  val dummy_tag : Weakhtbl.tag
  val create_tag : int -> Weakhtbl.tag
  val tag_equal : Weakhtbl.tag -> Weakhtbl.tag -> bool
  val tag_hash : Weakhtbl.tag -> int
  module type S =
    sig
      type key
      type 'a t
      val create : int -> 'Weakhtbl.S.t
      val clear : 'Weakhtbl.S.t -> unit
      val copy : 'Weakhtbl.S.t -> 'Weakhtbl.S.t
      val find : 'Weakhtbl.S.t -> Weakhtbl.S.key -> 'a
      val mem : 'Weakhtbl.S.t -> Weakhtbl.S.key -> bool
      val set : 'Weakhtbl.S.t -> Weakhtbl.S.key -> '-> unit
      val remove : 'Weakhtbl.S.t -> Weakhtbl.S.key -> unit
      val length : 'Weakhtbl.S.t -> int
      val memoize : int -> (Weakhtbl.S.key -> 'a) -> Weakhtbl.S.key -> 'a
      val memoize_rec :
        int ->
        ((Weakhtbl.S.key -> 'a) -> Weakhtbl.S.key -> 'a) ->
        Weakhtbl.S.key -> 'a
      val memoize_option :
        int -> (Weakhtbl.S.key option -> 'a) -> Weakhtbl.S.key option -> 'a
    end
  module type Weakey =
    sig type t val tag : Weakhtbl.Weakey.t -> Weakhtbl.tag end
  module Make :
    functor (S : Weakey->
      sig
        type key = S.t
        type 'a t
        val create : int -> 'a t
        val clear : 'a t -> unit
        val copy : 'a t -> 'a t
        val find : 'a t -> key -> 'a
        val mem : 'a t -> key -> bool
        val set : 'a t -> key -> '-> unit
        val remove : 'a t -> key -> unit
        val length : 'a t -> int
        val memoize : int -> (key -> 'a) -> key -> 'a
        val memoize_rec : int -> ((key -> 'a) -> key -> 'a) -> key -> 'a
        val memoize_option : int -> (key option -> 'a) -> key option -> 'a
      end
end