sig
  type t = UTF8Impl.t
  type modified
  type bytes = string
  type error =
      Unable_to_convert_to_modified_utf8 of t
    | Unable_to_convert_from_modified_utf8 of modified
    | Unable_to_convert_to_utf8 of string
    | Unable_to_convert_from_utf8 of t
    | Invalid_index of int * int
    | Index_out_of_bounds of int * int
    | Invalid_escaped_string of t
  exception Exception of error
  val string_of_error : error -> string
  val make : UCharImpl.t list -> t
  val modified_of_bytes : bytes -> modified
  val bytes_of_modified : modified -> bytes
  val to_modified : t -> modified
  val of_modified : modified -> t
  val to_string : t -> string
  val to_string_noerr : t -> string
  val of_string : string -> t
  val to_bytes : t -> bytes
  val of_bytes : bytes -> t
  val of_char : char -> t
  val of_uchar : UCharImpl.t -> t
  val length : t -> int
  val get : t -> int -> UCharImpl.t
  val equal : t -> t -> bool
  val compare : t -> t -> int
  val hash : t -> int
  val index_from : t -> int -> UCharImpl.t -> int
  val rindex_from : t -> int -> UCharImpl.t -> int
  val substring : t -> int -> int -> t
  val ( ++ ) : t -> t -> t
  val concat : t list -> t
  val concat_sep : t -> t list -> t
  val concat_sep_map : t -> ('-> t) -> 'a list -> t
  val replace : UCharImpl.t -> UCharImpl.t -> t -> t
  val contains : UCharImpl.t -> t -> bool
  val split : UCharImpl.t -> t -> t list
  val trim : t -> t
  val escape : t -> t
  val unescape : t -> t
  val escape_char : UCharImpl.t -> t
  external to_camomile : t -> CamomileLibrary.UTF8.t = "%identity"
  external of_camomile : CamomileLibrary.UTF8.t -> t = "%identity"
end