From d5a573cdfa939be4a4b0397b57cad2dff28a1d28 Mon Sep 17 00:00:00 2001 From: makeevrserg Date: Tue, 18 Jun 2024 12:20:27 +0300 Subject: [PATCH] add cached value loading strategy --- gradle.properties | 2 +- .../klibs/kstorage/api/impl/DefaultMutableKrate.kt | 10 +++++++++- .../api/impl/DefaultStateFlowMutableKrate.kt | 12 +++++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index 1e8e0cc..d60306e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,7 +19,7 @@ makeevrserg.java.ktarget=17 # Project makeevrserg.project.name=KStorage makeevrserg.project.group=ru.astrainteractive.klibs -makeevrserg.project.version.string=2.1.0 +makeevrserg.project.version.string=2.2.0 makeevrserg.project.description=Kotlin wrapper for key-value storage libraries makeevrserg.project.developers=makeevrserg|Makeev Roman|makeevrserg@gmail.com makeevrserg.project.url=https://github.com/makeevrserg/klibs.kstorage/ diff --git a/kstorage/src/commonMain/kotlin/ru/astrainteractive/klibs/kstorage/api/impl/DefaultMutableKrate.kt b/kstorage/src/commonMain/kotlin/ru/astrainteractive/klibs/kstorage/api/impl/DefaultMutableKrate.kt index b373624..67a4d1c 100644 --- a/kstorage/src/commonMain/kotlin/ru/astrainteractive/klibs/kstorage/api/impl/DefaultMutableKrate.kt +++ b/kstorage/src/commonMain/kotlin/ru/astrainteractive/klibs/kstorage/api/impl/DefaultMutableKrate.kt @@ -7,13 +7,21 @@ import ru.astrainteractive.klibs.kstorage.api.provider.ValueSaver /** * This [DefaultMutableKrate] can be used with delegation + * + * @param requireInstantLoading - if true, will load value into [cachedValue] directly from [loader]. + * If false will put [factory] value into [cachedValue] */ class DefaultMutableKrate( private val factory: ValueFactory, private val saver: ValueSaver = ValueSaver.Empty(), private val loader: ValueLoader, + private val requireInstantLoading: Boolean = true ) : MutableKrate { - private var _cachedValue: T = loader.loadAndGet() ?: factory.create() + + private var _cachedValue: T = when { + requireInstantLoading -> loader.loadAndGet() ?: factory.create() + else -> factory.create() + } override val cachedValue: T get() = _cachedValue diff --git a/kstorage/src/commonMain/kotlin/ru/astrainteractive/klibs/kstorage/api/impl/DefaultStateFlowMutableKrate.kt b/kstorage/src/commonMain/kotlin/ru/astrainteractive/klibs/kstorage/api/impl/DefaultStateFlowMutableKrate.kt index df754f0..6584b9e 100644 --- a/kstorage/src/commonMain/kotlin/ru/astrainteractive/klibs/kstorage/api/impl/DefaultStateFlowMutableKrate.kt +++ b/kstorage/src/commonMain/kotlin/ru/astrainteractive/klibs/kstorage/api/impl/DefaultStateFlowMutableKrate.kt @@ -10,13 +10,23 @@ import ru.astrainteractive.klibs.kstorage.api.provider.ValueSaver /** * This [DefaultStateFlowMutableKrate] can be used with delegation + * + * @param requireInstantLoading - if true, will load value into [cachedValue] directly from [loader]. + * If false will put [factory] value into [cachedValue] */ class DefaultStateFlowMutableKrate( private val factory: ValueFactory, private val saver: ValueSaver = ValueSaver.Empty(), private val loader: ValueLoader, + requireInstantLoading: Boolean = true ) : StateFlowMutableKrate { - private val _stateFlow = MutableStateFlow(loader.loadAndGet() ?: factory.create()) + + private val _stateFlow = MutableStateFlow( + value = when { + requireInstantLoading -> loader.loadAndGet() ?: factory.create() + else -> factory.create() + } + ) override val cachedStateFlow: StateFlow = _stateFlow.asStateFlow()