functor (H : HashedType->
  sig
    type key = H.t
    type 'a t
    val create : int -> 'a t
    val length : 'a t -> int
    val is_empty : 'a t -> bool
    val clear : 'a t -> unit
    val copy : 'a t -> 'a t
    val add : 'a t -> key -> '-> unit
    val remove : 'a t -> key -> unit
    val remove_all : 'a t -> key -> unit
    val find : 'a t -> key -> 'a
    val find_all : 'a t -> key -> 'a list
    val find_default : 'a t -> key -> '-> 'a
    val find_option : 'a t -> key -> 'a option
    val replace : 'a t -> key -> '-> unit
    val mem : 'a t -> key -> bool
    val iter : (key -> '-> unit) -> 'a t -> unit
    val for_all : (key -> '-> bool) -> 'a t -> bool
    val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
    val exists : (key -> '-> bool) -> 'a t -> bool
    val map : (key -> '-> 'c) -> 'b t -> 'c t
    val map_inplace : (key -> '-> 'a) -> 'a t -> unit
    val filter : ('-> bool) -> 'a t -> 'a t
    val filter_inplace : ('-> bool) -> 'a t -> unit
    val filteri : (key -> '-> bool) -> 'a t -> 'a t
    val filteri_inplace : (key -> '-> bool) -> 'a t -> unit
    val filter_map : (key -> '-> 'b option) -> 'a t -> 'b t
    val filter_map_inplace : (key -> '-> 'a option) -> 'a t -> unit
    val modify : key -> ('-> 'a) -> 'a t -> unit
    val modify_def : '-> key -> ('-> 'a) -> 'a t -> unit
    val modify_opt : key -> ('a option -> 'a option) -> 'a t -> unit
    val merge :
      (key -> 'a option -> 'b option -> 'c option) -> 'a t -> 'b t -> 'c t
    val merge_all :
      (key -> 'a list -> 'b list -> 'c list) -> 'a t -> 'b t -> 'c t
    val stats : 'a t -> statistics
    val keys : 'a t -> key BatEnum.t
    val values : 'a t -> 'BatEnum.t
    val enum : 'a t -> (key * 'a) BatEnum.t
    val to_list : 'a t -> (key * 'a) list
    val of_enum : (key * 'a) BatEnum.t -> 'a t
    val of_list : (key * 'a) list -> 'a t
    val print :
      ?first:string ->
      ?last:string ->
      ?sep:string ->
      ('BatInnerIO.output -> key -> unit) ->
      ('BatInnerIO.output -> '-> unit) ->
      'BatInnerIO.output -> 'b t -> unit
    module Exceptionless :
      sig
        val find : 'a t -> key -> 'a option
        val modify :
          key -> ('-> 'a) -> 'a t -> (unit, exn) BatPervasives.result
      end
    module Infix :
      sig
        val ( --> ) : 'a t -> key -> 'a
        val ( <-- ) : 'a t -> key * '-> unit
      end
    module Labels :
      sig
        val add : 'a t -> key:key -> data:'-> unit
        val replace : 'a t -> key:key -> data:'-> unit
        val iter : f:(key:key -> data:'-> unit) -> 'a t -> unit
        val for_all : f:(key:key -> data:'-> bool) -> 'a t -> bool
        val map : f:(key:key -> data:'-> 'b) -> 'a t -> 'b t
        val map_inplace : f:(key:key -> data:'-> 'a) -> 'a t -> unit
        val filter : f:('-> bool) -> 'a t -> 'a t
        val filter_inplace : f:('-> bool) -> 'a t -> unit
        val filteri : f:(key:key -> data:'-> bool) -> 'a t -> 'a t
        val filteri_inplace : f:(key:key -> data:'-> bool) -> 'a t -> unit
        val filter_map : f:(key:key -> data:'-> 'b option) -> 'a t -> 'b t
        val filter_map_inplace :
          f:(key:key -> data:'-> 'a option) -> 'a t -> unit
        val fold :
          f:(key:key -> data:'-> '-> 'b) -> 'a t -> init:'-> 'b
        val exists : f:(key:key -> data:'-> bool) -> 'a t -> bool
        val modify : key:key -> f:('-> 'a) -> 'a t -> unit
        val modify_def :
          default:'-> key:key -> f:('-> 'a) -> 'a t -> unit
        val modify_opt :
          key:key -> f:('a option -> 'a option) -> 'a t -> unit
        val merge :
          f:(key -> 'a option -> 'b option -> 'c option) ->
          left:'a t -> right:'b t -> 'c t
        val merge_all :
          f:(key -> 'a list -> 'b list -> 'c list) ->
          left:'a t -> right:'b t -> 'c t
      end
  end