packages feed

vimus-0.1.0: src/Queue.hs

-- | A simple unbounded queue.
--
-- All operations are non-blocking.
module Queue (
  Queue
, newQueue
, putQueue
, takeAllQueue
) where

import           Control.Exception (mask_)
import           Control.Concurrent.MVar
import           Control.Applicative

newtype Queue a = Queue (MVar [a])

-- | Create an empty queue.
newQueue :: IO (Queue a)
newQueue = Queue <$> newMVar []

-- | Put an element into the queue.
putQueue :: Queue a -> a -> IO ()
putQueue (Queue m) x = mask_ $ takeMVar m >>= putMVar m . (x:)

-- | Take all elements from the queue.
takeAllQueue :: Queue a -> IO [a]
takeAllQueue (Queue m) = reverse <$> swapMVar m []