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

Safe HaskellSafe-Inferred

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

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 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 Rational 
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) 

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 DeriveGeneric flag on.

Instances

Generic Bool 
Generic Char 
Generic Double 
Generic Float 
Generic Int 
Generic Ordering 
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.