From e2bd8b2044d94c78c85439cb7c2479efcad40afa Mon Sep 17 00:00:00 2001 From: Him188 Date: Fri, 20 Dec 2019 10:56:43 +0800 Subject: [PATCH] Add receiver E --- .../net.mamoe.mirai/event/Subscribers.kt | 80 ++++++++++--------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Subscribers.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Subscribers.kt index b8fa7fa98..c1e97bf4c 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Subscribers.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Subscribers.kt @@ -40,30 +40,34 @@ inline class ListeningStatus(inline val listening: Boolean) { * 将以当前协程的 job 为父 job 启动监听, 因此, 当当前协程运行结束后, 监听也会结束. * [handler] 将会有当前协程上下文执行, 即会被调用 [subscribe] 时的协程调度器执行 */ -suspend inline fun subscribe(noinline handler: suspend (E) -> ListeningStatus): Listener = E::class.subscribe(handler) +suspend inline fun subscribe(noinline handler: suspend E.(E) -> ListeningStatus): Listener = E::class.subscribe(handler) -suspend inline fun subscribeAlways(noinline listener: suspend (E) -> Unit): Listener = E::class.subscribeAlways(listener) +suspend inline fun subscribeAlways(noinline listener: suspend E.(E) -> Unit): Listener = E::class.subscribeAlways(listener) -suspend inline fun subscribeOnce(noinline listener: suspend (E) -> Unit): Listener = E::class.subscribeOnce(listener) +suspend inline fun subscribeOnce(noinline listener: suspend E.(E) -> Unit): Listener = E::class.subscribeOnce(listener) -suspend inline fun subscribeUntil(valueIfStop: T, noinline listener: suspend (E) -> T): Listener = +suspend inline fun subscribeUntil(valueIfStop: T, noinline listener: suspend E.(E) -> T): Listener = E::class.subscribeUntil(valueIfStop, listener) -suspend inline fun subscribeUntilFalse(noinline listener: suspend (E) -> Boolean): Listener = +suspend inline fun subscribeUntilFalse(noinline listener: suspend E.(E) -> Boolean): Listener = E::class.subscribeUntilFalse(listener) -suspend inline fun subscribeUntilTrue(noinline listener: suspend (E) -> Boolean): Listener = E::class.subscribeUntilTrue(listener) -suspend inline fun subscribeUntilNull(noinline listener: suspend (E) -> Any?): Listener = E::class.subscribeUntilNull(listener) +suspend inline fun subscribeUntilTrue(noinline listener: suspend E.(E) -> Boolean): Listener = + E::class.subscribeUntilTrue(listener) + +suspend inline fun subscribeUntilNull(noinline listener: suspend E.(E) -> Any?): Listener = E::class.subscribeUntilNull(listener) -suspend inline fun subscribeWhile(valueIfContinue: T, noinline listener: suspend (E) -> T): Listener = +suspend inline fun subscribeWhile(valueIfContinue: T, noinline listener: suspend E.(E) -> T): Listener = E::class.subscribeWhile(valueIfContinue, listener) -suspend inline fun subscribeWhileFalse(noinline listener: suspend (E) -> Boolean): Listener = +suspend inline fun subscribeWhileFalse(noinline listener: suspend E.(E) -> Boolean): Listener = E::class.subscribeWhileFalse(listener) -suspend inline fun subscribeWhileTrue(noinline listener: suspend (E) -> Boolean): Listener = E::class.subscribeWhileTrue(listener) -suspend inline fun subscribeWhileNull(noinline listener: suspend (E) -> Any?): Listener = E::class.subscribeWhileNull(listener) +suspend inline fun subscribeWhileTrue(noinline listener: suspend E.(E) -> Boolean): Listener = + E::class.subscribeWhileTrue(listener) + +suspend inline fun subscribeWhileNull(noinline listener: suspend E.(E) -> Any?): Listener = E::class.subscribeWhileNull(listener) // endregion @@ -71,42 +75,42 @@ suspend inline fun subscribeWhileNull(noinline listen // region KClass 的扩展方法 (不推荐) @PublishedApi -internal suspend fun KClass.subscribe(handler: suspend (E) -> ListeningStatus) = this.subscribeInternal(Handler(handler)) +internal suspend fun KClass.subscribe(handler: suspend E.(E) -> ListeningStatus) = this.subscribeInternal(Handler { it.handler(it) }) @PublishedApi -internal suspend fun KClass.subscribeAlways(listener: suspend (E) -> Unit) = - this.subscribeInternal(Handler { listener(it); ListeningStatus.LISTENING }) +internal suspend fun KClass.subscribeAlways(listener: suspend E.(E) -> Unit) = + this.subscribeInternal(Handler { it.listener(it); ListeningStatus.LISTENING }) @PublishedApi -internal suspend fun KClass.subscribeOnce(listener: suspend (E) -> Unit) = - this.subscribeInternal(Handler { listener(it); ListeningStatus.STOPPED }) +internal suspend fun KClass.subscribeOnce(listener: suspend E.(E) -> Unit) = + this.subscribeInternal(Handler { it.listener(it); ListeningStatus.STOPPED }) @PublishedApi -internal suspend fun KClass.subscribeUntil(valueIfStop: T, listener: suspend (E) -> T) = - subscribeInternal(Handler { if (listener(it) == valueIfStop) ListeningStatus.STOPPED else ListeningStatus.LISTENING }) +internal suspend fun KClass.subscribeUntil(valueIfStop: T, listener: suspend E.(E) -> T) = + subscribeInternal(Handler { if (it.listener(it) == valueIfStop) ListeningStatus.STOPPED else ListeningStatus.LISTENING }) @PublishedApi -internal suspend inline fun KClass.subscribeUntilFalse(noinline listener: suspend (E) -> Boolean) = subscribeUntil(false, listener) +internal suspend inline fun KClass.subscribeUntilFalse(noinline listener: suspend E.(E) -> Boolean) = subscribeUntil(false, listener) @PublishedApi -internal suspend inline fun KClass.subscribeUntilTrue(noinline listener: suspend (E) -> Boolean) = subscribeUntil(true, listener) +internal suspend inline fun KClass.subscribeUntilTrue(noinline listener: suspend E.(E) -> Boolean) = subscribeUntil(true, listener) @PublishedApi -internal suspend inline fun KClass.subscribeUntilNull(noinline listener: suspend (E) -> Any?) = subscribeUntil(null, listener) +internal suspend inline fun KClass.subscribeUntilNull(noinline listener: suspend E.(E) -> Any?) = subscribeUntil(null, listener) @PublishedApi -internal suspend fun KClass.subscribeWhile(valueIfContinue: T, listener: suspend (E) -> T) = - subscribeInternal(Handler { if (listener(it) !== valueIfContinue) ListeningStatus.STOPPED else ListeningStatus.LISTENING }) +internal suspend fun KClass.subscribeWhile(valueIfContinue: T, listener: suspend E.(E) -> T) = + subscribeInternal(Handler { if (it.listener(it) !== valueIfContinue) ListeningStatus.STOPPED else ListeningStatus.LISTENING }) @PublishedApi -internal suspend inline fun KClass.subscribeWhileFalse(noinline listener: suspend (E) -> Boolean) = subscribeWhile(false, listener) +internal suspend inline fun KClass.subscribeWhileFalse(noinline listener: suspend E.(E) -> Boolean) = subscribeWhile(false, listener) @PublishedApi -internal suspend inline fun KClass.subscribeWhileTrue(noinline listener: suspend (E) -> Boolean) = subscribeWhile(true, listener) +internal suspend inline fun KClass.subscribeWhileTrue(noinline listener: suspend E.(E) -> Boolean) = subscribeWhile(true, listener) @PublishedApi -internal suspend inline fun KClass.subscribeWhileNull(noinline listener: suspend (E) -> Any?) = subscribeWhile(null, listener) +internal suspend inline fun KClass.subscribeWhileNull(noinline listener: suspend E.(E) -> Any?) = subscribeWhile(null, listener) // endregion @@ -150,29 +154,29 @@ suspend inline fun subscribeAll(noinline listeners: s inline class ListenerBuilder( @PublishedApi internal inline val handlerConsumer: suspend (Listener) -> Unit ) { - suspend inline fun handler(noinline listener: suspend (E) -> ListeningStatus) { - handlerConsumer(Handler(listener)) + suspend inline fun handler(noinline listener: suspend E.(E) -> ListeningStatus) { + handlerConsumer(Handler { it.listener(it) }) } - suspend inline fun always(noinline listener: suspend (E) -> Unit) = handler { listener(it); ListeningStatus.LISTENING } + suspend inline fun always(noinline listener: suspend E.(E) -> Unit) = handler { listener(it); ListeningStatus.LISTENING } - suspend inline fun until(until: T, noinline listener: suspend (E) -> T) = + suspend inline fun until(until: T, noinline listener: suspend E.(E) -> T) = handler { if (listener(it) == until) ListeningStatus.STOPPED else ListeningStatus.LISTENING } - suspend inline fun untilFalse(noinline listener: suspend (E) -> Boolean) = until(false, listener) - suspend inline fun untilTrue(noinline listener: suspend (E) -> Boolean) = until(true, listener) - suspend inline fun untilNull(noinline listener: suspend (E) -> Any?) = until(null, listener) + suspend inline fun untilFalse(noinline listener: suspend E.(E) -> Boolean) = until(false, listener) + suspend inline fun untilTrue(noinline listener: suspend E.(E) -> Boolean) = until(true, listener) + suspend inline fun untilNull(noinline listener: suspend E.(E) -> Any?) = until(null, listener) - suspend inline fun `while`(until: T, noinline listener: suspend (E) -> T) = + suspend inline fun `while`(until: T, noinline listener: suspend E.(E) -> T) = handler { if (listener(it) !== until) ListeningStatus.STOPPED else ListeningStatus.LISTENING } - suspend inline fun whileFalse(noinline listener: suspend (E) -> Boolean) = `while`(false, listener) - suspend inline fun whileTrue(noinline listener: suspend (E) -> Boolean) = `while`(true, listener) - suspend inline fun whileNull(noinline listener: suspend (E) -> Any?) = `while`(null, listener) + suspend inline fun whileFalse(noinline listener: suspend E.(E) -> Boolean) = `while`(false, listener) + suspend inline fun whileTrue(noinline listener: suspend E.(E) -> Boolean) = `while`(true, listener) + suspend inline fun whileNull(noinline listener: suspend E.(E) -> Any?) = `while`(null, listener) - suspend inline fun once(noinline listener: suspend (E) -> Unit) = handler { listener(it); ListeningStatus.STOPPED } + suspend inline fun once(noinline listener: suspend E.(E) -> Unit) = handler { listener(it); ListeningStatus.STOPPED } } @DslMarker