From ed5a52859a05c5a8672d233055271eb19ddd4ffb Mon Sep 17 00:00:00 2001 From: Him188 Date: Sun, 5 Apr 2020 17:48:15 +0800 Subject: [PATCH] Reduce duplication --- .../message/data/MessageChain.kt | 67 +++++++++---------- 1 file changed, 33 insertions(+), 34 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 b7f84fb4b..245bfda1c 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 @@ -439,52 +439,51 @@ object NullMessageChain : MessageChain { // region implementations -@Suppress("DuplicatedCode") // we don't have pattern matching @OptIn(MiraiExperimentalAPI::class) internal fun Sequence.constrainSingleMessages(): List { - val list = ArrayList(4) - val singleList = ArrayList?>(4) - - for (singleMessage in this) { - if (singleMessage is ConstrainSingle<*>) { - val key = singleMessage.key - val index = singleList.indexOf(key) - if (index != -1) { - list[index] = singleMessage - continue - } else { - singleList.add(list.size, key) - } - } - list.add(singleMessage) + val iterator = this.iterator() + return constrainSingleMessagesImpl supplier@{ + if (iterator.hasNext()) { + iterator.next() + } else null } - return list } -@Suppress("DuplicatedCode") // we don't have pattern matching -@OptIn(MiraiExperimentalAPI::class) -internal fun Iterable.constrainSingleMessages(): List { +@MiraiExperimentalAPI +internal inline fun constrainSingleMessagesImpl(iterator: () -> SingleMessage?): ArrayList { val list = ArrayList() - var firstConstrainIndex = -1 - for (singleMessage in this) { - if (singleMessage is ConstrainSingle<*>) { - if (firstConstrainIndex == -1) { - firstConstrainIndex = list.size // we are going to add one - } else { - val key = singleMessage.key - val index = list.indexOfFirst(firstConstrainIndex) { it is ConstrainSingle<*> && it.key == key } - if (index != -1) { - list[index] = singleMessage - continue + var next: SingleMessage? + do { + next = iterator() + next?.let { singleMessage -> + if (singleMessage is ConstrainSingle<*>) { + if (firstConstrainIndex == -1) { + firstConstrainIndex = list.size // we are going to add one + } else { + val key = singleMessage.key + val index = list.indexOfFirst(firstConstrainIndex) { it is ConstrainSingle<*> && it.key == key } + if (index != -1) { + list[index] = singleMessage + return@let + } } } - } - list.add(singleMessage) + list.add(singleMessage) + } ?: return list + } while (true) +} + +@OptIn(MiraiExperimentalAPI::class) +internal fun Iterable.constrainSingleMessages(): List { + val iterator = this.iterator() + return constrainSingleMessagesImpl supplier@{ + if (iterator.hasNext()) { + iterator.next() + } else null } - return list } internal inline fun List.indexOfFirst(offset: Int, predicate: (T) -> Boolean): Int {