{-# OPTIONS -fglasgow-exts #-} module GShow (tests) where {- The generic show example from the 2nd boilerplate paper. (There were some typos in the ICFP 2004 paper.) Also check out Data.Generics.Text. -} import Test.HUnit import Data.Generics hiding (gshow) import Prelude hiding (showString) gshow :: Data a => a -> String gshow = gshow_help `extQ` showString gshow_help :: Data a => a -> String gshow_help t = "(" ++ showConstr (toConstr t) ++ concat (intersperse " " (gmapQ gshow t)) ++ ")" showString :: String -> String showString s = "\"" ++ concat (map escape s) ++ "\"" where escape '\n' = "\\n" escape other_char = [other_char] gshowList :: Data b => [b] -> String gshowList xs = "[" ++ concat (intersperse "," (map gshow xs)) ++ "]" gshow' :: Data a => a -> String gshow' = gshow_help `ext1Q` gshowList `extQ` showString intersperse :: a -> [a] -> [a] intersperse _ [] = [] intersperse x [e] = [e] intersperse x (e:es) = (e:(x:intersperse x es)) tests = ( gshow' "foo" , gshow' [True,False] ) ~=? output output = ("\"foo\"","[(True),(False)]")