{-# LANGUAGE FlexibleInstances #-} -- | A typeclass for pretty-printing. Types that wish to be -- pretty-printed should make themselves an instance of the 'Pretty' -- class. The only class function that they need to implement is -- 'pretty_show', which turns the thing into a string in a nice -- way. The 'pretty_print' function then prints the result of -- 'pretty_show' by default. -- module Pretty ( Pretty(..) ) where import Text.Parsec ( ParseError ) class Pretty a where -- | Obtain a pretty 'String' representation of the given thingy. pretty_show :: a -> String -- | Pretty-print the given thingy. pretty_print :: a -> IO () pretty_print = putStrLn . pretty_show -- | If we can pretty print something, we can pretty-print a list of -- them too. -- instance (Pretty a) => Pretty [a] where pretty_show l = show $ map pretty_show l -- | If we can pretty print something, we can pretty-print a pair of -- them too. -- instance (Pretty a, Pretty b) => Pretty (a,b) where pretty_show (x,y) = show (pretty_show x, pretty_show y) -- | Define a 'Pretty' instance for the result of 'parse'. This lets -- us pretty-print the result of a parse attempt without worrying -- about whether or not it failed. If the parse failed, you get the -- same output that you usually would. Otherwise we pretty-print the -- parsed value. -- instance Pretty a => Pretty (Either ParseError a) where pretty_show (Left err) = show err pretty_show (Right v) = pretty_show v