sig
  type document
  val empty : PPrintEngine.document
  val char : char -> PPrintEngine.document
  val string : string -> PPrintEngine.document
  val substring : string -> int -> int -> PPrintEngine.document
  val fancystring : string -> int -> PPrintEngine.document
  val fancysubstring : string -> int -> int -> int -> PPrintEngine.document
  val utf8string : string -> PPrintEngine.document
  val hardline : PPrintEngine.document
  val blank : int -> PPrintEngine.document
  val break : int -> PPrintEngine.document
  val ( ^^ ) :
    PPrintEngine.document -> PPrintEngine.document -> PPrintEngine.document
  val nest : int -> PPrintEngine.document -> PPrintEngine.document
  val group : PPrintEngine.document -> PPrintEngine.document
  val ifflat :
    PPrintEngine.document -> PPrintEngine.document -> PPrintEngine.document
  val align : PPrintEngine.document -> PPrintEngine.document
  module ToChannel :
    sig
      type channel = out_channel
      type document = document
      val pretty : float -> int -> channel -> document -> unit
      val compact : channel -> document -> unit
    end
  module ToBuffer :
    sig
      type channel = Buffer.t
      type document = document
      val pretty : float -> int -> channel -> document -> unit
      val compact : channel -> document -> unit
    end
  module ToFormatter :
    sig
      type channel = Format.formatter
      type document = document
      val pretty : float -> int -> channel -> document -> unit
      val compact : channel -> document -> unit
    end
  type requirement = int
  val infinity : PPrintEngine.requirement
  class type output =
    object
      method char : char -> unit
      method substring : string -> int -> int -> unit
    end
  type state = {
    width : int;
    ribbon : int;
    mutable last_indent : int;
    mutable column : int;
  }
  class type custom =
    object
      method compact : PPrintEngine.output -> unit
      method pretty :
        PPrintEngine.output -> PPrintEngine.state -> int -> bool -> unit
      method requirement : PPrintEngine.requirement
    end
  val custom : PPrintEngine.custom -> PPrintEngine.document
  val requirement : PPrintEngine.document -> PPrintEngine.requirement
  val pretty :
    PPrintEngine.output ->
    PPrintEngine.state -> int -> bool -> PPrintEngine.document -> unit
  val compact : PPrintEngine.output -> PPrintEngine.document -> unit
end