Him188 6 лет назад
Родитель
Сommit
e2bd8b2044
1 измененных файлов с 42 добавлено и 38 удалено
  1. 42 38
      mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Subscribers.kt

+ 42 - 38
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 <reified E : Subscribable> subscribe(noinline handler: suspend (E) -> ListeningStatus): Listener<E> = E::class.subscribe(handler)
+suspend inline fun <reified E : Subscribable> subscribe(noinline handler: suspend E.(E) -> ListeningStatus): Listener<E> = E::class.subscribe(handler)
 
-suspend inline fun <reified E : Subscribable> subscribeAlways(noinline listener: suspend (E) -> Unit): Listener<E> = E::class.subscribeAlways(listener)
+suspend inline fun <reified E : Subscribable> subscribeAlways(noinline listener: suspend E.(E) -> Unit): Listener<E> = E::class.subscribeAlways(listener)
 
-suspend inline fun <reified E : Subscribable> subscribeOnce(noinline listener: suspend (E) -> Unit): Listener<E> = E::class.subscribeOnce(listener)
+suspend inline fun <reified E : Subscribable> subscribeOnce(noinline listener: suspend E.(E) -> Unit): Listener<E> = E::class.subscribeOnce(listener)
 
-suspend inline fun <reified E : Subscribable, T> subscribeUntil(valueIfStop: T, noinline listener: suspend (E) -> T): Listener<E> =
+suspend inline fun <reified E : Subscribable, T> subscribeUntil(valueIfStop: T, noinline listener: suspend E.(E) -> T): Listener<E> =
     E::class.subscribeUntil(valueIfStop, listener)
 
-suspend inline fun <reified E : Subscribable> subscribeUntilFalse(noinline listener: suspend (E) -> Boolean): Listener<E> =
+suspend inline fun <reified E : Subscribable> subscribeUntilFalse(noinline listener: suspend E.(E) -> Boolean): Listener<E> =
     E::class.subscribeUntilFalse(listener)
 
-suspend inline fun <reified E : Subscribable> subscribeUntilTrue(noinline listener: suspend (E) -> Boolean): Listener<E> = E::class.subscribeUntilTrue(listener)
-suspend inline fun <reified E : Subscribable> subscribeUntilNull(noinline listener: suspend (E) -> Any?): Listener<E> = E::class.subscribeUntilNull(listener)
+suspend inline fun <reified E : Subscribable> subscribeUntilTrue(noinline listener: suspend E.(E) -> Boolean): Listener<E> =
+    E::class.subscribeUntilTrue(listener)
 
+suspend inline fun <reified E : Subscribable> subscribeUntilNull(noinline listener: suspend E.(E) -> Any?): Listener<E> = E::class.subscribeUntilNull(listener)
 
-suspend inline fun <reified E : Subscribable, T> subscribeWhile(valueIfContinue: T, noinline listener: suspend (E) -> T): Listener<E> =
+
+suspend inline fun <reified E : Subscribable, T> subscribeWhile(valueIfContinue: T, noinline listener: suspend E.(E) -> T): Listener<E> =
     E::class.subscribeWhile(valueIfContinue, listener)
 
-suspend inline fun <reified E : Subscribable> subscribeWhileFalse(noinline listener: suspend (E) -> Boolean): Listener<E> =
+suspend inline fun <reified E : Subscribable> subscribeWhileFalse(noinline listener: suspend E.(E) -> Boolean): Listener<E> =
     E::class.subscribeWhileFalse(listener)
 
-suspend inline fun <reified E : Subscribable> subscribeWhileTrue(noinline listener: suspend (E) -> Boolean): Listener<E> = E::class.subscribeWhileTrue(listener)
-suspend inline fun <reified E : Subscribable> subscribeWhileNull(noinline listener: suspend (E) -> Any?): Listener<E> = E::class.subscribeWhileNull(listener)
+suspend inline fun <reified E : Subscribable> subscribeWhileTrue(noinline listener: suspend E.(E) -> Boolean): Listener<E> =
+    E::class.subscribeWhileTrue(listener)
+
+suspend inline fun <reified E : Subscribable> subscribeWhileNull(noinline listener: suspend E.(E) -> Any?): Listener<E> = E::class.subscribeWhileNull(listener)
 
 // endregion
 
