module Data.DeriveTH
(derive,
Derivation,
module Data.Derive.All,
_derive_string_instance
) where
import Data.List
import Control.Monad (liftM)
import Data.Derive.All
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 = extract =<< reify x
extract (TyConI decl) = liftM normData (expandData decl)
extract _ = error $ "Data.Derive.TH.deriveInternal: not a type!"