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