This commit is contained in:
InsanusMokrassar 2022-09-14 22:32:00 +06:00
parent 2696e663cf
commit 1be1070eb4
2 changed files with 9 additions and 8 deletions

View File

@ -2,6 +2,8 @@
## 0.12.13 ## 0.12.13
* `Coroutines`:
* Add opportunity to use markers in actors (solution of [#160](https://github.com/InsanusMokrassar/MicroUtils/issues/160))
* `Koin`: * `Koin`:
* Module inited :) * Module inited :)

View File

@ -1,28 +1,27 @@
package dev.inmo.micro_utils.coroutines package dev.inmo.micro_utils.coroutines
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.launch import kotlinx.coroutines.flow.consumeAsFlow
fun <T> CoroutineScope.actor( fun <T> CoroutineScope.actor(
channelCapacity: Int = Channel.UNLIMITED, channelCapacity: Int = Channel.UNLIMITED,
markerFactory: suspend (T) -> Any? = { null },
block: suspend (T) -> Unit block: suspend (T) -> Unit
): Channel<T> { ): Channel<T> {
val channel = Channel<T>(channelCapacity) val channel = Channel<T>(channelCapacity)
launch { channel.consumeAsFlow().subscribeAsync(this, markerFactory, block)
for (data in channel) {
block(data)
}
}
return channel return channel
} }
inline fun <T> CoroutineScope.safeActor( inline fun <T> CoroutineScope.safeActor(
channelCapacity: Int = Channel.UNLIMITED, channelCapacity: Int = Channel.UNLIMITED,
noinline onException: ExceptionHandler<Unit> = defaultSafelyExceptionHandler, noinline onException: ExceptionHandler<Unit> = defaultSafelyExceptionHandler,
noinline markerFactory: suspend (T) -> Any? = { null },
crossinline block: suspend (T) -> Unit crossinline block: suspend (T) -> Unit
): Channel<T> = actor( ): Channel<T> = actor(
channelCapacity channelCapacity,
markerFactory
) { ) {
safely(onException) { safely(onException) {
block(it) block(it)