queuelike-1.0.0: Data/MQueue/Class.hs
{-# 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