pretty-1.1.3.3: Pretty-printing library

Copyright(c) The University of Glasgow 2001
LicenseBSD-style (see the file LICENSE)
MaintainerDavid Terei <code@davidterei.com>
Stabilitystable
Portabilityportable
Safe HaskellSafe
LanguageHaskell98

Text.PrettyPrint.HughesPJ

Contents

Description

Provides a collection of pretty printer combinators, a set of API's that provides a way to easily print out text in a consistent format of your choosing.

Originally designed by John Hughes's and Simon Peyton Jones's.

For more information you can refer to the original paper that serves as the basis for this libraries design: /The Design -- of a Pretty-printing Library/ by John Hughes, in Advanced Functional Programming, 1995.

Synopsis

The document type

data Doc Source #

The abstract type of documents. A Doc represents a set of layouts. A Doc with no occurrences of Union or NoDoc represents just one layout.

Instances

Eq Doc # 

Methods

(==) :: Doc -> Doc -> Bool Source #

(/=) :: Doc -> Doc -> Bool Source #

Show Doc # 
IsString Doc # 
Generic Doc # 

Associated Types

type Rep Doc :: * -> * Source #

Methods

from :: Doc -> Rep Doc x Source #

to :: Rep Doc x -> Doc Source #

Semigroup Doc # 

Methods

(<>) :: Doc -> Doc -> Doc Source #

sconcat :: NonEmpty Doc -> Doc Source #

stimes :: Integral b => b -> Doc -> Doc Source #

Monoid Doc # 
NFData Doc # 

Methods

rnf :: Doc -> () Source #

type Rep Doc # 
type Rep Doc = D1 (MetaData "Doc" "Text.PrettyPrint.HughesPJ" "pretty-1.1.3.3" True) (C1 (MetaCons "Doc" PrefixI False) (S1 (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (Doc ()))))

data TextDetails Source #

A TextDetails represents a fragment of text that will be output at some point in a Doc.

Constructors

Chr !Char

A single Char fragment

Str String

A whole String fragment

PStr String

Used to represent a Fast String fragment but now deprecated and identical to the Str constructor.

Constructing documents

Converting values into documents

char :: Char -> Doc Source #

A document of height and width 1, containing a literal character.

text :: String -> Doc Source #

A document of height 1 containing a literal string. text satisfies the following laws:

The side condition on the last law is necessary because text "" has height 1, while empty has no height.

ptext :: String -> Doc Source #

Same as text. Used to be used for Bytestrings.

sizedText :: Int -> String -> Doc Source #

Some text with any width. (text s = sizedText (length s) s)

zeroWidthText :: String -> Doc Source #

Some text, but without any width. Use for non-printing text such as a HTML or Latex tags

int Source #

Arguments

:: Int 
-> Doc
int n = text (show n)

integer Source #

Arguments

:: Integer 
-> Doc
integer n = text (show n)

float Source #

Arguments

:: Float 
-> Doc
float n = text (show n)

double Source #

Arguments

:: Double 
-> Doc
double n = text (show n)

rational Source #

Arguments

:: Rational 
-> Doc
rational n = text (show n)

Simple derived documents

semi Source #

Arguments

:: Doc

A ';' character

comma Source #

Arguments

:: Doc

A ',' character

colon Source #

Arguments

:: Doc

A : character

space Source #

Arguments

:: Doc

A space character

equals Source #

Arguments

:: Doc

A '=' character

lparen Source #

Arguments

:: Doc

A '(' character

rparen Source #

Arguments

:: Doc

A ')' character

lbrack Source #

Arguments

:: Doc

A '[' character

rbrack Source #

Arguments

:: Doc

A ']' character

lbrace Source #

Arguments

:: Doc

A '{' character

rbrace Source #

Arguments

:: Doc

A '}' character

Wrapping documents in delimiters

parens Source #

Arguments

:: Doc 
-> Doc

Wrap document in (...)

brackets Source #

Arguments

:: Doc 
-> Doc

Wrap document in [...]

braces Source #

Arguments

:: Doc 
-> Doc

Wrap document in {...}

quotes Source #

Arguments

:: Doc 
-> Doc

Wrap document in '...'

doubleQuotes Source #

Arguments

:: Doc 
-> Doc

Wrap document in "..."

maybeParens :: Bool -> Doc -> Doc Source #

Apply parens to Doc if boolean is true.

maybeBrackets :: Bool -> Doc -> Doc Source #

Apply brackets to Doc if boolean is true.

maybeBraces :: Bool -> Doc -> Doc Source #

Apply braces to Doc if boolean is true.

maybeQuotes :: Bool -> Doc -> Doc Source #

Apply quotes to Doc if boolean is true.

maybeDoubleQuotes :: Bool -> Doc -> Doc Source #

Apply doubleQuotes to Doc if boolean is true.

Combining documents

empty :: Doc Source #

The empty document, with no height and no width. empty is the identity for <>, <+>, $$ and $+$, and anywhere in the argument list for sep, hcat, hsep, vcat, fcat etc.

