sig
  val add :
    ('a, 'b, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t ->
    key:'-> data:'-> unit
  val replace :
    ('a, 'b, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t ->
    key:'-> data:'-> unit
  val iter :
    f:(key:'-> data:'-> unit) ->
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> unit
  val for_all :
    f:(key:'-> data:'-> bool) ->
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> bool
  val map :
    f:(key:'-> data:'-> 'c) ->
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('a, 'c, [< `Read | `Write ]) BatHashtbl.Cap.t
  val map_inplace :
    f:(key:'-> data:'-> 'b) ->
    ('a, 'b, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> unit
  val filter :
    f:('-> bool) ->
    ('key, 'a, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('key, 'a, [< `Read | `Write ]) BatHashtbl.Cap.t
  val filter_inplace :
    f:('-> bool) ->
    ('key, 'a, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> unit
  val filteri :
    f:(key:'key -> data:'-> bool) ->
    ('key, 'a, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('key, 'a, [< `Read | `Write ]) BatHashtbl.Cap.t
  val filteri_inplace :
    f:(key:'key -> data:'-> bool) ->
    ('key, 'a, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> unit
  val filter_map :
    f:(key:'key -> data:'-> 'b option) ->
    ('key, 'a, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('key, 'b, [< `Read | `Write ]) BatHashtbl.Cap.t
  val filter_map_inplace :
    f:(key:'key -> data:'-> 'a option) ->
    ('key, 'a, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> unit
  val fold :
    f:(key:'-> data:'-> '-> 'c) ->
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> init:'-> 'c
  val exists :
    f:(key:'-> data:'-> bool) ->
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> bool
  val merge :
    f:('key -> 'a option -> 'b option -> 'c option) ->
    left:('key, 'a, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    right:('key, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('key, 'c, [< `Read | `Write ]) BatHashtbl.Cap.t
  val merge_all :
    f:('key -> 'a list -> 'b list -> 'c list) ->
    left:('key, 'a, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    right:('key, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('key, 'c, [< `Read | `Write ]) BatHashtbl.Cap.t
end