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