----------------------------------------------------------------------------- -- | -- Module : Control.Monad.Trans.Crtn.EventHandler -- Copyright : (c) 2012 Ian-Woo Kim -- -- License : BSD3 -- Maintainer : Ian-Woo Kim -- Stability : experimental -- Portability : GHC -- -- Common event handling -- ----------------------------------------------------------------------------- module Control.Monad.Trans.Crtn.EventHandler where import Control.Concurrent.MVar import Control.Monad.State -- import Control.Monad.Error import Control.Monad.Trans.Either -- from this package -- import Control.Monad.Trans.Crtn import Control.Monad.Trans.Crtn.Event import Control.Monad.Trans.Crtn.Driver import Control.Monad.Trans.Crtn.Logger -- | eventHandler :: MVar (Maybe (Driver e IO ())) -> e -> IO () eventHandler evar ev = do mnext <- takeMVar evar case mnext of Nothing -> return () Just drv -> do (r,drv') <- eaction drv putMVar evar (Just drv') case r of Left err -> scribe (show err) Right Nothing -> return () Right (Just (ActionOrder act)) -> act (eventHandler evar) >>= eventHandler evar where eaction = runStateT (runEitherT $ fire ev)