{-# LANGUAGE RecordWildCards, OverloadedStrings #-} {-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-} module Tip.Pretty where import Text.PrettyPrint import Tip.Types infixl 1 $\ -- | Typeclass for pretty things class Pretty a where pp :: a -> Doc -- | Pretty to string ppRender :: Pretty a => a -> String ppRender = render . pp -- | Print something pretty pprint :: Pretty a => a -> IO () pprint = putStrLn . ppRender instance PrettyVar String where varStr = id instance PrettyVar Int where varStr = show -- | Typeclass for variables class PrettyVar a where -- | The string in a variable varStr :: a -> String -- | Variable to 'Doc' ppVar :: PrettyVar a => a -> Doc ppVar = text . varStr -- * Utilities on Docs -- | Infix 'hang' ($\) :: Doc -> Doc -> Doc d1 $\ d2 = hang d1 2 d2 -- | Conditional parentheses parIf :: Bool -> Doc -> Doc parIf True = parens parIf False = id