pretty-1.1.3.2: 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

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

Monoid Doc 
NFData Doc 

Methods

rnf :: Doc -> () Source

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

data TextDetails

The TextDetails data type

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

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

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

text :: String -> Doc

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

Same as text. Used to be used for Bytestrings.

sizedText :: Int -> String -> Doc

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

zeroWidthText :: String -> Doc

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

int

Arguments

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

integer

Arguments

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

float

Arguments

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

double

Arguments

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

rational

Arguments

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

Simple derived documents

semi

Arguments

:: Doc

A ';' character

comma

Arguments

:: Doc

A ',' character

colon

Arguments

:: Doc

A : character

space

Arguments

:: Doc

A space character

equals

Arguments

:: Doc

A '=' character

lparen

Arguments

:: Doc

A '(' character

rparen

Arguments

:: Doc

A ')' character

lbrack

Arguments

:: Doc

A '[' character

rbrack

Arguments

:: Doc

A ']' character

lbrace

Arguments

:: Doc

A '{' character

rbrace

Arguments

:: Doc

A '}' character

Wrapping documents in delimiters

parens

Arguments

:: Doc 
-> Doc

Wrap document in (...)

brackets

Arguments

:: Doc 
-> Doc

Wrap document in [...]

braces

Arguments

:: Doc 
-> Doc

Wrap document in {...}

quotes

Arguments

:: Doc 
-> Doc

Wrap document in '...'

doubleQuotes

Arguments

:: Doc 
-> Doc

Wrap document in "..."

maybeParens :: Bool -> Doc -> Doc

Apply parens to Doc if boolean is true.

maybeBrackets :: Bool -> Doc -> Doc

Apply brackets to Doc if boolean is true.

maybeBraces :: Bool -> Doc -> Doc

Apply braces to Doc if boolean is true.

maybeQuotes :: Bool -> Doc -> Doc

Apply quotes to Doc if boolean is true.

maybeDoubleQuotes :: Bool -> Doc -> Doc

Apply doubleQuotes to Doc if boolean is true.

Combining documents

empty :: Doc

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

Beside. <> is associative, with identity empty.

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

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

hcat :: [Doc] -> Doc

List version of <>.

hsep :: [Doc] -> Doc

List version of <+>.

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

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

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

vcat :: [Doc] -> Doc

List version of $$.

sep :: [Doc] -> Doc

Either hsep or vcat.

cat :: [Doc] -> Doc

Either hcat or vcat.

fsep :: [Doc] -> Doc

"Paragraph fill" version of sep.

fcat :: [Doc] -> Doc

"Paragraph fill" version of cat.

nest :: Int -> Doc -> Doc

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

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

punctuate :: Doc -> [Doc] -> [Doc]

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

Predicates on documents

isEmpty :: Doc -> Bool

Returns True if the document is empty

Utility functions for documents

first :: Doc -> Doc -> Doc

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

reduceDoc :: Doc -> RDoc

Perform some simplification of a built up GDoc.

Rendering documents

Default rendering

render :: Doc -> String

Render the Doc to a String using the default Style.

Rendering with a particular style

data Style

A rendering style.

Constructors

Style 

Fields

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 = D1 (MetaData "Style" "Text.PrettyPrint.Annotated.HughesPJ" "pretty-1.1.3.2" False) (C1 (MetaCons "Style" PrefixI True) ((:*:) (S1 (MetaSel (Just Symbol "mode") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Mode)) ((:*:) (S1 (MetaSel (Just Symbol "lineLength") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Int)) (S1 (MetaSel (Just Symbol "ribbonsPerLine") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Float))))) 

style :: Style

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

renderStyle :: Style -> Doc -> String

Render the Doc to a String using the given Style.

data Mode

Rendering mode.

Constructors

PageMode

Normal

ZigZagMode

With zig-zag cuts

LeftMode

No indentation, infinitely long lines

OneLineMode

All on one line

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 = D1 (MetaData "Mode" "Text.PrettyPrint.Annotated.HughesPJ" "pretty-1.1.3.2" 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

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.