sig   type character = char   type t = Internal_pervasives.String.t   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 ]) 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 : 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 : OUTPUT_MODEL->       sig         val output :           ('a, 'b, 'c) Model.channel -> t -> (unit, 'e, 'f) Model.thread       end   val mutate :     Internal_pervasives.String.t ->     index:int -> char -> (unit, [> `out_of_bounds ]) result   val mutate_exn : Internal_pervasives.String.t -> index:int -> char -> unit   val blit :     src:Internal_pervasives.String.t ->     src_index:int ->     dst:Internal_pervasives.String.t ->     dst_index:int -> length:int -> (unit, [> `out_of_bounds ]) result   val blit_exn :     src:Internal_pervasives.String.t ->     src_index:int ->     dst:Internal_pervasives.String.t -> dst_index:int -> length:int -> unit end