module System.Glib.Cast.TH (instance_) where
import Data.Maybe
import Language.Haskell.Interpreter
import Language.Haskell.TH.Syntax
instance_ :: String -> Q [Dec]
instance_ module_
= do
(Right (elements :: [ModuleElem]))
<- qRunIO $ runInterpreter $ getModuleExports module_
return $ map makeInstance_ $ mapMaybe isCastTo elements
isCastTo :: ModuleElem -> Maybe String
isCastTo (Fun ('c' : 'a' : 's' : 't' : 'T' : 'o' : rest)) = Just rest
isCastTo _others = Nothing
makeInstance_ :: String -> Dec
makeInstance_ type_
= InstanceD []
(AppT (ConT $ mkName "Cast") $ ConT $ mkName type_)
[ FunD (mkName "cast")
[ Clause [] (NormalB $ VarE $ mkName $ "castTo" ++ type_) []]]