DispatchClosure

interface DispatchClosure

A map of Element instances. Every element has a unique Key. By design DispatchClosure is immutable. However, its elements might mutate depending on their implementation.

This concept is analogous to CoroutineContext and acts in the same way.

Examples below shows how to combine and access elements:

val closure = A(1) + B("arg") + A(2)
val elementA = closure[A] // Returns A(2). A(1) was replaced.
val elementB = closure[B] // Returns B("arg")
val elementC = closure.find(C) // Returns null
val elementC = closure[C] // Throws exception

See also

Types

Link copied to clipboard

A single element of a DispatchClosure. By default, it acts like a DispatchClosure that contains only itself.

Link copied to clipboard

Unique key for a Element. Contains T type of this element.

Functions

Link copied to clipboard

Returns Element associated with the key or null.

Link copied to clipboard
open operator fun <T : DispatchClosure.Element> get(key: DispatchClosure.Key<T>): T

Returns Element associated with the key or throws MissingClosureElementException.

Link copied to clipboard
abstract operator fun minus(key: DispatchClosure.Key<*>): DispatchClosure

Returns a closure without the element with a given key

Link copied to clipboard
open operator fun plus(closure: DispatchClosure): DispatchClosure

Combines this closure with incoming closure. If both closures contain elements with the same keys, the ones from the incoming closure remain.

Link copied to clipboard

Returns elements form this DispatchClosure as a Map.

Inheritors

Link copied to clipboard
Link copied to clipboard

Extensions

Link copied to clipboard
Link copied to clipboard
fun DispatchClosure.launchForeground(context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> Unit): Job

Launches a foreground job using this closure. By default, it's launched in a scope provided by DispatchCoroutineScope. This behaviour might be changed by dispatchJobIn or joinDispatchJob. Because this function uses local closure, calling it outside dispatch should not be done, because it might result in unexpected behaviour.

Link copied to clipboard

Returns this closure with local changes.

Link copied to clipboard
inline fun DispatchClosure.registeringJob(closure: DispatchClosure = EmptyDispatchClosure, newFrame: Boolean = false, block: DispatchClosure.() -> Unit): Job

Runs block that must register a foreground job. It adds SingleForegroundJobRegistry to local closure to allow proper job registration. Local closure change creates a new frame if newFrame is true.

Link copied to clipboard
inline fun <T> DispatchClosure.withLocalClosure(closure: DispatchClosure, newFrame: Boolean = false, block: DispatchClosure.() -> T): T

Changes LocalClosureContainer with a given closure for a time of block execution.