module Effects.Concurrent.STM
(
STM,
MonadSTM (..),
TVar,
newTVarA,
readTVarA,
writeTVarA,
modifyTVarA',
TBQueue,
newTBQueueA,
readTBQueueA,
tryReadTBQueueA,
writeTBQueueA,
flushTBQueueA,
Natural,
)
where
import Control.Concurrent.STM (STM)
import Control.Concurrent.STM qualified as STM
import Control.Concurrent.STM.TBQueue (TBQueue)
import Control.Concurrent.STM.TBQueue qualified as TBQueue
import Control.Concurrent.STM.TVar (TVar)
import Control.Concurrent.STM.TVar qualified as TVar
import Control.Monad.Trans.Class (MonadTrans (lift))
import Control.Monad.Trans.Reader (ReaderT)
import GHC.Stack (HasCallStack)
import Numeric.Natural (Natural)
class (Monad m) => MonadSTM m where
atomically :: (HasCallStack) => STM a -> m a
instance MonadSTM IO where
atomically :: forall a. HasCallStack => STM a -> IO a
atomically = STM a -> IO a
forall a. STM a -> IO a
STM.atomically
{-# INLINEABLE atomically #-}
instance (MonadSTM m) => MonadSTM (ReaderT e m) where
atomically :: forall a. HasCallStack => STM a -> ReaderT e m a
atomically = m a -> ReaderT e m a
forall (m :: * -> *) a. Monad m => m a -> ReaderT e m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> ReaderT e m a) -> (STM a -> m a) -> STM a -> ReaderT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. STM a -> m a
forall a. HasCallStack => STM a -> m a
forall (m :: * -> *) a. (MonadSTM m, HasCallStack) => STM a -> m a
atomically
{-# INLINEABLE atomically #-}
newTVarA :: (HasCallStack, MonadSTM m) => a -> m (TVar a)
newTVarA :: forall (m :: * -> *) a.
(HasCallStack, MonadSTM m) =>
a -> m (TVar a)
newTVarA = STM (TVar a) -> m (TVar a)
forall a. HasCallStack => STM a -> m a
forall (m :: * -> *) a. (MonadSTM m, HasCallStack) => STM a -> m a
atomically (STM (TVar a) -> m (TVar a))
-> (a -> STM (TVar a)) -> a -> m (TVar a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> STM (TVar a)
forall a. a -> STM (TVar a)
TVar.newTVar
{-# INLINEABLE newTVarA #-}
readTVarA :: (HasCallStack, MonadSTM m) => TVar a -> m a
readTVarA :: forall (m :: * -> *) a. (HasCallStack, MonadSTM m) => TVar a -> m a
readTVarA = STM a -> m a
forall a. HasCallStack => STM a -> m a
forall (m :: * -> *) a. (MonadSTM m, HasCallStack) => STM a -> m a
atomically (STM a -> m a) -> (TVar a -> STM a) -> TVar a -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TVar a -> STM a
forall a. TVar a -> STM a
TVar.readTVar
{-# INLINEABLE readTVarA #-}
writeTVarA :: (HasCallStack, MonadSTM m) => TVar a -> a -> m ()
writeTVarA :: forall (m :: * -> *) a.
(HasCallStack, MonadSTM m) =>
TVar a -> a -> m ()
writeTVarA TVar a
r = STM () -> m ()
forall a. HasCallStack => STM a -> m a
forall (m :: * -> *) a. (MonadSTM m, HasCallStack) => STM a -> m a
atomically (STM () -> m ()) -> (a -> STM ()) -> a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TVar a -> a -> STM ()
forall a. TVar a -> a -> STM ()
TVar.writeTVar TVar a
r
{-# INLINEABLE writeTVarA #-}
modifyTVarA' :: (HasCallStack, MonadSTM m) => TVar a -> (a -> a) -> m ()
modifyTVarA' :: forall (m :: * -> *) a.
(HasCallStack, MonadSTM m) =>
TVar a -> (a -> a) -> m ()
modifyTVarA' TVar a
r = STM () -> m ()
forall a. HasCallStack => STM a -> m a
forall (m :: * -> *) a. (MonadSTM m, HasCallStack) => STM a -> m a
atomically (STM () -> m ()) -> ((a -> a) -> STM ()) -> (a -> a) -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TVar a -> (a -> a) -> STM ()
forall a. TVar a -> (a -> a) -> STM ()
TVar.modifyTVar' TVar a
r
{-# INLINEABLE modifyTVarA' #-}
newTBQueueA ::
(HasCallStack, MonadSTM m) =>
Natural ->
m (TBQueue a)
newTBQueueA :: forall (m :: * -> *) a.
(HasCallStack, MonadSTM m) =>
Natural -> m (TBQueue a)
newTBQueueA = STM (TBQueue a) -> m (TBQueue a)
forall a. HasCallStack => STM a -> m a
forall (m :: * -> *) a. (MonadSTM m, HasCallStack) => STM a -> m a
atomically (STM (TBQueue a) -> m (TBQueue a))
-> (Natural -> STM (TBQueue a)) -> Natural -> m (TBQueue a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Natural -> STM (TBQueue a)
forall a. Natural -> STM (TBQueue a)
TBQueue.newTBQueue
{-# INLINEABLE newTBQueueA #-}
readTBQueueA :: (HasCallStack, MonadSTM m) => TBQueue a -> m a
readTBQueueA :: forall (m :: * -> *) a.
(HasCallStack, MonadSTM m) =>
TBQueue a -> m a
readTBQueueA = STM a -> m a
forall a. HasCallStack => STM a -> m a
forall (m :: * -> *) a. (MonadSTM m, HasCallStack) => STM a -> m a
atomically (STM a -> m a) -> (TBQueue a -> STM a) -> TBQueue a -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TBQueue a -> STM a
forall a. TBQueue a -> STM a
TBQueue.readTBQueue
{-# INLINEABLE readTBQueueA #-}
tryReadTBQueueA :: (HasCallStack, MonadSTM m) => TBQueue a -> m (Maybe a)
tryReadTBQueueA :: forall (m :: * -> *) a.
(HasCallStack, MonadSTM m) =>
TBQueue a -> m (Maybe a)
tryReadTBQueueA = STM (Maybe a) -> m (Maybe a)
forall a. HasCallStack => STM a -> m a
forall (m :: * -> *) a. (MonadSTM m, HasCallStack) => STM a -> m a
atomically (STM (Maybe a) -> m (Maybe a))
-> (TBQueue a -> STM (Maybe a)) -> TBQueue a -> m (Maybe a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TBQueue a -> STM (Maybe a)
forall a. TBQueue a -> STM (Maybe a)
TBQueue.tryReadTBQueue
{-# INLINEABLE tryReadTBQueueA #-}
writeTBQueueA :: (HasCallStack, MonadSTM m) => TBQueue a -> a -> m ()
writeTBQueueA :: forall (m :: * -> *) a.
(HasCallStack, MonadSTM m) =>
TBQueue a -> a -> m ()
writeTBQueueA TBQueue a
q = STM () -> m ()
forall a. HasCallStack => STM a -> m a
forall (m :: * -> *) a. (MonadSTM m, HasCallStack) => STM a -> m a
atomically (STM () -> m ()) -> (a -> STM ()) -> a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TBQueue a -> a -> STM ()
forall a. TBQueue a -> a -> STM ()
TBQueue.writeTBQueue TBQueue a
q
{-# INLINEABLE writeTBQueueA #-}
flushTBQueueA :: (HasCallStack, MonadSTM m) => TBQueue a -> m [a]
flushTBQueueA :: forall (m :: * -> *) a.
(HasCallStack, MonadSTM m) =>
TBQueue a -> m [a]
flushTBQueueA = STM [a] -> m [a]
forall a. HasCallStack => STM a -> m a
forall (m :: * -> *) a. (MonadSTM m, HasCallStack) => STM a -> m a
atomically (STM [a] -> m [a]) -> (TBQueue a -> STM [a]) -> TBQueue a -> m [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TBQueue a -> STM [a]
forall a. TBQueue a -> STM [a]
TBQueue.flushTBQueue
{-# INLINEABLE flushTBQueueA #-}