Containers_ppPretty printing of documents.
A document is a structured tree of text with formatting instructions.
It can be rendered into a string ("pretty printed"), see Pretty.
This follows Wadler's paper "A prettier printer", but with some changes in the rendering part because we can't rely on lazyness to make the algebraic implementation efficient.
Some general considerations: the type t is the type of documents, a tree with text leaves that is pretty printed within a given width.
Layout is controlled via the combination of a few primitives:
newline will either print a space or a newline. It is similar to Format's "@ " in that sense. A big difference with Format is that by default newline is actually a newline. It only becomes a space if it's in a group small enough to fit in the remainder of the current line.group d tries to write d on a single line if there's room. If not, it has no effect.nest n d increases the indentation level inside d. Any newline that is rendered as a new line is indented by n more spaces (which are cumulative with surrounding nest calls).append a b (or a ^ b) just prints a followed by b.fill d is a bit like group but it will try to cram as much as possible on each line. It is not all-or-nothing like group.val nil : tEmpty document
val char : char -> tSingle char.
val textpf : ('a, unit, string, t) Stdlib.format4 -> 'aText, with a Printf-compatible format.
For example, textpf "%d-%d" 4 2 is like text "4-2".
val textf : ('a, Stdlib.Format.formatter, unit, t) Stdlib.format4 -> 'aText, with a Format-compatible format.
Note that this will bake-in any formatting done by Format. Newlines introduced by format will become hard newlines in the resulting document.
nest n d increases indentation by n inside d. If current indentation is m, then every newline inside d will be followed by n + m leading spaces.
Group the documents inside this.
Newlines immediately inside this group will either render as new lines or as spaces, depending on the width available.
val newline : tA line break.
val newline_or_spaces : int -> tnewline_or_spaces n either prints a newline (respecting indentation), or prints n spaces. newline is basically newline_or_spaces 1.
fill sep l resembles group (append_l ~sep l), except it tries to put as many items of l as possible on each line.
In terms of Format, this is like the hov box.
module Out : sig ... endArbitrary output.
module Ext : sig ... endExtension node.
ext e v d wraps d with value v.
It is a document that has the same shape (and size) as d, except that additional data will be output when it is rendered using extension e.
When this is rendered, first e.pre out v is called; then d is printed; then e.post out v is called. Here out is the output buffer/stream for rendering.
module Pretty : sig ... endPretty-printing.
module Flatten : sig ... endTrivial printing, on a single line.
val debug : Stdlib.Format.formatter -> t -> unitmodule Infix : sig ... endval sp : tA single space
append_l ?sep l is the concatenation of elements of l, separated by sep (default nil)
val bool : bool -> tval int : int -> tval float : float -> tval float_hex : float -> tval text_quoted : string -> ttext_quoted s is text (spf "%S" s)
val text_zero_width : string -> tText but we assume it takes no space on screen.
of_list f l maps each element of l to a document and concatenates them.
bracket2 l d r groups d, indented by 2, between brackets l and r
module Dump : sig ... endPrinters that correspond closely to OCaml's syntax.
module Term_color : sig ... endSimple colors in terminals