Reduce CombinedStateObserver hierarchy: use List

This commit is contained in:
Him188 2021-06-17 17:12:42 +08:00
parent 48f9ca0d48
commit 951f3b2bc4
2 changed files with 25 additions and 20 deletions

View File

@ -13,16 +13,14 @@ import net.mamoe.mirai.internal.network.handler.NetworkHandler
import net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport
internal class CombinedStateObserver(
private val first: StateObserver,
private val last: StateObserver,
private val list: List<StateObserver>
) : StateObserver {
override fun stateChanged(
networkHandler: NetworkHandlerSupport,
previous: NetworkHandlerSupport.BaseStateImpl,
new: NetworkHandlerSupport.BaseStateImpl
) {
first.stateChanged(networkHandler, previous, new)
last.stateChanged(networkHandler, previous, new)
list.forEach { it.stateChanged(networkHandler, previous, new) }
}
override fun exceptionOnCreatingNewState(
@ -30,13 +28,11 @@ internal class CombinedStateObserver(
previousState: NetworkHandlerSupport.BaseStateImpl,
exception: Throwable
) {
first.exceptionOnCreatingNewState(networkHandler, previousState, exception)
last.exceptionOnCreatingNewState(networkHandler, previousState, exception)
list.forEach { it.exceptionOnCreatingNewState(networkHandler, previousState, exception) }
}
override fun beforeStateResume(networkHandler: NetworkHandler, state: NetworkHandlerSupport.BaseStateImpl) {
first.beforeStateResume(networkHandler, state)
last.beforeStateResume(networkHandler, state)
list.forEach { it.beforeStateResume(networkHandler, state) }
}
override fun afterStateResume(
@ -44,30 +40,29 @@ internal class CombinedStateObserver(
state: NetworkHandlerSupport.BaseStateImpl,
result: Result<Unit>
) {
first.afterStateResume(networkHandler, state, result)
last.afterStateResume(networkHandler, state, result)
list.forEach { it.afterStateResume(networkHandler, state, result) }
}
override fun toString(): String {
return asSequence().joinToString(
return list.joinToString(
prefix = "CombinedStateObserver[",
postfix = "]",
separator = " -> "
) { it.toString() }
}
private fun asSequence(): Sequence<StateObserver> = sequence {
if (first is CombinedStateObserver) yieldAll(first.asSequence()) else yield(first)
if (last is CombinedStateObserver) yieldAll(last.asSequence()) else yield(last)
}
companion object {
operator fun StateObserver?.plus(last: StateObserver?): StateObserver {
return when {
last == null -> this ?: StateObserver.NOP
this == null -> last
last == null -> this
else -> CombinedStateObserver(this, last)
} ?: StateObserver.NOP
else -> {
val result = mutableListOf<StateObserver>()
if (this is CombinedStateObserver) result.addAll(this.list) else result.add(this)
if (last is CombinedStateObserver) result.addAll(last.list) else result.add(last)
CombinedStateObserver(result)
}
}
}
}
}

View File

@ -12,12 +12,14 @@ package net.mamoe.mirai.internal.network.handler
import net.mamoe.mirai.internal.network.framework.AbstractMockNetworkHandlerTest
import net.mamoe.mirai.internal.network.handler.NetworkHandler.State.CONNECTING
import net.mamoe.mirai.internal.network.handler.NetworkHandler.State.INITIALIZED
import net.mamoe.mirai.internal.network.handler.state.CombinedStateObserver
import net.mamoe.mirai.internal.network.handler.state.CombinedStateObserver.Companion.plus
import net.mamoe.mirai.internal.network.handler.state.StateChangedObserver
import net.mamoe.mirai.internal.network.handler.state.StateObserver
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance
import kotlin.test.assertEquals
import kotlin.test.assertIs
@TestInstance(TestInstance.Lifecycle.PER_METHOD)
internal class StateObserverTest : AbstractMockNetworkHandlerTest() {
@ -85,7 +87,7 @@ internal class StateObserverTest : AbstractMockNetworkHandlerTest() {
@Test
fun `can combine`() {
val called = ArrayList<Pair<NetworkHandlerSupport.BaseStateImpl, NetworkHandlerSupport.BaseStateImpl>>()
components[StateObserver] = object : StateChangedObserver(CONNECTING) {
val added = object : StateChangedObserver(CONNECTING) {
override fun stateChanged0(
networkHandler: NetworkHandlerSupport,
previous: NetworkHandlerSupport.BaseStateImpl,
@ -93,6 +95,8 @@ internal class StateObserverTest : AbstractMockNetworkHandlerTest() {
) {
called.add(previous to new)
}
override fun toString(): String = "1"
} + object : StateChangedObserver(CONNECTING) {
override fun stateChanged0(
networkHandler: NetworkHandlerSupport,
@ -101,7 +105,13 @@ internal class StateObserverTest : AbstractMockNetworkHandlerTest() {
) {
called.add(previous to new)
}
override fun toString(): String = "2"
}
assertIs<CombinedStateObserver>(added)
assertEquals("CombinedStateObserver[1 -> 2]", added.toString())
components[StateObserver] = added
val handler = createNetworkHandler()
assertEquals(0, called.size)
handler.setState(INITIALIZED)