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

-- | Lifted 'STM.TSem' operations.
module Control.Concurrent.STM.TSem.Lifted
  ( TSem
  , newTSem
  , waitTSem
  , signalTSem
  , signalTSemN
  ) where

import Numeric.Natural (Natural)
import Control.Monad.Base (MonadBase(..))
import Control.Monad.STM (STM)
import Control.Concurrent.STM.TSem (TSem)
import qualified Control.Concurrent.STM.TSem as STM

-- | A lifted version of 'STM.newTSem'.
newTSem  MonadBase STM μ  Integer  μ TSem
newTSem = liftBase . STM.newTSem
{-# INLINE newTSem #-}

-- | A lifted version of 'STM.waitTSem'.
waitTSem  MonadBase STM μ  TSem  μ ()
waitTSem = liftBase . STM.waitTSem
{-# INLINE waitTSem #-}

-- | A lifted version of 'STM.signalTSem'.
signalTSem  MonadBase STM μ  TSem  μ ()
signalTSem = liftBase . STM.signalTSem
{-# INLINE signalTSem #-}

-- | A lifted version of 'STM.signalTSemN'.
signalTSemN  MonadBase STM μ  Natural  TSem  μ ()
signalTSemN = (liftBase .) . STM.signalTSemN
{-# INLINE signalTSemN #-}