module DerivingEq where import DerivingUtils deriveEq stdnames src t@(_,TypeInfo{constructors=cs}) = do let pv = stdvalue stdnames mod_Prelude HsVar eq <- pv "==" true <- pv "True" false <- pv "False" andand <- pv "&&" let def = if length cs>1 then [alt2 src eq wild wild (ident false)] else [] eqalt ConInfo{conName=c0,conArity=n} = alt2 (srcLoc c0) eq (p xs) (p ys) rhs where c = convCon t c0 p vs = hsPApp c vs rhs = conj andand true comps comps = zipWith eqtst xs ys eqtst = opapp (HsVar eq) xs=take n (vars "x") ys=take n (vars "y") return [fun src (map eqalt cs++def)]