sig
  class nfd :
    UChar.t #OOChannel.obj_output_channel ->
    [UChar.t] OOChannel.obj_output_channel
  class nfc :
    UChar.t #OOChannel.obj_output_channel ->
    [UChar.t] OOChannel.obj_output_channel
  class nfkd :
    UChar.t #OOChannel.obj_output_channel ->
    [UChar.t] OOChannel.obj_output_channel
  class nfkc :
    UChar.t #OOChannel.obj_output_channel ->
    [UChar.t] OOChannel.obj_output_channel
  module type Type =
    sig
      type text
      val nfd : UNF.Type.text -> UNF.Type.text
      val nfkd : UNF.Type.text -> UNF.Type.text
      val nfc : UNF.Type.text -> UNF.Type.text
      val nfkc : UNF.Type.text -> UNF.Type.text
      module NFCBuf :
        sig
          type buf
          val create : int -> UNF.Type.NFCBuf.buf
          val contents : UNF.Type.NFCBuf.buf -> UNF.Type.text
          val clear : UNF.Type.NFCBuf.buf -> unit
          val reset : UNF.Type.NFCBuf.buf -> unit
          val add_char : UNF.Type.NFCBuf.buf -> UChar.t -> unit
          val add_string : UNF.Type.NFCBuf.buf -> UNF.Type.text -> unit
          val add_buffer : UNF.Type.NFCBuf.buf -> UNF.Type.NFCBuf.buf -> unit
        end
      val nfc_append : UNF.Type.text -> UNF.Type.text -> UNF.Type.text
      val put_nfd : XString.t -> UNF.Type.text -> unit
      val put_nfkd : XString.t -> UNF.Type.text -> unit
      val put_nfc : XString.t -> UNF.Type.text -> unit
      val put_nfkc : XString.t -> UNF.Type.text -> unit
      type index
      val nfd_inc :
        UNF.Type.text ->
        UNF.Type.index ->
        ([ `Inc of UChar.t list * UNF.Type.index * 'a lazy_t ] as 'a)
      val canon_compare : UNF.Type.text -> UNF.Type.text -> int
    end
  module Make :
    functor (Text : UnicodeString.Type->
      sig
        type text = Text.t
        val nfd : text -> text
        val nfkd : text -> text
        val nfc : text -> text
        val nfkc : text -> text
        module NFCBuf :
          sig
            type buf
            val create : int -> buf
            val contents : buf -> text
            val clear : buf -> unit
            val reset : buf -> unit
            val add_char : buf -> UChar.t -> unit
            val add_string : buf -> text -> unit
            val add_buffer : buf -> buf -> unit
          end
        val nfc_append : text -> text -> text
        val put_nfd : XString.t -> text -> unit
        val put_nfkd : XString.t -> text -> unit
        val put_nfc : XString.t -> text -> unit
        val put_nfkc : XString.t -> text -> unit
        type index = Text.index
        val nfd_inc :
          text ->
          index -> ([ `Inc of UChar.t list * index * 'a lazy_t ] as 'a)
        val canon_compare : text -> text -> int
      end
  val nfd : UChar.t -> UChar.t list
  val nfkd : UChar.t -> UChar.t list
end