Composable blocking transactions, based on the blog post: http://blog.downstairspeople.org/2010/06/06/composable-blocking-transactions/
- data BVar a
- newBVar :: a -> IO (BVar a)
- peekBVar :: BVar a -> IO a
- pokeBVar :: BVar a -> a -> IO ()
- modifyBVar :: BVar a -> (a -> (a, b)) -> IO b
- runBTM :: (forall e. BTM e (Value e a)) -> IO a
- data BTM e a
- data Value e a
- when :: Value e Bool -> BTM e (Value e ()) -> BTM e (Value e ())
- unless :: Value e Bool -> BTM e (Value e ()) -> BTM e (Value e ())
- readBVar :: BVar a -> BTM e (Value e a)
- writeBVar :: BVar a -> Value e a -> BTM e (Value e ())
- retry :: BTM e (Value e ())
- runBTA :: BTA a b -> a -> IO b
- data BTA a b
- fetchBVar :: BVar a -> BTA () a
- storeBVar :: BVar a -> BTA a ()
- retryWhen :: BTA Bool ()
- retryUnless :: BTA Bool ()
Perform a transaction using only a single variable.
Blocking Transaction Monad
The blocking transaction monad.
An opaque value. It can be modified and combined with other opaque values, but not observed.
The type variable
e binds the value to the monadic context in which it
occurs, (this is identical to the
runST existential type trick).
Flow control. Skip the critical section if the predicate is false.
Flow control. Skip the critical section if the predicate is true.
Electively retry. This will restore all variables to their state before the transaction began, and listen for a change to any variable in the working set before trying the transaction again.
Blocking Transaction Arrow
The blocking transaction arrow. The semantics are identical to the equivalent operations on the monadic interface.