hpaste

recent | annotate | new

{-# 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)