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) Hashtbl.t -> ('a, 'b, [< `Read | `Write ]) BatHashtbl.Cap.t
    = "%identity"
  external to_table :
    ('a, 'b, [ `Read | `Write ]) BatHashtbl.Cap.t -> ('a, 'b) 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 ->
    'a -> 'b -> unit
  val remove :
    ('a, 'b, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> 'a -> unit
  val remove_all :
    ('a, 'b, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> 'a -> unit
  val replace :
    ('a, 'b, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t ->
    'a -> 'b -> 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 -> 'a -> 'b
  val find_all :
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> 'a -> 'b list
  val find_default :
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> 'a -> 'b -> 'b
  val find_option :
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> 'a -> 'b option
  val mem :
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> 'a -> bool
  val iter :
    ('a -> 'b -> unit) ->
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> unit
  val fold :
    ('a -> 'b -> 'c -> 'c) ->
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> 'c -> 'c
  val map :
    ('a -> 'b -> 'c) ->
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('a, 'c, [< `Read | `Write ]) BatHashtbl.Cap.t
  val map_inplace :
    ('a -> 'b -> 'b) ->
    ('a, 'b, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> unit
  val filter :
    ('a -> bool) ->
    ('key, 'a, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('key, 'a, [< `Read | `Write ]) BatHashtbl.Cap.t
  val filter_inplace :
    ('a -> bool) ->
    ('key, 'a, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> unit
  val filteri :
    ('key -> 'a -> bool) ->
    ('key, 'a, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('key, 'a, [< `Read | `Write ]) BatHashtbl.Cap.t
  val filteri_inplace :
    ('key -> 'a -> bool) ->
    ('key, 'a, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> unit
  val filter_map :
    ('key -> 'a -> 'b option) ->
    ('key, 'a, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('key, 'b, [< `Read | `Write ]) BatHashtbl.Cap.t
  val filter_map_inplace :
    ('key -> 'a -> 'a option) ->
    ('key, 'a, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> unit
  val keys :
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> 'a BatEnum.t
  val values :
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> 'b 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 print :
    ?first:string ->
    ?last:string ->
    ?sep:string ->
    ?kvsep:string ->
    ('a BatInnerIO.output -> 'b -> unit) ->
    ('a BatInnerIO.output -> 'c -> unit) ->
    'a BatInnerIO.output ->
    ('b, 'c, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> unit
  module Exceptionless :
    sig
      val find :
        ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
        'a -> 'b option
      val modify :
        'a ->
        ('b -> '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:'a -> data:'b -> unit
      val replace :
        ('a, 'b, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t ->
        key:'a -> data:'b -> unit
      val iter :
        f:(key:'a -> data:'b -> unit) ->
        ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t -> unit
      val map :
        f:(key:'a -> data:'b -> 'c) ->
        ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
        ('a, 'c, [< `Read | `Write ]) BatHashtbl.Cap.t
      val map_inplace :
        f:(key:'a -> data:'b -> 'b) ->
        ('a, 'b, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> unit
      val filter :
        f:('a -> bool) ->
        ('key, 'a, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
        ('key, 'a, [< `Read | `Write ]) BatHashtbl.Cap.t
      val filter_inplace :
        f:('a -> bool) ->
        ('key, 'a, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> unit
      val filteri :
        f:(key:'key -> data:'a -> bool) ->
        ('key, 'a, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
        ('key, 'a, [< `Read | `Write ]) BatHashtbl.Cap.t
      val filteri_inplace :
        f:(key:'key -> data:'a -> bool) ->
        ('key, 'a, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> unit
      val filter_map :
        f:(key:'key -> data:'a -> '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 -> 'a option) ->
        ('key, 'a, [< `Read | `Write > `Write ]) BatHashtbl.Cap.t -> unit
      val fold :
        f:(key:'a -> data:'b -> 'c -> 'c) ->
        ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
        init:'c -> 'c
    end
end