module System.Plugins.Hotswap (newPlugin, Plugin (..), usePlugin, reloadPlugin) where
import System.Plugins.Load
import Data.IORef
data Plugin a = Plugin {
pluginObject :: FilePath,
pluginIncludes :: [FilePath],
pluginFunctionName :: String,
pluginFunction :: IORef a,
pluginModule :: IORef Module
}
usePlugin :: Plugin (a -> b) -> a -> IO b
usePlugin p x = fmap ($ x) $ readIORef $ pluginFunction p
newPlugin :: FilePath -> [FilePath] -> String -> IO (Plugin a)
newPlugin obj incs name = do
plugin <- load_ obj incs name
case plugin of
LoadSuccess m f -> do
fref <- newIORef f
mref <- newIORef m
return $! Plugin obj incs name fref mref
_ -> error "no such module or function"
reloadPlugin :: Plugin a -> IO ()
reloadPlugin (Plugin _ _ name fref mref) = do
m <- readIORef mref
plugin <- reload m name
case plugin of
LoadSuccess newm newf -> do
writeIORef mref newm
writeIORef fref newf
_ -> error "no such module or function"