sig

  type !'a t
  val create : int -> 'a Weak.t
  val length : 'a Weak.t -> int
  val set : 'a Weak.t -> int -> 'a option -> unit
  val get : 'a Weak.t -> int -> 'a option
  val get_copy : 'a Weak.t -> int -> 'a option
  val check : 'a Weak.t -> int -> bool
  val fill : 'a Weak.t -> int -> int -> 'a option -> unit
  val blit : 'a Weak.t -> int -> 'a Weak.t -> int -> int -> unit
  module type S =
    sig
      type data
      type t
      val create : int -> Weak.S.t
      val clear : Weak.S.t -> unit
      val merge : Weak.S.t -> Weak.S.data -> Weak.S.data
      val add : Weak.S.t -> Weak.S.data -> unit
      val remove : Weak.S.t -> Weak.S.data -> unit
      val find : Weak.S.t -> Weak.S.data -> Weak.S.data
      val find_opt : Weak.S.t -> Weak.S.data -> Weak.S.data option
      val find_all : Weak.S.t -> Weak.S.data -> Weak.S.data list
      val mem : Weak.S.t -> Weak.S.data -> bool
      val iter : (Weak.S.data -> unit) -> Weak.S.t -> unit
      val fold : (Weak.S.data -> 'a -> 'a) -> Weak.S.t -> 'a -> 'a
      val count : Weak.S.t -> int
      val stats : Weak.S.t -> int * int * int * int * int * int
    end
  module Make :
    functor (H : Hashtbl.HashedType) ->
      sig
        type data = H.t
        type t
        val create : int -> t
        val clear : t -> unit
        val merge : t -> data -> data
        val add : t -> data -> unit
        val remove : t -> data -> unit
        val find : t -> data -> data
        val find_opt : t -> data -> data option
        val find_all : t -> data -> data list
        val mem : t -> data -> bool
        val iter : (data -> unit) -> t -> unit
        val fold : (data -> 'a -> 'a) -> t -> 'a -> 'a
        val count : t -> int
        val stats : t -> int * int * int * int * int * int
      end
end