module Control.Concurrent.STM.TChan.Lifted
    ( module All
	, newTChanIO
	, newBroadcastTChanIO
    , dupTChanIO
	, readTChanIO
	, tryReadTChanIO
	, peekTChanIO
	, tryPeekTChanIO
	, writeTChanIO
    , unGetTChanIO
    , isEmptyTChanIO
    , cloneTChanIO
    ) where


import Control.Concurrent.STM.TChan as All
    hiding (newTChanIO, newBroadcastTChanIO)
import qualified Control.Concurrent.STM.TChan as STM
import Internal

newTChanIO :: MonadIO m => m (TChan a)
newTChanIO = liftIO STM.newTChanIO

newBroadcastTChanIO :: MonadIO m => m (TChan a)
newBroadcastTChanIO = liftIO STM.newBroadcastTChanIO

dupTChanIO :: MonadIO m => TChan a -> m (TChan a)
dupTChanIO = atomically . dupTChan

readTChanIO :: MonadIO m => TChan a -> m a
readTChanIO = atomically . readTChan

tryReadTChanIO :: MonadIO m => TChan a -> m (Maybe a)
tryReadTChanIO = atomically . tryReadTChan

peekTChanIO :: MonadIO m => TChan a -> m a
peekTChanIO = atomically . peekTChan

tryPeekTChanIO :: MonadIO m => TChan a -> m (Maybe a)
tryPeekTChanIO = atomically . tryPeekTChan

writeTChanIO :: MonadIO m => TChan a -> a -> m ()
writeTChanIO = atomically .: writeTChan

unGetTChanIO :: MonadIO m => TChan a -> a -> m ()
unGetTChanIO = atomically .: unGetTChan

isEmptyTChanIO :: MonadIO m => TChan a -> m Bool
isEmptyTChanIO = atomically . isEmptyTChan

cloneTChanIO :: MonadIO m => TChan a -> m (TChan a)
cloneTChanIO = atomically . cloneTChan