From aa553ebb75090934ca3594745a0bffd30d97dbbf Mon Sep 17 00:00:00 2001 From: Him188 Date: Sun, 29 Mar 2020 02:33:49 +0800 Subject: [PATCH] Add `MessageChain.size` --- .../message/data/MessageChain.kt | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt index 6aad7bbd9..c31a8d3cd 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt @@ -16,6 +16,7 @@ package net.mamoe.mirai.message.data import net.mamoe.mirai.message.data.NullMessageChain.equals import net.mamoe.mirai.message.data.NullMessageChain.toString import net.mamoe.mirai.utils.MiraiInternalAPI +import net.mamoe.mirai.utils.SinceMirai import kotlin.js.JsName import kotlin.jvm.JvmMultifileClass import kotlin.jvm.JvmName @@ -45,6 +46,12 @@ interface MessageChain : Message, Iterable { override operator fun contains(sub: String): Boolean override fun toString(): String + /** + * 元素数量 + */ + @SinceMirai("0.31.1") + val size: Int + /** * 获取第一个类型为 [key] 的 [Message] 实例 * @@ -374,7 +381,6 @@ inline fun MessageChain.flatten(): Sequence = this.asSequence() / // endregion converters -// region implementations /** * 不含任何元素的 [MessageChain] @@ -389,19 +395,25 @@ object EmptyMessageChain : MessageChain by MessageChainImplByIterable(emptyList( */ object NullMessageChain : MessageChain { override fun toString(): String = "NullMessageChain" + override val size: Int get() = 0 override fun equals(other: Any?): Boolean = other === this override fun contains(sub: String): Boolean = error("accessing NullMessageChain") override fun followedBy(tail: Message): CombinedMessage = CombinedMessage(left = EmptyMessageChain, tail = tail) override fun iterator(): MutableIterator = error("accessing NullMessageChain") } + +// region implementations + + /** * 使用 [Iterable] 作为委托的 [MessageChain] */ @PublishedApi -internal inline class MessageChainImplByIterable constructor( +internal class MessageChainImplByIterable constructor( private val delegate: Iterable ) : Message, Iterable, MessageChain { + override val size: Int by lazy { delegate.count() } override fun iterator(): Iterator = delegate.iterator() override fun toString(): String = this.delegate.joinToString("") { it.toString() } override operator fun contains(sub: String): Boolean = delegate.any { it.contains(sub) } @@ -411,9 +423,10 @@ internal inline class MessageChainImplByIterable constructor( * 使用 [Collection] 作为委托的 [MessageChain] */ @PublishedApi -internal inline class MessageChainImplByCollection constructor( +internal class MessageChainImplByCollection constructor( private val delegate: Collection ) : Message, Iterable, MessageChain { + override val size: Int get() = delegate.size override fun iterator(): Iterator = delegate.iterator() override fun toString(): String = this.delegate.joinToString("") { it.toString() } override operator fun contains(sub: String): Boolean = delegate.any { it.contains(sub) } @@ -426,11 +439,12 @@ internal inline class MessageChainImplByCollection constructor( internal class MessageChainImplBySequence constructor( delegate: Sequence ) : Message, Iterable, MessageChain { + override val size: Int by lazy { collected.size } + /** * [Sequence] 可能只能消耗一遍, 因此需要先转为 [List] */ private val collected: List by lazy { delegate.toList() } - override fun iterator(): Iterator = collected.iterator() override fun toString(): String = this.collected.joinToString("") { it.toString() } override operator fun contains(sub: String): Boolean = collected.any { it.contains(sub) } @@ -440,9 +454,10 @@ internal class MessageChainImplBySequence constructor( * 单个 [SingleMessage] 作为 [MessageChain] */ @PublishedApi -internal inline class SingleMessageChainImpl constructor( +internal class SingleMessageChainImpl constructor( private val delegate: SingleMessage ) : Message, Iterable, MessageChain { + override val size: Int get() = 1 override fun toString(): String = this.delegate.toString() override fun iterator(): Iterator = iterator { yield(delegate) } override operator fun contains(sub: String): Boolean = sub in delegate