From 951f3b2bc41c39eae311c1222e9ad70a7409c006 Mon Sep 17 00:00:00 2001 From: Him188 Date: Thu, 17 Jun 2021 17:12:42 +0800 Subject: [PATCH] Reduce CombinedStateObserver hierarchy: use List --- .../handler/state/CombinedStateObserver.kt | 33 ++++++++----------- .../network/handler/StateObserverTest.kt | 12 ++++++- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/mirai-core/src/commonMain/kotlin/network/handler/state/CombinedStateObserver.kt b/mirai-core/src/commonMain/kotlin/network/handler/state/CombinedStateObserver.kt index 6c341be82..a18a63a03 100644 --- a/mirai-core/src/commonMain/kotlin/network/handler/state/CombinedStateObserver.kt +++ b/mirai-core/src/commonMain/kotlin/network/handler/state/CombinedStateObserver.kt @@ -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 { 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 ) { - 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 = 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() + 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) + } + } } } } \ No newline at end of file diff --git a/mirai-core/src/commonTest/kotlin/network/handler/StateObserverTest.kt b/mirai-core/src/commonTest/kotlin/network/handler/StateObserverTest.kt index d28b0f2b0..96f9f80c2 100644 --- a/mirai-core/src/commonTest/kotlin/network/handler/StateObserverTest.kt +++ b/mirai-core/src/commonTest/kotlin/network/handler/StateObserverTest.kt @@ -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>() - 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(added) + assertEquals("CombinedStateObserver[1 -> 2]", added.toString()) + + components[StateObserver] = added val handler = createNetworkHandler() assertEquals(0, called.size) handler.setState(INITIALIZED)