module Control.Concurrent.STM.SSem(SSem, new, wait, signal, tryWait
, waitN, signalN, tryWaitN
, getValue) where
import Control.Monad.STM(STM,retry)
import Control.Concurrent.STM.TVar(newTVar,readTVar,writeTVar)
import Control.Concurrent.STM.SSemInternals(SSem(SSem))
new :: Int -> STM SSem
new :: Int -> STM SSem
new = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap TVar Int -> SSem
SSem forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> STM (TVar a)
newTVar
wait :: SSem -> STM ()
wait :: SSem -> STM ()
wait = forall a b c. (a -> b -> c) -> b -> a -> c
flip SSem -> Int -> STM ()
waitN Int
1
waitN :: SSem -> Int -> STM ()
waitN :: SSem -> Int -> STM ()
waitN (SSem TVar Int
s) Int
i = do
Int
v <- forall a. TVar a -> STM a
readTVar TVar Int
s
if Int
v forall a. Ord a => a -> a -> Bool
>= Int
i
then forall a. TVar a -> a -> STM ()
writeTVar TVar Int
s forall a b. (a -> b) -> a -> b
$! Int
vforall a. Num a => a -> a -> a
-Int
i
else forall a. STM a
retry
signal :: SSem -> STM ()
signal :: SSem -> STM ()
signal = forall a b c. (a -> b -> c) -> b -> a -> c
flip SSem -> Int -> STM ()
signalN Int
1
signalN :: SSem -> Int -> STM ()
signalN :: SSem -> Int -> STM ()
signalN (SSem TVar Int
s) Int
i = do
Int
v <- forall a. TVar a -> STM a
readTVar TVar Int
s
forall a. TVar a -> a -> STM ()
writeTVar TVar Int
s forall a b. (a -> b) -> a -> b
$! Int
vforall a. Num a => a -> a -> a
+Int
i
tryWait :: SSem -> STM (Maybe Int)
tryWait :: SSem -> STM (Maybe Int)
tryWait = forall a b c. (a -> b -> c) -> b -> a -> c
flip SSem -> Int -> STM (Maybe Int)
tryWaitN Int
1
tryWaitN :: SSem -> Int -> STM (Maybe Int)
tryWaitN :: SSem -> Int -> STM (Maybe Int)
tryWaitN (SSem TVar Int
s) Int
i = do
Int
v <- forall a. TVar a -> STM a
readTVar TVar Int
s
if Int
v forall a. Ord a => a -> a -> Bool
>= Int
i
then do forall a. TVar a -> a -> STM ()
writeTVar TVar Int
s forall a b. (a -> b) -> a -> b
$! Int
vforall a. Num a => a -> a -> a
-Int
i
forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just Int
i)
else forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
getValue :: SSem -> STM Int
getValue :: SSem -> STM Int
getValue (SSem TVar Int
s) = forall a. TVar a -> STM a
readTVar TVar Int
s