-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Fully encapsulated monad transformers with queuelike functionality. -- -- Contains several implementations of data structures implementing a -- single-in, single-out paradigm, and implements monad -- transformers for their safe use. The monad transformer part of the -- library includes tools to fully encapsulate single-threaded use of a -- priority queue in a monad, including an array-based heap -- implementation. @package pqueue-mtl @version 1.0.2 -- | Abstracts the implementation details of a single-insertion, -- single-extraction queuelike structure. module Data.Queue.Class -- | A generic type class encapsulating a generic queuelike structure, that -- supports single-insertion and single-extraction; this abstraction -- includes priority queues, stacks, and FIFO queues. There are many -- minimal implementations, so each method lists the prerequisites for -- its default implementation. Most implementations will implement -- empty, (singleton and merge) or insert, -- (peek and delete) or extract, and size. class Queuelike q e | q -> e insert :: (Queuelike q e) => e -> q -> q insertAll :: (Queuelike q e) => [e] -> q -> q extract :: (Queuelike q e) => q -> Maybe (e, q) peek :: (Queuelike q e) => q -> Maybe e delete :: (Queuelike q e) => q -> Maybe q empty :: (Queuelike q e) => q singleton :: (Queuelike q e) => e -> q fromList :: (Queuelike q e) => [e] -> q size :: (Queuelike q e) => q -> Int isEmpty :: (Queuelike q e) => q -> Bool toList :: (Queuelike q e) => q -> [e] toList_ :: (Queuelike q e) => q -> [e] merge :: (Queuelike q e) => q -> q -> q mergeAll :: (Queuelike q e) => [q] -> q -- | A basic implementation of a stack implementing the Queue abstraction. module Data.Queue.Stack data Stack e instance Monoid (Stack e) instance Queuelike (Stack e) e -- | A basic first-in, first-out queue implementation implementing the -- Queuelike abstraction. module Data.Queue.Queue data Queue e instance Monoid (Queue e) instance Queuelike (Queue e) e -- | Generic queue wrapper to transform a min-queue into a max-queue. module Data.Queue.ReverseQueue newtype Down a Down :: a -> Down a unDown :: Down a -> a -- | Wrapper around a generic queue that reverses the ordering on its -- elements. data ReverseQueue q e instance (Eq a) => Eq (Down a) instance (Queuelike (q (Down e)) (Down e)) => Queuelike (ReverseQueue q e) e instance (Ord a) => Ord (Down a) -- | An alternate implementation of a priority queue based on a -- Fibonacci heap. -- -- Fibonacci heaps, while not quite as internally functional as pairing -- heaps, are generally less ad-hoc and may prove useful for some uses -- (as well as serving as a useful testbed). A Fibonacci heap can be -- thought of as a lazier binomial heap, designed to better take -- advantage of the fact that in a lazy language a series of modification -- operations will likely all be computed at once, preferably as late as -- possible. The Fibonacci heap supports all Queuelike operations -- with the same time complexity as PQueue. module Data.Queue.FibQueue data FQueue e instance (Ord e) => Queuelike (FQueue e) e -- | An efficient implementation of a priority queue. -- -- The implementation of PQueue is based on a pairing heap, -- a simple and efficient implementation of a general-purpose priority -- queue. PQueue supports insert, merge, and -- peek in constant time, and extract and delete in -- logarithmic time. module Data.Queue.PQueue data PQueue e instance (Ord e) => Monoid (PQueue e) instance (Read e) => Read (PQueue e) instance (Show e) => Show (PQueue e) instance (Read e) => Read (PHeap e) instance (Show e) => Show (PHeap e) instance (Ord e) => Queuelike (PQueue e) e instance (Ord e) => Monoid (PHeap e) module Data.Queue.Instances module Data.Queue module Control.Monad.Queue.Class -- | Type that only orders on the key, ignoring the value completely; -- frequently useful in priority queues, so made available here. data (:->) e f (:->) :: e -> f -> (:->) e f -- | Typeclass abstraction of a monad with access to a mutable queue. -- Minimal implementation: queueInsert or queueInsertAll, -- queuePeek, queueExtract or queueDelete, -- queueSize. class (Monad m) => MonadQueue e m | m -> e queueInsert :: (MonadQueue e m) => e -> m () queueInsertAll :: (MonadQueue e m) => [e] -> m () queueExtract :: (MonadQueue e m) => m (Maybe e) queueDelete :: (MonadQueue e m) => m () queuePeek :: (MonadQueue e m) => m (Maybe e) queueEmpty :: (MonadQueue e m) => m Bool queueSize :: (MonadQueue e m) => m Int instance (MonadQueue e m) => MonadQueue e (IntMapT f m) instance (MonadQueue e m) => MonadQueue e (ListT m) instance (MonadQueue e m) => MonadQueue e (MaybeT m) instance (Monoid w, MonadQueue e m) => MonadQueue e (WriterT w m) instance (Monoid w, MonadQueue e m) => MonadQueue e (WriterT w m) instance (MonadQueue e m) => MonadQueue e (ReaderT r m) instance (MonadQueue e m) => MonadQueue e (StateT s m) instance (MonadQueue e m) => MonadQueue e (StateT s m) instance (Ord f) => Ord (e :-> f) instance (Eq f) => Eq (e :-> f) module Control.Monad.Queue.Heap -- | Monad based on an array implementation of a standard binary heap. type HeapM s e = HeapT s e (ST s) -- | Monad transformer based on an array implementation of a standard -- binary heap. data HeapT s e m a -- | Runs an HeapM computation starting with an empty heap. runHeapM :: (Ord e) => (forall s. HeapM s e a) -> a runHeapMIO :: (Ord e) => HeapM RealWorld e a -> IO a runHeapT :: (MonadST s m, Monad m) => HeapT s e m a -> m a instance (Monad m) => Monad (HeapT s e m) instance (MonadST s m) => MonadST s (HeapT s e m) instance (MonadFix m) => MonadFix (HeapT s e m) instance (MonadReader r m) => MonadReader r (HeapT s e m) instance (MonadWriter w m) => MonadWriter w (HeapT s e m) instance (MonadST s m, Monad m, Ord e) => MonadQueue e (HeapT s e m) instance (MonadST s m, MonadState t m) => MonadState t (HeapT s e m) instance MonadTrans (HeapT s e) -- | A monad transformer allowing a purely functional queue implementation -- (specifically, implementing the Queuelike abstraction) to be -- used in a monadic, single-threaded fashion. module Control.Monad.Queue.QueueT -- | A monad transformer granting the underlying monad m access to -- single-threaded actions on a queue. newtype QueueT q m a QueueT :: StateT q m a -> QueueT q m a runQT :: QueueT q m a -> StateT q m a -- | A monad controlling single-threaded access to a queue. newtype QueueM q a QueueM :: State q a -> QueueM q a runQM :: QueueM q a -> State q a type PQueueT e = QueueT (PQueue e) type PQueueM e = QueueM (PQueue e) type FibQueueT e = QueueT (FQueue e) type FibQueueM e = QueueM (FQueue e) -- | Unwraps a queue transformer, initializing it with an empty queue. runQueueT :: (Monad m, Queuelike q e) => QueueT q m a -> m a -- | Unwraps a queue transformer, initializing it with a queue with the -- specified contents. runQueueTOn :: (Monad m, Queuelike q e) => QueueT q m a -> [e] -> m a -- | Executes a computation in a queue monad, starting with an empty queue. runQueueM :: (Queuelike q e) => QueueM q a -> a -- | Executes a computation in a queue monad, starting with a queue with -- the specified contents. runQueueMOn :: (Queuelike q e) => QueueM q a -> [e] -> a instance MonadFix (QueueM q) instance Monad (QueueM q) instance (MonadReader r m) => MonadReader r (QueueT q m) instance (MonadWriter w m) => MonadWriter w (QueueT q m) instance (MonadIO m) => MonadIO (QueueT q m) instance (MonadST s m) => MonadST s (QueueT q m) instance (MonadFix m) => MonadFix (QueueT q m) instance (Monad m) => Monad (QueueT q m) instance MonadTrans (QueueT q) instance (Queuelike q e) => MonadQueue e (QueueM q) instance (Monad m, Queuelike q e) => MonadQueue e (QueueT q m) instance (MonadState s m) => MonadState s (QueueT q m) module Control.Monad.Queue.Instances module Control.Monad.Queue