mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-13 03:16:05 +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
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user