diff --git a/CHANGELOG.md b/CHANGELOG.md index b4d8f4c877b..427b3a137d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## 0.26.2 +* `Coroutines`: + * Rename `SpecialMutableStateFlow` to `MutableRedeliverStateFlow` + ## 0.26.1 * `Versions`: diff --git a/common/compose/src/jvmTest/kotlin/LoadableComponentTests.kt b/common/compose/src/jvmTest/kotlin/LoadableComponentTests.kt index dc33811f442..79b10bba28a 100644 --- a/common/compose/src/jvmTest/kotlin/LoadableComponentTests.kt +++ b/common/compose/src/jvmTest/kotlin/LoadableComponentTests.kt @@ -2,11 +2,9 @@ import androidx.compose.runtime.remember import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.runComposeUiTest import dev.inmo.micro_utils.common.compose.LoadableComponent -import dev.inmo.micro_utils.coroutines.SpecialMutableStateFlow -import kotlinx.coroutines.flow.MutableSharedFlow +import dev.inmo.micro_utils.coroutines.MutableRedeliverStateFlow import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.first -import kotlinx.coroutines.flow.firstOrNull import org.jetbrains.annotations.TestOnly import kotlin.test.Test import kotlin.test.assertTrue @@ -16,8 +14,8 @@ class LoadableComponentTests { @Test @TestOnly fun testSimpleLoad() = runComposeUiTest { - val loadingFlow = SpecialMutableStateFlow(0) - val loadedFlow = SpecialMutableStateFlow(0) + val loadingFlow = MutableRedeliverStateFlow(0) + val loadedFlow = MutableRedeliverStateFlow(0) setContent { LoadableComponent({ loadingFlow.filter { it == 1 }.first() diff --git a/coroutines/compose/src/jsMain/kotlin/dev/inmo/micro_utils/coroutines/compose/StyleSheetsAggregator.kt b/coroutines/compose/src/jsMain/kotlin/dev/inmo/micro_utils/coroutines/compose/StyleSheetsAggregator.kt index 9cc62b81acd..7f1ed7ab8e3 100644 --- a/coroutines/compose/src/jsMain/kotlin/dev/inmo/micro_utils/coroutines/compose/StyleSheetsAggregator.kt +++ b/coroutines/compose/src/jsMain/kotlin/dev/inmo/micro_utils/coroutines/compose/StyleSheetsAggregator.kt @@ -3,7 +3,7 @@ package dev.inmo.micro_utils.coroutines.compose import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.remember -import dev.inmo.micro_utils.coroutines.SpecialMutableStateFlow +import dev.inmo.micro_utils.coroutines.MutableRedeliverStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.debounce @@ -16,7 +16,7 @@ import org.jetbrains.compose.web.css.StyleSheet * to add `Style(stylesheet)` on every compose function call */ object StyleSheetsAggregator { - private val _stylesFlow = SpecialMutableStateFlow>(emptySet()) + private val _stylesFlow = MutableRedeliverStateFlow>(emptySet()) val stylesFlow: StateFlow> = _stylesFlow.asStateFlow() @Composable diff --git a/coroutines/compose/src/jvmTest/kotlin/FlowStateTests.kt b/coroutines/compose/src/jvmTest/kotlin/FlowStateTests.kt index 2f4ad81e9f0..741ec3b0057 100644 --- a/coroutines/compose/src/jvmTest/kotlin/FlowStateTests.kt +++ b/coroutines/compose/src/jvmTest/kotlin/FlowStateTests.kt @@ -2,7 +2,7 @@ import androidx.compose.material.Button import androidx.compose.material.Text import androidx.compose.runtime.collectAsState import androidx.compose.ui.test.* -import dev.inmo.micro_utils.coroutines.SpecialMutableStateFlow +import dev.inmo.micro_utils.coroutines.MutableRedeliverStateFlow import org.jetbrains.annotations.TestOnly import kotlin.test.Test @@ -11,7 +11,7 @@ class FlowStateTests { @Test @TestOnly fun simpleTest() = runComposeUiTest { - val flowState = SpecialMutableStateFlow(0) + val flowState = MutableRedeliverStateFlow(0) setContent { Button({ flowState.value++ }) { Text("Click") } Text(flowState.collectAsState().value.toString()) diff --git a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/SpecialMutableStateFlow.kt b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/MutableRedeliverStateFlow.kt similarity index 90% rename from coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/SpecialMutableStateFlow.kt rename to coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/MutableRedeliverStateFlow.kt index 80972346b2d..d78a9be9196 100644 --- a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/SpecialMutableStateFlow.kt +++ b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/MutableRedeliverStateFlow.kt @@ -1,7 +1,5 @@ package dev.inmo.micro_utils.coroutines -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.InternalCoroutinesApi import kotlinx.coroutines.channels.BufferOverflow @@ -11,13 +9,12 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.internal.SynchronizedObject import kotlinx.coroutines.internal.synchronized -import kotlin.coroutines.CoroutineContext /** * Works like [StateFlow], but guarantee that latest value update will always be delivered to * each active subscriber */ -open class SpecialMutableStateFlow( +open class MutableRedeliverStateFlow( initialValue: T ) : MutableStateFlow, FlowCollector, MutableSharedFlow { @OptIn(InternalCoroutinesApi::class) @@ -68,3 +65,6 @@ open class SpecialMutableStateFlow( override suspend fun collect(collector: FlowCollector) = sharingFlow.collect(collector) } + +@Deprecated("Renamed to MutableRedeliverStateFlow", ReplaceWith("MutableRedeliverStateFlow")) +typealias SpecialMutableStateFlow = MutableRedeliverStateFlow diff --git a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/SmartMutex.kt b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/SmartMutex.kt index 5127fc6ecde..5ae306a725d 100644 --- a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/SmartMutex.kt +++ b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/SmartMutex.kt @@ -1,7 +1,6 @@ package dev.inmo.micro_utils.coroutines import kotlinx.coroutines.currentCoroutineContext -import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.first @@ -44,7 +43,7 @@ sealed interface SmartMutex { * @param locked Preset state of [isLocked] and its internal [_lockStateFlow] */ class Mutable(locked: Boolean = false) : SmartMutex { - private val _lockStateFlow = SpecialMutableStateFlow(locked) + private val _lockStateFlow = MutableRedeliverStateFlow(locked) override val lockStateFlow: StateFlow = _lockStateFlow.asStateFlow() private val internalChangesMutex = Mutex() diff --git a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/SmartSemaphore.kt b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/SmartSemaphore.kt index cef80cfab16..c557037a3b5 100644 --- a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/SmartSemaphore.kt +++ b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/SmartSemaphore.kt @@ -1,7 +1,6 @@ package dev.inmo.micro_utils.coroutines import kotlinx.coroutines.currentCoroutineContext -import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.first @@ -47,7 +46,7 @@ sealed interface SmartSemaphore { */ class Mutable(permits: Int, acquiredPermits: Int = 0) : SmartSemaphore { override val maxPermits: Int = permits - private val _freePermitsStateFlow = SpecialMutableStateFlow(permits - acquiredPermits) + private val _freePermitsStateFlow = MutableRedeliverStateFlow(permits - acquiredPermits) override val permitsStateFlow: StateFlow = _freePermitsStateFlow.asStateFlow() private val internalChangesMutex = Mutex(false) diff --git a/coroutines/src/commonTest/kotlin/SpecialMutableStateFlowTests.kt b/coroutines/src/commonTest/kotlin/SpecialMutableStateFlowTests.kt index 8e3aa105621..f3912e8759c 100644 --- a/coroutines/src/commonTest/kotlin/SpecialMutableStateFlowTests.kt +++ b/coroutines/src/commonTest/kotlin/SpecialMutableStateFlowTests.kt @@ -1,33 +1,31 @@ -import dev.inmo.micro_utils.coroutines.SpecialMutableStateFlow -import dev.inmo.micro_utils.coroutines.asDeferred +import dev.inmo.micro_utils.coroutines.MutableRedeliverStateFlow import dev.inmo.micro_utils.coroutines.subscribe import kotlinx.coroutines.Job import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import kotlin.test.Test import kotlin.test.assertEquals -import kotlin.test.assertTrue class SpecialMutableStateFlowTests { @Test fun simpleTest() = runTest { - val specialMutableStateFlow = SpecialMutableStateFlow(0) - specialMutableStateFlow.value = 1 - specialMutableStateFlow.first { it == 1 } - assertEquals(1, specialMutableStateFlow.value) + val mutableRedeliverStateFlow = MutableRedeliverStateFlow(0) + mutableRedeliverStateFlow.value = 1 + mutableRedeliverStateFlow.first { it == 1 } + assertEquals(1, mutableRedeliverStateFlow.value) } @Test fun specialTest() = runTest { - val specialMutableStateFlow = SpecialMutableStateFlow(0) + val mutableRedeliverStateFlow = MutableRedeliverStateFlow(0) lateinit var subscriberJob: Job - subscriberJob = specialMutableStateFlow.subscribe(this) { + subscriberJob = mutableRedeliverStateFlow.subscribe(this) { when (it) { - 1 -> specialMutableStateFlow.value = 2 + 1 -> mutableRedeliverStateFlow.value = 2 2 -> subscriberJob.cancel() } } - specialMutableStateFlow.value = 1 + mutableRedeliverStateFlow.value = 1 subscriberJob.join() - assertEquals(2, specialMutableStateFlow.value) + assertEquals(2, mutableRedeliverStateFlow.value) } } \ No newline at end of file diff --git a/pagination/compose/src/commonMain/kotlin/InfinityPagedComponent.kt b/pagination/compose/src/commonMain/kotlin/InfinityPagedComponent.kt index 95b17437f3d..4699d7f4945 100644 --- a/pagination/compose/src/commonMain/kotlin/InfinityPagedComponent.kt +++ b/pagination/compose/src/commonMain/kotlin/InfinityPagedComponent.kt @@ -1,9 +1,8 @@ package dev.inmo.micro_utils.pagination.compose import androidx.compose.runtime.* -import dev.inmo.micro_utils.coroutines.SpecialMutableStateFlow +import dev.inmo.micro_utils.coroutines.MutableRedeliverStateFlow import dev.inmo.micro_utils.coroutines.launchLoggingDropExceptions -import dev.inmo.micro_utils.coroutines.runCatchingLogging import dev.inmo.micro_utils.pagination.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job @@ -27,8 +26,8 @@ class InfinityPagedComponentContext internal constructor( private val loader: suspend InfinityPagedComponentContext.(Pagination) -> PaginationResult ) { internal val startPage = SimplePagination(page, size) - internal val latestLoadedPage = SpecialMutableStateFlow?>(null) - internal val dataState = SpecialMutableStateFlow?>(null) + internal val latestLoadedPage = MutableRedeliverStateFlow?>(null) + internal val dataState = MutableRedeliverStateFlow?>(null) internal var loadingJob: Job? = null internal val loadingMutex = Mutex() diff --git a/pagination/compose/src/commonMain/kotlin/PagedComponent.kt b/pagination/compose/src/commonMain/kotlin/PagedComponent.kt index 90d93f7906b..fe85d845975 100644 --- a/pagination/compose/src/commonMain/kotlin/PagedComponent.kt +++ b/pagination/compose/src/commonMain/kotlin/PagedComponent.kt @@ -1,7 +1,7 @@ package dev.inmo.micro_utils.pagination.compose import androidx.compose.runtime.* -import dev.inmo.micro_utils.coroutines.SpecialMutableStateFlow +import dev.inmo.micro_utils.coroutines.MutableRedeliverStateFlow import dev.inmo.micro_utils.coroutines.launchLoggingDropExceptions import dev.inmo.micro_utils.pagination.* import kotlinx.coroutines.CoroutineScope @@ -28,8 +28,8 @@ class PagedComponentContext internal constructor( private val loader: suspend PagedComponentContext.(Pagination) -> PaginationResult ) { internal val startPage = SimplePagination(initialPage, size) - internal val latestLoadedPage = SpecialMutableStateFlow?>(null) - internal val dataState = SpecialMutableStateFlow?>(null) + internal val latestLoadedPage = MutableRedeliverStateFlow?>(null) + internal val dataState = MutableRedeliverStateFlow?>(null) internal var loadingJob: Job? = null internal val loadingMutex = Mutex()