{-# OPTIONS_GHC -fglasgow-exts -fth #-} module Keyword (keyword, keywords) where import Language.Haskell.TH.Syntax import Char -- keyword name = [d| data $(name) = $(name) |] -- DataD Cxt Name [Name] [Con] [Name] -- data Con = NormalC Name [StrictType] | ... keyword name = DataD [] name' [] [NormalC name' []] (map mkName ["Show", "Eq"]) where name' = mkName name -- where name' = (Name (mkOccName name) NameS) lowerFirst "" = "" lowerFirst (x:xs) = (toLower x):xs lcCons name = ValD (VarP lcName) (NormalB (ConE (mkName name))) [] where lcName = mkName $ lowerFirst name keywords names = return (map keyword names ++ map lcCons names)