@@ -71,42 +75,42 @@ suspend inline fun <reified E : Subscribable> subscribeWhileNull(noinline listen
 // region KClass 的扩展方法 (不推荐)
 
 @PublishedApi
-internal suspend fun <E : Subscribable> KClass<E>.subscribe(handler: suspend (E) -> ListeningStatus) = this.subscribeInternal(Handler(handler))
+internal suspend fun <E : Subscribable> KClass<E>.subscribe(handler: suspend E.(E) -> ListeningStatus) = this.subscribeInternal(Handler { it.handler(it) })
 
 @PublishedApi
-internal suspend fun <E : Subscribable> KClass<E>.subscribeAlways(listener: suspend (E) -> Unit) =
-    this.subscribeInternal(Handler { listener(it); ListeningStatus.LISTENING })
+internal suspend fun <E : Subscribable> KClass<E>.subscribeAlways(listener: suspend E.(E) -> Unit) =
+    this.subscribeInternal(Handler { it.listener(it); ListeningStatus.LISTENING })
 
 @PublishedApi
-internal suspend fun <E : Subscribable> KClass<E>.subscribeOnce(listener: suspend (E) -> Unit) =
-    this.subscribeInternal(Handler { listener(it); ListeningStatus.STOPPED })
+internal suspend fun <E : Subscribable> KClass<E>.subscribeOnce(listener: suspend E.(E) -> Unit) =
+    this.subscribeInternal(Handler { it.listener(it); ListeningStatus.STOPPED })
 
 @PublishedApi
-internal suspend fun <E : Subscribable, T> KClass<E>.subscribeUntil(valueIfStop: T, listener: suspend (E) -> T) =
-    subscribeInternal(Handler { if (listener(it) == valueIfStop) ListeningStatus.STOPPED else ListeningStatus.LISTENING })
+internal suspend fun <E : Subscribable, T> KClass<E>.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 <E : Subscribable> KClass<E>.subscribeUntilFalse(noinline listener: suspend (E) -> Boolean) = subscribeUntil(false, listener)
+internal suspend inline fun <E : Subscribable> KClass<E>.subscribeUntilFalse(noinline listener: suspend E.(E) -> Boolean) = subscribeUntil(false, listener)
 
 @PublishedApi
-internal suspend inline fun <E : Subscribable> KClass<E>.subscribeUntilTrue(noinline listener: suspend (E) -> Boolean) = subscribeUntil(true, listener)
+internal suspend inline fun <E : Subscribable> KClass<E>.subscribeUntilTrue(noinline listener: suspend E.(E) -> Boolean) = subscribeUntil(true, listener)
 
 @PublishedApi
-internal suspend inline fun <E : Subscribable> KClass<E>.subscribeUntilNull(noinline listener: suspend (E) -> Any?) = subscribeUntil(null, listener)
+internal suspend inline fun <E : Subscribable> KClass<E>.subscribeUntilNull(noinline listener: suspend E.(E) -> Any?) = subscribeUntil(null, listener)
 
 
 @PublishedApi
-internal suspend fun <E : Subscribable, T> KClass<E>.subscribeWhile(valueIfContinue: T, listener: suspend (E) -> T) =
-    subscribeInternal(Handler { if (listener(it) !== valueIfContinue) ListeningStatus.STOPPED else ListeningStatus.LISTENING })
+internal suspend fun <E : Subscribable, T> KClass<E>.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 <E : Subscribable> KClass<E>.subscribeWhileFalse(noinline listener: suspend (E) -> Boolean) = subscribeWhile(false, listener)
+internal suspend inline fun <E : Subscribable> KClass<E>.subscribeWhileFalse(noinline listener: suspend E.(E) -> Boolean) = subscribeWhile(false, listener)
 
 @PublishedApi
-internal suspend inline fun <E : Subscribable> KClass<E>.subscribeWhileTrue(noinline listener: suspend (E) -> Boolean) = subscribeWhile(true, listener)
+internal suspend inline fun <E : Subscribable> KClass<E>.subscribeWhileTrue(noinline listener: suspend E.(E) -> Boolean) = subscribeWhile(true, listener)
 
 @PublishedApi
-internal suspend inline fun <E : Subscribable> KClass<E>.subscribeWhileNull(noinline listener: suspend (E) -> Any?) = subscribeWhile(null, listener)
+internal suspend inline fun <E : Subscribable> KClass<E>.subscribeWhileNull(noinline listener: suspend E.(E) -> Any?) = subscribeWhile(null, listener)
 
 // endregion
 
@@ -150,29 +154,29 @@ suspend inline fun <reified E : Subscribable> subscribeAll(noinline listeners: s
 inline class ListenerBuilder<out E : Subscribable>(
     @PublishedApi internal inline val handlerConsumer: suspend (Listener<E>) -> 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 <T> until(until: T, noinline listener: suspend (E) -> T) =
+    suspend inline fun <T> 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 <T> `while`(until: T, noinline listener: suspend (E) -> T) =
+    suspend inline fun <T> `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