module Data.Derive.NFData(makeNFData) where
import Language.Haskell.TH.All
#ifdef GUESS
import Control.Parallel.Strategies
import Data.DeriveGuess
example = (,) "NFData" [d|
instance (NFData a) => NFData (DataName a) where
rnf CtorZero = ()
rnf (CtorOne x1) = rnf x1 `seq` ()
rnf (CtorTwo x1 x2) = rnf x1 `seq` rnf x2 `seq` ()
rnf (CtorTwo' x1 x2) = rnf x1 `seq` rnf x2 `seq` ()
|]
#endif
makeNFData :: Derivation
makeNFData = derivation nFData' "NFData"
nFData' dat = [instance_context ["NFData"] "NFData" dat [(FunD (mkName "rnf") (
(map (\(ctorInd,ctor) -> (Clause [(ConP (mkName ("" ++ ctorName ctor)) ((
map (\field -> (VarP (mkName ("x" ++ show field)))) (id [1..ctorArity ctor]
))++[]))] (NormalB (foldl1With (VarE (mkName "seq")) ((map (\field -> (AppE
(VarE (mkName "rnf")) (VarE (mkName ("x" ++ show field))))) (id [1..
ctorArity ctor]))++[(TupE [])]++[]))) [])) (id (zip [0..] (dataCtors dat)))
)++[]))]]