FiberRef

zio.FiberRef
See theFiberRef companion object
trait FiberRef[A] extends Serializable

A FiberRef is ZIO's equivalent of Java's ThreadLocal. The value of a FiberRef is automatically propagated to child fibers when they are forked and merged back in to the value of the parent fiber after they are joined.

for {
 fiberRef <- FiberRef.make("Hello world!")
 child    <- fiberRef.set("Hi!").fork
 _        <- child.join
 result   <- fiberRef.get
} yield result

Here result will be equal to "Hi!" since changes made by a child fiber are merged back in to the value of the parent fiber on join.

By default the value of the child fiber will replace the value of the parent fiber on join but you can specify your own logic for how values should be merged.

for {
 fiberRef <- FiberRef.make(0, identity[Int], math.max)
 child    <- fiberRef.update(_ + 1).fork
 _        <- fiberRef.update(_ + 2)
 _        <- child.join
 value    <- fiberRef.get
} yield value

Here value will be 2 as the value in the joined fiber is lower and we specified max as our combining function.

Attributes

Companion:
object
Graph
Supertypes
class Object
trait Matchable
class Any
Known subtypes
class Proxy[A]
Self type

Members list

Concise view

Type members

Types

type Patch

The type of the patch that describes updates to the value of the FiberRef. In the simple case this will just be a function that sets the value of the FiberRef. In more complex cases this will describe an update to a piece of a whole value, allowing updates to the value by different fibers to be combined in a compositional way when those fibers are joined.

The type of the patch that describes updates to the value of the FiberRef. In the simple case this will just be a function that sets the value of the FiberRef. In more complex cases this will describe an update to a piece of a whole value, allowing updates to the value by different fibers to be combined in a compositional way when those fibers are joined.

Attributes

type Value = A

The type of the value of the FiberRef.

The type of the value of the FiberRef.

Attributes

Value members

Abstract methods

def combine(first: Patch, second: Patch): Patch

Combines two patches to produce a new patch that describes the updates of the first patch and then the updates of the second patch. The combine operation should be associative. In addition, if the combine operation is commutative then joining multiple fibers concurrently will result in deterministic FiberRef values.

Combines two patches to produce a new patch that describes the updates of the first patch and then the updates of the second patch. The combine operation should be associative. In addition, if the combine operation is commutative then joining multiple fibers concurrently will result in deterministic FiberRef values.

Attributes

def diff(oldValue: Value, newValue: Value): Patch

Constructs a patch describing the updates to a value from an old value and a new value.

Constructs a patch describing the updates to a value from an old value and a new value.

Attributes

def fork: Patch

The initial patch that is applied to the value of the FiberRef when a new fiber is forked.

The initial patch that is applied to the value of the FiberRef when a new fiber is forked.

Attributes

The initial value of the FiberRef.

The initial value of the FiberRef.

Attributes

def join(oldValue: Value, newValue: Value): Value
def patch(patch: Patch)(oldValue: Value): Value

Applies a patch to an old value to produce a new value that is equal to the old value with the updates described by the patch.

Applies a patch to an old value to produce a new value that is equal to the old value with the updates described by the patch.

Attributes

Concrete methods

def asThreadLocal(implicit trace: Trace, unsafe: Unsafe): UIO[ThreadLocal[A]]

Returns a ThreadLocal that can be used to interact with this FiberRef from side effecting code.

Returns a ThreadLocal that can be used to interact with this FiberRef from side effecting code.

This feature is meant to be used for integration with side effecting code, that needs to access fiber specific data, like MDC contexts and the like. The returned ThreadLocal will be backed by this FiberRef on all threads that are currently managed by ZIO when this feature is enabled using Runtime.enableCurrentFiber, and behave like an ordinary ThreadLocal on all other threads.

Attributes

def delete(implicit trace: Trace): UIO[Unit]
def get(implicit trace: Trace): UIO[A]

Reads the value associated with the current fiber. Returns initial value if no value was set or inherited from parent.

Reads the value associated with the current fiber. Returns initial value if no value was set or inherited from parent.

Attributes

final def getAndSet(newValue: A)(implicit trace: Trace): UIO[A]

Atomically sets the value associated with the current fiber and returns the old value.

Atomically sets the value associated with the current fiber and returns the old value.

Attributes

