module Graphics.Vty.Widgets.Events
( Handlers
, Handler
, newHandlers
, addHandler
, fireEvent
)
where
import Control.Monad
import Data.IORef
type Handler a = a -> IO ()
newtype Handlers a = Handlers (IORef [Handler a])
addHandler :: (w -> IO (Handlers a)) -> w -> Handler a -> IO ()
addHandler getRef w handler = do
(Handlers r) <- getRef w
modifyIORef r $ \s -> s ++ [handler]
fireEvent :: w -> (w -> IO (Handlers a)) -> a -> IO ()
fireEvent w getRef ev = do
(Handlers r) <- getRef w
handlers <- readIORef r
forM_ handlers $ \handler ->
handler ev
newHandlers :: IO (Handlers a)
newHandlers = do
r <- newIORef []
return $ Handlers r