On Tue, Jun 22, 2010 at 6:24 PM, Andy Stewart
<lazycat.manatee@gmail.com> wrote:
Hi all,
I have below duplicate code, but i don't know how to use TH instance code.
------------------------------> duplicate code start <------------------------------
instance Variable PageType where
toVariant = toVariant . show
fromVariant x = fmap (\v -> read v :: PageType) $ fromVariant x
instance Variable Int where
toVariant = toVariant . show
fromVariant x = fmap (\v -> read v :: Int) $ fromVariant x
instance Variable (Maybe Char) where
toVariant = toVariant . show
fromVariant x = fmap (\v -> read v :: Maybe Char) $ fromVariant x
instance Variable (Maybe Int) where
toVariant = toVariant . show
fromVariant x = fmap (\v -> read v :: Maybe Int) $ fromVariant x
instance Variable ProcessID where
toVariant = toVariant . show
fromVariant x = fmap (\v -> read v :: ProcessID) $ fromVariant x
instance Variable GWindowId where
toVariant = toVariant . show
fromVariant x = fmap (\v -> read v :: GWindowId) $ fromVariant x
------------------------------> duplicate code end <------------------------------
Any TH expert help?
Thanks,
-- Andy
mkInstance :: Name -> Q Dec
mkInstance n = do
tv <- [|toVariant . show|]
fv <- [|fmap read . fromVariant|]
return $ InstanceD [] (ConT ''Variable `AppT` ConT n)
[ FunD (mkName "toVariant") [Clause [] [NormalB tv] []]
, FunD (mkName "fromVariant") [Clause [] [NormalB fv] []]
]
mkInstances = mapM mkInstance
mkInstances [''PageType, ''Int, ..]
Haven't tried it, but it should be pretty close.
Michael