module Data.Case.Enumerate
( enumerateConstructors
) where
import Language.Haskell.TH
import Control.Monad
enumerateConstructors :: Name -> Name -> Exp -> Q Exp
enumerateConstructors vname name expr = do
TyConI (DataD _ _ _ _ ctors _) <- reify name
matches <- forM ctors $ \(NormalC cname args) -> case args of
[] -> return $ Match (ConP (sketchyNameSingletonize cname) []) (NormalB expr) []
_ -> fail "constConstructors2: empty data constructor required"
return $ CaseE (VarE vname) matches
sketchyNameSingletonize :: Name -> Name
sketchyNameSingletonize = id
. mkName . ('S':) . reverse
. takeWhile (/= '.') . reverse . show