Add NFData and Eq instances
authorIvan Lazar Miljenovic <ivan.miljenovic@gmail.com>
Tue, 24 Jun 2014 09:55:22 +0000 (19:55 +1000)
committerIvan Lazar Miljenovic <ivan.miljenovic@gmail.com>
Tue, 24 Jun 2014 09:55:22 +0000 (19:55 +1000)
Eq instance is based via the default rendering in case of differences in
how they were created.

pretty.cabal
src/Text/PrettyPrint/HughesPJ.hs

index 7714b73..7d71469 100644 (file)
@@ -30,7 +30,8 @@ Library
     exposed-modules:
         Text.PrettyPrint
         Text.PrettyPrint.HughesPJ
-    build-depends: base >= 3 && < 5
+    build-depends: base >= 3 && < 5,
+                   deepseq >= 1.1 && < 1.4
     extensions: CPP, BangPatterns
     ghc-options: -Wall -fwarn-tabs
 
index 10de760..2a36f07 100644 (file)
@@ -75,8 +75,10 @@ module Text.PrettyPrint.HughesPJ (
     ) where
 #endif
 
-import Data.Monoid ( Monoid(mempty, mappend) )
-import Data.String ( IsString(fromString) )
+import Control.DeepSeq ( NFData(rnf) )
+import Data.Function   ( on )
+import Data.Monoid     ( Monoid(mempty, mappend) )
+import Data.String     ( IsString(fromString) )
 
 -- ---------------------------------------------------------------------------
 -- The Doc calculus
@@ -236,6 +238,24 @@ instance Show Doc where
                                     (ribbonsPerLine style)
                                     txtPrinter cont doc
 
+instance Eq Doc where
+  (==) = (==) `on` render
+
+instance NFData Doc where
+  rnf Empty               = ()
+  rnf (NilAbove d)        = rnf d
+  rnf (TextBeside td i d) = rnf td `seq` rnf i `seq` rnf d
+  rnf (Nest k d)          = rnf k  `seq` rnf d
+  rnf (Union ur ul)       = rnf ur `seq` rnf ul
+  rnf NoDoc               = ()
+  rnf (Beside ld s rd)    = rnf ld `seq` rnf s `seq` rnf rd
+  rnf (Above ud s ld)     = rnf ud `seq` rnf s `seq` rnf ld
+
+instance NFData TextDetails where
+  rnf (Chr c)    = rnf c
+  rnf (Str str)  = rnf str
+  rnf (PStr str) = rnf str
+
 -- ---------------------------------------------------------------------------
 -- Values and Predicates on GDocs and TextDetails