mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-13 14:50:43 +08:00
Add receiver E
This commit is contained in:
parent
1675387cb6
commit
e2bd8b2044
@ -40,30 +40,34 @@ inline class ListeningStatus(inline val listening: Boolean) {
|
|||||||
* 将以当前协程的 job 为父 job 启动监听, 因此, 当当前协程运行结束后, 监听也会结束.
|
* 将以当前协程的 job 为父 job 启动监听, 因此, 当当前协程运行结束后, 监听也会结束.
|
||||||
* [handler] 将会有当前协程上下文执行, 即会被调用 [subscribe] 时的协程调度器执行
|
* [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)
|
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)
|
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> subscribeUntilTrue(noinline listener: suspend E.(E) -> Boolean): Listener<E> =
|
||||||
suspend inline fun <reified E : Subscribable> subscribeUntilNull(noinline listener: suspend (E) -> Any?): Listener<E> = E::class.subscribeUntilNull(listener)
|
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)
|
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)
|
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> subscribeWhileTrue(noinline listener: suspend E.(E) -> Boolean): Listener<E> =
|
||||||
suspend inline fun <reified E : Subscribable> subscribeWhileNull(noinline listener: suspend (E) -> Any?): Listener<E> = E::class.subscribeWhileNull(listener)
|
E::class.subscribeWhileTrue(listener)
|
||||||
|
|
||||||
|
suspend inline fun <reified E : Subscribable> subscribeWhileNull(noinline listener: suspend E.(E) -> Any?): Listener<E> = E::class.subscribeWhileNull(listener)
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
@ -71,42 +75,42 @@ suspend inline fun <reified E : Subscribable> subscribeWhileNull(noinline listen
|
|||||||
// region KClass 的扩展方法 (不推荐)
|
// region KClass 的扩展方法 (不推荐)
|
||||||
|
|
||||||
@PublishedApi
|
@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
|
@PublishedApi
|
||||||
internal suspend fun <E : Subscribable> KClass<E>.subscribeAlways(listener: suspend (E) -> Unit) =
|
internal suspend fun <E : Subscribable> KClass<E>.subscribeAlways(listener: suspend E.(E) -> Unit) =
|
||||||
this.subscribeInternal(Handler { listener(it); ListeningStatus.LISTENING })
|
this.subscribeInternal(Handler { it.listener(it); ListeningStatus.LISTENING })
|
||||||
|
|
||||||
@PublishedApi
|
@PublishedApi
|
||||||
internal suspend fun <E : Subscribable> KClass<E>.subscribeOnce(listener: suspend (E) -> Unit) =
|
internal suspend fun <E : Subscribable> KClass<E>.subscribeOnce(listener: suspend E.(E) -> Unit) =
|
||||||
this.subscribeInternal(Handler { listener(it); ListeningStatus.STOPPED })
|
this.subscribeInternal(Handler { it.listener(it); ListeningStatus.STOPPED })
|
||||||
|
|
||||||
@PublishedApi
|
@PublishedApi
|
||||||
internal suspend fun <E : Subscribable, T> KClass<E>.subscribeUntil(valueIfStop: T, listener: suspend (E) -> T) =
|
internal suspend fun <E : Subscribable, T> KClass<E>.subscribeUntil(valueIfStop: T, listener: suspend E.(E) -> T) =
|
||||||
subscribeInternal(Handler { if (listener(it) == valueIfStop) ListeningStatus.STOPPED else ListeningStatus.LISTENING })
|
subscribeInternal(Handler { if (it.listener(it) == valueIfStop) ListeningStatus.STOPPED else ListeningStatus.LISTENING })
|
||||||
|
|
||||||
@PublishedApi
|
@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
|
@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
|
@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
|
@PublishedApi
|
||||||
internal suspend fun <E : Subscribable, T> KClass<E>.subscribeWhile(valueIfContinue: T, listener: suspend (E) -> T) =
|
internal suspend fun <E : Subscribable, T> KClass<E>.subscribeWhile(valueIfContinue: T, listener: suspend E.(E) -> T) =
|
||||||
subscribeInternal(Handler { if (listener(it) !== valueIfContinue) ListeningStatus.STOPPED else ListeningStatus.LISTENING })
|
subscribeInternal(Handler { if (it.listener(it) !== valueIfContinue) ListeningStatus.STOPPED else ListeningStatus.LISTENING })
|
||||||
|
|
||||||
@PublishedApi
|
@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
|
@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
|
@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
|
// endregion
|
||||||
|
|
||||||
@ -150,29 +154,29 @@ suspend inline fun <reified E : Subscribable> subscribeAll(noinline listeners: s
|
|||||||
inline class ListenerBuilder<out E : Subscribable>(
|
inline class ListenerBuilder<out E : Subscribable>(
|
||||||
@PublishedApi internal inline val handlerConsumer: suspend (Listener<E>) -> Unit
|
@PublishedApi internal inline val handlerConsumer: suspend (Listener<E>) -> Unit
|
||||||
) {
|
) {
|
||||||
suspend inline fun handler(noinline listener: suspend (E) -> ListeningStatus) {
|
suspend inline fun handler(noinline listener: suspend E.(E) -> ListeningStatus) {
|
||||||
handlerConsumer(Handler(listener))
|
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 }
|
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 untilFalse(noinline listener: suspend E.(E) -> Boolean) = until(false, listener)
|
||||||
suspend inline fun untilTrue(noinline listener: suspend (E) -> Boolean) = until(true, listener)
|
suspend inline fun untilTrue(noinline listener: suspend E.(E) -> Boolean) = until(true, listener)
|
||||||
suspend inline fun untilNull(noinline listener: suspend (E) -> Any?) = until(null, 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 }
|
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 whileFalse(noinline listener: suspend E.(E) -> Boolean) = `while`(false, listener)
|
||||||
suspend inline fun whileTrue(noinline listener: suspend (E) -> Boolean) = `while`(true, listener)
|
suspend inline fun whileTrue(noinline listener: suspend E.(E) -> Boolean) = `while`(true, listener)
|
||||||
suspend inline fun whileNull(noinline listener: suspend (E) -> Any?) = `while`(null, 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
|
@DslMarker
|
||||||
|
Loading…
Reference in New Issue
Block a user