sig
  type 'a gen = unit -> 'a option
  type 'a sequence = ('-> unit) -> unit
  type 'a klist = unit -> [ `Cons of 'a * 'CCString.klist | `Nil ]
  module type S =
    sig
      type t
      val length : CCString.S.t -> int
      val blit : CCString.S.t -> int -> Bytes.t -> int -> int -> unit
      val fold : ('-> char -> 'a) -> '-> CCString.S.t -> 'a
      val to_gen : CCString.S.t -> char CCString.gen
      val to_seq : CCString.S.t -> char CCString.sequence
      val to_klist : CCString.S.t -> char CCString.klist
      val to_list : CCString.S.t -> char list
      val pp : Buffer.t -> CCString.S.t -> unit
      val print : Format.formatter -> CCString.S.t -> unit
    end
  external get : string -> int -> char = "%string_safe_get"
  external create : int -> bytes = "caml_create_string"
  val make : int -> char -> string
  val copy : string -> string
  val sub : string -> int -> int -> string
  val fill : bytes -> int -> int -> char -> unit
  val concat : string -> string list -> string
  val trim : string -> string
  val escaped : string -> string
  val index : string -> char -> int
  val rindex : string -> char -> int
  val index_from : string -> int -> char -> int
  val rindex_from : string -> int -> char -> int
  val contains : string -> char -> bool
  val contains_from : string -> int -> char -> bool
  val rcontains_from : string -> int -> char -> bool
  val uppercase : string -> string
  val lowercase : string -> string
  val capitalize : string -> string
  val uncapitalize : string -> string
  type t = string
  external unsafe_get : string -> int -> char = "%string_unsafe_get"
  external unsafe_set : bytes -> int -> char -> unit = "%string_unsafe_set"
  external unsafe_blit : string -> int -> bytes -> int -> int -> unit
    = "caml_blit_string" [@@noalloc]
  external unsafe_fill : bytes -> int -> int -> char -> unit
    = "caml_fill_string" [@@noalloc]
  val equal : string -> string -> bool
  val compare : string -> string -> int
  val hash : string -> int
  val init : int -> (int -> char) -> string
  val rev : string -> string
  val pad : ?side:[ `Left | `Right ] -> ?c:char -> int -> string -> string
  val of_char : char -> string
  val of_gen : char CCString.gen -> string
  val of_seq : char CCString.sequence -> string
  val of_klist : char CCString.klist -> string
  val of_list : char list -> string
  val of_array : char array -> string
  val to_array : string -> char array
  val find : ?start:int -> sub:string -> string -> int
  val find_all : ?start:int -> sub:string -> string -> int CCString.gen
  val find_all_l : ?start:int -> sub:string -> string -> int list
  val mem : ?start:int -> sub:string -> string -> bool
  val rfind : sub:string -> string -> int
  val replace :
    ?which:[ `All | `Left | `Right ] ->
    sub:string -> by:string -> string -> string
  val is_sub : sub:string -> int -> string -> int -> len:int -> bool
  val repeat : string -> int -> string
  val prefix : pre:string -> string -> bool
  val suffix : suf:string -> string -> bool
  val chop_prefix : pre:string -> string -> string option
  val chop_suffix : suf:string -> string -> string option
  val take : int -> string -> string
  val drop : int -> string -> string
  val take_drop : int -> string -> string * string
  val lines : string -> string list
  val lines_gen : string -> string CCString.gen
  val concat_gen : sep:string -> string CCString.gen -> string
  val unlines : string list -> string
  val unlines_gen : string CCString.gen -> string
  val set : string -> int -> char -> string
  val iter : (char -> unit) -> string -> unit
  val iteri : (int -> char -> unit) -> string -> unit
  val map : (char -> char) -> string -> string
  val mapi : (int -> char -> char) -> string -> string
  val filter_map : (char -> char option) -> string -> string
  val filter : (char -> bool) -> string -> string
  val flat_map : ?sep:string -> (char -> string) -> string -> string
  val for_all : (char -> bool) -> string -> bool
  val exists : (char -> bool) -> string -> bool
  val length : string -> int
  val blit : string -> int -> Bytes.t -> int -> int -> unit
  val fold : ('-> char -> 'a) -> '-> string -> 'a
  val to_gen : string -> char gen
  val to_seq : string -> char sequence
  val to_klist : string -> char klist
  val to_list : string -> char list
  val pp : Buffer.t -> string -> unit
  val print : Format.formatter -> string -> unit
  val ltrim : t -> t
  val rtrim : t -> t
  val map2 : (char -> char -> char) -> string -> string -> string
  val iter2 : (char -> char -> unit) -> string -> string -> unit
  val iteri2 : (int -> char -> char -> unit) -> string -> string -> unit
  val fold2 : ('-> char -> char -> 'a) -> '-> string -> string -> 'a
  val for_all2 : (char -> char -> bool) -> string -> string -> bool
  val exists2 : (char -> char -> bool) -> string -> string -> bool
  val capitalize_ascii : string -> string
  val uncapitalize_ascii : string -> string
  val uppercase_ascii : string -> string
  val lowercase_ascii : string -> string
  val equal_caseless : string -> string -> bool
  module Find :
    sig
      type _ pattern
      val compile : string -> [ `Direct ] CCString.Find.pattern
      val rcompile : string -> [ `Reverse ] CCString.Find.pattern
      val find :
        ?start:int ->
        pattern:[ `Direct ] CCString.Find.pattern -> string -> int
      val rfind :
        ?start:int ->
        pattern:[ `Reverse ] CCString.Find.pattern -> string -> int
    end
  module Split :
    sig
      val list_ : by:string -> string -> (string * int * int) list
      val gen : by:string -> string -> (string * int * int) CCString.gen
      val seq : by:string -> string -> (string * int * int) CCString.sequence
      val klist : by:string -> string -> (string * int * int) CCString.klist
      val list_cpy : by:string -> string -> string list
      val gen_cpy : by:string -> string -> string CCString.gen
      val seq_cpy : by:string -> string -> string CCString.sequence
      val klist_cpy : by:string -> string -> string CCString.klist
      val left : by:string -> string -> (string * string) option
      val left_exn : by:string -> string -> string * string
      val right : by:string -> string -> (string * string) option
      val right_exn : by:string -> string -> string * string
    end
  val split_on_char : char -> string -> string list
  val split : by:string -> string -> string list
  val compare_versions : string -> string -> int
  val compare_natural : string -> string -> int
  val edit_distance : string -> string -> int
  module Sub :
    sig
      type t = string * int * int
      val make : string -> int -> len:int -> CCString.Sub.t
      val full : string -> CCString.Sub.t
      val copy : CCString.Sub.t -> string
      val underlying : CCString.Sub.t -> string
      val sub : CCString.Sub.t -> int -> int -> CCString.Sub.t
      val get : CCString.Sub.t -> int -> char
      val length : t -> int
      val blit : t -> int -> Bytes.t -> int -> int -> unit
      val fold : ('-> char -> 'a) -> '-> t -> 'a
      val to_gen : t -> char gen
      val to_seq : t -> char sequence
      val to_klist : t -> char klist
      val to_list : t -> char list
      val pp : Buffer.t -> t -> unit
      val print : Format.formatter -> t -> unit
    end
end