(<>) :: Doc -> Doc -> Doc infixl 6 Source #

Beside. <> is associative, with identity empty.

(<+>) :: Doc -> Doc -> Doc infixl 6 Source #

Beside, separated by space, unless one of the arguments is empty. <+> is associative, with identity empty.

hcat :: [Doc] -> Doc Source #

List version of <>.

hsep :: [Doc] -> Doc Source #

List version of <+>.

($$) :: Doc -> Doc -> Doc infixl 5 Source #

Above, except that if the last line of the first argument stops at least one position before the first line of the second begins, these two lines are overlapped. For example:

   text "hi" $$ nest 5 (text "there")

lays out as

   hi   there

rather than

   hi
        there

$$ is associative, with identity empty, and also satisfies

  • (x $$ y) <> z = x $$ (y <> z), if y non-empty.

($+$) :: Doc -> Doc -> Doc infixl 5 Source #

Above, with no overlapping. $+$ is associative, with identity empty.

vcat :: [Doc] -> Doc Source #

List version of $$.

sep :: [Doc] -> Doc Source #

Either hsep or vcat.

cat :: [Doc] -> Doc Source #

Either hcat or vcat.

fsep :: [Doc] -> Doc Source #

"Paragraph fill" version of sep.

fcat :: [Doc] -> Doc Source #

"Paragraph fill" version of cat.

nest :: Int -> Doc -> Doc Source #

Nest (or indent) a document by a given number of positions (which may also be negative). nest satisfies the laws:

The side condition on the last law is needed because empty is a left identity for <>.

hang :: Doc -> Int -> Doc -> Doc Source #

hang d1 n d2 = sep [d1, nest n d2]

punctuate :: Doc -> [Doc] -> [Doc] Source #

punctuate p [d1, ... dn] = [d1 <> p, d2 <> p, ... dn-1 <> p, dn]

Predicates on documents

isEmpty :: Doc -> Bool Source #

Returns True if the document is empty

Utility functions for documents

first :: Doc -> Doc -> Doc Source #

first returns its first argument if it is non-empty, otherwise its second.

reduceDoc :: Doc -> RDoc Source #

Perform some simplification of a built up GDoc.

Rendering documents

Default rendering

render :: Doc -> String Source #

Render the Doc to a String using the default Style (see style).

Rendering with a particular style

data Style Source #

A rendering style. Allows us to specify constraints to choose among the many different rendering options.

Constructors

Style 

Fields

  • mode :: Mode

    The rendering mode.

  • lineLength :: Int

    Maximum length of a line, in characters.

  • ribbonsPerLine :: Float

    Ratio of line length to ribbon length. A ribbon refers to the characters on a line excluding indentation. So a lineLength of 100, with a ribbonsPerLine of 2.0 would only allow up to 50 characters of ribbon to be displayed on a line, while allowing it to be indented up to 50 characters.

Instances

Eq Style # 

Methods

(==) :: Style -> Style -> Bool Source #

(/=) :: Style -> Style -> Bool Source #

Show Style # 
Generic Style # 

Associated Types

type Rep Style :: * -> * Source #

Methods

from :: Style -> Rep Style x Source #

to :: Rep Style x -> Style Source #

type Rep Style # 

style :: Style Source #

The default style (mode=PageMode, lineLength=100, ribbonsPerLine=1.5).

renderStyle :: Style -> Doc -> String Source #

Render the Doc to a String using the given Style.

data Mode Source #

Rendering mode.

Constructors

PageMode

Normal rendering (lineLength and ribbonsPerLine respected').

ZigZagMode

With zig-zag cuts.

LeftMode

No indentation, infinitely long lines (lineLength ignored), but explicit new lines, i.e., text "one" $$ text "two", are respected.

OneLineMode

All on one line, lineLength ignored and explicit new lines ($$) are turned into spaces.

Instances

Eq Mode # 

Methods

(==) :: Mode -> Mode -> Bool Source #

(/=) :: Mode -> Mode -> Bool Source #

Show Mode # 
Generic Mode # 

Associated Types

type Rep Mode :: * -> * Source #

Methods

from :: Mode -> Rep Mode x Source #

to :: Rep Mode x -> Mode Source #

type Rep Mode # 
type Rep Mode = D1 (MetaData "Mode" "Text.PrettyPrint.Annotated.HughesPJ" "pretty-1.1.3.3" False) ((:+:) ((:+:) (C1 (MetaCons "PageMode" PrefixI False) U1) (C1 (MetaCons "ZigZagMode" PrefixI False) U1)) ((:+:) (C1 (MetaCons "LeftMode" PrefixI False) U1) (C1 (MetaCons "OneLineMode" PrefixI False) U1)))

General rendering

fullRender Source #

Arguments

:: Mode

Rendering mode.

-> Int

Line length.

-> Float

Ribbons per line.

-> (TextDetails -> a -> a)

What to do with text.

-> a

What to do at the end.

-> Doc

The document.

-> a

Result.

The general rendering interface. Please refer to the Style and Mode types for a description of rendering mode, line length and ribbons.