{-# 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 :: forall (μ :: * -> *) α. MonadBase STM μ => α -> μ (TVar α)
newTVar = forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> STM (TVar a)
STM.newTVar
{-# INLINE newTVar #-}

-- | A lifted version of 'STM.newTVarIO'.
newTVarIO  MonadBase IO μ  α  μ (TVar α)
newTVarIO :: forall (μ :: * -> *) α. MonadBase IO μ => α -> μ (TVar α)
newTVarIO = forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> IO (TVar a)
STM.newTVarIO
{-# INLINE newTVarIO #-}

-- | A lifted version of 'STM.readTVar'.
readTVar  MonadBase STM μ  TVar α  μ α
readTVar :: forall (μ :: * -> *) α. MonadBase STM μ => TVar α -> μ α
readTVar = forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. TVar a -> STM a
STM.readTVar
{-# INLINE readTVar #-}

-- | A lifted version of 'STM.readTVarIO'.
readTVarIO  MonadBase IO μ  TVar α  μ α
readTVarIO :: forall (μ :: * -> *) α. MonadBase IO μ => TVar α -> μ α
readTVarIO = forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. TVar a -> IO a
STM.readTVarIO
{-# INLINE readTVarIO #-}

-- | A lifted version of 'STM.writeTVar'.
writeTVar  MonadBase STM μ  TVar α  α  μ ()
writeTVar :: forall (μ :: * -> *) α. MonadBase STM μ => TVar α -> α -> μ ()
writeTVar = (forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase forall b c a. (b -> c) -> (a -> b) -> a -> c
.) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. TVar a -> a -> STM ()
STM.writeTVar
{-# INLINE writeTVar #-}

-- | A lifted version of 'STM.modifyTVar'.
modifyTVar  MonadBase STM μ  TVar α  (α  α)  μ ()
modifyTVar :: forall (μ :: * -> *) α.
MonadBase STM μ =>
TVar α -> (α -> α) -> μ ()
modifyTVar = (forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase forall b c a. (b -> c) -> (a -> b) -> a -> c
.) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. TVar a -> (a -> a) -> STM ()
STM.modifyTVar
{-# INLINE modifyTVar #-}

-- | A lifted version of 'STM.modifyTVar''.
modifyTVar'  MonadBase STM μ  TVar α  (α  α)  μ ()
modifyTVar' :: forall (μ :: * -> *) α.
MonadBase STM μ =>
TVar α -> (α -> α) -> μ ()
modifyTVar' = (forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase forall b c a. (b -> c) -> (a -> b) -> a -> c
.) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. TVar a -> (a -> a) -> STM ()
STM.modifyTVar'
{-# INLINE modifyTVar' #-}

-- | A lifted version of 'STM.swapTVar'.
swapTVar  MonadBase STM μ  TVar α  α  μ α
swapTVar :: forall (μ :: * -> *) α. MonadBase STM μ => TVar α -> α -> μ α
swapTVar = (forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase forall b c a. (b -> c) -> (a -> b) -> a -> c
.) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. TVar a -> a -> STM a
STM.swapTVar
{-# INLINE swapTVar #-}

-- | A lifted version of 'STM.registerDelay'.
registerDelay  MonadBase IO μ  Int  μ (TVar Bool)
registerDelay :: forall (μ :: * -> *). MonadBase IO μ => Int -> μ (TVar Bool)
registerDelay = forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> IO (TVar Bool)
STM.registerDelay
{-# INLINE registerDelay #-}

-- | A lifted version of 'STM.mkWeakTVar'.
mkWeakTVar  MonadBase IO μ  TVar α  IO ()  μ (Weak (TVar α))
mkWeakTVar :: forall (μ :: * -> *) α.
MonadBase IO μ =>
TVar α -> IO () -> μ (Weak (TVar α))
mkWeakTVar = (forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase forall b c a. (b -> c) -> (a -> b) -> a -> c
.) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. TVar a -> IO () -> IO (Weak (TVar a))
STM.mkWeakTVar
{-# INLINE mkWeakTVar #-}