{-# OPTIONS_GHC -Wall -fwarn-tabs #-}
{-# LANGUAGE CPP, DeriveDataTypeable #-}
#if __GLASGOW_HASKELL__ >= 701
{-# LANGUAGE Safe #-}
#endif
module Control.Concurrent.STM.TMChan
(
TMChan()
, newTMChan
, newTMChanIO
, dupTMChan
, newBroadcastTMChan
, newBroadcastTMChanIO
, readTMChan
, tryReadTMChan
, peekTMChan
, tryPeekTMChan
, writeTMChan
, unGetTMChan
, closeTMChan
, isClosedTMChan
, isEmptyTMChan
) where
import Data.Typeable (Typeable)
#if __GLASGOW_HASKELL__ < 710
import Control.Applicative ((<$>))
#endif
import Control.Monad.STM (STM)
import Control.Concurrent.STM.TVar
import Control.Concurrent.STM.TChan
data TMChan a = TMChan
{-# UNPACK #-} !(TVar Bool)
{-# UNPACK #-} !(TChan a)
deriving Typeable
newTMChan :: STM (TMChan a)
newTMChan :: forall a. STM (TMChan a)
newTMChan = do
TVar Bool
closed <- forall a. a -> STM (TVar a)
newTVar Bool
False
TChan a
chan <- forall a. STM (TChan a)
newTChan
forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. TVar Bool -> TChan a -> TMChan a
TMChan TVar Bool
closed TChan a
chan)
newTMChanIO :: IO (TMChan a)
newTMChanIO :: forall a. IO (TMChan a)
newTMChanIO = do
TVar Bool
closed <- forall a. a -> IO (TVar a)
newTVarIO Bool
False
TChan a
chan <- forall a. IO (TChan a)
newTChanIO
forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. TVar Bool -> TChan a -> TMChan a
TMChan TVar Bool
closed TChan a
chan)
newBroadcastTMChan :: STM (TMChan a)
newBroadcastTMChan :: forall a. STM (TMChan a)
newBroadcastTMChan = do
TVar Bool
closed <- forall a. a -> STM (TVar a)
newTVar Bool
False
TChan a
chan <- forall a. STM (TChan a)
newBroadcastTChan
forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. TVar Bool -> TChan a -> TMChan a
TMChan TVar Bool
closed TChan a
chan)
newBroadcastTMChanIO :: IO (TMChan a)
newBroadcastTMChanIO :: forall a. IO (TMChan a)
newBroadcastTMChanIO = do
TVar Bool
closed <- forall a. a -> IO (TVar a)
newTVarIO Bool
False
TChan a
chan <- forall a. IO (TChan a)
newBroadcastTChanIO
forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. TVar Bool -> TChan a -> TMChan a
TMChan TVar Bool
closed TChan a
chan)
dupTMChan :: TMChan a -> STM (TMChan a)
dupTMChan :: forall a. TMChan a -> STM (TMChan a)
dupTMChan (TMChan TVar Bool
closed TChan a
chan) = do
TChan a
new_chan <- forall a. TChan a -> STM (TChan a)
dupTChan TChan a
chan
forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. TVar Bool -> TChan a -> TMChan a
TMChan TVar Bool
closed TChan a
new_chan)
readTMChan :: TMChan a -> STM (Maybe a)
readTMChan :: forall a. TMChan a -> STM (Maybe a)
readTMChan (TMChan TVar Bool
closed TChan a
chan) = do
Bool
b <- forall a. TVar a -> STM a
readTVar TVar Bool
closed
if Bool
b
then forall a. TChan a -> STM (Maybe a)
tryReadTChan TChan a
chan
else forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. TChan a -> STM a
readTChan TChan a
chan
tryReadTMChan :: TMChan a -> STM (Maybe (Maybe a))
tryReadTMChan :: forall a. TMChan a -> STM (Maybe (Maybe a))
tryReadTMChan (TMChan TVar Bool
closed TChan a
chan) = do
Bool
b <- forall a. TVar a -> STM a
readTVar TVar Bool
closed
if Bool
b
then forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. TChan a -> STM (Maybe a)
tryReadTChan TChan a
chan
else forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. TChan a -> STM (Maybe a)
tryReadTChan TChan a
chan
peekTMChan :: TMChan a -> STM (Maybe a)
peekTMChan :: forall a. TMChan a -> STM (Maybe a)
peekTMChan (TMChan TVar Bool
closed TChan a
chan) = do
Bool
b <- forall a. TVar a -> STM a
readTVar TVar Bool
closed
if Bool
b
then do
Bool
b' <- forall a. TChan a -> STM Bool
isEmptyTChan TChan a
chan
if Bool
b'
then forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
else forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. TChan a -> STM a
peekTChan TChan a
chan
else forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. TChan a -> STM a
peekTChan TChan a
chan
tryPeekTMChan :: TMChan a -> STM (Maybe (Maybe a))
tryPeekTMChan :: forall a. TMChan a -> STM (Maybe (Maybe a))
tryPeekTMChan (TMChan TVar Bool
closed TChan a
chan) = do
Bool
b <- forall a. TVar a -> STM a
readTVar TVar Bool
closed
if Bool
b
then forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. TChan a -> STM (Maybe a)
tryPeekTChan TChan a
chan
else forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. TChan a -> STM (Maybe a)
tryPeekTChan TChan a
chan
writeTMChan :: TMChan a -> a -> STM ()
writeTMChan :: forall a. TMChan a -> a -> STM ()
writeTMChan (TMChan TVar Bool
closed TChan a
chan) a
x = do
Bool
b <- forall a. TVar a -> STM a
readTVar TVar Bool
closed
if Bool
b
then forall (m :: * -> *) a. Monad m => a -> m a
return ()
else forall a. TChan a -> a -> STM ()
writeTChan TChan a
chan a
x
unGetTMChan :: TMChan a -> a -> STM ()
unGetTMChan :: forall a. TMChan a -> a -> STM ()
unGetTMChan (TMChan TVar Bool
closed TChan a
chan) a
x = do
Bool
b <- forall a. TVar a -> STM a
readTVar TVar Bool
closed
if Bool
b
then forall (m :: * -> *) a. Monad m => a -> m a
return ()
else forall a. TChan a -> a -> STM ()
unGetTChan TChan a
chan a
x
closeTMChan :: TMChan a -> STM ()
closeTMChan :: forall a. TMChan a -> STM ()
closeTMChan (TMChan TVar Bool
closed TChan a
_chan) =
forall a. TVar a -> a -> STM ()
writeTVar TVar Bool
closed Bool
True
isClosedTMChan :: TMChan a -> STM Bool
isClosedTMChan :: forall a. TMChan a -> STM Bool
isClosedTMChan (TMChan TVar Bool
closed TChan a
_chan) =
forall a. TVar a -> STM a
readTVar TVar Bool
closed
isEmptyTMChan :: TMChan a -> STM Bool
isEmptyTMChan :: forall a. TMChan a -> STM Bool
isEmptyTMChan (TMChan TVar Bool
_closed TChan a
chan) =
forall a. TChan a -> STM Bool
isEmptyTChan TChan a
chan