fix: replace runBlocking with non-blocking async operations
Some checks failed
Build APK and Notify Discord / build (push) Has been cancelled
Some checks failed
Build APK and Notify Discord / build (push) Has been cancelled
This commit is contained in:
parent
fd607d98f8
commit
1fbbe3e77c
1 changed files with 38 additions and 4 deletions
|
@ -11,7 +11,11 @@ import com.lagradost.nicehttp.addGenericDns
|
||||||
import eu.kanade.tachiyomi.network.NetworkHelper
|
import eu.kanade.tachiyomi.network.NetworkHelper
|
||||||
import eu.kanade.tachiyomi.network.NetworkHelper.Companion.defaultUserAgentProvider
|
import eu.kanade.tachiyomi.network.NetworkHelper.Companion.defaultUserAgentProvider
|
||||||
import kotlinx.coroutines.CancellationException
|
import kotlinx.coroutines.CancellationException
|
||||||
|
import kotlinx.coroutines.CoroutineDispatcher
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.async
|
import kotlinx.coroutines.async
|
||||||
|
import kotlinx.coroutines.awaitAll
|
||||||
|
import kotlinx.coroutines.coroutineScope
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import kotlinx.serialization.ExperimentalSerializationApi
|
import kotlinx.serialization.ExperimentalSerializationApi
|
||||||
|
@ -85,12 +89,42 @@ object Mapper : ResponseParser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <A, B> Collection<A>.asyncMap(f: suspend (A) -> B): List<B> = runBlocking {
|
/**
|
||||||
map { async { f(it) } }.map { it.await() }
|
* Performs parallel processing of collection items without blocking threads.
|
||||||
|
* Each operation runs in its own coroutine on the specified dispatcher.
|
||||||
|
*
|
||||||
|
* @param dispatcher The CoroutineDispatcher to use for parallel operations (defaults to IO)
|
||||||
|
* @param f The suspend function to apply to each item
|
||||||
|
* @return List of results in the same order as the original collection
|
||||||
|
*/
|
||||||
|
suspend fun <A, B> Collection<A>.asyncMap(
|
||||||
|
dispatcher: CoroutineDispatcher = Dispatchers.IO,
|
||||||
|
f: suspend (A) -> B
|
||||||
|
): List<B> = coroutineScope {
|
||||||
|
map { item ->
|
||||||
|
async(dispatcher) {
|
||||||
|
f(item)
|
||||||
|
}
|
||||||
|
}.awaitAll()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <A, B> Collection<A>.asyncMapNotNull(f: suspend (A) -> B?): List<B> = runBlocking {
|
/**
|
||||||
map { async { f(it) } }.mapNotNull { it.await() }
|
* Performs parallel processing of collection items without blocking threads,
|
||||||
|
* filtering out null results.
|
||||||
|
*
|
||||||
|
* @param dispatcher The CoroutineDispatcher to use for parallel operations (defaults to IO)
|
||||||
|
* @param f The suspend function to apply to each item
|
||||||
|
* @return List of non-null results in the same order as the original collection
|
||||||
|
*/
|
||||||
|
suspend fun <A, B> Collection<A>.asyncMapNotNull(
|
||||||
|
dispatcher: CoroutineDispatcher = Dispatchers.IO,
|
||||||
|
f: suspend (A) -> B?
|
||||||
|
): List<B> = coroutineScope {
|
||||||
|
map { item ->
|
||||||
|
async(dispatcher) {
|
||||||
|
f(item)
|
||||||
|
}
|
||||||
|
}.mapNotNull { it.await() }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun logError(e: Throwable, post: Boolean = true, snackbar: Boolean = true) {
|
fun logError(e: Throwable, post: Boolean = true, snackbar: Boolean = true) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue