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

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

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

-- | A lifted version of 'STM.signalTSemN'.
signalTSemN  MonadBase STM μ  Natural  TSem  μ ()
signalTSemN :: forall (μ :: * -> *). MonadBase STM μ => Natural -> TSem -> μ ()
signalTSemN = (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
. Natural -> TSem -> STM ()
STM.signalTSemN
{-# INLINE signalTSemN #-}