mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2024-11-22 16:23:50 +00:00
a little improve of weak extensions and add tests for weak scopes
This commit is contained in:
parent
0398a7bebd
commit
f373524f34
@ -4,11 +4,14 @@ import kotlinx.coroutines.*
|
|||||||
import kotlin.coroutines.CoroutineContext
|
import kotlin.coroutines.CoroutineContext
|
||||||
import kotlin.coroutines.EmptyCoroutineContext
|
import kotlin.coroutines.EmptyCoroutineContext
|
||||||
|
|
||||||
private fun CoroutineScope.createWeakSubScope() = CoroutineScope(coroutineContext.minusKey(Job)).also { newScope ->
|
private fun CoroutineScope.createWeakSubScope() = CoroutineScope(coroutineContext.minusKey(Job) + Job()).also { newScope ->
|
||||||
coroutineContext.job.invokeOnCompletion { newScope.cancel() }
|
newScope.launch {
|
||||||
|
this@createWeakSubScope.coroutineContext.job.join()
|
||||||
|
newScope.cancel()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun CoroutineScope.weakLaunch(
|
fun CoroutineScope.launchWeak(
|
||||||
context: CoroutineContext = EmptyCoroutineContext,
|
context: CoroutineContext = EmptyCoroutineContext,
|
||||||
start: CoroutineStart = CoroutineStart.DEFAULT,
|
start: CoroutineStart = CoroutineStart.DEFAULT,
|
||||||
block: suspend CoroutineScope.() -> Unit
|
block: suspend CoroutineScope.() -> Unit
|
||||||
@ -19,7 +22,7 @@ fun CoroutineScope.weakLaunch(
|
|||||||
return job
|
return job
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T> CoroutineScope.weakAsync(
|
fun <T> CoroutineScope.asyncWeak(
|
||||||
context: CoroutineContext = EmptyCoroutineContext,
|
context: CoroutineContext = EmptyCoroutineContext,
|
||||||
start: CoroutineStart = CoroutineStart.DEFAULT,
|
start: CoroutineStart = CoroutineStart.DEFAULT,
|
||||||
block: suspend CoroutineScope.() -> T
|
block: suspend CoroutineScope.() -> T
|
||||||
@ -29,3 +32,16 @@ fun <T> CoroutineScope.weakAsync(
|
|||||||
deferred.invokeOnCompletion { scope.cancel() }
|
deferred.invokeOnCompletion { scope.cancel() }
|
||||||
return deferred
|
return deferred
|
||||||
}
|
}
|
||||||
|
@Deprecated("Renamed", ReplaceWith("launchWeak(context, start, block)", "dev.inmo.micro_utils.coroutines.launchWeak"))
|
||||||
|
fun CoroutineScope.weakLaunch(
|
||||||
|
context: CoroutineContext = EmptyCoroutineContext,
|
||||||
|
start: CoroutineStart = CoroutineStart.DEFAULT,
|
||||||
|
block: suspend CoroutineScope.() -> Unit
|
||||||
|
): Job = launchWeak(context, start, block)
|
||||||
|
|
||||||
|
@Deprecated("Renamed", ReplaceWith("asyncWeak(context, start, block)", "dev.inmo.micro_utils.coroutines.asyncWeak"))
|
||||||
|
fun <T> CoroutineScope.weakAsync(
|
||||||
|
context: CoroutineContext = EmptyCoroutineContext,
|
||||||
|
start: CoroutineStart = CoroutineStart.DEFAULT,
|
||||||
|
block: suspend CoroutineScope.() -> T
|
||||||
|
): Deferred<T> = asyncWeak(context, start, block)
|
||||||
|
36
coroutines/src/commonTest/kotlin/WeakJobTests.kt
Normal file
36
coroutines/src/commonTest/kotlin/WeakJobTests.kt
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import dev.inmo.micro_utils.coroutines.asyncWeak
|
||||||
|
import dev.inmo.micro_utils.coroutines.launchWeak
|
||||||
|
import kotlinx.coroutines.CancellationException
|
||||||
|
import kotlinx.coroutines.coroutineScope
|
||||||
|
import kotlinx.coroutines.delay
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.test.runTest
|
||||||
|
import kotlin.test.Test
|
||||||
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
|
class WeakJobTests {
|
||||||
|
@Test
|
||||||
|
fun testWeakJob() = runTest {
|
||||||
|
var commonJobDone = false
|
||||||
|
var weakJobStarted = false
|
||||||
|
try {
|
||||||
|
coroutineScope {
|
||||||
|
launch {
|
||||||
|
delay(1000)
|
||||||
|
commonJobDone = true
|
||||||
|
}
|
||||||
|
asyncWeak {
|
||||||
|
weakJobStarted = true
|
||||||
|
delay(100500L)
|
||||||
|
error("This must never happen")
|
||||||
|
}
|
||||||
|
}.await()
|
||||||
|
} catch (error: Throwable) {
|
||||||
|
assertTrue(error is CancellationException)
|
||||||
|
assertTrue(commonJobDone)
|
||||||
|
assertTrue(weakJobStarted)
|
||||||
|
return@runTest
|
||||||
|
}
|
||||||
|
error("Cancellation exception has not been thrown")
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user