----------------------------------------------------------------------------- -- | -- Module : Control.Monad.Queue.Class -- Copyright : (c) Leon P Smith 2009 -- License : BSD3 -- -- Maintainer : leon at melding-monads dot com -- Stability : experimental -- Portability : portable -- ----------------------------------------------------------------------------- {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FunctionalDependencies #-} 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 (n-1) return (e:es))