pretty-1.1.3.3: Pretty-printing library

Copyright | (c) The University of Glasgow 2001
License | BSD-style (see the file LICENSE)
Maintainer | David Terei <code@davidterei.com>
Stability | stable
Portability | portable
Safe Haskell | Safe
Language | Haskell98

Text.PrettyPrint

Contents

- The document type
- Constructing documents
  - Converting values into documents
  - Simple derived documents
  - Wrapping documents in delimiters
  - Combining documents
- Predicates on documents
- Rendering documents
  - Default rendering
  - Rendering with a particular style
  - General rendering

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.

This module should be used as opposed to the `HughesPJ` module. Both are equivalent though as this module simply re-exports the other.

Synopsis

- data Doc
- char :: Char -> Doc
- text :: String -> Doc
- ptext :: String -> Doc
- sizedText :: Int -> String -> Doc
- zeroWidthText :: String -> Doc
- int :: Int -> Doc
- integer :: Integer -> Doc
- float :: Float -> Doc
- double :: Double -> Doc
- rational :: Rational -> Doc
- semi :: Doc
- comma :: Doc
- colon :: Doc
- space :: Doc
- equals :: Doc
- lparen :: Doc
- rparen :: Doc
- lbrack :: Doc
- rbrack :: Doc
- lbrace :: Doc
- rbrace :: Doc
- parens :: Doc -> Doc
- brackets :: Doc -> Doc
- braces :: Doc -> Doc
- quotes :: Doc -> Doc
- doubleQuotes :: Doc -> Doc
- empty :: Doc
- (<>) :: Doc -> Doc -> Doc
- (<+>) :: Doc -> Doc -> Doc
- hcat :: [Doc] -> Doc
- hsep :: [Doc] -> Doc
- ($$) :: Doc -> Doc -> Doc
- ($+$) :: Doc -> Doc -> Doc
- vcat :: [Doc] -> Doc
- sep :: [Doc] -> Doc
- cat :: [Doc] -> Doc
- fsep :: [Doc] -> Doc
- fcat :: [Doc] -> Doc
- nest :: Int -> Doc -> Doc
- hang :: Doc -> Int -> Doc -> Doc
- punctuate :: Doc -> [Doc] -> [Doc]
- isEmpty :: Doc -> Bool
- render :: Doc -> String
- data Style = Style {
  - mode :: Mode
  - lineLength :: Int
  - ribbonsPerLine :: Float
  }
- style :: Style
- renderStyle :: Style -> Doc -> String
- fullRender :: Mode -> Int -> Float -> (TextDetails -> a -> a) -> a -> Doc -> a
- data Mode
  - = PageMode
  - | ZigZagMode
  - | LeftMode
  - | OneLineMode
- data TextDetails
  - = Chr !Char
  - | Str String
  - | PStr String

# 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 # |
Methods showsPrec :: Int -> Doc -> ShowS Source # show :: Doc -> String Source # showList :: [Doc] -> ShowS Source #
IsString Doc # |
Methods fromString :: String -> Doc Source #
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 # |
Methods mempty :: Doc Source # mappend :: Doc -> Doc -> Doc Source # mconcat :: [Doc] -> Doc Source #
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 ()))))

# 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:

-     text s <> text t = text (s++t)

- ``text` "" `<>` x = x`, if `x` non-empty

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 `"..."`

## 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:

-     nest 0 x = x

-     nest k (nest k' x) = nest (k+k') x

-     nest k (x <> y) = nest k z <> nest k y

-     nest k (x $$ y) = nest k x $$ nest k y

-     nest k empty = empty

- `x `<>` `nest` k y = x `<>` y`, if `x` non-empty

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

# Rendering documents

## Default rendering

render :: Doc -> String #

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

## Rendering with a particular style

data Style #

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 # |
Methods showsPrec :: Int -> Style -> ShowS Source # show :: Style -> String Source # showList :: [Style] -> ShowS Source #
Generic Style # |
Associated Types type Rep Style :: * -> * Source # Methods from :: Style -> Rep Style x Source # to :: Rep Style x -> Style Source #
type Rep Style # |

type Rep Style = D1 * (MetaData "Style" "Text.PrettyPrint.Annotated.HughesPJ" "pretty-1.1.3.3" 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`.

## 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. Please refer to the `Style` and `Mode` types for a description of rendering mode, line length and ribbons.

data Mode #

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 # |
Methods showsPrec :: Int -> Mode -> ShowS Source # show :: Mode -> String Source # showList :: [Mode] -> ShowS Source #
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 *))))

data TextDetails #

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.

Instances

Eq TextDetails # |
Methods (==) :: TextDetails -> TextDetails -> Bool Source # (/=) :: TextDetails -> TextDetails -> Bool Source #
Show TextDetails # |
Methods showsPrec :: Int -> TextDetails -> ShowS Source # show :: TextDetails -> String Source # showList :: [TextDetails] -> ShowS Source #
Generic TextDetails # |
Associated Types type Rep TextDetails :: * -> * Source # Methods from :: TextDetails -> Rep TextDetails x Source # to :: Rep TextDetails x -> TextDetails Source #
NFData TextDetails # |
Methods rnf :: TextDetails -> () Source #
type Rep TextDetails # |

type Rep TextDetails = D1 * (MetaData "TextDetails" "Text.PrettyPrint.Annotated.HughesPJ" "pretty-1.1.3.3" False) ((:+:) * (C1 * (MetaCons "Chr" PrefixI False) (S1 * (MetaSel (Nothing Symbol) SourceUnpack SourceStrict DecidedStrict) (Rec0 * Char))) ((:+:) * (C1 * (MetaCons "Str" PrefixI False) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 * String))) (C1 * (MetaCons "PStr" PrefixI False) (S1 * (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 * String)))))