mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-15 13:00:12 +08:00
Reduce CombinedStateObserver hierarchy: use List
This commit is contained in:
parent
48f9ca0d48
commit
951f3b2bc4
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user