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

-- | Lifted 'STM.TMVar' operations.
module Control.Concurrent.STM.TMVar.Lifted
  ( TMVar
  , newTMVar
  , newEmptyTMVar
  , newTMVarIO
  , newEmptyTMVarIO
  , takeTMVar
  , tryTakeTMVar
  , putTMVar
  , tryPutTMVar
  , readTMVar
  , tryReadTMVar
  , swapTMVar
  , isEmptyTMVar
  , mkWeakTMVar
  ) where

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

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

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

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

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

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

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

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

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

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

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

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

-- | A lifted version of 'STM.isEmptyTMVar'.
isEmptyTMVar  MonadBase STM μ  TMVar α  μ Bool
isEmptyTMVar = liftBase . STM.isEmptyTMVar
{-# INLINE isEmptyTMVar #-}

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