sig
  type ('a, 'b) t = ('a, 'b) BatArray.Cap.t
    constraint 'b = [< `Read | `Write ]
  external length : ('a, [< `Read | `Write ]) t -> int = "%array_length"
  external get : ('a, [< `Read | `Write > `Read ]) t -> int -> 'a
    = "%array_safe_get"
  external set : ('a, [< `Read | `Write > `Write ]) t -> int -> '-> unit
    = "%array_safe_set"
  external make : int -> '-> ('a, [< `Read | `Write ]) t = "caml_make_vect"
  external create : int -> '-> ('a, [< `Read | `Write ]) t
    = "caml_make_vect"
  external make_float : int -> (float, [< `Read | `Write ]) t
    = "caml_make_float_vect"
  external of_array : 'a array -> ('a, [< `Read | `Write ]) t = "%identity"
  external to_array : ('a, [ `Read | `Write ]) t -> 'a array = "%identity"
  external read_only :
    ('a, [< `Read | `Write > `Read ]) t -> ('a, [ `Read ]) t = "%identity"
  external write_only :
    ('a, [< `Read | `Write > `Write ]) t -> ('a, [ `Write ]) t = "%identity"
  val init : int -> (int -> 'a) -> ('a, [< `Read | `Write ]) t
  val make_matrix :
    int -> int -> '-> (('a, [< `Read | `Write ]) t, [< `Read | `Write ]) t
  val create_matrix :
    int -> int -> '-> (('a, [< `Read | `Write ]) t, [< `Read | `Write ]) t
  val iter : ('-> unit) -> ('a, [< `Read | `Write > `Read ]) t -> unit
  val map :
    ('-> 'b) ->
    ('a, [< `Read | `Write > `Read ]) t -> ('b, [< `Read | `Write ]) t
  val iteri :
    (int -> '-> unit) -> ('a, [< `Read | `Write > `Read ]) t -> unit
  val mapi :
    (int -> '-> 'b) ->
    ('a, [< `Read | `Write > `Read ]) t -> ('b, [< `Read | `Write ]) t
  val modify : ('-> 'a) -> ('a, [ `Read | `Write ]) t -> unit
  val modifyi : (int -> '-> 'a) -> ('a, [ `Read | `Write ]) t -> unit
  val fold_left :
    ('-> '-> 'a) -> '-> ('b, [< `Read | `Write > `Read ]) t -> 'a
  val fold :
    ('-> '-> 'a) -> '-> ('b, [< `Read | `Write > `Read ]) t -> 'a
  val fold_right :
    ('-> '-> 'a) -> ('b, [< `Read | `Write > `Read ]) t -> '-> 'a
  val fold_while :
    ('acc -> '-> bool) ->
    ('acc -> '-> 'acc) ->
    'acc -> ('a, [< `Read | `Write > `Read ]) t -> 'acc * int
  val iter2 :
    ('-> '-> unit) ->
    ('a, [< `Read | `Write > `Read ]) t ->
    ('b, [< `Read | `Write > `Read ]) t -> unit
  val iter2i :
    (int -> '-> '-> unit) ->
    ('a, [< `Read | `Write > `Read ]) t ->
    ('b, [< `Read | `Write > `Read ]) t -> unit
  val for_all : ('-> bool) -> ('a, [< `Read | `Write > `Read ]) t -> bool
  val exists : ('-> bool) -> ('a, [< `Read | `Write > `Read ]) t -> bool
  val find_opt :
    ('-> bool) -> ('a, [< `Read | `Write > `Read ]) t -> 'a option
  val find_map :
    ('-> 'b option) -> ('a, [< `Read | `Write > `Read ]) t -> 'b option
  val mem : '-> ('a, [< `Read | `Write > `Read ]) t -> bool
  val memq : '-> ('a, [< `Read | `Write > `Read ]) t -> bool
  val filter :
    ('-> bool) ->
    ('a, [< `Read | `Write > `Read ]) t -> ('a, [< `Read | `Write ]) t
  val filter_map :
    ('-> 'b option) ->
    ('a, [< `Read | `Write > `Read ]) t -> ('b, [< `Read | `Write ]) t
  val count_matching :
    ('-> bool) -> ('a, [< `Read | `Write > `Read ]) t -> int
  val find_all :
    ('-> bool) ->
    ('a, [< `Read | `Write > `Read ]) t -> ('a, [< `Read | `Write ]) t
  val partition :
    ('-> bool) ->
    ('a, [< `Read | `Write > `Read ]) t ->
    ('a, [< `Read | `Write ]) t * ('a, [< `Read | `Write ]) t
  val rev :
    ('a, [< `Read | `Write > `Read ]) t -> ('a, [< `Read | `Write ]) t
  val rev_in_place : ('a, [ `Read | `Write ]) t -> unit
  val append :
    ('a, [< `Read | `Write > `Read ]) t ->
    ('a, [< `Read | `Write > `Read ]) t -> ('a, [< `Read | `Write ]) t
  val concat :
    ('a, [< `Read | `Write > `Read ]) t list -> ('a, [< `Read | `Write ]) t
  val sub :
    ('a, [< `Read | `Write > `Read ]) t ->
    int -> int -> ('a, [< `Read | `Write ]) t
  val copy : ('a, [< `Read | `Write > `Read ]) t -> 'a array
  val fill : ('a, [< `Read | `Write > `Write ]) t -> int -> int -> '-> unit
  val blit :
    ('a, [< `Read | `Write > `Read ]) t ->
    int -> ('a, [< `Read | `Write > `Write ]) t -> int -> int -> unit
  val enum : ('a, [< `Read | `Write > `Read ]) t -> 'BatEnum.t
  val of_enum : 'BatEnum.t -> ('a, [< `Read | `Write ]) t
  val backwards : ('a, [< `Read | `Write > `Read ]) t -> 'BatEnum.t
  val of_backwards : 'BatEnum.t -> ('a, [< `Read | `Write ]) t
  val to_list : ('a, [< `Read | `Write > `Read ]) t -> 'a list
  val split :
    ('a * 'b, [< `Read | `Write > `Read ]) t ->
    ('a, [< `Read | `Write ]) t * ('b, [< `Read | `Write ]) t
  val combine :
    ('a, [< `Read | `Write > `Read ]) t ->
    ('b, [< `Read | `Write > `Read ]) t ->
    ('a * 'b, [< `Read | `Write > `Read ]) t
  val pivot_split :
    'BatOrd.ord -> ('a, [< `Read | `Write > `Read ]) t -> '-> int * int
  val of_list : 'a list -> ('a, [< `Read | `Write ]) t
  val sort : ('-> '-> int) -> ('a, [ `Read | `Write ]) t -> unit
  val stable_sort : ('-> '-> int) -> ('a, [ `Read | `Write ]) t -> unit
  val fast_sort : ('-> '-> int) -> ('a, [ `Read | `Write ]) t -> unit
  val print :
    ?first:string ->
    ?last:string ->
    ?sep:string ->
    ('BatIO.output -> '-> unit) ->
    'BatIO.output -> ('b, [< `Read | `Write > `Read ]) t -> unit
  val compare :
    'BatOrd.comp -> ('a, [< `Read | `Write > `Read ]) t BatOrd.comp
  val ord : 'BatOrd.ord -> ('a, [< `Read | `Write > `Read ]) t BatOrd.ord
  val equal : 'BatOrd.eq -> ('a, [< `Read | `Write > `Read ]) t BatOrd.eq
  module Exceptionless = BatArray.Cap.Exceptionless
  module Labels = BatArray.Cap.Labels
  external unsafe_get : ('a, [< `Read | `Write > `Read ]) t -> int -> 'a
    = "%array_unsafe_get"
  external unsafe_set :
    ('a, [< `Read | `Write > `Write ]) t -> int -> '-> unit
    = "%array_unsafe_set"
  val find :
    ('-> bool) ->
    ('a, [< `Read | `Write > `Read ]) BatArray.Cap.t -> 'a option
  val findi :
    ('-> bool) ->
    ('a, [< `Read | `Write > `Read ]) BatArray.Cap.t -> int option
end