2023-01-27 09:15:27 +00:00
|
|
|
package dev.inmo.micro_utils.repos.cache.util
|
|
|
|
|
2024-02-20 18:05:57 +00:00
|
|
|
import dev.inmo.micro_utils.coroutines.SmartRWLocker
|
|
|
|
import dev.inmo.micro_utils.coroutines.withWriteLock
|
2023-08-22 21:26:54 +00:00
|
|
|
import dev.inmo.micro_utils.repos.*
|
2024-02-20 18:05:57 +00:00
|
|
|
import kotlinx.serialization.Serializable
|
|
|
|
import kotlin.js.JsName
|
|
|
|
import kotlin.jvm.JvmName
|
|
|
|
|
|
|
|
/**
|
|
|
|
* `invalidate`/`actualizeAll` clearing mode. Declare when data in original repo will be cleared
|
|
|
|
*/
|
|
|
|
@Serializable
|
|
|
|
sealed interface ActualizeAllClearMode {
|
|
|
|
/**
|
|
|
|
* Instruct user of this mode to clear internal data __before load__ of external data
|
|
|
|
*/
|
|
|
|
@Serializable
|
|
|
|
data object BeforeLoad : ActualizeAllClearMode
|
|
|
|
/**
|
|
|
|
* Instruct user of this mode to clear internal data __after load__ of external data and __before set__ of internal data
|
|
|
|
*/
|
|
|
|
@Serializable
|
|
|
|
data object BeforeSet : ActualizeAllClearMode
|
|
|
|
/**
|
|
|
|
* Instruct user of this mode to never clear internal data
|
|
|
|
*/
|
|
|
|
@Serializable
|
|
|
|
data object Never : ActualizeAllClearMode
|
|
|
|
}
|
|
|
|
|
|
|
|
suspend inline fun <K, V> KeyValueRepo<K, V>.actualizeAllWithClearBeforeLoad(
|
|
|
|
getAll: () -> Map<K, V>
|
|
|
|
) {
|
|
|
|
clear()
|
|
|
|
val newData = getAll()
|
|
|
|
set(newData)
|
|
|
|
}
|
|
|
|
|
|
|
|
suspend inline fun <K, V> KeyValueRepo<K, V>.actualizeAllWithClearBeforeSet(
|
|
|
|
getAll: () -> Map<K, V>
|
|
|
|
) {
|
|
|
|
val newData = getAll()
|
|
|
|
clear()
|
|
|
|
set(newData)
|
|
|
|
}
|
|
|
|
|
|
|
|
suspend inline fun <K, V> KeyValueRepo<K, V>.actualizeAllWithoutClear(
|
|
|
|
getAll: () -> Map<K, V>
|
|
|
|
) {
|
|
|
|
val newData = getAll()
|
|
|
|
set(newData)
|
|
|
|
}
|
|
|
|
|
|
|
|
@JvmName("actualizeAllWithClearBeforeLoadWithLocker")
|
|
|
|
@JsName("actualizeAllWithClearBeforeLoadWithLocker")
|
|
|
|
suspend inline fun <K, V> KeyValueRepo<K, V>.actualizeAllWithClearBeforeLoad(
|
|
|
|
locker: SmartRWLocker,
|
|
|
|
getAll: () -> Map<K, V>
|
|
|
|
) {
|
|
|
|
locker.withWriteLock {
|
|
|
|
clear()
|
|
|
|
}
|
|
|
|
|
|
|
|
val newData = getAll()
|
|
|
|
locker.withWriteLock {
|
|
|
|
set(newData)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@JvmName("actualizeAllWithClearBeforeSetWithLocker")
|
|
|
|
@JsName("actualizeAllWithClearBeforeSetWithLocker")
|
|
|
|
suspend inline fun <K, V> KeyValueRepo<K, V>.actualizeAllWithClearBeforeSet(
|
|
|
|
locker: SmartRWLocker,
|
|
|
|
getAll: () -> Map<K, V>
|
|
|
|
) {
|
|
|
|
val newData = getAll()
|
|
|
|
locker.withWriteLock {
|
|
|
|
clear()
|
|
|
|
set(newData)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@JvmName("actualizeAllWithoutClearWithLocker")
|
|
|
|
@JsName("actualizeAllWithoutClearWithLocker")
|
|
|
|
suspend inline fun <K, V> KeyValueRepo<K, V>.actualizeAllWithoutClear(
|
|
|
|
locker: SmartRWLocker,
|
|
|
|
getAll: () -> Map<K, V>
|
|
|
|
) {
|
|
|
|
val newData = getAll()
|
|
|
|
locker.withWriteLock {
|
|
|
|
set(newData)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
suspend inline fun <K, V> KeyValueRepo<K, V>.actualizeAllWithClearBeforeLoad(
|
|
|
|
locker: SmartRWLocker? = null,
|
|
|
|
getAll: () -> Map<K, V>
|
|
|
|
) {
|
|
|
|
locker ?.let {
|
|
|
|
actualizeAllWithClearBeforeLoad(locker = locker, getAll)
|
|
|
|
} ?: actualizeAllWithClearBeforeLoad(getAll)
|
|
|
|
}
|
|
|
|
|
|
|
|
suspend inline fun <K, V> KeyValueRepo<K, V>.actualizeAllWithClearBeforeSet(
|
|
|
|
locker: SmartRWLocker? = null,
|
|
|
|
getAll: () -> Map<K, V>
|
|
|
|
) {
|
|
|
|
locker ?.let {
|
|
|
|
actualizeAllWithClearBeforeSet(locker = locker, getAll)
|
|
|
|
} ?: actualizeAllWithClearBeforeSet(getAll)
|
|
|
|
}
|
|
|
|
|
|
|
|
suspend inline fun <K, V> KeyValueRepo<K, V>.actualizeAllWithoutClear(
|
|
|
|
locker: SmartRWLocker? = null,
|
|
|
|
getAll: () -> Map<K, V>
|
|
|
|
) {
|
|
|
|
locker ?.let {
|
|
|
|
actualizeAllWithoutClear(locker = locker, getAll)
|
|
|
|
} ?: actualizeAllWithoutClear(getAll)
|
|
|
|
}
|
2023-01-27 09:15:27 +00:00
|
|
|
|
2023-08-22 21:26:54 +00:00
|
|
|
suspend inline fun <K, V> KeyValueRepo<K, V>.actualizeAll(
|
2024-02-20 18:05:57 +00:00
|
|
|
locker: SmartRWLocker? = null,
|
|
|
|
clearMode: ActualizeAllClearMode = ActualizeAllClearMode.BeforeSet,
|
2023-01-27 09:15:27 +00:00
|
|
|
getAll: () -> Map<K, V>
|
|
|
|
) {
|
2024-02-20 18:05:57 +00:00
|
|
|
when (clearMode) {
|
|
|
|
ActualizeAllClearMode.BeforeLoad -> locker ?.let {
|
|
|
|
actualizeAllWithClearBeforeLoad(locker = locker, getAll)
|
|
|
|
} ?: actualizeAllWithClearBeforeLoad(getAll)
|
|
|
|
ActualizeAllClearMode.BeforeSet -> locker ?.let {
|
|
|
|
actualizeAllWithClearBeforeSet(locker = locker, getAll)
|
|
|
|
} ?: actualizeAllWithClearBeforeSet(getAll)
|
|
|
|
ActualizeAllClearMode.Never -> locker ?.let {
|
|
|
|
actualizeAllWithoutClear(locker = locker, getAll)
|
|
|
|
} ?: actualizeAllWithoutClear(getAll)
|
|
|
|
}
|
2023-01-27 09:15:27 +00:00
|
|
|
}
|
|
|
|
|
2023-08-22 21:26:54 +00:00
|
|
|
suspend inline fun <K, V> KeyValueRepo<K, V>.actualizeAll(
|
2024-02-20 18:05:57 +00:00
|
|
|
parentRepo: ReadKeyValueRepo<K, V>,
|
|
|
|
locker: SmartRWLocker? = null,
|
|
|
|
clearMode: ActualizeAllClearMode = ActualizeAllClearMode.BeforeSet,
|
2023-01-27 09:15:27 +00:00
|
|
|
) {
|
2024-02-20 18:05:57 +00:00
|
|
|
actualizeAll(locker, clearMode) {
|
|
|
|
parentRepo.getAll()
|
2023-01-27 09:15:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-08-22 21:26:54 +00:00
|
|
|
suspend inline fun <K, V> KeyValueRepo<K, List<V>>.actualizeAll(
|
2024-02-20 18:05:57 +00:00
|
|
|
parentRepo: ReadKeyValuesRepo<K, V>,
|
|
|
|
locker: SmartRWLocker? = null,
|
|
|
|
clearMode: ActualizeAllClearMode = ActualizeAllClearMode.BeforeSet,
|
2023-01-27 09:15:27 +00:00
|
|
|
) {
|
2024-02-20 18:05:57 +00:00
|
|
|
actualizeAll(locker, clearMode) {
|
|
|
|
parentRepo.getAll()
|
2023-01-27 09:15:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-08-22 21:26:54 +00:00
|
|
|
suspend inline fun <K, V> KeyValueRepo<K, V>.actualizeAll(
|
2024-02-20 18:05:57 +00:00
|
|
|
parentRepo: ReadCRUDRepo<V, K>,
|
|
|
|
locker: SmartRWLocker? = null,
|
|
|
|
clearMode: ActualizeAllClearMode = ActualizeAllClearMode.BeforeSet,
|
2023-01-27 09:15:27 +00:00
|
|
|
) {
|
2024-02-20 18:05:57 +00:00
|
|
|
actualizeAll(locker, clearMode) {
|
|
|
|
parentRepo.getAll()
|
2023-01-27 09:15:27 +00:00
|
|
|
}
|
|
|
|
}
|