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 |
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
- data Doc
- data TextDetails
- 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
- maybeParens :: Bool -> Doc -> Doc
- maybeBrackets :: Bool -> Doc -> Doc
- maybeBraces :: Bool -> Doc -> Doc
- maybeQuotes :: Bool -> Doc -> Doc
- maybeDoubleQuotes :: Bool -> 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
- first :: Doc -> Doc -> Doc
- reduceDoc :: Doc -> RDoc
- render :: Doc -> String
- data Style = Style {
- mode :: Mode
- lineLength :: Int
- ribbonsPerLine :: Float
- style :: Style
- renderStyle :: Style -> Doc -> String
- data Mode
- fullRender :: Mode -> Int -> Float -> (TextDetails -> a -> a) -> a -> Doc -> a
The document type
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.
data TextDetails Source #
A TextDetails represents a fragment of text that will be output at some
point in a Doc
.
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 # | |
(==) :: TextDetails -> TextDetails -> Bool Source # (/=) :: TextDetails -> TextDetails -> Bool Source # | |
Show TextDetails # | |
Generic TextDetails # | |
from :: TextDetails -> Rep TextDetails x Source # to :: Rep TextDetails x -> TextDetails Source # | |
NFData TextDetails # | |
rnf :: TextDetails -> () Source # | |
type Rep TextDetails # | |
type Rep TextDetails = D1 (MetaData "TextDetails" "Text.PrettyPrint.Annotated.HughesPJ" "pretty-1.1.3.5" False) (C1 (MetaCons "Chr" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) SourceUnpack SourceStrict DecidedStrict) (Rec0 Char)) :+: (C1 (MetaCons "Str" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 String)) :+: C1 (MetaCons "PStr" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 String)))) |
Constructing documents
Converting values into documents
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
Simple derived documents
Wrapping documents in delimiters
maybeDoubleQuotes :: Bool -> Doc -> Doc Source #
Apply doubleQuotes
to Doc
if boolean is true.
Combining documents
($$) :: 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
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:
nest
0 x = xnest
k (nest
k' x) =nest
(k+k') xnest
k (x<>
y) =nest
k x<>
nest
k ynest
k (x$$
y) =nest
k x$$
nest
k ynest
kempty
=empty
x
, if<>
nest
k y = x<>
yx
non-empty
The side condition on the last law is needed because
empty
is a left identity for <>
.
punctuate :: Doc -> [Doc] -> [Doc] Source #
punctuate p [d1, ... dn] = [d1 <> p, d2 <> p, ... dn-1 <> p, dn]
Predicates on documents
Utility functions for documents
first :: Doc -> Doc -> Doc Source #
first
returns its first argument if it is non-empty, otherwise its second.
Rendering documents
Default rendering
Rendering with a particular style
A rendering style. Allows us to specify constraints to choose among the many different rendering options.
Style | |
|
Instances
Eq Style # | |
Show Style # | |
Generic Style # | |
type Rep Style # | |
type Rep Style = D1 (MetaData "Style" "Text.PrettyPrint.Annotated.HughesPJ" "pretty-1.1.3.5" False) (C1 (MetaCons "Style" PrefixI True) (S1 (MetaSel (Just "mode") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Mode) :*: (S1 (MetaSel (Just "lineLength") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Int) :*: S1 (MetaSel (Just "ribbonsPerLine") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Float)))) |
Rendering mode.
PageMode | Normal rendering ( |
ZigZagMode | With zig-zag cuts. |
LeftMode | No indentation, infinitely long lines ( |
OneLineMode | All on one line, |
Instances
Eq Mode # | |
Show Mode # | |
Generic Mode # | |
type Rep Mode # | |
type Rep Mode = D1 (MetaData "Mode" "Text.PrettyPrint.Annotated.HughesPJ" "pretty-1.1.3.5" 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
:: 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.