From 51e98ef62d3ac5d896014af5b28c6bad5cccc15f Mon Sep 17 00:00:00 2001
From: Him188 <Him188@mamoe.net>
Date: Sun, 1 Mar 2020 14:37:24 +0800
Subject: [PATCH] Improve iteration performance

---
 .../message/data/CombinedMessage.kt              | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CombinedMessage.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CombinedMessage.kt
index c29b85149..f632f790b 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CombinedMessage.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/CombinedMessage.kt
@@ -16,6 +16,10 @@ import kotlin.jvm.JvmMultifileClass
 import kotlin.jvm.JvmName
 
 /**
+ * 链接的两个消息.
+ *
+ * @see Message.plus
+ *
  * Left-biased list
  */
 class CombinedMessage(
@@ -27,11 +31,19 @@ class CombinedMessage(
     private suspend fun SequenceScope<Message>.yieldCombinedOrElements(message: Message) {
         when (message) {
             is CombinedMessage -> {
+                // fast path, 避免创建新的 iterator, 也不会挂起协程
                 yieldCombinedOrElements(message.element)
                 yieldCombinedOrElements(message.left)
             }
-            is MessageChain -> message.forEach { yieldCombinedOrElements(it) }
-            else -> yield(message)
+            is MessageChain -> {
+                // 更好的性能, 因为协程不会挂起.
+                // 这可能会导致爆栈 (十万个元素), 但作为消息序列足够了.
+                message.forEach { yieldCombinedOrElements(it) }
+            }
+            else -> {
+                check(message is SingleMessage) { "unsupported Message type. DO NOT CREATE YOUR OWN Message TYPE!" }
+                yield(message)
+            }
         }
     }