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
newQSemN :: MonadIO m => Int -> m QSemN
newQSemN :: Int -> m QSemN
newQSemN = IO QSemN -> m QSemN
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO QSemN -> m QSemN) -> (Int -> IO QSemN) -> Int -> m QSemN
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> IO QSemN
Q.newQSemN
waitQSemN :: MonadIO m => QSemN -> Int -> m ()
waitQSemN :: QSemN -> Int -> m ()
waitQSemN QSemN
x = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> (Int -> IO ()) -> Int -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. QSemN -> Int -> IO ()
Q.waitQSemN QSemN
x
signalQSemN :: MonadIO m => QSemN -> Int -> m ()
signalQSemN :: QSemN -> Int -> m ()
signalQSemN QSemN
x = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> (Int -> IO ()) -> Int -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. QSemN -> Int -> IO ()
Q.signalQSemN QSemN
x
{-# INLINE withQSemN #-}
withQSemN :: MonadUnliftIO m => QSemN -> Int -> m a -> m a
withQSemN :: QSemN -> Int -> m a -> m a
withQSemN QSemN
x Int
n m a
io = ((forall a. m a -> IO a) -> IO a) -> m a
forall (m :: * -> *) b.
MonadUnliftIO m =>
((forall a. m a -> IO a) -> IO b) -> m b
withRunInIO (((forall a. m a -> IO a) -> IO a) -> m a)
-> ((forall a. m a -> IO a) -> IO a) -> m a
forall a b. (a -> b) -> a -> b
$ \forall a. m a -> IO a
run ->
IO () -> IO () -> IO a -> IO a
forall (m :: * -> *) a b c.
MonadUnliftIO m =>
m a -> m b -> m c -> m c
bracket_ (QSemN -> Int -> IO ()
forall (m :: * -> *). MonadIO m => QSemN -> Int -> m ()
waitQSemN QSemN
x Int
n) (QSemN -> Int -> IO ()
forall (m :: * -> *). MonadIO m => QSemN -> Int -> m ()
signalQSemN QSemN
x Int
n) (m a -> IO a
forall a. m a -> IO a
run m a
io)