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 ->
    '-> '-> 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 filter :
    ('-> bool) ->
    ('b, 'a, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('b, 'a, [< `Read | `Write ]) BatHashtbl.Cap.t
  val filteri :
    ('-> '-> bool) ->
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('a, 'b, [< `Read | `Write ]) BatHashtbl.Cap.t
  val filter_map :
    ('-> '-> 'c option) ->
    ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
    ('a, '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 print :
    ?first:string ->
    ?last:string ->
    ?sep: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
    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 fold :
        f:(key:'-> data:'-> '-> 'c) ->
        ('a, 'b, [< `Read | `Write > `Read ]) BatHashtbl.Cap.t ->
        init:'-> 'c
    end
end