{-# 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