From c8956fd136e9cd070ae469afbc66aa55cdd76567 Mon Sep 17 00:00:00 2001 From: Arkadii Ivanov Date: Mon, 10 Oct 2022 23:44:52 +0100 Subject: [PATCH] Do not throw if Store is already initialized --- mvikotlin-main/build.gradle.kts | 1 + .../com/arkivanov/mvikotlin/main/store/DefaultStore.kt | 8 ++++++++ .../mvikotlin/core/test/internal/StoreGenericTests.kt | 7 +++++++ .../mvikotlin/timetravel/store/TimeTravelStoreImpl.kt | 7 +++++++ 4 files changed, 23 insertions(+) diff --git a/mvikotlin-main/build.gradle.kts b/mvikotlin-main/build.gradle.kts index a39f35f6..78bf2d3e 100644 --- a/mvikotlin-main/build.gradle.kts +++ b/mvikotlin-main/build.gradle.kts @@ -26,6 +26,7 @@ kotlin { implementation(project(":mvikotlin")) implementation(project(":rx")) implementation(project(":rx-internal")) + implementation(project(":utils-internal")) } common.test.dependencies { diff --git a/mvikotlin-main/src/commonMain/kotlin/com/arkivanov/mvikotlin/main/store/DefaultStore.kt b/mvikotlin-main/src/commonMain/kotlin/com/arkivanov/mvikotlin/main/store/DefaultStore.kt index 0188593c..86204dc1 100644 --- a/mvikotlin-main/src/commonMain/kotlin/com/arkivanov/mvikotlin/main/store/DefaultStore.kt +++ b/mvikotlin-main/src/commonMain/kotlin/com/arkivanov/mvikotlin/main/store/DefaultStore.kt @@ -10,6 +10,7 @@ import com.arkivanov.mvikotlin.rx.Observer import com.arkivanov.mvikotlin.rx.internal.BehaviorSubject import com.arkivanov.mvikotlin.rx.internal.PublishSubject import com.arkivanov.mvikotlin.rx.observer +import com.arkivanov.mvikotlin.utils.internal.atomic internal class DefaultStore( initialState: State, @@ -23,10 +24,17 @@ internal class DefaultStore() + private val isInitialized = atomic(false) override fun init() { assertOnMainThread() + if (isInitialized.value) { + return + } + + isInitialized.value = true + intentSubject.subscribe(observer(onNext = ::onIntent)) executor.init( diff --git a/mvikotlin-test-internal/src/commonMain/kotlin/com/arkivanov/mvikotlin/core/test/internal/StoreGenericTests.kt b/mvikotlin-test-internal/src/commonMain/kotlin/com/arkivanov/mvikotlin/core/test/internal/StoreGenericTests.kt index 30347a7b..5f10b337 100644 --- a/mvikotlin-test-internal/src/commonMain/kotlin/com/arkivanov/mvikotlin/core/test/internal/StoreGenericTests.kt +++ b/mvikotlin-test-internal/src/commonMain/kotlin/com/arkivanov/mvikotlin/core/test/internal/StoreGenericTests.kt @@ -25,6 +25,13 @@ abstract class StoreGenericTests( ) -> Store ) { + @Test + fun does_not_throw_WHEN_second_init() { + val store = store() + + store.init() + } + @Test fun state_val_returns_initial_state_WHEN_created() { val store = store(initialState = "initial") diff --git a/mvikotlin-timetravel/src/commonMain/kotlin/com/arkivanov/mvikotlin/timetravel/store/TimeTravelStoreImpl.kt b/mvikotlin-timetravel/src/commonMain/kotlin/com/arkivanov/mvikotlin/timetravel/store/TimeTravelStoreImpl.kt index a533145a..c43dc153 100644 --- a/mvikotlin-timetravel/src/commonMain/kotlin/com/arkivanov/mvikotlin/timetravel/store/TimeTravelStoreImpl.kt +++ b/mvikotlin-timetravel/src/commonMain/kotlin/com/arkivanov/mvikotlin/timetravel/store/TimeTravelStoreImpl.kt @@ -33,6 +33,7 @@ internal class TimeTravelStoreImpl?>(null) private val eventProcessor = EventProcessor() private val eventDebugger = EventDebugger() + private val isInitialized = atomic(false) override fun states(observer: Observer): Disposable = stateSubject.subscribe(observer) @@ -70,6 +71,12 @@ internal class TimeTravelStoreImpl