{-# 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 #-}