mirai/backend/mirai-console/src/util/CoroutineScopeUtils.kt

54 lines
1.7 KiB
Kotlin
Raw Normal View History

/*
2020-10-28 13:35:15 +08:00
* Copyright 2019-2020 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
2020-10-28 13:35:15 +08:00
* Use of this source code is governed by the GNU AFFERO GENERAL PUBLIC LICENSE version 3 license that can be found through the following link.
*
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
@file:JvmName("CoroutineScopeUtils")
package net.mamoe.mirai.console.util
2020-09-02 20:20:26 +08:00
import kotlinx.coroutines.*
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext
@ConsoleExperimentalApi
2020-09-02 20:20:26 +08:00
public object CoroutineScopeUtils {
@JvmStatic
@ConsoleExperimentalApi
2020-09-02 20:20:26 +08:00
public fun CoroutineContext.overrideWithSupervisorJob(name: String? = null): CoroutineContext =
this + NamedSupervisorJob(name ?: "<unnamed>", this[Job])
2020-09-02 20:20:26 +08:00
@JvmStatic
@ConsoleExperimentalApi
2020-09-02 20:20:26 +08:00
public fun CoroutineScope.childScope(
name: String? = null,
context: CoroutineContext = EmptyCoroutineContext
): CoroutineScope =
CoroutineScope(this.childScopeContext(name, context))
2020-09-02 20:20:26 +08:00
@JvmStatic
@ConsoleExperimentalApi
2020-09-02 20:20:26 +08:00
public fun CoroutineScope.childScopeContext(
name: String? = null,
context: CoroutineContext = EmptyCoroutineContext
): CoroutineContext =
this.coroutineContext.overrideWithSupervisorJob(name) + context.let {
if (name != null) it + CoroutineName(name)
else it
}
}
@ConsoleExperimentalApi
2020-09-02 20:20:26 +08:00
public class NamedSupervisorJob @JvmOverloads constructor(
private val name: String,
parent: Job? = null
) : CompletableJob by SupervisorJob(parent) {
override fun toString(): String {
return "NamedSupervisorJob($name)"
}
2020-09-02 20:20:26 +08:00
}