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