sig
  module C :
    sig
      type 'a t = private { arr : 'a array; ofs : int; len : int; }
      val empty : 'It_type.IT.Subarray.C.t
      val mk :
        arr:'a array -> ofs:int -> len:int -> 'It_type.IT.Subarray.C.t
    end
  type 'a t =
    'It_type.IT.Subarray.C.t = private {
    arr : 'a array;
    ofs : int;
    len : int;
  }
  val length : 'It_type.IT.Subarray.t -> int
  val get : 'It_type.IT.Subarray.t -> int -> 'a
  val empty : 'It_type.IT.Subarray.C.t
  val replace_with_substring :
    char array -> string -> int -> int -> char It_type.IT.Subarray.C.t
  val of_string : string -> char It_type.IT.Subarray.C.t
  val of_array : 'a array -> 'It_type.IT.Subarray.C.t
  val of_array_sub : 'a array -> int -> int -> 'It_type.IT.Subarray.C.t
  val of_list : 'a list -> 'It_type.IT.Subarray.C.t
  val of_elem : '-> 'It_type.IT.Subarray.C.t
  type dir = Subarray.dir = L | R
  val fold :
    It_type.IT.Subarray.dir ->
    ('-> '-> 'a) -> '-> 'It_type.IT.Subarray.C.t -> 'a
  val iter : ('-> unit) -> 'It_type.IT.Subarray.C.t -> unit
  val to_list : 'It_type.IT.Subarray.C.t -> 'a list
  val to_string : char It_type.IT.Subarray.C.t -> string
  val append_to_list_rev : 'It_type.IT.Subarray.C.t -> 'a list -> 'a list
  val get_first_item : 'It_type.IT.Subarray.C.t -> 'a option
  val destruct_first_item :
    'It_type.IT.Subarray.C.t -> ('a * 'It_type.IT.Subarray.C.t) option
  val sub :
    'It_type.IT.Subarray.C.t ->
    ofs:int -> len:int -> 'It_type.IT.Subarray.C.t
  val split_at :
    int ->
    'It_type.IT.Subarray.C.t ->
    'It_type.IT.Subarray.C.t * 'It_type.IT.Subarray.C.t
  val drop : int -> 'It_type.IT.Subarray.C.t -> 'It_type.IT.Subarray.C.t
  val break :
    ('-> bool) ->
    'It_type.IT.Subarray.C.t ->
    'It_type.IT.Subarray.C.t * 'It_type.IT.Subarray.C.t
  val break_limit :
    limit:int ->
    ('-> bool) ->
    'It_type.IT.Subarray.C.t ->
    [> `Found of 'It_type.IT.Subarray.C.t * 'It_type.IT.Subarray.C.t
     | `Hit_end
     | `Hit_limit ]
  val drop_while :
    ('-> bool) -> 'It_type.IT.Subarray.C.t -> 'It_type.IT.Subarray.C.t
  val is_empty : 'It_type.IT.Subarray.C.t -> bool
  val buffer_add : Buffer.t -> char It_type.IT.Subarray.C.t -> unit
  val map :
    ('-> 'b) -> 'It_type.IT.Subarray.C.t -> 'It_type.IT.Subarray.C.t
  val copy : 'It_type.IT.Subarray.C.t -> 'It_type.IT.Subarray.C.t
  val concat_splitted :
    'It_type.IT.Subarray.C.t ->
    'It_type.IT.Subarray.C.t -> 'It_type.IT.Subarray.C.t
end