sig
  type async
  type sync
  type ('a, 's) stream
  type location = int * int
  module Error :
    sig
      type t =
          [ `Bad_content of string
          | `Bad_document of string
          | `Bad_namespace of string
          | `Bad_token of string * string * string
          | `Decoding_error of string * string
          | `Misnested_tag of string * string * (string * string) list
          | `Unexpected_eoi of string
          | `Unmatched_end_tag of string
          | `Unmatched_start_tag of string ]
      val to_string : ?location:Markup.location -> Markup.Error.t -> string
    end
  module Encoding :
    sig
      type t
      val decode :
        ?report:(Markup.location -> Markup.Error.t -> unit) ->
        Markup.Encoding.t ->
        (char, 's) Markup.stream -> (int, 's) Markup.stream
      val utf_8 : Markup.Encoding.t
      val utf_16be : Markup.Encoding.t
      val utf_16le : Markup.Encoding.t
      val utf_16 : Markup.Encoding.t
      val iso_8859_1 : Markup.Encoding.t
      val us_ascii : Markup.Encoding.t
      val windows_1251 : Markup.Encoding.t
      val windows_1252 : Markup.Encoding.t
      val ucs_4be : Markup.Encoding.t
      val ucs_4le : Markup.Encoding.t
      val ucs_4be_transposed : Markup.Encoding.t
      val ucs_4le_transposed : Markup.Encoding.t
      val ebcdic : Markup.Encoding.t
    end
  type name = string * string
  type xml_declaration = {
    version : string;
    encoding : string option;
    standalone : bool option;
  }
  type doctype = {
    doctype_name : string option;
    public_identifier : string option;
    system_identifier : string option;
    raw_text : string option;
    force_quirks : bool;
  }
  type signal =
      [ `Comment of string
      | `Doctype of Markup.doctype
      | `End_element
      | `PI of string * string
      | `Start_element of Markup.name * (Markup.name * string) list
      | `Text of string list
      | `Xml of Markup.xml_declaration ]
  val signal_to_string : [< Markup.signal ] -> string
  type 'parser
  val signals : 'Markup.parser -> (Markup.signal, 's) Markup.stream
  val location : 'Markup.parser -> Markup.location
  val parse_xml :
    ?report:(Markup.location -> Markup.Error.t -> unit) ->
    ?encoding:Markup.Encoding.t ->
    ?namespace:(string -> string option) ->
    ?entity:(string -> string option) ->
    ?context:[< `Document | `Fragment ] ->
    (char, 's) Markup.stream -> 'Markup.parser
  val write_xml :
    ?report:(Markup.signal * int -> Markup.Error.t -> unit) ->
    ?prefix:(string -> string option) ->
    ([< Markup.signal ], 's) Markup.stream -> (char, 's) Markup.stream
  val parse_html :
    ?report:(Markup.location -> Markup.Error.t -> unit) ->
    ?encoding:Markup.Encoding.t ->
    ?context:[< `Document | `Fragment of string ] ->
    (char, 's) Markup.stream -> 'Markup.parser
  val write_html :
    ?escape_attribute:(string -> string) ->
    ?escape_text:(string -> string) ->
    ([< Markup.signal ], 's) Markup.stream -> (char, 's) Markup.stream
  val string : string -> (char, Markup.sync) Markup.stream
  val buffer : Stdlib.Buffer.t -> (char, Markup.sync) Markup.stream
  val channel : Stdlib.in_channel -> (char, Markup.sync) Markup.stream
  val file : string -> (char, Markup.sync) Markup.stream * (unit -> unit)
  val fn : (unit -> char option) -> (char, Markup.sync) Markup.stream
  val to_string : (char, Markup.sync) Markup.stream -> string
  val to_buffer : (char, Markup.sync) Markup.stream -> Stdlib.Buffer.t
  val to_channel :
    Stdlib.out_channel -> (char, Markup.sync) Markup.stream -> unit
  val to_file : string -> (char, Markup.sync) Markup.stream -> unit
  val stream : (unit -> 'a option) -> ('a, Markup.sync) Markup.stream
  val next : ('a, Markup.sync) Markup.stream -> 'a option
  val peek : ('a, Markup.sync) Markup.stream -> 'a option
  val transform :
    ('-> '-> 'c list * 'a option) ->
    '-> ('b, 's) Markup.stream -> ('c, 's) Markup.stream
  val fold : ('-> '-> 'a) -> '-> ('b, Markup.sync) Markup.stream -> 'a
  val map : ('-> 'b) -> ('a, 's) Markup.stream -> ('b, 's) Markup.stream
  val filter :
    ('-> bool) -> ('a, 's) Markup.stream -> ('a, 's) Markup.stream
  val filter_map :
    ('-> 'b option) -> ('a, 's) Markup.stream -> ('b, 's) Markup.stream
  val iter : ('-> unit) -> ('a, Markup.sync) Markup.stream -> unit
  val drain : ('a, Markup.sync) Markup.stream -> unit
  val of_list : 'a list -> ('a, Markup.sync) Markup.stream
  val to_list : ('a, Markup.sync) Markup.stream -> 'a list
  val content :
    ([< Markup.signal ], 's) Markup.stream ->
    (Markup.signal, 's) Markup.stream
  val tree :
    ?text:(string list -> 'a) ->
    ?element:(Markup.name -> (Markup.name * string) list -> 'a list -> 'a) ->
    ?comment:(string -> 'a) ->
    ?pi:(string -> string -> 'a) ->
    ?xml:(Markup.xml_declaration -> 'a) ->
    ?doctype:(Markup.doctype -> 'a) ->
    ([< Markup.signal ], Markup.sync) Markup.stream -> 'a option
  val trees :
    ?text:(string list -> 'a) ->
    ?element:(Markup.name -> (Markup.name * string) list -> 'a list -> 'a) ->
    ?comment:(string -> 'a) ->
    ?pi:(string -> string -> 'a) ->
    ?xml:(Markup.xml_declaration -> 'a) ->
    ?doctype:(Markup.doctype -> 'a) ->
    ([< Markup.signal ], 's) Markup.stream -> ('a, 's) Markup.stream
  type 'a node =
      [ `Comment of string
      | `Doctype of Markup.doctype
      | `Element of Markup.name * (Markup.name * string) list * 'a list
      | `PI of string * string
      | `Text of string
      | `Xml of Markup.xml_declaration ]
  val from_tree :
    ('-> 'Markup.node) ->
    '-> (Markup.signal, Markup.sync) Markup.stream
  val elements :
    (Markup.name -> (Markup.name * string) list -> bool) ->
    ([< Markup.signal ] as 'a, 's) Markup.stream ->
    (('a, 's) Markup.stream, 's) Markup.stream
  val text :
    ([< Markup.signal ], 's) Markup.stream -> (char, 's) Markup.stream
  val trim :
    (Markup.signal, 's) Markup.stream -> (Markup.signal, 's) Markup.stream
  val normalize_text :
    ([> `Text of string list ] as 'a, 's) Markup.stream ->
    ('a, 's) Markup.stream
  val pretty_print :
    (Markup.signal, 's) Markup.stream -> (Markup.signal, 's) Markup.stream
  val html5 :
    ([< Markup.signal ], 's) Markup.stream ->
    (Markup.signal, 's) Markup.stream
  val xhtml :
    ?dtd:[< `Frameset_1_0 | `Strict_1_0 | `Strict_1_1 | `Transitional_1_0 ] ->
    ([< Markup.signal ], 's) Markup.stream ->
    (Markup.signal, 's) Markup.stream
  val xhtml_entity : string -> string option
  val strings_to_bytes :
    (string, 's) Markup.stream -> (char, 's) Markup.stream
  val compare_locations : Markup.location -> Markup.location -> int
  module Ns :
    sig
      val html : string
      val svg : string
      val mathml : string
      val xml : string
      val xmlns : string
      val xlink : string
    end
  module type IO =
    sig
      type 'a t
      val return : '-> 'Markup.IO.t
      val of_cps : ((exn -> unit) -> ('-> unit) -> unit) -> 'Markup.IO.t
      val to_cps :
        (unit -> 'Markup.IO.t) -> (exn -> unit) -> ('-> unit) -> unit
    end
  module type ASYNCHRONOUS =
    sig
      type 'a io
      module Encoding :
        sig
          type t = Markup.Encoding.t
          val decode :
            ?report:(Markup.location ->
                     Markup.Error.t -> unit Markup.ASYNCHRONOUS.io) ->
            Markup.Encoding.t ->
            (char, 'a) Markup.stream -> (int, Markup.async) Markup.stream
        end
      val parse_xml :
        ?report:(Markup.location ->
                 Markup.Error.t -> unit Markup.ASYNCHRONOUS.io) ->
        ?encoding:Markup.ASYNCHRONOUS.Encoding.t ->
        ?namespace:(string -> string option) ->
        ?entity:(string -> string option) ->
        ?context:[< `Document | `Fragment ] ->
        (char, 'a) Markup.stream -> Markup.async Markup.parser
      val write_xml :
        ?report:(Markup.signal * int ->
                 Markup.Error.t -> unit Markup.ASYNCHRONOUS.io) ->
        ?prefix:(string -> string option) ->
        ([< Markup.signal ], 'a) Markup.stream ->
        (char, Markup.async) Markup.stream
      val parse_html :
        ?report:(Markup.location ->
                 Markup.Error.t -> unit Markup.ASYNCHRONOUS.io) ->
        ?encoding:Markup.ASYNCHRONOUS.Encoding.t ->
        ?context:[< `Document | `Fragment of string ] ->
        (char, 'a) Markup.stream -> Markup.async Markup.parser
      val write_html :
        ?escape_attribute:(string -> string) ->
        ?escape_text:(string -> string) ->
        ([< Markup.signal ], 'a) Markup.stream ->
        (char, Markup.async) Markup.stream
      val fn :
        (unit -> char option Markup.ASYNCHRONOUS.io) ->
        (char, Markup.async) Markup.stream
      val to_string :
        (char, 'a) Markup.stream -> string Markup.ASYNCHRONOUS.io
      val to_buffer :
        (char, 'a) Markup.stream -> Stdlib.Buffer.t Markup.ASYNCHRONOUS.io
      val stream :
        (unit -> 'a option Markup.ASYNCHRONOUS.io) ->
        ('a, Markup.async) Markup.stream
      val next : ('a, 'b) Markup.stream -> 'a option Markup.ASYNCHRONOUS.io
      val peek : ('a, 'b) Markup.stream -> 'a option Markup.ASYNCHRONOUS.io
      val transform :
        ('-> '-> ('c list * 'a option) Markup.ASYNCHRONOUS.io) ->
        '-> ('b, 'd) Markup.stream -> ('c, Markup.async) Markup.stream
      val fold :
        ('-> '-> 'Markup.ASYNCHRONOUS.io) ->
        '-> ('b, 'c) Markup.stream -> 'Markup.ASYNCHRONOUS.io
      val map :
        ('-> 'Markup.ASYNCHRONOUS.io) ->
        ('a, 'c) Markup.stream -> ('b, Markup.async) Markup.stream
      val filter :
        ('-> bool Markup.ASYNCHRONOUS.io) ->
        ('a, 'b) Markup.stream -> ('a, Markup.async) Markup.stream
      val filter_map :
        ('-> 'b option Markup.ASYNCHRONOUS.io) ->
        ('a, 'c) Markup.stream -> ('b, Markup.async) Markup.stream
      val iter :
        ('-> unit Markup.ASYNCHRONOUS.io) ->
        ('a, 'b) Markup.stream -> unit Markup.ASYNCHRONOUS.io
      val drain : ('a, 'b) Markup.stream -> unit Markup.ASYNCHRONOUS.io
      val to_list : ('a, 'b) Markup.stream -> 'a list Markup.ASYNCHRONOUS.io
      val load :
        ('a, 'b) Markup.stream ->
        ('a, Markup.sync) Markup.stream Markup.ASYNCHRONOUS.io
      val tree :
        ?text:(string list -> 'a) ->
        ?element:(Markup.name -> (Markup.name * string) list -> 'a list -> 'a) ->
        ?comment:(string -> 'a) ->
        ?pi:(string -> string -> 'a) ->
        ?xml:(Markup.xml_declaration -> 'a) ->
        ?doctype:(Markup.doctype -> 'a) ->
        ([< Markup.signal ], 'b) Markup.stream ->
        'a option Markup.ASYNCHRONOUS.io
    end
  module Asynchronous :
    functor (IO : IO->
      sig
        module Encoding :
          sig
            type t = Encoding.t
            val decode :
              ?report:(location -> Error.t -> unit IO.t) ->
              Encoding.t -> (char, 'a) stream -> (int, async) stream
          end
        val parse_xml :
          ?report:(location -> Error.t -> unit IO.t) ->
          ?encoding:Encoding.t ->
          ?namespace:(string -> string option) ->
          ?entity:(string -> string option) ->
          ?context:[< `Document | `Fragment ] ->
          (char, 'a) stream -> async parser
        val write_xml :
          ?report:(signal * int -> Error.t -> unit IO.t) ->
          ?prefix:(string -> string option) ->
          ([< signal ], 'a) stream -> (char, async) stream
        val parse_html :
          ?report:(location -> Error.t -> unit IO.t) ->
          ?encoding:Encoding.t ->
          ?context:[< `Document | `Fragment of string ] ->
          (char, 'a) stream -> async parser
        val write_html :
          ?escape_attribute:(string -> string) ->
          ?escape_text:(string -> string) ->
          ([< signal ], 'a) stream -> (char, async) stream
        val fn : (unit -> char option IO.t) -> (char, async) stream
        val to_string : (char, 'a) stream -> string IO.t
        val to_buffer : (char, 'a) stream -> Buffer.t IO.t
        val stream : (unit -> 'a option IO.t) -> ('a, async) stream
        val next : ('a, 'b) stream -> 'a option IO.t
        val peek : ('a, 'b) stream -> 'a option IO.t
        val transform :
          ('-> '-> ('c list * 'a option) IO.t) ->
          '-> ('b, 'd) stream -> ('c, async) stream
        val fold : ('-> '-> 'IO.t) -> '-> ('b, 'c) stream -> 'IO.t
        val map : ('-> 'IO.t) -> ('a, 'c) stream -> ('b, async) stream
        val filter :
          ('-> bool IO.t) -> ('a, 'b) stream -> ('a, async) stream
        val filter_map :
          ('-> 'b option IO.t) -> ('a, 'c) stream -> ('b, async) stream
        val iter : ('-> unit IO.t) -> ('a, 'b) stream -> unit IO.t
        val drain : ('a, 'b) stream -> unit IO.t
        val to_list : ('a, 'b) stream -> 'a list IO.t
        val load : ('a, 'b) stream -> ('a, sync) stream IO.t
        val tree :
          ?text:(string list -> 'a) ->
          ?element:(name -> (name * string) list -> 'a list -> 'a) ->
          ?comment:(string -> 'a) ->
          ?pi:(string -> string -> 'a) ->
          ?xml:(xml_declaration -> 'a) ->
          ?doctype:(doctype -> 'a) ->
          ([< signal ], 'b) stream -> 'a option IO.t
      end
  val preprocess_input_stream :
    (int, 's) Markup.stream ->
    (Markup.location * int, 's) Markup.stream * (unit -> Markup.location)
end