module Rasa (rasa) where
import Rasa.Internal.Editor
import Rasa.Internal.Action
import Rasa.Internal.Events
import Rasa.Internal.Scheduler
import Control.Concurrent.Async
import Control.Lens
import Control.Monad
import Control.Monad.IO.Class
import Data.Default (def)
import Data.List
rasa :: Scheduler () -> IO ()
rasa scheduler =
evalAction def hooks $ do
dispatchEvent Init
eventLoop
dispatchEvent Exit
where hooks = getHooks scheduler
eventLoop :: Action ()
eventLoop = do
dispatchEvent BeforeRender
dispatchEvent OnRender
dispatchEvent AfterRender
dispatchEvent BeforeEvent
asyncActions <- use asyncs
(done, action) <- liftIO $ waitAny asyncActions
asyncs %= delete done
action
isExiting <- use exiting
unless isExiting eventLoop