module DerivingRead where
import DerivingUtils
deriveRead stdnames src t@(_,TypeInfo{constructors=cs}) =
do let pv = stdvalue stdnames mod_Prelude
readParenArg <- pv "readParenArg"
readArgument <- pv "readArgument"
readToken <- pv "readToken"
HsVar readsPrec <- pv "readsPrec"
readAp <- pv "readAp"
readChoice <- pv "readChoice"
let d = var (localVal "d")
alt = alt1 src readsPrec d
rdCon ConInfo{conName=c0,conArity=n} =
case n of
0 -> rdConName cn c
_ -> rdParenArg (comp (rdConName cn c:replicate n rdArg))
where
c = convCon t c0
cn = getBaseName c0
rdConName cn c = rdToken (con c) (str src cn)
rdToken = opapp readToken
rdParenArg a = opapp readParenArg d a
rdArg = ident readArgument
comp = foldl1 (opapp readAp)
choice = foldr1 (opapp readChoice)
return [fun src [alt (choice (map rdCon cs))]]