yoko-0.3.1: Data/Yoko/TH/Internal.hs
module Data.Yoko.TH.Internal where
import Language.Haskell.TH
thFail :: String -> Q a
thFail s = fail $ "yokoTH: " ++ s
data DataType = DataType [TyVarBndr] (Either Con [Con])
dataType :: Name -> Q DataType
dataType n = do
i <- reify n
case i of
TyConI d -> case d of
DataD _ _ tvbs cons _ -> return $ DataType tvbs $ Right cons
NewtypeD _ _ tvbs con _ -> return $ DataType tvbs $ Left con
_ -> thFail $ "expecting name of newtype or data type, not: " ++ show d
_ -> thFail $ "expecting name of newtype or data type, not: " ++ show i
dataType2Dec :: Name -> DataType -> Dec
dataType2Dec n (DataType tvbs cons) = case cons of
Left con -> NewtypeD [] n tvbs con []
Right cons -> DataD [] n tvbs cons []