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