final def getAndUpdate(f: A => A)(implicit trace: Trace): UIO[A]

Atomically modifies the FiberRef with the specified function and returns the old value.

Atomically modifies the FiberRef with the specified function and returns the old value.

Attributes

final def getAndUpdateSome(pf: PartialFunction[A, A])(implicit trace: Trace): UIO[A]

Atomically modifies the FiberRef with the specified partial function and returns the old value. If the function is undefined on the current value it doesn't change it.

Atomically modifies the FiberRef with the specified partial function and returns the old value. If the function is undefined on the current value it doesn't change it.

Attributes

def getWith[R, E, B](f: A => ZIO[R, E, B])(implicit trace: Trace): ZIO[R, E, B]

Gets the value associated with the current fiber and uses it to run the specified effect.

Gets the value associated with the current fiber and uses it to run the specified effect.

Attributes

def locally[R, E, B](newValue: A)(zio: ZIO[R, E, B])(implicit trace: Trace): ZIO[R, E, B]

Returns a ZIO that runs with value bound to the current fiber.

Returns a ZIO that runs with value bound to the current fiber.

Guarantees that fiber data is properly restored via acquireRelease.

Attributes

final def locallyScoped(value: A)(implicit trace: Trace): ZIO[Scope, Nothing, Unit]

Returns a scoped workflow that sets the value associated with the curent fiber to the specified value and restores it to its original value when the scope is closed.

Returns a scoped workflow that sets the value associated with the curent fiber to the specified value and restores it to its original value when the scope is closed.

Attributes

final def locallyScopedWith(f: A => A)(implicit trace: Trace): ZIO[Scope, Nothing, Unit]

Returns a scoped workflow that updates the value associated with the current fiber using the specified function and restores it to its original value when the scope is closed.

Returns a scoped workflow that updates the value associated with the current fiber using the specified function and restores it to its original value when the scope is closed.

Attributes

final def locallyWith[R, E, B](f: A => A)(zio: ZIO[R, E, B])(implicit trace: Trace): ZIO[R, E, B]

Returns a ZIO that runs with f applied to the current fiber.

Returns a ZIO that runs with f applied to the current fiber.

Guarantees that fiber data is properly restored via acquireRelease.

Attributes

def modify[B](f: A => (B, A))(implicit trace: Trace): UIO[B]

Atomically modifies the FiberRef with the specified function, which computes a return value for the modification. This is a more powerful version of update.

Atomically modifies the FiberRef with the specified function, which computes a return value for the modification. This is a more powerful version of update.

Attributes

final def modifySome[B](default: B)(pf: PartialFunction[A, (B, A)])(implicit trace: Trace): UIO[B]

Atomically modifies the FiberRef with the specified partial function, which computes a return value for the modification if the function is defined in the current value otherwise it returns a default value. This is a more powerful version of updateSome.

Atomically modifies the FiberRef with the specified partial function, which computes a return value for the modification if the function is defined in the current value otherwise it returns a default value. This is a more powerful version of updateSome.

Attributes

final def reset(implicit trace: Trace): UIO[Unit]
def set(value: A)(implicit trace: Trace): UIO[Unit]

Sets the value associated with the current fiber.

Sets the value associated with the current fiber.

Attributes

def update(f: A => A)(implicit trace: Trace): UIO[Unit]

Atomically modifies the FiberRef with the specified function.

Atomically modifies the FiberRef with the specified function.

Attributes

final def updateAndGet(f: A => A)(implicit trace: Trace): UIO[A]

Atomically modifies the FiberRef with the specified function and returns the result.

Atomically modifies the FiberRef with the specified function and returns the result.

Attributes

final def updateSome(pf: PartialFunction[A, A])(implicit trace: Trace): UIO[Unit]

Atomically modifies the FiberRef with the specified partial function. If the function is undefined on the current value it doesn't change it.

Atomically modifies the FiberRef with the specified partial function. If the function is undefined on the current value it doesn't change it.

Attributes

final def updateSomeAndGet(pf: PartialFunction[A, A])(implicit trace: Trace): UIO[A]

Atomically modifies the FiberRef with the specified partial function. If the function is undefined on the current value it returns the old value without changing it.

Atomically modifies the FiberRef with the specified partial function. If the function is undefined on the current value it returns the old value without changing it.

Attributes