{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances #-}
module Data.Concurrent.Queue (TakeQueue(..), PutQueue(..), Take, Put, TakePut, DMVar, newDMVar, newEmptyDMVar) where
import Control.Concurrent
import Control.Concurrent.STM
import Control.Applicative
class TakeQueue q m | q -> m where
take :: q a -> m a
class PutQueue q m | q -> m where
put :: q a -> a -> m ()
instance TakeQueue MVar IO where
take = takeMVar
instance PutQueue MVar IO where
put = putMVar
instance TakeQueue Chan IO where
take = readChan
instance PutQueue Chan IO where
put = writeChan
instance TakeQueue TMVar STM where
take = takeTMVar
instance PutQueue TMVar STM where
put = putTMVar
instance TakeQueue TChan STM where
take = readTChan
instance PutQueue TChan STM where
put = writeTChan
newtype Take = Take Take
newtype Put = Put Put
newtype TakePut = TakePut TakePut
newtype DMVar d a = DMVar (MVar a)
newDMVar :: a -> IO (DMVar d a)
newDMVar a = DMVar <$> newMVar a
newEmptyDMVar :: IO (DMVar d a)
newEmptyDMVar = DMVar <$> newEmptyMVar
takeDMVar :: DMVar d a -> IO a
takeDMVar (DMVar x) = takeMVar x
putDMVar :: DMVar d a -> a -> IO ()
putDMVar (DMVar x) a = putMVar x a
instance TakeQueue (DMVar TakePut) IO where
take = takeDMVar
instance PutQueue (DMVar TakePut) IO where
put = putDMVar
instance TakeQueue (DMVar Take) IO where
take = takeDMVar
instance PutQueue (DMVar Put) IO where
put = putDMVar