GenericPretty 1.1.3 → 1.1.4
raw patch · 3 files changed
+231/−230 lines, 3 files
Files
- GenericPretty.cabal +34/−86
- README +117/−64
- Text/PrettyPrint/GenericPretty.hs +80/−80
GenericPretty.cabal view
@@ -7,106 +7,54 @@ -- The package version. See the Haskell package versioning policy -- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for -- standards guiding when and how versions should be incremented. -Version: 1.1.3 +Version: 1.1.4 -- A short (one-line) description of the package. Synopsis: A generic, derivable, haskell pretty printer. -- A longer description of the package. Description: - *GenericPretty is a haskell library that provides support for automatic - derivation of pretty printing functions on user defined data types. - . - *The Pretty library <http://www.haskell.org/ghc/docs/7.0.4/html/libraries/ghc-7.0.4/Pretty.html> - is used underneath, the work is done over 'Pretty.Doc' types. - The library "MyPretty" is also provided. This library is a thin wrapper around the "Pretty" - library and implements only 'Style' related features. These features are planned to be added - to the Pretty library itself. - When that happens "MyPretty" will become obsolete and will be replaced by "Pretty". + GenericPretty is a Haskell library that supports automatic + derivation of pretty printing functions on user defined data + types. . - *The output provided by the library functions is identical to that of Prelude.show, - except it has extra whitespace. - . - *This package requires the use of the new GHC.Generics features: <http://www.haskell.org/haskellwiki/Generics>. - These features are present in versions of GHC >= 7.2. - . - *The Generics used are based on those described in the paper "A Generic Deriving Mechanism for Haskell" - - by Magalhaes, Dijkstra, Jeuring and Loh in Proceedings of the third ACM Haskell symposium on Haskell - (Haskell'2010), pp. 37-48, ACM, 2010: <http://dreixel.net/research/pdf/gdmh.pdf> - There are several changes from the original paper in the ghc implementation which are described here: + The form of geenrics used is based on that introduced in the paper: + Magalhaes, Dijkstra, Jeuring, and Loh, + A Generic Deriving Mechanism for Haskell, + 3'rd ACM Symposium on Haskell, pp. 37-48, September 2010, + <http://dx.doi.org/10.1145/1863523.1863529>. + Changes from the original paper in the GHC implementation + are described here: <http://www.haskell.org/haskellwiki/Generics#Changes_from_the_paper>. - . - *This generics mechanism supports deriving for all haskell datatypes EXCEPT for - constrained datatypes. - That is to say, datatypes which have a context will fail. . - For instance, - . - "data (Eq a) => Constr a = Constr a" - . - will fail because of the (Eq a) context. - . - *Installation instructions - . - The package is installed in the same way as any other package. If needed, instructions are provided below. - . - 0. Make sure you have a version of ghc >= 7.2 installed and that you can use the 'runhaskell' command from the command line. - . - 1. Download the file "GenericPretty-1.1.3.tar.gz" from this page. - . - 2. Unpack the file. If using a UNIX system, run - . - tar xzf GenericPretty-1.1.3.tar.gz - . - If on windows use your preferred unpacking utility(for instance, 7zip : <http://www.7-zip.org/>) - . - 3. Move to the correct directory: - . - cd GenericPretty-1.1.3 - . - 4. Run the following haskell commands to install the library globally + This package requires the use of the new GHC.Generics features + <http://www.haskell.org/haskellwiki/Generics>, present from GHC 7.2. + Use of these features is indicated by the DeriveGeneric pragma. + or the flag -XDeriveGeneric. . - runhaskell Setup configure + Pretty printing produces values of type Pretty.Doc, using + the Pretty library + <http://www.haskell.org/ghc/docs/7.0.4/html/libraries/ghc-7.0.4/Pretty.html>. . - runhaskell Setup build + The Pretty library plans to incorporate a Style datatype to control details + of printing (such as line length). The library MyPretty is provided as a + thin wrapper around the Pretty library, to support Style related features. + Once the Pretty library supports Style, MyPretty will become obsolete and + be replaced by Pretty. . - runhaskell Setup install + The output provided is a pretty printed version of that provided by + Prelude.show. That is, rendering the document provided by this pretty + printer yields an output identical to that of Prelude.show, except + for extra whitespace. . - If something went wrong, you can check this page for more info, look at manual installation: + For information about the functions exported by the package please see + the API linked further down this page. + + For examples of usage, both basic and more complex see the README file and + the haskell source code files in the TestSuite folder, both included in the package. + + Finally for installation instructions also see the README file or this page: <http://www.haskell.org/haskellwiki/Cabal/How_to_install_a_Cabal_package> - . - *Basic example of usage - . - Here is a source file demonstrating the GenericPretty usage - . - import Text.PrettyPrint.GenericPretty - . - data Tree a = Leaf a | Node (Tree a) (Tree a) deriving (Generic) - . - instance (Out a) => Out (Tree a) where - docPrec = genOut - . - tree :: Tree Int - . - tree = Node (Node (Leaf 333333333) (Leaf (-555555555))) (Leaf 777777777) - . - main = pp tree - . - * For the above program to run the -XDeriveGeneric flag needs to be set. - . - This can be done either directly at the command line, by compiling with "ghc -XDeriveGeneric" or in - the source code by using the LANGUAGE pragma (it seems I can't demonstrate the LANGUAGE pragma since - cabal hates special characters. An example however is provided in the README file included in the package). - Alternatively, for more information on the LANGUAGE pragma see here: - <http://www.haskell.org/ghc/docs/7.0.4/html/users_guide/pragmas.html> - . - Besides setting the flag, one must derive "Generic" for the desired datatype - by typing "deriving (Generic)" and write an instance of "Out" defining docPrec as "docPrec = genOut". - Then the pretty printing functions such as "pp" can be used on any data of that type. - . - For more details about the above example as well as examples of customizing the pretty printing please - check the README file included in the package. For more information about the library itself and - what it exports check the API linked further down this page. -- URL for the project homepage or repository. Homepage: https://github.com/HaggisMcMutton/GenericPretty
README view
@@ -1,39 +1,78 @@ ******************************************************************************* -* GenericPretty. +* GenericPretty * A Generic, Derivable, Haskell Pretty Printer ******************************************************************************* +=============================================================================== ========================== Description ======================================== +=============================================================================== -GenericPretty is a haskell library that provides support for automatic -derivation of pretty printing functions on user defined data types. +GenericPretty is a Haskell library that supports automatic +derivation of pretty printing functions on user defined data +types. -The Pretty library [1] is used underneath, the work is over 'Pretty.Doc' types. +The form of geenrics used is based on that introduced in the paper: +Magalhaes, Dijkstra, Jeuring, and Loh, +A Generic Deriving Mechanism for Haskell, +3'rd ACM Symposium on Haskell, pp. 37-48, September 2010, + http://dx.doi.org/10.1145/1863523.1863529. +Changes from the original paper in the GHC implementation +are described here: + http://www.haskell.org/haskellwiki/Generics#Changes_from_the_paper. -The library "MyPretty" is also provided. This library is a thin wrapper around -the "Pretty" library and implements only "Style" related features. -These features are planned to be added to the Pretty library itself. When -that happens "MyPretty" will become obsolete and will be replaced by "Pretty". - -The output provided by the library functions is identical to that of -Prelude.show, except it has extra whitespace. - -This library requires the use of the new GHC.Generics features [2] -These features are present in versions of GHC >= 7.2. +This package requires the use of the new GHC.Generics features: + http://www.haskell.org/haskellwiki/Generics +present from GHC 7.2. +Use of these features is indicated by the DeriveGeneric pragma +or the flag -XDeriveGeneric. -The Generics used are based on those described in the paper "A Generic Deriving -Mechanism for Haskell" - by Magalhães, Dijkstra, Jeuring and Löh in Proceedings -of the third ACM Haskell symposium on Haskell (Haskell'2010), pp. 3748, ACM, -2010 [3]. -There are however several changes between the mechanism described in -the paper and the one implemented in GHC [4]. +Pretty printing produces values of type Pretty.Doc, using +the Pretty library + http://www.haskell.org/ghc/docs/7.0.4/html/libraries/ghc-7.0.4/Pretty.html. -This generics mechanism supports deriving for all haskell datatypes EXCEPT for +The Pretty library plans to incorporate a Style datatype to control details +of printing (such as line length). The library MyPretty is provided as a +thin wrapper around the Pretty library, to support Style related features. +Once the Pretty library supports Style, MyPretty will become obsolete and +be replaced by Pretty. + +The output provided is a pretty printed version of that provided by +Prelude.show. That is, rendering the document provided by this pretty +printer yields an output identical to that of Prelude.show, except +for extra whitespace. + +The generics mechanism works on all haskell datatypes except for constrained datatypes. -That is to say, datatypes which have a context will fail. For instance, -"data (Eq a) => Constr a = Constr a" will fail because of the (Eq a) context. +That is to say, datatypes which have a context will fail. +For instance, + data (Eq a) => Constr a = Constr a deriving (Generic) +will fail because of the (Eq a) context. + +=============================================================================== +===================== Installation Instructions =============================== +=============================================================================== +The package is installed in the same way as any other package. The steps are: + 0. Make sure you have a version of ghc >= 7.2 installed and that you can + use the 'runhaskell' command from the command line. + 1. Download and unpack "GenericPretty-1.1.4.tar.gz" + 2. Move to the correct directory: + $ cd GenericPretty-1.1.4 + 3. Run the following haskell commands to install the library globally: + $ runhaskell Setup configure + $ runhaskell Setup build + $ runhaskell Setup install + + The last command requires root access, so you might need to run is as: + $ sudo runhaskell Setup install + +If something went wrong, you can check this page for more info, +look at manual installation: + http://www.haskell.org/haskellwiki/Cabal/How_to_install_a_Cabal_package + +=============================================================================== ============================== Basic Example ================================== +=============================================================================== Here is a haskell source file, called 'SimpleTest.hs' ---------------------------------------------------- @@ -55,10 +94,13 @@ The flag DeriveGeneric must be given to GHC. This can be done as above, in a 'LANGUAGE' pragma, or manually by compiling with 'ghc -XDeriveGeneric'. -As can be seen, to use the library one must simply import it, derive 'Generic' -on the custom data type, and write an instance of 'Out' using 'genOut'. +As can be seen, to use the library you must simply import it, derive Generic +on the custom data type by writing + "deriving (Generic)" +and write an instance of Out implementing 'docPrec' as + "docPrec = genOut" -Then one can use the pretty printing functions, such as 'pp' and 'pretty'. +Then you can use the pretty printing functions, such as 'pp' and 'pretty'. Compiling and running the file is simple and gives the following result. ----------------------------- @@ -72,7 +114,6 @@ --------------------------- If we replaced the main function with 'main = ppLen 30 tree1', the result would instead be: - ----------------------------- Node (Node (Leaf 333333) (Leaf (-555555))) @@ -81,25 +122,32 @@ (Leaf (-14141414))) (Leaf 7777777)) ------------------------------- -In this case the output tries to remain under 30 characters/line, if possible, -while always maintaining correct indentation. +In this case the output tries to remain under 30 characters/line, +if possible, while always maintaining correct indentation. -There also is a 'ppStyle' function which lets you further customize the output +=============================================================================== +================= The 'ppStyle' and 'prettyStyle' functions =================== +=============================================================================== + +The 'ppStyle' function lets you further customize the output by giving a 'Style' which consists of the line length, the number of ribbons per line and the mode to use. -A ribbon length is the length of non-indentation text per line. +The 'prettyStyle' function does the same thing except it outputs a String +instead of an IO() operation. + +A ribbon length is the maximum length of non-indentation text per line. So if I used a line length of 80 and 2 ribbons per line than I would have a maximum of 40 non-indentation characters on any line. The mode tells 'Pretty' how to render the result. There are 4 options: -1. PageMode - the default rendering -2. ZigZagMode - zig-zag cuts -3. LeftMode - there is no indentation and no maximum line length -4. OneLineMode - everything is put on one line - -The most interesting one is the ZigZagMode. Using the running example we write: + 1. PageMode - the default rendering + 2. ZigZagMode - zig-zag cuts + 3. LeftMode - there is no indentation and no maximum line length + 4. OneLineMode - everything is put on one line +The most interesting one is the ZigZagMode. +Modifying the running example we get: -------------------------------------- {-# LANGUAGE DeriveGeneric #-} @@ -121,6 +169,8 @@ main = ppStyle zigStyle tree1 -------------------------------------- We import "MyPretty" to gain access to the "Style" functionality. +Then we proceed to define the 'zigStyle' using a maximum line length of 30, +1.5 ribbonsPerLine and the ZigZagMode. Running the program, we get: ------------------------------------- @@ -135,14 +185,19 @@ (Leaf (-14141414))) (Leaf 7777777)) ------------------------------------- -Notice that the "/" show us the direction in which the rows below have been moved -(left in this case) and the number of "/"s indicate the number of characters -that the rows were moved(in this case 5 characters to the left) +Notice that the "/" show us the direction in which the rows below have been +moved (left in this case) and the number of "/"s indicate the number of +characters that the rows were moved(in this case 5 characters to the left). + +So the last 3 lines are 10 characters to the left compared to where they +would be if we had no maximum line length. -========================== Customization Example ============================== +=============================================================================== +======================= Full Customization Example ============================ +=============================================================================== -While the previous approach provides us some with some options as to the format -of the pretty printed result, sometimes you need even more control. +While the previous approach provides us some with some options as to the +format of the pretty printed result, sometimes you need even more control. Fully customizing the pretty printed results is straightforward, as in the following example called 'CustomTest.hs' @@ -166,13 +221,10 @@ main = pp tree1 ------------------------------ Here we import the library 'MyPretty' and use it directly to define doc. -We could have manually defined 'docPrec' or 'docList' as well if we wanted. As -it is now they are inferred from our definition of doc. - -The syntax used in the definition is the one used in both the Pretty[1] and the -Text.PrettyPrint.HughesPJ [5] libraries.(the second is better documented). +We could have manually defined 'docPrec' or 'docList' as well if we wanted. +As it is now they are inferred from our definition of doc. -By running the above we get a tree with a minimum of indentation: +By running the above custom definition we get a tree with little indentation: ----------------------------------- (customNode (customNode @@ -185,27 +237,28 @@ (customLeaf 57575757)) (customLeaf -14141414)) (customLeaf 7777777))) - ----------------------------------- +The syntax used in the definition is the one used in both the Pretty and the +Text.PrettyPrint.HughesPJ libraries: + http://www.haskell.org/ghc/docs/7.0.4/html/libraries/ghc-7.0.4/Pretty.html + http://hackage.haskell.org/packages/archive/pretty/1.1.0.0/doc/html/Text-PrettyPrint-HughesPJ.html +The second one however is better documented. +=============================================================================== ========================= Further Info ======================================== +=============================================================================== The above 'Tree' examples can be found in 'TestSuite/SimpleTest.hs', -'TestSuite/CustomTest.hs' and 'TestSuite.ZigZagTest.hs'. More involved examples -integrated with QuickCheck can be found in 'TestSuite/Tests.hs'. +'TestSuite.ZigZagTest.hs' and 'TestSuite/CustomTest.hs'. More involved +examples integrated with QuickCheck can be found in 'TestSuite/Tests.hs'. -Further information can be found in the API [6] and in the source code itself. +Further information can be found in the API: + http://hackage.haskell.org/packages/archive/GenericPretty/1.1.4/doc/html/Text-PrettyPrint-GenericPretty.html +and in the source code itself. +=============================================================================== ============================ Contact ========================================== - -Please send any questions/suggestions to: -Razvan Ranca <ranca.razvan@gmail.com> - -============================= Links =========================================== +=============================================================================== -[1] http://www.haskell.org/ghc/docs/7.0.4/html/libraries/ghc-7.0.4/Pretty.html -[2] http://www.haskell.org/haskellwiki/Generics -[3] http://dreixel.net/research/pdf/gdmh.pdf -[4] http://www.haskell.org/haskellwiki/Generics#Changes_from_the_paper -[5] http://hackage.haskell.org/packages/archive/pretty/1.1.0.0/doc/html/Text-PrettyPrint-HughesPJ.html -[6] http://hackage.haskell.org/packages/archive/GenericPretty/1.0.1/doc/html/Text-PrettyPrint-GenericPretty.html+Please send any questions/suggestions/issues to: + Razvan Ranca - ranca.razvan@gmail.com
Text/PrettyPrint/GenericPretty.hs view
@@ -42,74 +42,74 @@ import Text.PrettyPrint.MyPretty -- | The class 'Out' is the equivalent of 'Prelude.Show' - - -- 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 'show' 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 'doc' - -- 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 +-- +-- 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 'show' 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 'doc' +-- 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 class Out a where -- | 'docPrec' is the equivalent of 'Prelude.showsPrec' - -- Convert a value to a pretty printable 'Pretty.Doc'. + -- Convert a value to a pretty printable 'Pretty.Doc'. docPrec :: 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' -- | 'doc' is the equivalent of 'Prelude.show' - -- A specialised variant of 'docPrec', using precedence context zero. + -- A specialised variant of 'docPrec', using precedence context zero. doc :: a -> Doc -- | 'docList' is the equivalent of 'Prelude.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. + -- 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. docList :: [a] -> Doc doc = docPrec 0 @@ -117,20 +117,20 @@ docList = docListWith doc -- | default generic out 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 SDoc's - -- needs to 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 = genOut - -- - -- After doing this, the user can now pretty printing function like 'pp' and 'pretty' - -- on data of type Tree +-- pretty printing functions, finally it concatenates all of the SDoc's +-- needs to 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 = genOut +-- +-- After doing this, the user can now pretty printing function like 'pp' and 'pretty' +-- on data of type Tree genOut :: (Generic a ,GOut (Rep a)) => Int -> a -> Doc genOut n x = sep $ out1 (from x) Pref n False @@ -146,8 +146,8 @@ middle (x:xs) = init xs -- |Utility function used to wrap the passed value in parens if the bool is true - -- A single paren should never occupy a whole line, so they are concatenated - -- to the first and last elements in the list, instead of just adding them to the list +-- A single paren should never occupy a whole line, so they are concatenated +-- to the first and last elements in the list, instead of just adding them to the list wrapParens :: Bool -> [Doc] -> [Doc] wrapParens _ [] = [] wrapParens False s = s @@ -278,7 +278,7 @@ isNullary _ = False -- | 'fullPP' is a fully customizable Pretty Printer - -- Every other pretty printer just gives some default values to 'fullPP' +-- Every other pretty printer just gives some default values to 'fullPP' fullPP :: (Out a) => Mode -- ^The 'Pretty' mode to use /(eg: 'Pretty.PageMode')/ -> Int -- ^The maximum line length -> Float -- ^The number of ribbons per line /(the fraction of line length over the @@ -307,7 +307,7 @@ decode (Str s) = s -- | 'outputStr' just leaves the text as a string, ---usefull is you want to further process the pretty printed result. +-- usefull is you want to further process the pretty printed result. -- This is another example of a function that can handle the text conversion for 'fullPP'. outputStr :: TextDetails -> String -> String outputStr td str = decode td ++ str @@ -319,32 +319,32 @@ decode (Str s) = s -- | Customizable pretty printer, takes a user defined 'Style' as a parameter - -- uses 'outputStr' to obtain the result +-- uses 'outputStr' to obtain the result prettyStyle :: (Out a) => Style -> a -> String prettyStyle s = fullPP (mode s) (lineLength s) (ribbonsPerLine s) outputStr "" -- | Semi-customizable pretty printer. Takes the lineLength as a parameter - -- uses mode = 'Pretty.PageMode' and ribbonsPerLine = 1 +-- uses mode = 'Pretty.PageMode' and ribbonsPerLine = 1 prettyLen :: (Out a) => Int -> a -> String prettyLen l = fullPP PageMode l 1 outputStr "" -- | The default pretty printer returning 'String's - -- uses the default 'MyPretty.Style', 'style' +-- uses the default 'MyPretty.Style', 'style' pretty :: (Out a) => a -> String pretty = prettyStyle style -- | Customizable pretty printer, takes a user defined 'MyPretty.Style' as a parameter - -- uses 'outputIO' to obtain the result +-- uses 'outputIO' to obtain the result ppStyle :: (Out a) => Style -> a -> IO() ppStyle s = fullPP (mode s) (lineLength s) (ribbonsPerLine s) outputIO (putChar '\n') -- | Semi-customizable pretty printer. Takes the lineLength as a parameter - -- uses mode = 'Pretty.PageMode' and ribbonsPerLine = 1 +-- uses mode = 'Pretty.PageMode' and ribbonsPerLine = 1 ppLen :: (Out a) => Int -> a -> IO() ppLen l = fullPP PageMode l 1 outputIO (putChar '\n') -- | The default Pretty Printer, - -- uses the default 'MyPretty.Style', 'style' +-- uses the default 'MyPretty.Style', 'style' pp :: (Out a) => a -> IO() pp = ppStyle style