module Data.DeriveTH
(derive,
Derivation,
_derive_string_instance
) where
import Data.List
import Control.Monad (liftM)
import Language.Haskell.TH.All
derive :: Derivation -> Name -> Q [Dec]
derive (Derivation f _) nm = f =<< deriveOne nm
_derive_string_instance :: Derivation -> Name -> Q Exp
_derive_string_instance (Derivation f s) nm =
return . LitE . StringL . blankLine . show . ppr . peephole =<< f =<< deriveOne nm
where
blankLine "" = "-- Cannot derive " ++ s ++ " for " ++ show nm
blankLine xs = xs
deriveOne :: Name -> Q DataDef
deriveOne x = liftM extract (reify x)
extract (TyConI decl) = normData decl
extract _ = error $ "Data.Derive.TH.deriveInternal: not a type!"