A purely functional synchronisation primitive.
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 empty Promise
will block until the Promise
is completed.
get
on a completed Promise
will always immediately return its content.
complete(a)
on an empty Promise
will set it to a
, and notify any and all readers currently blocked on a call to get
.
complete(a)
on a Promise
that's already been completed will not modify its content, and result in a failed F
.
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.
An asynchronous, concurrent mutable reference.
An asynchronous, concurrent mutable reference.
Provides safe concurrent access and modification of its content, but no
functionality for synchronisation, which is instead handled by Promise.
For this reason, a Ref
is always initialised to a value.
The implementation is nonblocking and lightweight, consisting essentially of
a purely functional wrapper over an AtomicReference
Creates a bounded asynchronous queue.
Creates a bounded asynchronous queue. Calls to enqueue1
will wait until the
queue's size is less than maxSize
. See mutable.Queue for more documentation.
Creates a queue that functions as a circular buffer.
Creates a queue that functions as a circular buffer. Up to size
elements of
type A
will accumulate on the queue and then it will begin overwriting
the oldest elements. Thus an enqueue process will never wait.
The size of the circular buffer (must be > 0)
Begins asynchronous evaluation of f
when the returned F[Unit]
is
bound.
Begins asynchronous evaluation of f
when the returned F[Unit]
is
bound. Like start
but is more efficient.
Converts a discrete stream to a signal.
Converts a discrete stream to a signal. Returns a single-element stream.
Resulting signal is initially initial
, and is updated with latest value
produced by source
. If source
is empty, the resulting signal will always
be initial
.
discrete stream publishing values to this signal
Defined as hold(None, source.map(Some(_)))
Provides types which allow asynchronous reading (but not writing).
Provides types which allow asynchronous reading and writing.
Like sequence
but each G[A]
is evaluated in parallel.
Like traverse
but each G[B]
computed from an A
is evaluated in parallel.
Creates an empty Promise[F, A]
Creates an initialized SyncRef[F,A]
.
Creates a mutable.Semaphore
, initialized to the given count.
Creates a new continuous signal which may be controlled asynchronously,
and immediately sets the value to initialValue
.
Begins asynchronous evaluation of f
when the returned F[F[A]]
is
bound.
Begins asynchronous evaluation of f
when the returned F[F[A]]
is
bound. The inner F[A]
will block until the result is available.
Creates a synchronous queue, which always has size 0.
Creates a synchronous queue, which always has size 0. Any calls to enqueue1
block until there is an offsetting call to dequeue1
. Any calls to dequeue1
block until there is an offsetting call to enqueue1
.
Creates an asynchronous topic, which distributes each published A
to
an arbitrary number of subscribers.
Creates an asynchronous topic, which distributes each published A
to
an arbitrary number of subscribers. Each subscriber is guaranteed to
receive at least the initial A
or last value published by any publisher.
Creates an unbounded asynchronous queue.
Creates an unbounded asynchronous queue. See mutable.Queue for more documentation.
Like unsafeRunSync
but execution is shifted to the supplied execution context.
Like unsafeRunSync
but execution is shifted to the supplied execution context.
This method returns immediately after submitting execution to the execution context.
Provides utilities for asynchronous computations.