{-# OPTIONS_GHC -fth -fno-warn-missing-methods -cpp #-} -- | Derive NFData, from Control.Parallel.Strategies. 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))) )++[]))]]