Commit ac263579 authored by Him188's avatar Him188

Fix ambiguous CombinedMessage

parent 7443e2ae
...@@ -24,7 +24,7 @@ import kotlin.jvm.JvmName ...@@ -24,7 +24,7 @@ import kotlin.jvm.JvmName
*/ */
class CombinedMessage( class CombinedMessage(
val left: Message, val left: Message,
val element: Message val tail: Message
) : Iterable<Message>, Message { ) : Iterable<Message>, Message {
// 不要把它用作 local function, 会编译错误 // 不要把它用作 local function, 会编译错误
...@@ -32,16 +32,26 @@ class CombinedMessage( ...@@ -32,16 +32,26 @@ class CombinedMessage(
when (message) { when (message) {
is CombinedMessage -> { is CombinedMessage -> {
// fast path, 避免创建新的 iterator, 也不会挂起协程 // fast path, 避免创建新的 iterator, 也不会挂起协程
yieldCombinedOrElements(message.element)
yieldCombinedOrElements(message.left) yieldCombinedOrElements(message.left)
yieldCombinedOrElements(message.tail)
} }
is MessageChain -> { is Iterable<*> -> {
// 更好的性能, 因为协程不会挂起. // 更好的性能, 因为协程不会挂起.
// 这可能会导致爆栈 (十万个元素), 但作为消息序列足够了. // 这可能会导致爆栈 (十万个元素), 但作为消息序列足够了.
message.forEach { yieldCombinedOrElements(it) } message.forEach {
yieldCombinedOrElements(
it as? Message ?: error(
"A Message implementing Iterable must implement Iterable<Message>, " +
"whereas got ${it!!::class.simpleName}"
)
)
}
} }
else -> { else -> {
check(message is SingleMessage) { "unsupported Message type. DO NOT CREATE YOUR OWN Message TYPE!" } check(message is SingleMessage) {
"unsupported Message type. " +
"A Message must be a CombinedMessage, a Iterable<Message> or a SingleMessage"
}
yield(message) yield(message)
} }
} }
...@@ -56,10 +66,10 @@ class CombinedMessage( ...@@ -56,10 +66,10 @@ class CombinedMessage(
} }
override fun toString(): String { override fun toString(): String {
return element.toString() + left.toString() return tail.toString() + left.toString()
} }
fun isFlat(): Boolean { fun isFlat(): Boolean {
return element is SingleMessage && left is SingleMessage return tail is SingleMessage && left is SingleMessage
} }
} }
\ No newline at end of file
...@@ -95,7 +95,7 @@ interface Message { ...@@ -95,7 +95,7 @@ interface Message {
*/ */
@JvmSynthetic // in java they should use `plus` instead @JvmSynthetic // in java they should use `plus` instead
fun followedBy(tail: Message): CombinedMessage { fun followedBy(tail: Message): CombinedMessage {
return CombinedMessage(tail, this) return CombinedMessage(left = this, tail = tail)
} }
/** /**
...@@ -110,6 +110,9 @@ interface Message { ...@@ -110,6 +110,9 @@ interface Message {
operator fun plus(another: Message): CombinedMessage = this.followedBy(another) operator fun plus(another: Message): CombinedMessage = this.followedBy(another)
// avoid resolution ambiguity
operator fun plus(another: SingleMessage): CombinedMessage = this.followedBy(another)
operator fun plus(another: String): CombinedMessage = this.followedBy(another.toMessage()) operator fun plus(another: String): CombinedMessage = this.followedBy(another.toMessage())
// `+ ""` will be resolved to `plus(String)` instead of `plus(CharSeq)` // `+ ""` will be resolved to `plus(String)` instead of `plus(CharSeq)`
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment