module Rasa (rasa) where
import Rasa.Internal.Editor
import Rasa.Internal.Action
import Rasa.Internal.Events
import Rasa.Internal.Scheduler
import Control.Lens
import Control.Concurrent.Async
import Control.Monad
import Control.Monad.State
import Control.Monad.Reader
import Data.Default (def)
import Data.Foldable
rasa :: [Action [Keypress]] -> Scheduler () -> IO ()
rasa eventProviders scheduler =
evalAction def hooks $ do
dispatchEvent Init
eventLoop eventProviders
dispatchEvent Exit
where hooks = getHooks scheduler
eventLoop :: [Action [Keypress]] -> Action ()
eventLoop eventProviders = do
dispatchEvent BeforeRender
dispatchEvent OnRender
dispatchEvent AfterRender
dispatchEvent BeforeEvent
currentEditor <- get
hooks <- ask
asyncEventProviders <- liftIO $ traverse (async.evalAction currentEditor hooks) eventProviders
(_, nextEvents) <- liftIO $ waitAny asyncEventProviders
traverse_ dispatchEvent nextEvents
isExiting <- use exiting
unless isExiting $ eventLoop eventProviders