sig
  module type Type =
    sig
      type t
      val get : UnicodeString.Type.t -> int -> UChar.t
      val init : int -> (int -> UChar.t) -> UnicodeString.Type.t
      val length : UnicodeString.Type.t -> int
      type index
      val look : UnicodeString.Type.t -> UnicodeString.Type.index -> UChar.t
      val nth : UnicodeString.Type.t -> int -> UnicodeString.Type.index
      val next :
        UnicodeString.Type.t ->
        UnicodeString.Type.index -> UnicodeString.Type.index
      val prev :
        UnicodeString.Type.t ->
        UnicodeString.Type.index -> UnicodeString.Type.index
      val out_of_range :
        UnicodeString.Type.t -> UnicodeString.Type.index -> bool
      val iter : (UChar.t -> unit) -> UnicodeString.Type.t -> unit
      val compare : UnicodeString.Type.t -> UnicodeString.Type.t -> int
      val first : UnicodeString.Type.t -> UnicodeString.Type.index
      val last : UnicodeString.Type.t -> UnicodeString.Type.index
      val move :
        UnicodeString.Type.t ->
        UnicodeString.Type.index -> int -> UnicodeString.Type.index
      val compare_index :
        UnicodeString.Type.t ->
        UnicodeString.Type.index -> UnicodeString.Type.index -> int
      module Buf :
        sig
          type buf
          val create : int -> UnicodeString.Type.Buf.buf
          val contents : UnicodeString.Type.Buf.buf -> UnicodeString.Type.t
          val clear : UnicodeString.Type.Buf.buf -> unit
          val reset : UnicodeString.Type.Buf.buf -> unit
          val add_char : UnicodeString.Type.Buf.buf -> UChar.t -> unit
          val add_string :
            UnicodeString.Type.Buf.buf -> UnicodeString.Type.t -> unit
          val add_buffer :
            UnicodeString.Type.Buf.buf -> UnicodeString.Type.Buf.buf -> unit
        end
    end
end