sig
  type ('a, 'b, 'c) t constraint 'c = [< `Read | `Write ]
  val create : int -> ('a, 'b, [< `Read | `Write ]) BatHashtbl.Cap.t
  external of_table :
    ('a, 'b) Stdlib.Hashtbl.t ->
    ('a, 'b, [< `Read | `Write ]) BatHashtbl.Cap.t = "%identity"
  external to_table :
    ('a, 'b, [ `Read | `Write ]) BatHashtbl.Cap.t ->
    ('a, 'b) Stdlib.Hashtbl.t = "%identity"
  external read_only :
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('a, 'b, [ `Read ]) BatHashtbl.Cap.t = "%identity"
  external write_only :
    ('a, 'b, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t ->
    ('a, 'b, [ `Write ]) BatHashtbl.Cap.t = "%identity"
  val length : ('a, 'b, [< `Read | `Write ]) BatHashtbl.Cap.t -> int
  val is_empty : ('a, 'b, [< `Read | `Write ]) BatHashtbl.Cap.t -> bool
  val add :
    ('a, 'b, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t ->
    '-> '-> unit
  val remove :
    ('a, 'b, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> '-> unit
  val remove_all :
    ('a, 'b, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> '-> unit
  val replace :
    ('a, 'b, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t ->
    '-> '-> unit
  val copy :
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('a, 'b, [< `Read | `Write ]) BatHashtbl.Cap.t
  val clear : ('a, 'b, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> unit
  val find :
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> '-> 'b
  val find_all :
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> '-> 'b list
  val find_default :
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> '-> '-> 'b
  val find_option :
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> '-> 'b option
  val mem :
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> '-> bool
  val iter :
    ('-> '-> unit) ->
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> unit
  val fold :
    ('-> '-> '-> 'c) ->
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> '-> 'c
  val map :
    ('-> '-> 'c) ->
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('a, 'c, [< `Read | `Write ]) BatHashtbl.Cap.t
  val map_inplace :
    ('-> '-> 'b) ->
    ('a, 'b, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> unit
  val filter :
    ('-> bool) ->
    ('key, 'a, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('key, 'a, [< `Read | `Write ]) BatHashtbl.Cap.t
  val filter_inplace :
    ('-> bool) ->
    ('key, 'a, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> unit
  val filteri :
    ('key -> '-> bool) ->
    ('key, 'a, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('key, 'a, [< `Read | `Write ]) BatHashtbl.Cap.t
  val filteri_inplace :
    ('key -> '-> bool) ->
    ('key, 'a, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> unit
  val filter_map :
    ('key -> '-> 'b option) ->
    ('key, 'a, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('key, 'b, [< `Read | `Write ]) BatHashtbl.Cap.t
  val filter_map_inplace :
    ('key -> '-> 'a option) ->
    ('key, 'a, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> unit
  val merge :
    ('key -> 'a option -> 'b option -> 'c option) ->
    ('key, 'a, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('key, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('key, 'c, [< `Read | `Write ]) BatHashtbl.Cap.t
  val merge_all :
    ('key -> 'a list -> 'b list -> 'c list) ->
    ('key, 'a, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('key, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('key, 'c, [< `Read | `Write ]) BatHashtbl.Cap.t
  val keys :
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> 'BatEnum.t
  val values :
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> 'BatEnum.t
  val enum :
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('a * 'b) BatEnum.t
  val of_enum :
    ('a * 'b) BatEnum.t -> ('a, 'b, [< `Read | `Write ]) BatHashtbl.Cap.t
  val to_list :
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> ('a * 'b) list
  val of_list :
    ('a * 'b) list -> ('a, 'b, [< `Read | `Write ]) BatHashtbl.Cap.t
  val print :
    ?first:string ->
    ?last:string ->
    ?sep:string ->
    ?kvsep:string ->
    ('BatInnerIO.output -> '-> unit) ->
    ('BatInnerIO.output -> '-> unit) ->
    'BatInnerIO.output ->
    ('b, 'c, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> unit
  module Exceptionless :
    sig
      val find :
        ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
        '-> 'b option
      val modify :
        '->
        ('-> 'b) ->
        ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
        (unit, exn) BatPervasives.result
    end
  module Labels :
    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 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 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
end