-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Abstraction typeclasses for queue-like things. -- -- A collection of abstract interfaces to mutable queue-like things. Note -- that I named this module before I realized that there was a module of -- the same name in (base<3). I am open to suggestions for a new name. @package queue @version 0.1.1.3 module Data.Queue.Classes -- | Construct a new FIFO queue. class (Monad m) => NewFifo q m newFifo :: (NewFifo q m) => m q -- | A type class carrying an altered set of functional dependencies used -- to constrain queues when the type of the queue never escapes far -- enough for a more deliberate choice to be made. class (Monad m) => DefaultFifo q m a | q -> a, m a -> q class (Monad m) => Enqueue q m a | q -> a enqueue :: (Enqueue q m a) => q -> a -> m () class (Monad m) => Dequeue q m a | q -> a dequeue :: (Dequeue q m a) => q -> m (Maybe a) dequeueBatch :: (Dequeue q m a) => q -> m [a] class (Monad m) => DequeueWhere q m a | q -> a dequeueWhere :: (DequeueWhere q m a) => q -> (a -> Bool) -> m (Maybe a) class (Monad m) => PeekQueue q m a | q -> a peekQueue :: (PeekQueue q m a) => q -> m [a] peekQueueTaking :: (PeekQueue q m a) => Int -> q -> m [a] class (Monad m) => QueueSize q m queueSize :: (QueueSize q m) => q -> m Int module Data.Queue.Instances -- | Chan is an abstract type representing an unbounded FIFO -- channel. data Chan a :: * -> * -- | An MVar (pronounced "em-var") is a synchronising variable, used -- for communication between concurrent threads. It can be thought of as -- a a box, which may be empty or full. data MVar a :: * -> * -- | A monad supporting atomic memory transactions. data STM a :: * -> * -- | TChan is an abstract type representing an unbounded FIFO -- channel. data TChan a :: * -> * -- | A TMVar is a synchronising variable, used for communication -- between concurrent threads. It can be thought of as a box, which may -- be empty or full. data TMVar a :: * -> * -- | Perform a series of STM actions atomically. -- -- You cannot use atomically inside an unsafePerformIO or -- unsafeInterleaveIO. Any attempt to do so will result in a -- runtime error. (Reason: allowing this would effectively allow a -- transaction inside a transaction, depending on exactly when the thunk -- is evaluated.) -- -- However, see newTVarIO, which can be called inside -- unsafePerformIO, and which allows top-level TVars to be -- allocated. atomically :: STM a -> IO a instance Dequeue (MVar a) IO a instance Enqueue (MVar a) IO a instance NewFifo (MVar a) IO instance Enqueue (Chan a) IO a instance NewFifo (Chan a) IO module Data.Queue -- | Construct a new FIFO queue. class (Monad m) => NewFifo q m newFifo :: (NewFifo q m) => m q -- | A type class carrying an altered set of functional dependencies used -- to constrain queues when the type of the queue never escapes far -- enough for a more deliberate choice to be made. class (Monad m) => DefaultFifo q m a | q -> a, m a -> q class (Monad m) => Enqueue q m a | q -> a enqueue :: (Enqueue q m a) => q -> a -> m () class (Monad m) => Dequeue q m a | q -> a dequeue :: (Dequeue q m a) => q -> m (Maybe a) dequeueBatch :: (Dequeue q m a) => q -> m [a] class (Monad m) => DequeueWhere q m a | q -> a dequeueWhere :: (DequeueWhere q m a) => q -> (a -> Bool) -> m (Maybe a) class (Monad m) => PeekQueue q m a | q -> a peekQueue :: (PeekQueue q m a) => q -> m [a] peekQueueTaking :: (PeekQueue q m a) => Int -> q -> m [a] class (Monad m) => QueueSize q m queueSize :: (QueueSize q m) => q -> m Int -- | RQueue : read-only newtype wrapper for arbitrary queues data RQueue q mkRQueue :: q -> RQueue q -- | WQueue : write-only newtype wrapper for arbitrary queues data WQueue q mkWQueue :: q -> WQueue q instance (Enqueue q m a) => Enqueue (WQueue q) m a instance (Dequeue q m a) => Dequeue (RQueue q) m a