court-0.1.0.0: src/Court/Queue.hs
{-# LANGUAGE BangPatterns #-}
module Court.Queue
( module Control.Concurrent.STM
, module Data.Monoid
, Queue(..)
, takeNextJobSTM
, takeNextJob
, addToQueueSTM
, addToQueue
) where
import Control.Concurrent.STM
import Data.List
import Data.Monoid
import Court.Job
data Queue = Queue ![Job] deriving (Show, Eq)
instance Monoid Queue where
mempty = Queue []
mappend (Queue xs) (Queue ys) = Queue . nub $ xs ++ ys
takeNextJobSTM :: TVar Queue -> STM (Maybe Job)
takeNextJobSTM queueTVar = do
Queue jobs <- readTVar queueTVar
case jobs of
job : rest -> do
writeTVar queueTVar $ Queue rest
return $ Just job
_ -> return Nothing
takeNextJob :: TVar Queue -> IO (Maybe Job)
takeNextJob = atomically . takeNextJobSTM
addToQueueSTM :: TVar Queue -> Job -> STM ()
addToQueueSTM queueTVar job = modifyTVar queueTVar (<> Queue [job])
addToQueue :: TVar Queue -> Job -> IO ()
addToQueue queueTVar job = atomically $ addToQueueSTM queueTVar job