sig
  module type WeakHashable =
    sig
      type t
      val equal : Buckx.WeakHashable.t -> Buckx.WeakHashable.t -> bool
      val hash : Buckx.WeakHashable.t -> int
      val pretty : Format.formatter -> Buckx.WeakHashable.t -> unit
      val id : string
    end
  module type S =
    sig
      type data
      type t
      val create : int -> Buckx.S.t
      val merge : Buckx.S.t -> Buckx.S.data -> Buckx.S.data
      val iter : Buckx.S.t -> (Buckx.S.data -> unit) -> unit
      val clear : Buckx.S.t -> unit
      val release : Buckx.S.t -> unit
      val shallow_copy : Buckx.S.t -> Buckx.S.t
      val addr : Buckx.S.t -> int
      val overwrite : old:Buckx.S.t -> fresh:Buckx.S.t -> unit
      val pretty_debug : Format.formatter -> Buckx.S.t -> int -> unit
    end
  module MakeBig :
    functor (H : WeakHashable->
      sig
        type data = H.t
        type t
        val create : int -> t
        val merge : t -> data -> data
        val iter : t -> (data -> unit) -> unit
        val clear : t -> unit
        val release : t -> unit
        val shallow_copy : t -> t
        val addr : t -> int
        val overwrite : old:t -> fresh:t -> unit
        val pretty_debug : Format.formatter -> t -> int -> unit
      end
end