1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2024-06-01 07:25:23 +00:00
tgbotapi/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/FlowsAggregation.kt

40 lines
982 B
Kotlin
Raw Normal View History

package dev.inmo.tgbotapi.extensions.utils
2020-08-10 05:53:54 +00:00
2021-01-09 12:25:11 +00:00
import dev.inmo.micro_utils.coroutines.safely
2020-08-10 05:53:54 +00:00
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.BroadcastChannel
import kotlinx.coroutines.flow.*
/**
* Analog of [merge] function for [Flow]s. The difference is in the usage of [BroadcastChannel] in this case
*/
2020-08-10 05:53:54 +00:00
fun <T> aggregateFlows(
withScope: CoroutineScope,
vararg flows: Flow<T>,
2020-10-27 09:26:32 +00:00
internalBufferSize: Int = 64
2020-08-10 05:53:54 +00:00
): Flow<T> {
val sharedFlow = MutableSharedFlow<T>(extraBufferCapacity = internalBufferSize)
2020-08-10 05:53:54 +00:00
flows.forEach {
it.onEach {
safely { sharedFlow.emit(it) }
2020-08-10 05:53:54 +00:00
}.launchIn(withScope)
}
2020-10-27 09:51:48 +00:00
return sharedFlow
2020-08-10 05:53:54 +00:00
}
fun <T> Flow<Iterable<T>>.flatten(): Flow<T> = flow {
collect {
it.forEach {
emit(it)
}
}
}
2022-08-24 09:03:54 +00:00
fun <T, R> Flow<T>.flatMap(mapper: suspend (T) -> Iterable<R>): Flow<R> = flow {
collect {
mapper(it).forEach {
emit(it)
}
}
}