packages feed

monad-effect-0.1.0.0: src/Control/System/EventLoop.hs

module Control.System.EventLoop where

import Control.System
import Control.Monad.Effect
import Control.Concurrent.STM

eventLoop :: forall mods . (ConsFDataList FData mods, System FData mods) => Eff mods NoError ()
eventLoop = do
  beforeSystem
  listenToEvents >>= liftIO . atomically >>= handleEvents @_ @mods
  afterSystem
  eventLoop

-- | Avoid runtime error (IO) though, make sure every loop breaking error is in SystemError
eventLoopWithRelease :: forall mods. (ConsFDataList FData mods, System FData mods) => Eff mods NoError ()
eventLoopWithRelease = do
  eventLoop
  releaseSystem

-- | When restart, the state is reset to the initial state
eventLoopWithReleaseRestartIO :: forall mods. (ConsFDataList FData mods, System FData mods) => SystemInitData FData mods -> IO ()
eventLoopWithReleaseRestartIO initData = do
  _ <- runSystemWithInitData @mods initData eventLoopWithRelease
  eventLoopWithReleaseRestartIO initData