-----------------------------------------------------------------------------
-- |
-- 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))