DerivingShow.hs

module DerivingShow where
import DerivingUtils

deriveShow stdnames src t@(_,TypeInfo{constructors=cs}) =
  do let pv = stdvalue stdnames mod_Prelude
     showParenArg <- pv "showParenArg"
     showArgument <- pv "showArgument"
     showString <- pv "showString"
     HsVar showsPrec <- pv "showsPrec"
     comp2 <- opapp # pv "."

     let showAlt ConInfo{conName=c0,conArity=n} =
	   case n of
	     0 -> alt (con c) (showConName cn)
	     _ -> alt (hsPApp c xs)
		      (paren (showConName cn `comp2` comp (map showArg xs)))
	   where
	     c = convCon t c0
	     cn = getBaseName c0
	     xs = take n (vars "x")

	 paren arg = ident showParenArg `app` d `app` arg
	 showArg v = ident showArgument `app` v
	 showConName c = ident showString `app` str src c

	 comp = foldr1 comp2

	 alt = alt2 src showsPrec d
	 d = var (localVal "d")

     return [fun src (map showAlt cs)]

Plain-text version of DerivingShow.hs | Valid HTML?