packages feed

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