module Control.Monad.Queue.Class where
import Control.Monad.Queue.Util
class Monad q => MonadQueue e q | q -> e where
enQ :: e -> q ()
peekQ :: q (Maybe e)
peekQs :: Integral maxlen => maxlen -> q [e]
peekQn :: Integral index => index -> q (Maybe e)
deQ :: q (Maybe e)
deQs :: Integral maxlen => maxlen -> q [e]
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 (n1)
return (e:es))