sig
  type character = char
  type t = bytes
  val max_string_length : int option
  val empty : bytes
  val is_empty : bytes -> bool
  val make : int -> char -> bytes
  val length : bytes -> int
  val of_character : char -> bytes
  val of_character_list : char list -> bytes
  val to_character_list : bytes -> char list
  val get : bytes -> index:int -> char option
  val set : bytes -> index:int -> v:char -> bytes option
  val get_exn : bytes -> index:int -> char
  val set_exn : bytes -> index:int -> v:char -> bytes
  val concat : ?sep:bytes -> bytes list -> bytes
  val of_native_string :
    string -> (bytes, [> `wrong_char_at of int ]) Api.result
  val of_native_substring :
    string ->
    offset:int ->
    length:int ->
    (bytes, [> `out_of_bounds | `wrong_char_at of int ]) Api.result
  val to_native_string : bytes -> string
  val to_string_hum : bytes -> string
  val fold : bytes -> init:'-> f:('-> char -> 'a) -> 'a
  val foldi : bytes -> init:'-> f:(int -> '-> char -> 'a) -> 'a
  val fold2_exn :
    bytes -> bytes -> init:'-> f:('-> char -> char -> 'a) -> 'a
  val compare : bytes -> bytes -> int
  val sub : bytes -> index:int -> length:int -> bytes option
  val sub_exn : bytes -> index:int -> length:int -> bytes
  val slice : ?start:int -> ?finish:int -> bytes -> bytes option
  val slice_exn : ?start:int -> ?finish:int -> bytes -> bytes
  val is_prefix : bytes -> prefix:bytes -> bool
  val is_suffix : bytes -> suffix:bytes -> bool
  val chop_prefix_exn : bytes -> prefix:bytes -> bytes
  val chop_prefix : bytes -> prefix:bytes -> bytes option
  val chop_suffix_exn : bytes -> suffix:bytes -> bytes
  val chop_suffix : bytes -> suffix:bytes -> bytes option
  val split_at : bytes -> index:int -> bytes * bytes
  val take : bytes -> index:int -> bytes
  val drop : bytes -> index:int -> bytes
  val compare_substring : bytes * int * int -> bytes * int * int -> int
  val compare_substring_strict :
    bytes * int * int -> bytes * int * int -> int option
  val iter : bytes -> f:(char -> unit) -> unit
  val iteri : bytes -> f:(int -> char -> unit) -> unit
  val iter_reverse : bytes -> f:(char -> unit) -> unit
  val rev : bytes -> bytes
  val map : bytes -> f:(char -> char) -> bytes
  val mapi : bytes -> f:(int -> char -> char) -> bytes
  val map2_exn : bytes -> bytes -> f:(char -> char -> char) -> bytes
  val for_all : bytes -> f:(char -> bool) -> bool
  val exists : bytes -> f:(char -> bool) -> bool
  val take_while : bytes -> f:(char -> bool) -> bytes
  val take_while_with_index : bytes -> f:(int -> char -> bool) -> bytes
  val index_of_character : bytes -> ?from:int -> char -> int option
  val index_of_character_reverse : bytes -> ?from:int -> char -> int option
  val index_of_string :
    ?from:int ->
    ?sub_index:int -> ?sub_length:int -> bytes -> sub:bytes -> int option
  val index_of_string_reverse :
    ?from:int ->
    ?sub_index:int -> ?sub_length:int -> bytes -> sub:bytes -> int option
  val find :
    ?from:int -> ?length:int -> bytes -> f:(char -> bool) -> int option
  val find_reverse :
    ?from:int -> ?length:int -> bytes -> f:(char -> bool) -> int option
  val filter_map :
    ?from:int -> ?length:int -> bytes -> f:(char -> char option) -> bytes
  val filter : ?from:int -> ?length:int -> bytes -> f:(char -> bool) -> bytes
  val split :
    bytes -> on:[ `Character of char | `String of bytes ] -> bytes list
  val strip :
    ?on:[ `Both | `Left | `Right ] ->
    ?whitespace:(char -> bool) -> bytes -> bytes
  module Make_output :
    functor (Model : Api.OUTPUT_MODEL->
      sig
        val output :
          ('a, 'b, 'c) Model.channel -> bytes -> (unit, 'e, 'f) Model.thread
      end
  val mutate :
    bytes -> index:int -> char -> (unit, [> `out_of_bounds ]) Api.result
  val mutate_exn : bytes -> index:int -> char -> unit
  val blit :
    src:bytes ->
    src_index:int ->
    dst:bytes ->
    dst_index:int -> length:int -> (unit, [> `out_of_bounds ]) Api.result
  val blit_exn :
    src:bytes ->
    src_index:int -> dst:bytes -> dst_index:int -> length:int -> unit
end