Constructs a Var from an initial value plus an event stream of changes.
Create a new, updatable Var with an initial value.
Create a new, updatable Var with an initial value. We call such Vars independent -- derived Vars being dependent on these.
Create a new Var whose values are provided asynchronously by
update
.
Create a new Var whose values are provided asynchronously by
update
. The returned Var is dormant until it is observed:
update
is called by-need. Such observations are also reference
counted so that simultaneous observations do not result in
multiple invocations of update
. When the last observer stops
observing, the com.twitter.util.Closable returned
from update
is closed. Subsequent observations result in a new
call to update
.
empty
is used to fill the returned Var until update
has
provided a value. The first observation of the returned Var is
synchronous with the call to update
--it is guaranteed the the
opportunity to fill the Var before the observer sees any value
at all.
Updates from update
are ignored after the returned
com.twitter.util.Closable is closed.
Collect a List of Vars into a new Var of List.
Collect a List of Vars into a new Var of List.
a java.util.List of Vars
a Var[java.util.List[A]] containing the collected values from vars.
Collect a collection of Vars into a Var of collection.
Collect a collection of Vars into a Var of collection. Var.collect can result in a stack overflow if called with a large sequence. Var.collectIndependent breaks composition with respect to update propagation. That is, collectIndependent can fail to correctly update interdependent vars, but is safe for independent vars.
// Example of difference between collect and collectIndependent: val v1 = Var(1) val v2 = v1.map(_*2) val vCollect = Var.collect(Seq(v1, v2)).map { case Seq(a, b) => (a, b) } val vCollectIndependent = Var.collectIndependent(Seq(v1, v2)).map { case Seq(a, b) => (a, b) } val refCollect = new AtomicReference[Seq[(Int, Int)]] vCollect.changes.build.register(Witness(refCollect)) val refCollectIndependent = new AtomicReference[Seq[(Int, Int)]] vCollectIndependent.changes.build.register(Witness(refCollectIndependent)) v1() = 2 // refCollect == Vector((1,2), (2,4)) // refCollectIndependent == Vector((1,2), (2,2), (2,4))
Collect a collection of Vars into a Var of collection.
Collect a collection of Vars into a Var of collection. Var.collect can result in a stack overflow if called with a large sequence. Var.collectIndependent breaks composition with respect to update propagation. That is, collectIndependent can fail to correctly update interdependent vars, but is safe for independent vars.
// Example of difference between collect and collectIndependent: val v1 = Var(1) val v2 = v1.map(_*2) val vCollect = Var.collect(Seq(v1, v2)).map { case Seq(a, b) => (a, b) } val vCollectIndependent = Var.collectIndependent(Seq(v1, v2)).map { case Seq(a, b) => (a, b) } val refCollect = new AtomicReference[Seq[(Int, Int)]] vCollect.changes.build.register(Witness(refCollect)) val refCollectIndependent = new AtomicReference[Seq[(Int, Int)]] vCollectIndependent.changes.build.register(Witness(refCollectIndependent)) v1() = 2 // refCollect == Vector((1,2), (2,4)) // refCollectIndependent == Vector((1,2), (2,2), (2,4))
Patch reconstructs a Var based on observing the incremental changes presented in the underlying Diffs.
Sample the current value of this Var.
Sample the current value of this Var. Note that this may lead to surprising results for lazily defined Vars: the act of observing a Var may be kick off a process to populate it; the value returned from sample may then reflect an intermediate value.
Create a new, constant, v-valued Var.
Note: There is a Java-friendly API for this object: com.twitter.util.Vars.