Maintainer | Ziyang Liu <free@cofree.io> |
---|---|
Safe Haskell | Safe |
Language | Haskell2010 |
Double-ended priority queues where priority values are integers, allowing efficient retrieval and removel from both ends of the queue.
A queue can be configured with a maximum size. Each time an insertion causes the queue to grow beyond the size limit, the greatest element will be automatically removed (rather than rejecting the insertion).
The implementation is backed by an
. This means
that certain operations, including IntMap
(NonEmpty
a)peekMin
, peekMax
and fromList
,
are asymptotically more expensive than a mutable array based implementation.
In a pure language like Haskell, a
mutable array based implementation would be impure
and need to operate inside monads. And in many applications, regardless
of language, the additional time complexity would be a small or negligible
price to pay to avoid destructive updates anyway.
If you only access one end of the queue (i.e., you need a regular
priority queue), an implementation based on a kind of heap that is more
amenable to purely functional implementations, such as binomial heap
and pairing heap, is potentially more efficient. But always benchmark
if performance is important; in my experience Map
always wins, even for
regular priority queues.
See README.md for more information.
Synopsis
- data IntMinMaxQueue a
- type Prio = Int
- empty :: IntMinMaxQueue a
- singleton :: (a -> Prio) -> a -> IntMinMaxQueue a
- fromList :: [(Prio, a)] -> IntMinMaxQueue a
- fromListWith :: (a -> Prio) -> [a] -> IntMinMaxQueue a
- fromMap :: IntMap (NonEmpty a) -> IntMinMaxQueue a
- null :: IntMinMaxQueue a -> Bool
- notNull :: IntMinMaxQueue a -> Bool
- size :: IntMinMaxQueue a -> Int
- withMaxSize :: IntMinMaxQueue a -> Int -> IntMinMaxQueue a
- maxSize :: IntMinMaxQueue a -> Maybe Int
- insert :: (a -> Prio) -> a -> IntMinMaxQueue a -> IntMinMaxQueue a
- peekMin :: IntMinMaxQueue a -> Maybe a
- peekMax :: IntMinMaxQueue a -> Maybe a
- deleteMin :: IntMinMaxQueue a -> IntMinMaxQueue a
- deleteMax :: IntMinMaxQueue a -> IntMinMaxQueue a
- pollMin :: IntMinMaxQueue a -> Maybe (a, IntMinMaxQueue a)
- pollMax :: IntMinMaxQueue a -> Maybe (a, IntMinMaxQueue a)
- takeMin :: Int -> IntMinMaxQueue a -> IntMinMaxQueue a
- takeMax :: Int -> IntMinMaxQueue a -> IntMinMaxQueue a
- dropMin :: Int -> IntMinMaxQueue a -> IntMinMaxQueue a
- dropMax :: Int -> IntMinMaxQueue a -> IntMinMaxQueue a
- map :: (a -> b) -> IntMinMaxQueue a -> IntMinMaxQueue b
- mapWithPriority :: (Prio -> a -> b) -> IntMinMaxQueue a -> IntMinMaxQueue b
- foldr :: (a -> b -> b) -> b -> IntMinMaxQueue a -> b
- foldl :: (a -> b -> a) -> a -> IntMinMaxQueue b -> a
- foldrWithPriority :: (Prio -> a -> b -> b) -> b -> IntMinMaxQueue a -> b
- foldlWithPriority :: (a -> Prio -> b -> a) -> a -> IntMinMaxQueue b -> a
- foldMapWithPriority :: Monoid m => (Prio -> a -> m) -> IntMinMaxQueue a -> m
- foldr' :: (a -> b -> b) -> b -> IntMinMaxQueue a -> b
- foldl' :: (a -> b -> a) -> a -> IntMinMaxQueue b -> a
- foldrWithPriority' :: (Prio -> a -> b -> b) -> b -> IntMinMaxQueue a -> b
- foldlWithPriority' :: (a -> Prio -> b -> a) -> a -> IntMinMaxQueue b -> a
- elems :: IntMinMaxQueue a -> [a]
- toList :: IntMinMaxQueue a -> [(Prio, a)]
- toAscList :: IntMinMaxQueue a -> [(Prio, a)]
- toDescList :: IntMinMaxQueue a -> [(Prio, a)]
- toMap :: IntMinMaxQueue a -> IntMap (NonEmpty a)
IntMinMaxQueue type
data IntMinMaxQueue a Source #
A double-ended priority queue whose elements are compared
on an Int
field.
Instances
Construction
empty :: IntMinMaxQueue a Source #
O(1). The empty queue.
singleton :: (a -> Prio) -> a -> IntMinMaxQueue a Source #
O(1). A queue with a single element.
fromList :: [(Prio, a)] -> IntMinMaxQueue a Source #
O(n * log n). Build a queue from a list of (priority, element) pairs.
fromListWith :: (a -> Prio) -> [a] -> IntMinMaxQueue a Source #
O(n * log n). Build a queue from a list of elements and a function from elements to priorities.
fromMap :: IntMap (NonEmpty a) -> IntMinMaxQueue a Source #
O(n) (due to calculating the queue size).
Size
null :: IntMinMaxQueue a -> Bool Source #
O(1). Is the queue empty?
notNull :: IntMinMaxQueue a -> Bool Source #
O(1). Is the queue non-empty?
size :: IntMinMaxQueue a -> Int Source #
O(1). The total number of elements in the queue.
Maximum size
withMaxSize :: IntMinMaxQueue a -> Int -> IntMinMaxQueue a Source #
Return a queue that is limited to the given number of elements. If the original queue has more elements than the size limit, the greatest elements will be dropped until the size limit is satisfied.
maxSize :: IntMinMaxQueue a -> Maybe Int Source #
O(1). The size limit of the queue. It returns either Nothing
(if
the queue does not have a size limit) or Just n
where n >= 0
.
Queue operations
insert :: (a -> Prio) -> a -> IntMinMaxQueue a -> IntMinMaxQueue a Source #
O(log n). Add the given element to the queue. If the queue has a size limit, and the insertion causes the queue to grow beyond its size limit, the greatest element will be removed from the queue, which may be the element just added.
peekMin :: IntMinMaxQueue a -> Maybe a Source #
O(log n). Retrieve the least element of the queue, if exists.
peekMax :: IntMinMaxQueue a -> Maybe a Source #
O(log n). Retrieve the greatest element of the queue, if exists.
deleteMin :: IntMinMaxQueue a -> IntMinMaxQueue a Source #
O(log n). Remove the least element of the queue, if exists.
deleteMax :: IntMinMaxQueue a -> IntMinMaxQueue a Source #
O(log n). Remove the greatest element of the queue, if exists.
pollMin :: IntMinMaxQueue a -> Maybe (a, IntMinMaxQueue a) Source #
O(log n). Remove and return the least element of the queue, if exists.
pollMax :: IntMinMaxQueue a -> Maybe (a, IntMinMaxQueue a) Source #
O(log n). Remove and return the greatest element of the queue, if exists.
takeMin :: Int -> IntMinMaxQueue a -> IntMinMaxQueue a Source #
takeMax :: Int -> IntMinMaxQueue a -> IntMinMaxQueue a Source #
dropMin :: Int -> IntMinMaxQueue a -> IntMinMaxQueue a Source #
dropMax :: Int -> IntMinMaxQueue a -> IntMinMaxQueue a Source #
Traversal
Map
map :: (a -> b) -> IntMinMaxQueue a -> IntMinMaxQueue b Source #
Map a function over all elements in the queue.
mapWithPriority :: (Prio -> a -> b) -> IntMinMaxQueue a -> IntMinMaxQueue b Source #
Map a function over all elements in the queue.
Folds
foldr :: (a -> b -> b) -> b -> IntMinMaxQueue a -> b Source #
foldl :: (a -> b -> a) -> a -> IntMinMaxQueue b -> a Source #
foldrWithPriority :: (Prio -> a -> b -> b) -> b -> IntMinMaxQueue a -> b Source #
Fold the elements in the queue using the given right-associative
binary operator, such that
.foldrWithPriority
f z == foldr
(uncurry
f) z . toAscList
foldlWithPriority :: (a -> Prio -> b -> a) -> a -> IntMinMaxQueue b -> a Source #
Fold the elements in the queue using the given left-associative
binary operator, such that
.foldlWithPriority
f z == foldr
(uncurry
. f) z . toAscList
foldMapWithPriority :: Monoid m => (Prio -> a -> m) -> IntMinMaxQueue a -> m Source #
Fold the elements in the queue using the given monoid, such that
.foldMapWithPriority
f == foldMap
(uncurry f) . elems
Strict Folds
foldr' :: (a -> b -> b) -> b -> IntMinMaxQueue a -> b Source #
A strict version of foldr
. Each application of the
operator is evaluated before using the result in the next application.
This function is strict in the starting value.
foldl' :: (a -> b -> a) -> a -> IntMinMaxQueue b -> a Source #
A strict version of foldl
. Each application of the
operator is evaluated before using the result in the next application.
This function is strict in the starting value.
foldrWithPriority' :: (Prio -> a -> b -> b) -> b -> IntMinMaxQueue a -> b Source #
A strict version of foldrWithPriority
. Each application of the
operator is evaluated before using the result in the next application.
This function is strict in the starting value.
foldlWithPriority' :: (a -> Prio -> b -> a) -> a -> IntMinMaxQueue b -> a Source #
A strict version of foldlWithPriority
. Each application of the
operator is evaluated before using the result in the next application.
This function is strict in the starting value.
Lists
elems :: IntMinMaxQueue a -> [a] Source #
Elements in the queue in ascending order of priority. Elements with the same priority are returned in no particular order.
toAscList :: IntMinMaxQueue a -> [(Prio, a)] Source #
Convert the queue to a list in ascending order of priority. Elements with the same priority are returned in no particular order.
toDescList :: IntMinMaxQueue a -> [(Prio, a)] Source #
Convert the queue to a list in descending order of priority. Elements with the same priority are returned in no particular order.