unliftio-0.2.25.1: src/UnliftIO/QSemN.hs
-- | Unlifted "Control.Concurrent.QSemN".
--
-- @since 0.2.14
module UnliftIO.QSemN
( QSemN
, newQSemN
, waitQSemN
, signalQSemN
, withQSemN
) where
import Control.Concurrent.QSemN (QSemN)
import Control.Monad.IO.Unlift
import UnliftIO.Exception
import qualified Control.Concurrent.QSemN as Q
-- | Lifted 'Q.newQSemN'.
--
-- @since 0.2.14
newQSemN :: MonadIO m => Int -> m QSemN
newQSemN = liftIO . Q.newQSemN
-- | Lifted 'Q.waitQSemN'.
--
-- @since 0.2.14
waitQSemN :: MonadIO m => QSemN -> Int -> m ()
waitQSemN x = liftIO . Q.waitQSemN x
-- | Lifted 'Q.signalQSemN'.
--
-- @since 0.2.14
signalQSemN :: MonadIO m => QSemN -> Int -> m ()
signalQSemN x = liftIO . Q.signalQSemN x
-- | 'withQSemN' is an exception-safe wrapper for performing the
-- provided operation while holding N unit of value from the semaphore.
-- It ensures the semaphore cannot be leaked if there are exceptions.
--
-- @since 0.2.14
{-# INLINE withQSemN #-}
withQSemN :: MonadUnliftIO m => QSemN -> Int -> m a -> m a
withQSemN x n io = withRunInIO $ \run ->
bracket_ (waitQSemN x n) (signalQSemN x n) (run io)