Commit 4d79a699 authored by Him188's avatar Him188

Flatten messages

parent babc2119
...@@ -139,4 +139,4 @@ suspend inline fun <C : Contact> C.sendMessage(message: Message): MessageReceipt ...@@ -139,4 +139,4 @@ suspend inline fun <C : Contact> C.sendMessage(message: Message): MessageReceipt
* @see Contact.sendMessage * @see Contact.sendMessage
*/ */
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
suspend inline fun <C : Contact> C.sendMessage(plain: String): MessageReceipt<C> = sendMessage(plain.toMessage()) as MessageReceipt<C> suspend inline fun <C : Contact> C.sendMessage(plain: String): MessageReceipt<C> = sendMessage(plain.toMessage())
\ No newline at end of file \ No newline at end of file
...@@ -113,11 +113,13 @@ suspend fun <C : Contact> Message.sendTo(contact: C): MessageReceipt<C> { ...@@ -113,11 +113,13 @@ suspend fun <C : Contact> Message.sendTo(contact: C): MessageReceipt<C> {
return contact.sendMessage(this) return contact.sendMessage(this)
} }
interface SingleMessage : Message
/** /**
* 消息元数据, 即不含内容的元素. * 消息元数据, 即不含内容的元素.
* 包括: [MessageSource] * 包括: [MessageSource]
*/ */
interface MessageMetadata : Message { interface MessageMetadata : SingleMessage {
/* /*
fun iterator(): Iterator<Message> { fun iterator(): Iterator<Message> {
return object : Iterator<Message> { return object : Iterator<Message> {
...@@ -134,7 +136,7 @@ interface MessageMetadata : Message { ...@@ -134,7 +136,7 @@ interface MessageMetadata : Message {
/** /**
* 消息内容 * 消息内容
*/ */
interface MessageContent : Message interface MessageContent : SingleMessage
/** /**
* 将 [this] 发送给指定联系人 * 将 [this] 发送给指定联系人
......
...@@ -27,7 +27,7 @@ import kotlin.reflect.KProperty ...@@ -27,7 +27,7 @@ import kotlin.reflect.KProperty
* *
* @see buildMessageChain 构造一个 [MessageChain] * @see buildMessageChain 构造一个 [MessageChain]
*/ */
interface MessageChain : Message, Iterable<Message> { interface MessageChain : Message, Iterable<SingleMessage> {
override operator fun contains(sub: String): Boolean override operator fun contains(sub: String): Boolean
override fun toString(): String override fun toString(): String
...@@ -78,7 +78,7 @@ fun MessageChain(): MessageChain = EmptyMessageChain ...@@ -78,7 +78,7 @@ fun MessageChain(): MessageChain = EmptyMessageChain
@Suppress("FunctionName") @Suppress("FunctionName")
fun MessageChain(vararg messages: Message): MessageChain = fun MessageChain(vararg messages: Message): MessageChain =
if (messages.isEmpty()) EmptyMessageChain if (messages.isEmpty()) EmptyMessageChain
else MessageChainImpl(messages.toMutableList()) else MessageChainImpl(messages.asSequence().flatten())
/** /**
* 构造 [MessageChain] 的快速途径 (无 [Array] 创建) * 构造 [MessageChain] 的快速途径 (无 [Array] 创建)
...@@ -88,7 +88,10 @@ fun MessageChain(vararg messages: Message): MessageChain = ...@@ -88,7 +88,10 @@ fun MessageChain(vararg messages: Message): MessageChain =
@JsName("newChain") @JsName("newChain")
@Suppress("FunctionName") @Suppress("FunctionName")
fun MessageChain(message: Message): MessageChain = fun MessageChain(message: Message): MessageChain =
SingleMessageChainImpl(message) when (message) {
is SingleMessage -> SingleMessageChainImpl(message)
else -> MessageChainImpl(message.flatten().asIterable())
}
/** /**
* 构造 [MessageChain] * 构造 [MessageChain]
...@@ -97,7 +100,7 @@ fun MessageChain(message: Message): MessageChain = ...@@ -97,7 +100,7 @@ fun MessageChain(message: Message): MessageChain =
@JsName("newChain") @JsName("newChain")
@Suppress("FunctionName") @Suppress("FunctionName")
fun MessageChain(messages: Iterable<Message>): MessageChain = fun MessageChain(messages: Iterable<Message>): MessageChain =
MessageChainImpl(messages.toList()) MessageChainImpl(messages.flatten().asIterable())
/** /**
* 构造 [MessageChain] * 构造 [MessageChain]
...@@ -106,7 +109,7 @@ fun MessageChain(messages: Iterable<Message>): MessageChain = ...@@ -106,7 +109,7 @@ fun MessageChain(messages: Iterable<Message>): MessageChain =
@JsName("newChain") @JsName("newChain")
@Suppress("FunctionName") @Suppress("FunctionName")
fun MessageChain(messages: List<Message>): MessageChain = fun MessageChain(messages: List<Message>): MessageChain =
MessageChainImpl(messages) MessageChainImpl(messages.flatten().asIterable())
/** /**
...@@ -114,20 +117,34 @@ fun MessageChain(messages: List<Message>): MessageChain = ...@@ -114,20 +117,34 @@ fun MessageChain(messages: List<Message>): MessageChain =
* 若 [this] 为 [MessageChain] 将直接返回 this * 若 [this] 为 [MessageChain] 将直接返回 this
* 否则将调用 [MessageChain] 构造一个 [MessageChainImpl] * 否则将调用 [MessageChain] 构造一个 [MessageChainImpl]
*/ */
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE", "UNCHECKED_CAST")
@JvmSynthetic @JvmSynthetic
fun Message.toChain(): MessageChain = when (this) { fun Message.toChain(): MessageChain = when (this) {
is MessageChain -> this is MessageChain -> this
is CombinedMessage -> MessageChainImpl(this) is CombinedMessage -> MessageChainImpl((this as Iterable<Message>).flatten().asIterable())
else -> SingleMessageChainImpl(this) else -> SingleMessageChainImpl(this as SingleMessage)
} }
/** @JvmName("asMessageChain1")
* 构造 [MessageChain] @JvmSynthetic
*/ @Suppress("unused", "NOTHING_TO_INLINE")
fun Iterable<SingleMessage>.asMessageChain(): MessageChain = MessageChainImpl(this)
@JvmSynthetic @JvmSynthetic
@Suppress("unused", "NOTHING_TO_INLINE") @Suppress("unused", "NOTHING_TO_INLINE")
fun Iterable<Message>.asMessageChain(): MessageChain = MessageChainImpl(this) fun Iterable<Message>.asMessageChain(): MessageChain = MessageChainImpl(this.flatten())
fun Iterable<Message>.flatten(): Sequence<SingleMessage> = asSequence().flatten()
fun Sequence<Message>.flatten(): Sequence<SingleMessage> = flatMap { it.flatten() }
fun Message.flatten(): Sequence<SingleMessage> {
return when (this) {
is MessageChain -> this.asSequence()
is CombinedMessage -> this.asSequence().flatten()
else -> sequenceOf(this as SingleMessage)
}
}
/** /**
* 获取第一个 [M] 类型的 [Message] 实例 * 获取第一个 [M] 类型的 [Message] 实例
...@@ -174,9 +191,7 @@ fun <M : Message> MessageChain.first(key: Message.Key<M>): M = firstOrNull(key) ...@@ -174,9 +191,7 @@ fun <M : Message> MessageChain.first(key: Message.Key<M>): M = firstOrNull(key)
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
fun <M : Message> MessageChain.any(key: Message.Key<M>): Boolean = firstOrNull(key) != null fun <M : Message> MessageChain.any(key: Message.Key<M>): Boolean = firstOrNull(key) != null
object EmptyMessageChain : MessageChain by { object EmptyMessageChain : MessageChain by MessageChainImpl(emptyList())
MessageChainImpl(emptyList())
}()
/** /**
* Null 的 [MessageChain]. * Null 的 [MessageChain].
...@@ -188,21 +203,23 @@ object NullMessageChain : MessageChain { ...@@ -188,21 +203,23 @@ object NullMessageChain : MessageChain {
override fun toString(): String = "null" override fun toString(): String = "null"
override fun contains(sub: String): Boolean = error("accessing NullMessageChain") override fun contains(sub: String): Boolean = error("accessing NullMessageChain")
override fun followedBy(tail: Message): CombinedMessage = CombinedMessage(left = EmptyMessageChain, element = tail) override fun followedBy(tail: Message): CombinedMessage = CombinedMessage(left = EmptyMessageChain, element = tail)
override fun iterator(): MutableIterator<Message> = error("accessing NullMessageChain") override fun iterator(): MutableIterator<SingleMessage> = error("accessing NullMessageChain")
} }
@PublishedApi @PublishedApi
internal class MessageChainImpl constructor( internal class MessageChainImpl constructor(
private val delegate: Iterable<Message> private val delegate: Iterable<SingleMessage>
) : Message, Iterable<Message> by delegate, MessageChain { ) : Message, Iterable<SingleMessage> by delegate, MessageChain {
constructor(delegate: Sequence<SingleMessage>) : this(delegate.asIterable())
override fun toString(): String = this.delegate.joinToString("") { it.toString() } override fun toString(): String = this.delegate.joinToString("") { it.toString() }
override operator fun contains(sub: String): Boolean = delegate.any { it.contains(sub) } override operator fun contains(sub: String): Boolean = delegate.any { it.contains(sub) }
} }
@PublishedApi @PublishedApi
internal class SingleMessageChainImpl constructor( internal class SingleMessageChainImpl constructor(
private val delegate: Message private val delegate: SingleMessage
) : Message, Iterable<Message> by listOf(delegate), MessageChain { ) : Message, Iterable<SingleMessage> by listOf(delegate), MessageChain {
override fun toString(): String = this.delegate.toString() override fun toString(): String = this.delegate.toString()
override operator fun contains(sub: String): Boolean = sub in delegate override operator fun contains(sub: String): Boolean = sub in delegate
......
...@@ -56,6 +56,7 @@ internal class LockFreeLinkedListTest { ...@@ -56,6 +56,7 @@ internal class LockFreeLinkedListTest {
//} //}
} }
@Suppress("UNREACHABLE_CODE", "DeferredResultUnused")
@Test @Test
fun `so many concurrent add remove and foreach`() = runBlocking { fun `so many concurrent add remove and foreach`() = runBlocking {
return@runBlocking // 测试通过了, 加快速度. 因为 kotlin 一些其他 bug return@runBlocking // 测试通过了, 加快速度. 因为 kotlin 一些其他 bug
......
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