packages feed

GenericPretty 1.1.3 → 1.1.4

raw patch · 3 files changed

+231/−230 lines, 3 files

Files

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. 37–48, 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