com.rickbusarow.dispatcherprovider.Builders.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of dispatcher-provider Show documentation
Show all versions of dispatcher-provider Show documentation
Utilities for injecting CoroutineDispatcher options into a CoroutineScope at creation, then locating them via the CoroutineContext
The newest version!
/*
* Copyright (C) 2019-2020 Rick Busarow
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.rickbusarow.dispatcherprovider
import kotlinx.coroutines.*
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext
import kotlin.coroutines.coroutineContext
/**
* Calls the specified suspending block with a given coroutine context, suspends until it completes, and returns
* the result.
*
* Extracts the [DispatcherProvider] from the `coroutineContext` of the current coroutine,
* then uses its **default** [CoroutineDispatcher] property to call `withContext(theDispatcher)`,
* and returns the result.
*
* The *default* property always corresponds to the `DispatcherProvider` of the current coroutine.
*
* @see withContext
*/
public suspend fun withDefault(
context: CoroutineContext = EmptyCoroutineContext,
block: suspend CoroutineScope.() -> T
): T {
val newContext = coroutineContext.dispatcherProvider.default + context
return withContext(newContext, block)
}
/**
* Calls the specified suspending block with a given coroutine context, suspends until it completes, and returns
* the result.
*
* Extracts the [DispatcherProvider] from the `coroutineContext` of the current coroutine,
* then uses its **io** [CoroutineDispatcher] property to call `withContext(theDispatcher)`,
* and returns the result.
*
* The `io` property always corresponds to the `DispatcherProvider` of the current coroutine.
*
* @see withContext
*/
public suspend fun withIO(
context: CoroutineContext = EmptyCoroutineContext,
block: suspend CoroutineScope.() -> T
): T {
val newContext = coroutineContext.dispatcherProvider.io + context
return withContext(newContext, block)
}
/**
* Calls the specified suspending block with a given coroutine context, suspends until it completes, and returns
* the result.
*
* Extracts the [DispatcherProvider] from the `coroutineContext` of the current coroutine,
* then uses its **main** [CoroutineDispatcher] property to call `withContext(theDispatcher)`,
* and returns the result.
*
* The `main` property always corresponds to the `DispatcherProvider` of the current coroutine.
*
* @see withContext
*/
public suspend fun withMain(
context: CoroutineContext = EmptyCoroutineContext,
block: suspend CoroutineScope.() -> T
): T {
val newContext = coroutineContext.dispatcherProvider.main + context
return withContext(newContext, block)
}
/**
* Calls the specified suspending block with a given coroutine context, suspends until it completes, and returns
* the result.
*
* Extracts the [DispatcherProvider] from the `coroutineContext` of the current coroutine,
* then uses its **mainImmediate** [CoroutineDispatcher] property to call `withContext(theDispatcher)`,
* and returns the result.
*
* The `mainImmediate` property always corresponds to the `DispatcherProvider` of the current coroutine.
*
* @see withContext
*/
public suspend fun withMainImmediate(
context: CoroutineContext = EmptyCoroutineContext, block: suspend CoroutineScope.() -> T
): T {
val newContext = coroutineContext.dispatcherProvider.mainImmediate + context
return withContext(newContext, block)
}
/**
* Calls the specified suspending block with a given coroutine context, suspends until it completes, and returns
* the result.
*
* Extracts the [DispatcherProvider] from the `coroutineContext` of the current coroutine,
* then uses its **unconfined** [CoroutineDispatcher] property to call `withContext(theDispatcher)`,
* and returns the result.
*
* The `unconfined` property always corresponds to the `DispatcherProvider` of the current coroutine.
*
* @see withContext
*/
public suspend fun withUnconfined(
context: CoroutineContext = EmptyCoroutineContext,
block: suspend CoroutineScope.() -> T
): T {
val newContext = coroutineContext.dispatcherProvider.unconfined + context
return withContext(newContext, block)
}
/**
* Launches a new coroutine without blocking the current thread and returns a reference to the coroutine as a [Job].
* The coroutine is cancelled when the resulting job is [cancelled][Job.cancel].
*
* Extracts the [DispatcherProvider] from the [CoroutineScope] receiver, then uses its **default** [CoroutineDispatcher]
* property (`coroutineContext.dispatcherProvider.default`) to call `launch(...)`.
*
* The `default` property always corresponds to the `DispatcherProvider` of the current `CoroutineScope`.
*
* @see launch
*/
public fun CoroutineScope.launchDefault(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job = launch(coroutineContext.dispatcherProvider.default + context, start, block)
/**
* Launches a new coroutine without blocking the current thread and returns a reference to the coroutine as a [Job].
* The coroutine is cancelled when the resulting job is [cancelled][Job.cancel].
*
* Extracts the [DispatcherProvider] from the [CoroutineScope] receiver, then uses its **default** [CoroutineDispatcher]
* property (`coroutineContext.dispatcherProvider.io`) to call `launch(...)`.
*
* The `io` property always corresponds to the `DispatcherProvider` of the current `CoroutineScope`.
*
* @see launch
*/
public fun CoroutineScope.launchIO(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job = launch(coroutineContext.dispatcherProvider.io + context, start, block)
/**
* Launches a new coroutine without blocking the current thread and returns a reference to the coroutine as a [Job].
* The coroutine is cancelled when the resulting job is [cancelled][Job.cancel].
*
* Extracts the [DispatcherProvider] from the [CoroutineScope] receiver, then uses its **default** [CoroutineDispatcher]
* property (`coroutineContext.dispatcherProvider.main`) to call `launch(...)`.
*
* The `main` property always corresponds to the `DispatcherProvider` of the current `CoroutineScope`.
*
* @see launch
*/
public fun CoroutineScope.launchMain(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job = launch(coroutineContext.dispatcherProvider.main + context, start, block)
/**
* Launches a new coroutine without blocking the current thread and returns a reference to the coroutine as a [Job].
* The coroutine is cancelled when the resulting job is [cancelled][Job.cancel].
*
* Extracts the [DispatcherProvider] from the [CoroutineScope] receiver, then uses its **default** [CoroutineDispatcher]
* property (`coroutineContext.dispatcherProvider.mainImmediate`) to call `launch(...)`.
*
* The `mainImmediate` property always corresponds to the `DispatcherProvider` of the current `CoroutineScope`.
*
* @see launch
*/
public fun CoroutineScope.launchMainImmediate(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job = launch(coroutineContext.dispatcherProvider.mainImmediate + context, start, block)
/**
* Launches a new coroutine without blocking the current thread and returns a reference to the coroutine as a [Job].
* The coroutine is cancelled when the resulting job is [cancelled][Job.cancel].
*
* Extracts the [DispatcherProvider] from the [CoroutineScope] receiver, then uses its **default** [CoroutineDispatcher]
* property (`coroutineContext.dispatcherProvider.unconfined`) to call `launch(...)`.
*
* The `unconfined` property always corresponds to the `DispatcherProvider` of the current `CoroutineScope`.
*
* @see launch
*/
public fun CoroutineScope.launchUnconfined(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job = launch(coroutineContext.dispatcherProvider.unconfined + context, start, block)
/**
* Creates a coroutine and returns its future result as an implementation of [Deferred].
*
* Extracts the [DispatcherProvider] from the [CoroutineScope] receiver, then uses its **default** [CoroutineDispatcher]
* property (`coroutineContext.dispatcherProvider.default`) to call `async(...)`.
*
* The `default` property always corresponds to the `DispatcherProvider` of the current `CoroutineScope`.
*
* @see async
*/
public fun CoroutineScope.asyncDefault(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> T
): Deferred = async(coroutineContext.dispatcherProvider.default + context, start, block)
/**
* Creates a coroutine and returns its future result as an implementation of [Deferred].
*
* Extracts the [DispatcherProvider] from the [CoroutineScope] receiver, then uses its **default** [CoroutineDispatcher]
* property (`coroutineContext.dispatcherProvider.io`) to call `async(...)`.
*
* The `io` property always corresponds to the `DispatcherProvider` of the current `CoroutineScope`.
*
* @see async
*/
public fun CoroutineScope.asyncIO(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> T
): Deferred = async(coroutineContext.dispatcherProvider.io + context, start, block)
/**
* Creates a coroutine and returns its future result as an implementation of [Deferred].
*
* Extracts the [DispatcherProvider] from the [CoroutineScope] receiver, then uses its **default** [CoroutineDispatcher]
* property (`coroutineContext.dispatcherProvider.main`) to call `async(...)`.
*
* The `main` property always corresponds to the `DispatcherProvider` of the current `CoroutineScope`.
*
* @see async
*/
public fun CoroutineScope.asyncMain(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> T
): Deferred = async(coroutineContext.dispatcherProvider.main + context, start, block)
/**
* Creates a coroutine and returns its future result as an implementation of [Deferred].
*
* Extracts the [DispatcherProvider] from the [CoroutineScope] receiver, then uses its **default** [CoroutineDispatcher]
* property (`coroutineContext.dispatcherProvider.mainImmediate`) to call `async(...)`.
*
* The `mainImmediate` property always corresponds to the `DispatcherProvider` of the current `CoroutineScope`.
*
* @see async
*/
public fun CoroutineScope.asyncMainImmediate(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> T
): Deferred = async(coroutineContext.dispatcherProvider.mainImmediate + context, start, block)
/**
* Creates a coroutine and returns its future result as an implementation of [Deferred].
*
* Extracts the [DispatcherProvider] from the [CoroutineScope] receiver, then uses its **default** [CoroutineDispatcher]
* property (`coroutineContext.dispatcherProvider.unconfined`) to call `async(...)`.
*
* The `unconfined` property always corresponds to the `DispatcherProvider` of the current `CoroutineScope`.
*
* @see async
*/
public fun CoroutineScope.asyncUnconfined(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> T
): Deferred = async(coroutineContext.dispatcherProvider.unconfined + context, start, block)