{-# LANGUAGE FlexibleInstances #-} module Control.MonadSTM where import Control.Concurrent.STM (STM, atomically) import Control.Monad.Trans (MonadTrans (..)) -- | Like `MonadIO` but for `STM` monad -- `MonadBase` seemed too cumbersome for this. class MonadSTM m where liftSTM :: STM a -> m a instance MonadSTM IO where liftSTM = atomically instance (MonadTrans t, Monad m, MonadSTM m) => MonadSTM (t m) where liftSTM = lift . liftSTM