module Control.Concurrent.SSem( SSem,new
, withSem,wait,signal,tryWait
, withSemN,waitN,signalN,tryWaitN
, getValue) where
import Control.Concurrent.STM.SSemInternals(SSem(SSem))
import qualified Control.Concurrent.STM.SSem as S(wait,signal,tryWait,waitN,signalN,tryWaitN,getValue)
import Control.Concurrent.STM.TVar(newTVarIO)
import Control.Exception(bracket_)
import Control.Monad.STM(atomically)
new :: Int -> IO SSem
new :: Int -> IO SSem
new = (TVar Int -> SSem) -> IO (TVar Int) -> IO SSem
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap TVar Int -> SSem
SSem (IO (TVar Int) -> IO SSem)
-> (Int -> IO (TVar Int)) -> Int -> IO SSem
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> IO (TVar Int)
forall a. a -> IO (TVar a)
newTVarIO
withSem :: SSem -> IO a -> IO a
withSem :: forall a. SSem -> IO a -> IO a
withSem SSem
s = IO () -> IO () -> IO a -> IO a
forall a b c. IO a -> IO b -> IO c -> IO c
bracket_ (SSem -> IO ()
wait SSem
s) (SSem -> IO ()
signal SSem
s)
withSemN :: SSem -> Int -> IO a -> IO a
withSemN :: forall a. SSem -> Int -> IO a -> IO a
withSemN SSem
s Int
i = IO () -> IO () -> IO a -> IO a
forall a b c. IO a -> IO b -> IO c -> IO c
bracket_ (SSem -> Int -> IO ()
waitN SSem
s Int
i) (SSem -> Int -> IO ()
signalN SSem
s Int
i)
wait :: SSem -> IO ()
wait :: SSem -> IO ()
wait = STM () -> IO ()
forall a. STM a -> IO a
atomically (STM () -> IO ()) -> (SSem -> STM ()) -> SSem -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SSem -> STM ()
S.wait
waitN :: SSem -> Int-> IO ()
waitN :: SSem -> Int -> IO ()
waitN SSem
s Int
i = STM () -> IO ()
forall a. STM a -> IO a
atomically (SSem -> Int -> STM ()
S.waitN SSem
s Int
i)
signal :: SSem -> IO ()
signal :: SSem -> IO ()
signal = STM () -> IO ()
forall a. STM a -> IO a
atomically (STM () -> IO ()) -> (SSem -> STM ()) -> SSem -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SSem -> STM ()
S.signal
signalN :: SSem-> Int -> IO ()
signalN :: SSem -> Int -> IO ()
signalN SSem
s Int
i = STM () -> IO ()
forall a. STM a -> IO a
atomically (SSem -> Int -> STM ()
S.signalN SSem
s Int
i)
tryWait :: SSem -> IO (Maybe Int)
tryWait :: SSem -> IO (Maybe Int)
tryWait = STM (Maybe Int) -> IO (Maybe Int)
forall a. STM a -> IO a
atomically (STM (Maybe Int) -> IO (Maybe Int))
-> (SSem -> STM (Maybe Int)) -> SSem -> IO (Maybe Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SSem -> STM (Maybe Int)
S.tryWait
tryWaitN :: SSem -> Int -> IO (Maybe Int)
tryWaitN :: SSem -> Int -> IO (Maybe Int)
tryWaitN SSem
s Int
i = STM (Maybe Int) -> IO (Maybe Int)
forall a. STM a -> IO a
atomically (SSem -> Int -> STM (Maybe Int)
S.tryWaitN SSem
s Int
i)
getValue :: SSem -> IO Int
getValue :: SSem -> IO Int
getValue = STM Int -> IO Int
forall a. STM a -> IO a
atomically (STM Int -> IO Int) -> (SSem -> STM Int) -> SSem -> IO Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SSem -> STM Int
S.getValue