module Data.Generics.Is.TH.Compat where
import Language.Haskell.TH
constructorNames :: Name -> Q [Name]
constructorNames datatype = do
info <- reify datatype
cs <- constructors info
return$ cs >>= conNames
where
constructors ty = case ty of
TyConI (DataD _ _ _ _ cs _) -> return cs
TyConI (NewtypeD _ _ _ _ c _) -> return [c]
_ -> fail $ "Can't derive predicates for " ++ nameBase datatype ++ "."
conNames c = case c of
NormalC n _ -> [n]
RecC n _ -> [n]
InfixC _ n _ -> [n]
ForallC _ _ c' -> conNames c'
GadtC ns _ _ -> ns
RecGadtC ns _ _ -> ns