module ConIO.MonadSTM (MonadSTM (..)) where
import Control.Concurrent.STM
import Control.Monad.Trans.Class
class (Monad m) => MonadSTM m where
liftSTM :: STM a -> m a
liftSTM_IO :: STM a -> IO a -> m a
liftSTM_IO STM a
stm IO a
_ = STM a -> m a
forall a. STM a -> m a
forall (m :: * -> *) a. MonadSTM m => STM a -> m a
liftSTM STM a
stm
instance MonadSTM STM where
liftSTM :: forall a. STM a -> STM a
liftSTM = STM a -> STM a
forall a. a -> a
id
instance MonadSTM IO where
liftSTM :: forall a. STM a -> IO a
liftSTM = STM a -> IO a
forall a. STM a -> IO a
atomically
liftSTM_IO :: forall a. STM a -> IO a -> IO a
liftSTM_IO STM a
_ IO a
io = IO a
io
instance (MonadSTM m, MonadTrans t) => MonadSTM (t m) where
liftSTM :: forall a. STM a -> t m a
liftSTM = m a -> t m a
forall (m :: * -> *) a. Monad m => m a -> t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> t m a) -> (STM a -> m a) -> STM a -> t m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. STM a -> m a
forall a. STM a -> m a
forall (m :: * -> *) a. MonadSTM m => STM a -> m a
liftSTM
liftSTM_IO :: forall a. STM a -> IO a -> t m a
liftSTM_IO STM a
stm IO a
io = m a -> t m a
forall (m :: * -> *) a. Monad m => m a -> t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> t m a) -> m a -> t m a
forall a b. (a -> b) -> a -> b
$ STM a -> IO a -> m a
forall a. STM a -> IO a -> m a
forall (m :: * -> *) a. MonadSTM m => STM a -> IO a -> m a
liftSTM_IO STM a
stm IO a
io