diff --git a/CHANGELOG.md b/CHANGELOG.md index fed9cdca25b..1c1a5c44c16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 0.10.5 + +* `Versions` + * `Compose`: `1.2.0-alpha01-dev683` -> `1.2.0-alpha01-dev686` +* `Repos` + * `Android`: + * New function `SharedPreferencesKeyValueRepo` +* `FSM` + * Add `StateHandlingErrorHandler` and opportunity to handle states handling errors + ## 0.10.4 * `Versions`: diff --git a/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/StatesMachine.kt b/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/StatesMachine.kt index cc8fe265ef4..81d5f773a96 100644 --- a/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/StatesMachine.kt +++ b/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/StatesMachine.kt @@ -3,6 +3,8 @@ package dev.inmo.micro_utils.fsm.common import dev.inmo.micro_utils.common.Optional import dev.inmo.micro_utils.common.onPresented import dev.inmo.micro_utils.coroutines.* +import dev.inmo.micro_utils.fsm.common.utils.StateHandlingErrorHandler +import dev.inmo.micro_utils.fsm.common.utils.defaultStateHandlingErrorHandler import kotlinx.coroutines.* import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock @@ -13,13 +15,24 @@ import kotlinx.coroutines.sync.withLock * handling until [start] method will be called */ interface StatesMachine : StatesHandler { + suspend fun launchStateHandling( + state: T, + handlers: List>, + onStateHandlingErrorHandler: StateHandlingErrorHandler + ): T? { + return runCatchingSafely { + handlers.firstOrNull { it.checkHandleable(state) } ?.run { + handleState(state) + } + }.getOrElse { + onStateHandlingErrorHandler(state, it) + } + } suspend fun launchStateHandling( state: T, handlers: List> ): T? { - return handlers.firstOrNull { it.checkHandleable(state) } ?.run { - handleState(state) - } + return launchStateHandling(state, handlers, defaultStateHandlingErrorHandler()) } /** @@ -38,8 +51,9 @@ interface StatesMachine : StatesHandler { */ operator fun invoke( statesManager: StatesManager, - handlers: List> - ) = DefaultStatesMachine(statesManager, handlers) + handlers: List>, + onStateHandlingErrorHandler: StateHandlingErrorHandler = defaultStateHandlingErrorHandler() + ) = DefaultStatesMachine(statesManager, handlers, onStateHandlingErrorHandler) } } @@ -52,12 +66,17 @@ interface StatesMachine : StatesHandler { open class DefaultStatesMachine ( protected val statesManager: StatesManager, protected val handlers: List>, + protected val onStateHandlingErrorHandler: StateHandlingErrorHandler = defaultStateHandlingErrorHandler() ) : StatesMachine { /** * Will call [launchStateHandling] for state handling */ override suspend fun StatesMachine.handleState(state: T): T? = launchStateHandling(state, handlers) + override suspend fun launchStateHandling(state: T, handlers: List>): T? { + return launchStateHandling(state, handlers, onStateHandlingErrorHandler) + } + /** * This */ diff --git a/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/UpdatableStatesMachine.kt b/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/UpdatableStatesMachine.kt index 09fc45b506f..3d2542473b2 100644 --- a/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/UpdatableStatesMachine.kt +++ b/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/UpdatableStatesMachine.kt @@ -1,6 +1,8 @@ package dev.inmo.micro_utils.fsm.common import dev.inmo.micro_utils.common.* +import dev.inmo.micro_utils.fsm.common.utils.StateHandlingErrorHandler +import dev.inmo.micro_utils.fsm.common.utils.defaultStateHandlingErrorHandler import kotlinx.coroutines.* import kotlinx.coroutines.sync.withLock @@ -20,9 +22,11 @@ interface UpdatableStatesMachine : StatesMachine { open class DefaultUpdatableStatesMachine( statesManager: StatesManager, handlers: List>, + onStateHandlingErrorHandler: StateHandlingErrorHandler = defaultStateHandlingErrorHandler() ) : DefaultStatesMachine( statesManager, - handlers + handlers, + onStateHandlingErrorHandler ), UpdatableStatesMachine { protected val jobsStates = mutableMapOf() @@ -34,7 +38,7 @@ open class DefaultUpdatableStatesMachine( */ override suspend fun performStateUpdate(previousState: Optional, actualState: T, scope: CoroutineScope) { statesJobsMutex.withLock { - if (compare(previousState, actualState)) { + if (shouldReplaceJob(previousState, actualState)) { statesJobs[actualState] ?.cancel() } val job = previousState.mapOnPresented { diff --git a/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/utils/StateHandlingErrorHandler.kt b/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/utils/StateHandlingErrorHandler.kt new file mode 100644 index 00000000000..064d27f00fc --- /dev/null +++ b/fsm/common/src/commonMain/kotlin/dev/inmo/micro_utils/fsm/common/utils/StateHandlingErrorHandler.kt @@ -0,0 +1,6 @@ +package dev.inmo.micro_utils.fsm.common.utils + +typealias StateHandlingErrorHandler = suspend (T, Throwable) -> T? +val DefaultStateHandlingErrorHandler: StateHandlingErrorHandler<*> = { _, _ -> null } +inline fun defaultStateHandlingErrorHandler(): StateHandlingErrorHandler = DefaultStateHandlingErrorHandler as StateHandlingErrorHandler + diff --git a/gradle.properties b/gradle.properties index f75b513b8b7..78315d96420 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,5 +14,5 @@ crypto_js_version=4.1.1 # Project data group=dev.inmo -version=0.10.4 -android_code_version=119 +version=0.10.5 +android_code_version=120 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7c7beb1d039..665ff4cc98c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,7 +4,7 @@ kt = "1.6.21" kt-serialization = "1.3.3" kt-coroutines = "1.6.1" -jb-compose = "1.2.0-alpha01-dev683" +jb-compose = "1.2.0-alpha01-dev686" jb-exposed = "0.38.2" jb-dokka = "1.6.21" @@ -16,7 +16,7 @@ ktor = "2.0.1" gh-release = "2.3.7" android-gradle = "7.0.4" -dexcount = "3.0.1" +dexcount = "3.1.0" android-coreKtx = "1.7.0" android-recyclerView = "1.2.1" diff --git a/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/keyvalue/KeyValueStore.kt b/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/keyvalue/KeyValueStore.kt index bc863224c42..440490f51ea 100644 --- a/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/keyvalue/KeyValueStore.kt +++ b/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/keyvalue/KeyValueStore.kt @@ -160,3 +160,9 @@ class KeyValueStore internal constructor ( } } } + +inline fun SharedPreferencesKeyValueRepo( + context: Context, + name: String = "default", + cacheValues: Boolean = false +) = context.keyValueStore(name, cacheValues)