sig
  module Make :
    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
end