{-# LANGUAGE TupleSections #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} module Control.Monad.Schedule.RoundRobin where -- base import Control.Monad.IO.Class import qualified Data.List.NonEmpty as NonEmpty -- transformers import Control.Monad.Trans.Class -- monad-schedule import Control.Monad.Schedule.Class -- | Any monad can be trivially scheduled by executing all actions after each other, -- step by step. newtype RoundRobinT m a = RoundRobinT { unRoundRobin :: m a } deriving (Functor, Applicative, Monad, MonadIO) instance MonadTrans RoundRobinT where lift = RoundRobinT -- | Execute only the first action, and leave the others for later, preserving the order. instance Monad m => MonadSchedule (RoundRobinT m) where schedule actions = ( , NonEmpty.tail actions) <$> fmap pure (NonEmpty.head actions)