module Control.Monad.Schedule.Yield where -- base import qualified Control.Concurrent as Concurrent import Control.Monad.IO.Class import Data.Functor.Identity (Identity (runIdentity)) -- monad-schedule import Control.Monad.Schedule.Class import Control.Monad.Schedule.Trans -- * 'YieldT' -- | A monad for scheduling with cooperative concurrency. type YieldT = ScheduleT () type Yield = YieldT Identity -- | Let another thread wake up. yield :: (Monad m) => YieldT m () yield = wait () runYieldT :: (Monad m) => YieldT m a -> m a runYieldT = runScheduleT $ const $ return () runYield :: Yield a -> a runYield = runIdentity . runYieldT {- | Run a 'YieldT' value in a 'MonadIO', interpreting 'yield's as GHC concurrency yields. -} runYieldIO :: (MonadIO m) => YieldT m a -> m a runYieldIO = runScheduleT $ const $ liftIO Concurrent.yield