GenericPretty-1.1.8: A generic, derivable, haskell pretty printer.

Text.PrettyPrint.GenericPretty

Description

GenericPretty is a Haskell library that supports automatic derivation of pretty printing functions on user defined data types.

The output provided is a pretty printed version of that provided by show. That is, rendering the document provided by this pretty printer yields an output identical to that of show, except for extra whitespace.

For examples of usage please see the README file included in the package.

For more information see the HackageDB project page: http://hackage.haskell.org/package/GenericPretty-1.1.8

Synopsis

Documentation

class Out a whereSource

The class Out is the equivalent of Show

It provides conversion of values to pretty printable Pretty.Doc's.

Minimal complete definition: docPrec or doc.

Derived instances of Out have the following properties

  • The result of docPrec is a syntactically correct Haskell expression containing only constants, given the fixity declarations in force at the point where the type is declared. It contains only the constructor names defined in the data type, parentheses, and spaces. When labelled constructor fields are used, braces, commas, field names, and equal signs are also used.
  • If the constructor is defined to be an infix operator, then docPrec will produce infix applications of the constructor.
  • the representation will be enclosed in parentheses if the precedence of the top-level constructor in x is less than d (associativity is ignored). Thus, if d is 0 then the result is never surrounded in parentheses; if d is 11 it is always surrounded in parentheses, unless it is an atomic expression.
  • If the constructor is defined using record syntax, then docPrec will produce the record-syntax form, with the fields given in the same order as the original declaration.

For example, given the declarations

 data Tree a =  Leaf a  |  Node (Tree a) (Tree a) deriving (Generic)

The derived instance of Out is equivalent to:

 instance (Out a) => Out (Tree a) where
  
         docPrec d (Leaf m) = Pretty.sep $ wrapParens (d > appPrec) $
              text "Leaf" : [nest (constrLen + parenLen) (docPrec (appPrec+1) m)]
           where appPrec = 10
                 constrLen = 5;
                 parenLen = if(d > appPrec) then 1 else 0
 
         docPrec d (Node u v) = Pretty.sep $ wrapParens (d > appPrec) $
              text "Node" : 
              nest (constrLen + parenLen) (docPrec (appPrec+1) u) : 
              [nest (constrLen + parenLen) (docPrec (appPrec+1) v)]
           where appPrec = 10
                 constrLen = 5
                 parenLen = if(d > appPrec) then 1 else 0

Methods

docPrecSource

Arguments

:: Int

the operator precedence of the enclosing context (a number from 0 to 11). Function application has precedence 10.

-> a

the value to be converted to a String

-> Doc

the resulting Doc

docPrec is the equivalent of showsPrec.

Convert a value to a pretty printable Pretty.Doc.

doc :: a -> DocSource

doc is the equivalent of show

This is a specialised variant of docPrec, using precedence context zero.

docList :: [a] -> DocSource

docList is the equivalent of showList.

The method docList is provided to allow the programmer to give a specialised way of showing lists of values. For example, this is used by the predefined Out instance of the Char type, where values of type String should be shown in double quotes, rather than between square brackets.

Instances

Out Bool 
Out Char 
Out Double 
Out Float 
Out Int 
Out Integer 
Out () 
Out a => Out [a] 
Out a => Out (Maybe a) 
(Out a, Out b) => Out (Either a b) 
(Out a, Out b) => Out (a, b) 
(Out a, Out b, Out c) => Out (a, b, c) 
(Out a, Out b, Out c, Out d) => Out (a, b, c, d) 
(Out a, Out b, Out c, Out d, Out e) => Out (a, b, c, d, e) 
(Out a, Out b, Out c, Out d, Out e, Out f) => Out (a, b, c, d, e, f) 
(Out a, Out b, Out c, Out d, Out e, Out f, Out g) => Out (a, b, c, d, e, f, g) 
(Out a, Out b, Out c, Out d, Out e, Out f, Out g, Out h) => Out (a, b, c, d, e, f, g, h) 
(Out a, Out b, Out c, Out d, Out e, Out f, Out g, Out h, Out i) => Out (a, b, c, d, e, f, g, h, i) 
(Out a, Out b, Out c, Out d, Out e, Out f, Out g, Out h, Out i, Out j) => Out (a, b, c, d, e, f, g, h, i, j) 
(Out a, Out b, Out c, Out d, Out e, Out f, Out g, Out h, Out i, Out j, Out k) => Out (a, b, c, d, e, f, g, h, i, j, k) 
(Out a, Out b, Out c, Out d, Out e, Out f, Out g, Out h, Out i, Out j, Out k, Out l) => Out (a, b, c, d, e, f, g, h, i, j, k, l) 
(Out a, Out b, Out c, Out d, Out e, Out f, Out g, Out h, Out i, Out j, Out k, Out l, Out m) => Out (a, b, c, d, e, f, g, h, i, j, k, l, m) 
(Out a, Out b, Out c, Out d, Out e, Out f, Out g, Out h, Out i, Out j, Out k, Out l, Out m, Out n) => Out (a, b, c, d, e, f, g, h, i, j, k, l, m, n) 
(Out a, Out b, Out c, Out d, Out e, Out f, Out g, Out h, Out i, Out j, Out k, Out l, Out m, Out n, Out o) => Out (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) 

