Like get but returns an F[Unit]
that can be used to cancel the subscription.
If this Promise
is empty, *synchronously* sets the current value to a
, and notifies
any and all readers currently blocked on a get
.
If this Promise
is empty, *synchronously* sets the current value to a
, and notifies
any and all readers currently blocked on a get
.
Note that the returned action completes after the reference has been successfully set:
use async.fork(r.complete)
if you want asynchronous behaviour.
If this Promise
has already been completed, the returned action immediately fails with a Promise.AlreadyCompletedException.
In the uncommon scenario where this behaviour is problematic, you can handle failure explicitly
using attempt
or any other ApplicativeError
/MonadError
combinator on the returned action.
Satisfies:
Promise.empty[F, A].flatMap(r => r.complete(a) *> r.get) == a.pure[F]
Obtains the value of the Promise
, or waits until it has been completed.
Like get but if the Promise
has not been completed when the timeout is reached, a None
is returned.
A purely functional synchronisation primitive.
When created, a
Promise
is empty. It can then be completed exactly once, and never be made empty again.get
on an emptyPromise
will block until thePromise
is completed.get
on a completedPromise
will always immediately return its content.complete(a)
on an emptyPromise
will set it toa
, and notify any and all readers currently blocked on a call toget
.complete(a)
on aPromise
that's already been completed will not modify its content, and result in a failedF
.Albeit simple,
Promise
can be used in conjunction with Ref to build complex concurrent behaviour and data structures like queues and semaphores.Finally, the blocking mentioned above is semantic only, no actual threads are blocked by the implementation.