{-# LANGUAGE MultiParamTypeClasses, TypeFamilies #-} module Data.MQueue.Class where -- import Data.MQueue.MonadHelpers -- import Control.Monad.Maybe 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 -- getSize :: q -> m Int -- combine :: q -> q -> m () {-# INLINE pushAll #-} 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