docPrecDefault :: (Generic a, GOut (Rep a)) => Int -> a -> DocSource

Default generic docPrec method.

Converts the type into a sum of products and passes it on to the generic pretty printing functions, finally it concatenates all of the Doc's

It can be used in code to define the instance for Out.

For instance, given the declaration:

 data Tree a =  Leaf a  |  Node (Tree a) (Tree a) deriving (Generic)

The user would need to write an instance declaration like:

 instance (Out a) => Out (Tree a) where
   docPrec = docPrecDefault

After doing this, the user can now pretty printing function like pp and pretty on data of type Tree

pp :: Out a => a -> IO ()Source

The default Pretty Printer,

Equivalent to:

 ppStyle defaultStyle

Where defaultStyle = (mode=PageMode, lineLength=80, ribbonsPerLine=1.5)

ppLen :: Out a => Int -> a -> IO ()Source

Semi-customizable pretty printer.

Equivalent to:

 ppStyle customStyle

Where customStyle uses the specified line length, mode = PageMode and ribbonsPerLine = 1.

ppStyle :: Out a => Style -> a -> IO ()Source

Customizable pretty printer.

Takes a user defined Style as a parameter and uses outputIO to obtain the result Equivalent to:

 fullPP outputIO (putChar '\n')

pretty :: Out a => a -> StringSource

The default pretty printer returning Strings

Equivalent to

 prettyStyle defaultStyle

Where defaultStyle = (mode=PageMode, lineLength=80, ribbonsPerLine=1.5)

prettyLen :: Out a => Int -> a -> StringSource

Semi-customizable pretty printer.

Equivalent to:

 prettyStyle customStyle

Where customStyle uses the specified line length, mode = PageMode and ribbonsPerLine = 1.

prettyStyle :: Out a => Style -> a -> StringSource

Customizable pretty printer

Takes a user defined Style as a parameter and uses outputStr to obtain the result Equivalent to:

 fullPP outputStr ""

fullPPSource

Arguments

:: Out a 
=> (TextDetails -> b -> b)

Function that handles the text conversion (eg: 'outputIO')

-> b

The end element of the result ( eg: "" or putChar('\n') )

-> Style

The pretty printing Style to use

-> a

The value to pretty print

-> b

The pretty printed result

fullPP is a fully customizable Pretty Printer

Every other pretty printer just gives some default values to fullPP

class Generic a

Representable types of kind *. This class is derivable in GHC with the XDeriveRepresentable flag on.

Instances

Generic Bool 
Generic Char 
Generic Double 
Generic Float 
Generic Int 
Generic () 
Generic [a] 
Generic (Maybe a) 
Generic (Either a b) 
Generic (a, b) 
Generic (a, b, c) 
Generic (a, b, c, d) 
Generic (a, b, c, d, e) 
Generic (a, b, c, d, e, f) 
Generic (a, b, c, d, e, f, g) 

outputIO :: TextDetails -> IO () -> IO ()Source

Utility function that handles the text conversion for fullPP.

outputIO transforms the text into Strings and outputs it directly.

outputStr :: TextDetails -> String -> StringSource

Utility function that handles the text conversion for fullPP.

outputStr just leaves the text as a String which is usefull if you want to further process the pretty printed result.