Commit ca212ca7 authored by Him188's avatar Him188

Rename the connecting function from concat to followed by

parent 84a9e51c
...@@ -93,14 +93,22 @@ interface Message { ...@@ -93,14 +93,22 @@ interface Message {
* println(c)// "Hello world!" * println(c)// "Hello world!"
* ``` * ```
*/ */
fun concat(tail: Message): MessageChain = fun followedBy(tail: Message): MessageChain {
if (tail is MessageChain) tail.concat(this)/*MessageChainImpl(this).also { tail.forEach { child -> it.concat(child) } }*/ require(tail !is SingleOnly) { "SingleOnly Message cannot follow another message" }
require(this !is SingleOnly) { "SingleOnly Message cannot be followed" }
return if (tail is MessageChain) tail.followedBy(this)/*MessageChainImpl(this).also { tail.forEach { child -> it.concat(child) } }*/
else MessageChainImpl(this, tail) else MessageChainImpl(this, tail)
}
operator fun plus(another: Message): MessageChain = this.concat(another) operator fun plus(another: Message): MessageChain = this.followedBy(another)
operator fun plus(another: String): MessageChain = this.concat(another.toMessage()) operator fun plus(another: String): MessageChain = this.followedBy(another.toMessage())
} }
/**
* 表示这个 [Message] 仅能单个存在, 无法被连接.
*/
interface SingleOnly : Message
/** /**
* 将 [this] 发送给指定联系人 * 将 [this] 发送给指定联系人
*/ */
......
...@@ -22,11 +22,11 @@ interface MessageChain : Message, MutableList<Message> { ...@@ -22,11 +22,11 @@ interface MessageChain : Message, MutableList<Message> {
override val stringValue: String override val stringValue: String
override operator fun contains(sub: String): Boolean override operator fun contains(sub: String): Boolean
override fun concat(tail: Message): MessageChain override fun followedBy(tail: Message): MessageChain
// endregion // endregion
operator fun plusAssign(message: Message) { operator fun plusAssign(message: Message) {
this.concat(message) this.followedBy(message)
} }
operator fun plusAssign(plain: String) { operator fun plusAssign(plain: String) {
...@@ -162,7 +162,7 @@ fun <M : Message> MessageChain.any(key: Message.Key<M>): Boolean = firstOrNull(k ...@@ -162,7 +162,7 @@ fun <M : Message> MessageChain.any(key: Message.Key<M>): Boolean = firstOrNull(k
* *
* 它不包含任何元素, 但维护一个 'lazy' 的 [MessageChainImpl]. * 它不包含任何元素, 但维护一个 'lazy' 的 [MessageChainImpl].
* *
* 只有在必要的时候(如迭代([iterator]), 插入([add]), 连接([concat], [plus], [plusAssign]))才会创建这个对象代表的 list * 只有在必要的时候(如迭代([iterator]), 插入([add]), 连接([followedBy], [plus], [plusAssign]))才会创建这个对象代表的 list
* *
* 它是一个正常的 [Message] 和 [MessageChain]. 可以做所有 [Message] 能做的事. * 它是一个正常的 [Message] 和 [MessageChain]. 可以做所有 [Message] 能做的事.
*/ */
...@@ -187,7 +187,7 @@ class EmptyMessageChain : MessageChain { ...@@ -187,7 +187,7 @@ class EmptyMessageChain : MessageChain {
override fun contains(sub: String): Boolean = if (initialized) delegate.contains(sub) else false override fun contains(sub: String): Boolean = if (initialized) delegate.contains(sub) else false
override fun contains(element: Message): Boolean = if (initialized) delegate.contains(element) else false override fun contains(element: Message): Boolean = if (initialized) delegate.contains(element) else false
override fun concat(tail: Message): MessageChain = delegate.concat(tail) override fun followedBy(tail: Message): MessageChain = delegate.followedBy(tail)
override val size: Int = if (initialized) delegate.size else 0 override val size: Int = if (initialized) delegate.size else 0
override fun containsAll(elements: Collection<Message>): Boolean = override fun containsAll(elements: Collection<Message>): Boolean =
...@@ -244,7 +244,7 @@ object NullMessageChain : MessageChain { ...@@ -244,7 +244,7 @@ object NullMessageChain : MessageChain {
override fun contains(sub: String): Boolean = false override fun contains(sub: String): Boolean = false
override fun contains(element: Message): Boolean = false override fun contains(element: Message): Boolean = false
override fun concat(tail: Message): MessageChain = override fun followedBy(tail: Message): MessageChain =
MessageChainImpl(tail) MessageChainImpl(tail)
override val size: Int = 0 override val size: Int = 0
...@@ -297,8 +297,9 @@ internal inline class MessageChainImpl constructor( ...@@ -297,8 +297,9 @@ internal inline class MessageChainImpl constructor(
override fun toString(): String = stringValue override fun toString(): String = stringValue
override operator fun contains(sub: String): Boolean = delegate.any { it.contains(sub) } override operator fun contains(sub: String): Boolean = delegate.any { it.contains(sub) }
override fun concat(tail: Message): MessageChain { override fun followedBy(tail: Message): MessageChain {
if (tail is MessageChain) tail.forEach { child -> this.concat(child) } require(tail !is SingleOnly) { "SingleOnly Message cannot follow another message" }
if (tail is MessageChain) tail.forEach { child -> this.followedBy(child) }
else this.delegate.add(tail) else this.delegate.add(tail)
return this return this
} }
...@@ -345,9 +346,11 @@ internal inline class SingleMessageChainImpl( ...@@ -345,9 +346,11 @@ internal inline class SingleMessageChainImpl(
override val stringValue: String get() = this.delegate.stringValue override val stringValue: String get() = this.delegate.stringValue
override operator fun contains(sub: String): Boolean = delegate.contains(sub) override operator fun contains(sub: String): Boolean = delegate.contains(sub)
override fun concat(tail: Message): MessageChain = override fun followedBy(tail: Message): MessageChain {
if (tail is MessageChain) tail.apply { concat(delegate) } require(tail !is SingleOnly) { "SingleOnly Message cannot follow another message" }
return if (tail is MessageChain) tail.apply { followedBy(delegate) }
else MessageChain(delegate, tail) else MessageChain(delegate, tail)
}
override fun plusAssign(message: Message) = override fun plusAssign(message: Message) =
throw UnsupportedOperationException("SingleMessageChainImpl cannot be plusAssigned") throw UnsupportedOperationException("SingleMessageChainImpl cannot be plusAssigned")
......
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