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