module Data.AVar.Unsafe (
AVar,
Result(..),
getAVar,
putAVar,
modAVar,
modAVar',
justModAVar,
condModAVar,
swapAVar,
newAVar) where
import Data.AVar.Internal
import Control.Concurrent
import Control.Concurrent.MVar
import Control.Concurrent.Chan
import qualified Control.Exception as E
data Result = OK
getAVar :: AVar a -> IO a
getAVar (AVar chan) = do
res <- newEmptyMVar
writeChan chan (Get res)
takeMVar res
putAVar :: AVar a -> a -> IO ()
putAVar (AVar chan) x = writeChan chan (Put x)
modAVar :: AVar a -> (a -> a) -> IO ()
modAVar (AVar chan) f = do
res <- newEmptyMVar
writeChan chan (Mod f res)
r <- takeMVar res
case r of
Nothing -> return ()
Just e -> E.throw e
modAVar' :: AVar a -> (a -> (a,b)) -> IO b
modAVar' (AVar chan) f = do
res <- newEmptyMVar
writeChan chan (Mod' f res)
r <- takeMVar res
case r of
Right b -> return b
Left e -> E.throw e
justModAVar :: AVar a -> (a -> a) -> IO ()
justModAVar (AVar chan) f = writeChan chan (JustMod f)
condModAVar :: AVar a
-> (a -> Bool)
-> (a -> a)
-> (a -> a)
-> IO Bool
condModAVar (AVar chan) p t f = do
res <- newEmptyMVar
writeChan chan (Atom p t f res)
r <- takeMVar res
case r of
Right x -> return x
Left e -> E.throw e
swapAVar :: (AVar a) -> a -> IO a
swapAVar (AVar chan) new = do
res <- newEmptyMVar
writeChan chan (Mod' (\old -> (new, old)) res)
r <- takeMVar res
case r of
Right a -> return a
Left e -> E.throw e