{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}
-----------------------------------------------------------------------------
-- |
-- Module : Control.Monad.Queue.Class
-- Copyright : (c) Leon P Smith 2009
-- License : BSD3
--
-- Maintainer : leon at melding-monads dot com
-- Stability : experimental
-- Portability : portable
--
-----------------------------------------------------------------------------
module Control.Monad.Queue.Class where
import Control.Monad.Queue.Util
import qualified Control.Monad.Queue.Allison as Allison
import qualified Control.Monad.Queue.Corec as Corec
class Monad q => MonadQueue e q | q -> e where
-- | Enqueue an element to a queue
enQ :: e -> q ()
-- | Dequeue an element, returns 'Nothing' if the queue is empty.
deQ :: q (Maybe e)
-- | Dequeue up to @maxlen@ elements.
deQs :: Integral maxlen => maxlen -> q [e]
-- | Examines the front element of the queue without removing it.
peekQ :: q (Maybe e)
-- | Examines up to @maxlen@ elements of the queue without removing them.
peekQs :: Integral maxlen => maxlen -> q [e]
-- | Examines the element currently at position @index@, indexing starts at @0@.
peekQn :: Integral index => index -> q (Maybe e)
-- | Returns the current length of the queue
lenQ :: Integral len => q len
deQ = do
es <- deQs (1 :: LenType)
case es of
[] -> return Nothing
(e:_) -> return (Just e)
deQs n
| n <= 0 = return []
| otherwise = deQ >>= maybe (return [])
(\e -> do
es <- deQs (n-1)
return (e:es))
instance MonadQueue e (Allison.Q e) where
enQ = Allison.enQ
peekQ = Allison.peekQ
peekQs = Allison.peekQs
peekQn = Allison.peekQn
deQ = Allison.deQ
deQs = Allison.deQs
lenQ = Allison.lenQ
instance MonadQueue e (Corec.Q w e) where
enQ = Corec.enQ
peekQ = Corec.peekQ
peekQs = Corec.peekQs
peekQn = Corec.peekQn
deQ = Corec.deQ
deQs = Corec.deQs
lenQ = Corec.lenQ