module MonadVar.Default
( defaultLockUnsafeWrite
, defaultReadWriteSwap
, defaultLockUnsafeSwap
, defaultReadWriteMutate_
, defaultReadWriteMutate
, defaultReadWriteMutateM_
, defaultReadWriteMutateM
, defaultLockUnsafeMutate_
, defaultLockUnsafeMutate
, defaultLockUnsafeMutateM_
, defaultLockUnsafeMutateM
, defaultLockIOMutateM_
, defaultLockIOMutateM
) where
import MonadVar.Prelude
import MonadVar.Classes
defaultLockUnsafeWrite
:: MonadLock m v => v a -> a -> m ()
defaultLockUnsafeWrite v y = tryHold v *> fill v y
defaultReadWriteSwap
:: (MonadRead m v, MonadWrite m v) => v a -> a -> m a
defaultReadWriteSwap v y = read v <* write v y
defaultLockUnsafeSwap
:: MonadLock m v => v a -> a -> m a
defaultLockUnsafeSwap v y = hold v <* fill v y
defaultReadWriteMutate_
:: (MonadRead m v, MonadWrite m v) => v a -> (a -> a) -> m ()
defaultReadWriteMutate_ v f = do
x <- read v
let !y = f x
write v y
defaultReadWriteMutate
:: (MonadRead m v, MonadWrite m v) => v a -> (a -> (a, b)) -> m b
defaultReadWriteMutate v f = do
x <- read v
let !(!y, z) = f x
write v y
return z
defaultReadWriteMutateM_
:: (MonadRead m v, MonadWrite m v) => v a -> (a -> m a) -> m ()
defaultReadWriteMutateM_ v f = do
x <- read v
!y <- f x
write v y
defaultReadWriteMutateM
:: (MonadRead m v, MonadWrite m v) => v a -> (a -> m (a, b)) -> m b
defaultReadWriteMutateM v f = do
x <- read v
!(!y, z) <- f x
write v y
return z
defaultLockUnsafeMutate_
:: MonadLock m v => v a -> (a -> a) -> m ()
defaultLockUnsafeMutate_ v f = do
x <- hold v
let !y = f x
fill v y
defaultLockUnsafeMutate
:: MonadLock m v => v a -> (a -> (a, b)) -> m b
defaultLockUnsafeMutate v f = do
x <- hold v
let !(!y, z) = f x
fill v y
return z
defaultLockUnsafeMutateM_
:: MonadLock m v => v a -> (a -> m a) -> m ()
defaultLockUnsafeMutateM_ v f = do
x <- hold v
!y <- f x
fill v y
defaultLockUnsafeMutateM
:: MonadLock m v => v a -> (a -> m (a, b)) -> m b
defaultLockUnsafeMutateM v f = do
x <- hold v
!(!y, z) <- f x
fill v y
return z
defaultLockIOMutateM_ :: MonadLock IO v => v a -> (a -> IO a) -> IO ()
defaultLockIOMutateM_ v f = mask $ \restore -> do
x <- hold v
y <- restore (f x) `onException` fill v x
fill v y
evaluate y
return ()
defaultLockIOMutateM :: MonadLock IO v => v a -> (a -> IO (a, b)) -> IO b
defaultLockIOMutateM v f = mask $ \restore -> do
x <- hold v
(y, z) <- restore (f x >>= evaluate) `onException` fill v x
fill v y
evaluate y
return z