{-# LANGUAGE UnicodeSyntax #-}
{-# LANGUAGE FlexibleContexts #-}

-- | Lifted 'STM.TVar' operations.
module Control.Concurrent.STM.TVar.Lifted
  ( TVar
  , newTVar
  , newTVarIO
  , readTVar
  , readTVarIO
  , writeTVar
  , modifyTVar
  , modifyTVar'
  , swapTVar
  , registerDelay
  , mkWeakTVar
  ) where

import Control.Monad.Base (MonadBase(..))
import Control.Monad.STM (STM)
import Control.Concurrent.STM.TVar (TVar)
import qualified Control.Concurrent.STM.TVar as STM
import System.Mem.Weak (Weak)

-- | A lifted version of 'STM.newTVar'.
newTVar  MonadBase STM μ  α  μ (TVar α)
newTVar = liftBase . STM.newTVar
{-# INLINE newTVar #-}

-- | A lifted version of 'STM.newTVarIO'.
newTVarIO  MonadBase IO μ  α  μ (TVar α)
newTVarIO = liftBase . STM.newTVarIO
{-# INLINE newTVarIO #-}

-- | A lifted version of 'STM.readTVar'.
readTVar  MonadBase STM μ  TVar α  μ α
readTVar = liftBase . STM.readTVar
{-# INLINE readTVar #-}

-- | A lifted version of 'STM.readTVarIO'.
readTVarIO  MonadBase IO μ  TVar α  μ α
readTVarIO = liftBase . STM.readTVarIO
{-# INLINE readTVarIO #-}

-- | A lifted version of 'STM.writeTVar'.
writeTVar  MonadBase STM μ  TVar α  α  μ ()
writeTVar = (liftBase .) . STM.writeTVar
{-# INLINE writeTVar #-}

-- | A lifted version of 'STM.modifyTVar'.
modifyTVar  MonadBase STM μ  TVar α  (α  α)  μ ()
modifyTVar = (liftBase .) . STM.modifyTVar
{-# INLINE modifyTVar #-}

-- | A lifted version of 'STM.modifyTVar''.
modifyTVar'  MonadBase STM μ  TVar α  (α  α)  μ ()
modifyTVar' = (liftBase .) . STM.modifyTVar'
{-# INLINE modifyTVar' #-}

-- | A lifted version of 'STM.swapTVar'.
swapTVar  MonadBase STM μ  TVar α  α  μ α
swapTVar = (liftBase .) . STM.swapTVar
{-# INLINE swapTVar #-}

-- | A lifted version of 'STM.registerDelay'.
registerDelay  MonadBase IO μ  Int  μ (TVar Bool)
registerDelay = liftBase . STM.registerDelay
{-# INLINE registerDelay #-}

-- | A lifted version of 'STM.mkWeakTVar'.
mkWeakTVar  MonadBase IO μ  TVar α  IO ()  μ (Weak (TVar α))
mkWeakTVar = (liftBase .) . STM.mkWeakTVar
{-# INLINE mkWeakTVar #-}