This module provides a simple form of single assignment variables. The following type represents single assignment variables.
data V a
Single assignment variables can only be created within the
otherwise, referential transparency would be compromised.
newV :: IO (V a)
However, the value of a single assignment variables can be accessed outside of the monad. This is save, as single assignment variables are only instantiated monotonically, i.e., once such a variable is bound, the value can never change again.
valV :: V a -> a
If a single assignment variable is accessed while no value is yet bound to the variable, the thread accessing the variable is suspended. Only when the variable is, eventually, bound, the reading thread is allowed to continue. Thus, a computation can never observe an unbound single assignment variable, which together with the monotonicity (mentioned above) guarantees referential transparency.
Single assignment variables can be bound within the
IO monad with an
expression of the form
svar << value, where
svar is a single
assignment variable and
value the value that is to be associated with the
(<<) :: V a -> a -> IO ()
Furthermore, this module provides a symmetric fork/join operation:
(&) :: IO a -> IO b -> IO (a, b)
The operation models parallel composition, which terminates after both of the concurrent subcomputations terminated.