{-| Module : Parsley.Internal.Common.QueueLike Description : Operations to work with Queue-like things. License : BSD-3-Clause Maintainer : Jamie Willis Stability : experimental Exposes the core shared operations of queue implementations. @since 1.5.0.0 -} module Parsley.Internal.Common.QueueLike (module Parsley.Internal.Common.QueueLike) where {-| Operations on a queue-like structure @q@. These operations should be efficient, with amortized constant complexity for all of them except `enqueueAll`. @since 1.5.0.0 -} class QueueLike q where {-| Construct an empty queue. @since 1.5.0.0 -} empty :: q a {-| Is the queue empty? @since 1.5.0.0 -} null :: q a -> Bool {-| Returns how many elements are in the queue. @since 1.5.0.0 -} size :: q a -> Int {-| Adds an element onto the end of the queue. @since 1.5.0.0 -} enqueue :: a -> q a -> q a {-| Removes an element from the front of the queue. @since 1.5.0.0 -} dequeue :: q a -> (a, q a) {-| modifies the head of the queue, without removal. Returns the old head @since 2.1.0.0 -} poke :: (a -> a) -> q a -> (a, q a) {-| Adds each of the elements onto the queue, from left-to-right. @since 1.5.0.0 -} enqueueAll :: [a] -> q a -> q a