Fills the MVar
if it is empty, or blocks (asynchronously)
if the MVar
is full, until the given value is next in
line to be consumed on take.
Fills the MVar
if it is empty, or blocks (asynchronously)
if the MVar
is full, until the given value is next in
line to be consumed on take.
This operation is atomic.
a task that on evaluation will complete when the
put
operation succeeds in filling the MVar
,
with the given value being next in line to
be consumed
Tries reading the current value, or blocks (asynchronously) until there is a value available.
Tries reading the current value, or blocks (asynchronously) until there is a value available.
This operation is atomic.
a task that on evaluation will be completed after a value has been read
Empties the MVar
if full, returning the contained value,
or blocks (asynchronously) until a value is available.
Empties the MVar
if full, returning the contained value,
or blocks (asynchronously) until a value is available.
This operation is atomic.
a task that on evaluation will be completed after a value was retrieved
Fill the MVar
if we can do it without blocking,
Fill the MVar
if we can do it without blocking,
whether or not the put succeeded
empty the MVar
if full
empty the MVar
if full
an Option holding the current value, None means it was empty
A mutable location, that is either empty or contains a value of type
A
.It has the following fundamental atomic operations:
put
The
MVar
is appropriate for building synchronization primitives and performing simple inter-thread communications. If it helps, it's similar with aBlockingQueue(capacity = 1)
, except that it doesn't block any threads, all waiting being done asynchronously (via Async or Concurrent data types, such as IO).Given its asynchronous, non-blocking nature, it can be used on top of Javascript as well.
Inspired by
Control.Concurrent.MVar
from Haskell and byscalaz.concurrent.MVar
.