module Data.MQueue.Class where
import Control.Monad.Trans
import Control.Monad
import Data.Maybe
class Monad m => MQueue q m where
type MQueueKey q :: *
newQueue :: m q
push :: q -> MQueueKey q -> m ()
pushAll :: q -> [MQueueKey q] -> m ()
pop :: q -> m (Maybe (MQueueKey q))
pop_ :: q -> m ()
peek :: q -> m (Maybe (MQueueKey q))
isEmpty :: q -> m Bool
pushAll = mapM_ . push
pop q = peek q >>= maybe (return Nothing) (\ key -> pop_ q >> return (Just key))
pop_ q = pop q >> return ()
isEmpty = liftM isNothing . peek