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 import net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport
internal class CombinedStateObserver( internal class CombinedStateObserver(
private val first: StateObserver, private val list: List<StateObserver>
private val last: StateObserver,
) : StateObserver { ) : StateObserver {
override fun stateChanged( override fun stateChanged(
networkHandler: NetworkHandlerSupport, networkHandler: NetworkHandlerSupport,
previous: NetworkHandlerSupport.BaseStateImpl, previous: NetworkHandlerSupport.BaseStateImpl,
new: NetworkHandlerSupport.BaseStateImpl new: NetworkHandlerSupport.BaseStateImpl
) { ) {
first.stateChanged(networkHandler, previous, new) list.forEach { it.stateChanged(networkHandler, previous, new) }
last.stateChanged(networkHandler, previous, new)
} }
override fun exceptionOnCreatingNewState( override fun exceptionOnCreatingNewState(
@ -30,13 +28,11 @@ internal class CombinedStateObserver(
previousState: NetworkHandlerSupport.BaseStateImpl, previousState: NetworkHandlerSupport.BaseStateImpl,
exception: Throwable exception: Throwable
) { ) {
first.exceptionOnCreatingNewState(networkHandler, previousState, exception) list.forEach { it.exceptionOnCreatingNewState(networkHandler, previousState, exception) }
last.exceptionOnCreatingNewState(networkHandler, previousState, exception)
} }
override fun beforeStateResume(networkHandler: NetworkHandler, state: NetworkHandlerSupport.BaseStateImpl) { override fun beforeStateResume(networkHandler: NetworkHandler, state: NetworkHandlerSupport.BaseStateImpl) {
first.beforeStateResume(networkHandler, state) list.forEach { it.beforeStateResume(networkHandler, state) }
last.beforeStateResume(networkHandler, state)
} }
override fun afterStateResume( override fun afterStateResume(
@ -44,30 +40,29 @@ internal class CombinedStateObserver(
state: NetworkHandlerSupport.BaseStateImpl, state: NetworkHandlerSupport.BaseStateImpl,
result: Result<Unit> result: Result<Unit>
) { ) {
first.afterStateResume(networkHandler, state, result) list.forEach { it.afterStateResume(networkHandler, state, result) }
last.afterStateResume(networkHandler, state, result)
} }
override fun toString(): String { override fun toString(): String {
return asSequence().joinToString( return list.joinToString(
prefix = "CombinedStateObserver[", prefix = "CombinedStateObserver[",
postfix = "]", postfix = "]",
separator = " -> " separator = " -> "
) { it.toString() } ) { 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 { companion object {
operator fun StateObserver?.plus(last: StateObserver?): StateObserver { operator fun StateObserver?.plus(last: StateObserver?): StateObserver {
return when { return when {
last == null -> this ?: StateObserver.NOP
this == null -> last this == null -> last
last == null -> this else -> {
else -> CombinedStateObserver(this, last) val result = mutableListOf<StateObserver>()
} ?: StateObserver.NOP 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.framework.AbstractMockNetworkHandlerTest
import net.mamoe.mirai.internal.network.handler.NetworkHandler.State.CONNECTING 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.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.CombinedStateObserver.Companion.plus
import net.mamoe.mirai.internal.network.handler.state.StateChangedObserver import net.mamoe.mirai.internal.network.handler.state.StateChangedObserver
import net.mamoe.mirai.internal.network.handler.state.StateObserver import net.mamoe.mirai.internal.network.handler.state.StateObserver
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance import org.junit.jupiter.api.TestInstance
import kotlin.test.assertEquals import kotlin.test.assertEquals
import kotlin.test.assertIs
@TestInstance(TestInstance.Lifecycle.PER_METHOD) @TestInstance(TestInstance.Lifecycle.PER_METHOD)
internal class StateObserverTest : AbstractMockNetworkHandlerTest() { internal class StateObserverTest : AbstractMockNetworkHandlerTest() {
@ -85,7 +87,7 @@ internal class StateObserverTest : AbstractMockNetworkHandlerTest() {
@Test @Test
fun `can combine`() { fun `can combine`() {
val called = ArrayList<Pair<NetworkHandlerSupport.BaseStateImpl, NetworkHandlerSupport.BaseStateImpl>>() val called = ArrayList<Pair<NetworkHandlerSupport.BaseStateImpl, NetworkHandlerSupport.BaseStateImpl>>()
components[StateObserver] = object : StateChangedObserver(CONNECTING) { val added = object : StateChangedObserver(CONNECTING) {
override fun stateChanged0( override fun stateChanged0(
networkHandler: NetworkHandlerSupport, networkHandler: NetworkHandlerSupport,
previous: NetworkHandlerSupport.BaseStateImpl, previous: NetworkHandlerSupport.BaseStateImpl,
@ -93,6 +95,8 @@ internal class StateObserverTest : AbstractMockNetworkHandlerTest() {
) { ) {
called.add(previous to new) called.add(previous to new)
} }
override fun toString(): String = "1"
} + object : StateChangedObserver(CONNECTING) { } + object : StateChangedObserver(CONNECTING) {
override fun stateChanged0( override fun stateChanged0(
networkHandler: NetworkHandlerSupport, networkHandler: NetworkHandlerSupport,
@ -101,7 +105,13 @@ internal class StateObserverTest : AbstractMockNetworkHandlerTest() {
) { ) {
called.add(previous to new) 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() val handler = createNetworkHandler()
assertEquals(0, called.size) assertEquals(0, called.size)
handler.setState(INITIALIZED) handler.setState(INITIALIZED)