mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2025-09-17 22:39:25 +00:00
Compare commits
31 Commits
Author | SHA1 | Date | |
---|---|---|---|
57ebed903f | |||
4478193d8a | |||
ee948395e3 | |||
0616b051ae | |||
4d155d0505 | |||
a169e733d9 | |||
f081e237c8 | |||
f412d387fa | |||
67354b43e2 | |||
39135a4000 | |||
eaa014cebd | |||
856e657f81 | |||
3a609e5b66 | |||
d0022dd599 | |||
7ba6eed453 | |||
beeb6ecc0a | |||
7cdc17a714 | |||
4765a950a9 | |||
65e8137e08 | |||
ae546dd9ad | |||
8110c42be0 | |||
bd2b5ae5fc | |||
2ddfffa6a9 | |||
a4b54e861d | |||
c6785f1a4f | |||
83fe621c56 | |||
b3a93e17eb | |||
546a391af3 | |||
786cf9bd8b | |||
dfd6fe062d | |||
b6ef818613 |
51
CHANGELOG.md
51
CHANGELOG.md
@@ -1,5 +1,56 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.20.0
|
||||||
|
|
||||||
|
## 0.19.9
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `Koin`: `3.4.2` -> `3.4.3`
|
||||||
|
* `Startup`:
|
||||||
|
* Now it is possible to start application in synchronous way
|
||||||
|
|
||||||
|
## 0.19.8
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `Coroutines`: `1.7.2` -> `1.7.3`
|
||||||
|
* `Kotlin`: `1.8.20` -> `1.8.22`
|
||||||
|
* `Compose`: `1.4.1` -> `1.4.3`
|
||||||
|
* `Okio`: `3.3.0` -> `3.4.0`
|
||||||
|
* `RecyclerView`: `1.3.0` -> `1.3.1`
|
||||||
|
* `Fragment`: `1.6.0` -> `1.6.1`
|
||||||
|
* `Repos`:
|
||||||
|
* Fixes In `KeyValueRepo.clear()` of almost all inheritors of `KeyValueRepo`
|
||||||
|
* `Cache`:
|
||||||
|
* All full caches got `skipStartInvalidate` property. By default, this property is `false` and fully caching repos
|
||||||
|
will be automatically invalidated on start of their work
|
||||||
|
|
||||||
|
## 0.19.7
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `Coroutines`: `1.7.1` -> `1.7.2`
|
||||||
|
|
||||||
|
## 0.19.6
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `Coroutines`: `1.6.4` -> `1.7.1`
|
||||||
|
* `Ktor`: `2.3.1` -> `2.3.2`
|
||||||
|
* `Compose`: `1.4.0` -> `1.4.1`
|
||||||
|
|
||||||
|
## 0.19.5
|
||||||
|
|
||||||
|
* `Repos`:
|
||||||
|
* `Generator`:
|
||||||
|
* Fixes in new type generation
|
||||||
|
|
||||||
|
## 0.19.4
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `Koin`: `3.4.1` -> `3.4.2`
|
||||||
|
* `Android Fragments`: `1.5.7` -> `1.6.0`
|
||||||
|
* `Koin`
|
||||||
|
* `Generator`
|
||||||
|
* Fixes in new generic generator part
|
||||||
|
|
||||||
## 0.19.3
|
## 0.19.3
|
||||||
|
|
||||||
* `Koin`
|
* `Koin`
|
||||||
|
@@ -17,6 +17,10 @@ buildscript {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
alias(libs.plugins.versions)
|
||||||
|
}
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
repositories {
|
repositories {
|
||||||
mavenLocal()
|
mavenLocal()
|
||||||
@@ -38,3 +42,4 @@ allprojects {
|
|||||||
|
|
||||||
apply from: "./extensions.gradle"
|
apply from: "./extensions.gradle"
|
||||||
apply from: "./github_release.gradle"
|
apply from: "./github_release.gradle"
|
||||||
|
apply from: "./versions_plugin_setup.gradle"
|
||||||
|
@@ -1,12 +1,10 @@
|
|||||||
package dev.inmo.micro_utils.common
|
package dev.inmo.micro_utils.common
|
||||||
|
|
||||||
import kotlinx.cinterop.ByteVar
|
import kotlinx.cinterop.*
|
||||||
import kotlinx.cinterop.allocArray
|
|
||||||
import kotlinx.cinterop.memScoped
|
|
||||||
import kotlinx.cinterop.toKString
|
|
||||||
import platform.posix.snprintf
|
import platform.posix.snprintf
|
||||||
import platform.posix.sprintf
|
import platform.posix.sprintf
|
||||||
|
|
||||||
|
@OptIn(ExperimentalForeignApi::class)
|
||||||
actual fun Float.fixed(signs: Int): Float {
|
actual fun Float.fixed(signs: Int): Float {
|
||||||
return memScoped {
|
return memScoped {
|
||||||
val buff = allocArray<ByteVar>(Float.SIZE_BYTES * 2)
|
val buff = allocArray<ByteVar>(Float.SIZE_BYTES * 2)
|
||||||
@@ -16,6 +14,7 @@ actual fun Float.fixed(signs: Int): Float {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalForeignApi::class)
|
||||||
actual fun Double.fixed(signs: Int): Double {
|
actual fun Double.fixed(signs: Int): Double {
|
||||||
return memScoped {
|
return memScoped {
|
||||||
val buff = allocArray<ByteVar>(Double.SIZE_BYTES * 2)
|
val buff = allocArray<ByteVar>(Double.SIZE_BYTES * 2)
|
||||||
|
@@ -1,12 +1,10 @@
|
|||||||
package dev.inmo.micro_utils.common
|
package dev.inmo.micro_utils.common
|
||||||
|
|
||||||
import kotlinx.cinterop.ByteVar
|
import kotlinx.cinterop.*
|
||||||
import kotlinx.cinterop.allocArray
|
|
||||||
import kotlinx.cinterop.memScoped
|
|
||||||
import kotlinx.cinterop.toKString
|
|
||||||
import platform.posix.snprintf
|
import platform.posix.snprintf
|
||||||
import platform.posix.sprintf
|
import platform.posix.sprintf
|
||||||
|
|
||||||
|
@OptIn(ExperimentalForeignApi::class)
|
||||||
actual fun Float.fixed(signs: Int): Float {
|
actual fun Float.fixed(signs: Int): Float {
|
||||||
return memScoped {
|
return memScoped {
|
||||||
val buff = allocArray<ByteVar>(Float.SIZE_BYTES * 2)
|
val buff = allocArray<ByteVar>(Float.SIZE_BYTES * 2)
|
||||||
@@ -16,6 +14,7 @@ actual fun Float.fixed(signs: Int): Float {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalForeignApi::class)
|
||||||
actual fun Double.fixed(signs: Int): Double {
|
actual fun Double.fixed(signs: Int): Double {
|
||||||
return memScoped {
|
return memScoped {
|
||||||
val buff = allocArray<ByteVar>(Double.SIZE_BYTES * 2)
|
val buff = allocArray<ByteVar>(Double.SIZE_BYTES * 2)
|
||||||
|
@@ -29,8 +29,4 @@ android {
|
|||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlinOptions {
|
|
||||||
jvmTarget = JavaVersion.VERSION_1_8.toString()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -3,6 +3,7 @@ org.gradle.parallel=true
|
|||||||
kotlin.js.generate.externals=true
|
kotlin.js.generate.externals=true
|
||||||
kotlin.incremental=true
|
kotlin.incremental=true
|
||||||
kotlin.incremental.js=true
|
kotlin.incremental.js=true
|
||||||
|
#kotlin.experimental.tryK2=true
|
||||||
android.useAndroidX=true
|
android.useAndroidX=true
|
||||||
android.enableJetifier=true
|
android.enableJetifier=true
|
||||||
org.gradle.jvmargs=-Xmx2g
|
org.gradle.jvmargs=-Xmx2g
|
||||||
@@ -14,5 +15,5 @@ crypto_js_version=4.1.1
|
|||||||
# Project data
|
# Project data
|
||||||
|
|
||||||
group=dev.inmo
|
group=dev.inmo
|
||||||
version=0.19.3
|
version=0.20.0
|
||||||
android_code_version=199
|
android_code_version=206
|
||||||
|
@@ -1,36 +1,38 @@
|
|||||||
[versions]
|
[versions]
|
||||||
|
|
||||||
kt = "1.8.20"
|
kt = "1.9.0"
|
||||||
kt-serialization = "1.5.1"
|
kt-serialization = "1.5.1"
|
||||||
kt-coroutines = "1.6.4"
|
kt-coroutines = "1.7.3"
|
||||||
|
|
||||||
kslog = "1.1.1"
|
kslog = "1.2.0"
|
||||||
|
|
||||||
jb-compose = "1.4.0"
|
jb-compose = "1.4.3"
|
||||||
jb-exposed = "0.41.1"
|
jb-exposed = "0.42.0"
|
||||||
jb-dokka = "1.8.20"
|
jb-dokka = "1.8.20"
|
||||||
|
|
||||||
korlibs = "4.0.3"
|
korlibs = "4.0.9"
|
||||||
uuid = "0.7.1"
|
uuid = "0.8.0"
|
||||||
|
|
||||||
ktor = "2.3.1"
|
ktor = "2.3.3"
|
||||||
|
|
||||||
gh-release = "2.4.1"
|
gh-release = "2.4.1"
|
||||||
|
|
||||||
koin = "3.4.1"
|
koin = "3.4.3"
|
||||||
|
|
||||||
okio = "3.3.0"
|
okio = "3.5.0"
|
||||||
|
|
||||||
ksp = "1.8.20-1.0.11"
|
ksp = "1.9.0-1.0.13"
|
||||||
kotlin-poet = "1.14.2"
|
kotlin-poet = "1.14.2"
|
||||||
|
|
||||||
|
versions = "0.47.0"
|
||||||
|
|
||||||
android-gradle = "7.4.2"
|
android-gradle = "7.4.2"
|
||||||
dexcount = "4.0.0"
|
dexcount = "4.0.0"
|
||||||
|
|
||||||
android-coreKtx = "1.10.1"
|
android-coreKtx = "1.10.1"
|
||||||
android-recyclerView = "1.3.0"
|
android-recyclerView = "1.3.1"
|
||||||
android-appCompat = "1.6.1"
|
android-appCompat = "1.6.1"
|
||||||
android-fragment = "1.5.7"
|
android-fragment = "1.6.1"
|
||||||
android-espresso = "3.5.1"
|
android-espresso = "3.5.1"
|
||||||
android-test = "1.1.5"
|
android-test = "1.1.5"
|
||||||
|
|
||||||
@@ -109,3 +111,5 @@ buildscript-android-dexcount = { module = "com.getkeepsafe.dexcount:dexcount-gra
|
|||||||
[plugins]
|
[plugins]
|
||||||
|
|
||||||
jb-compose = { id = "org.jetbrains.compose", version.ref = "jb-compose" }
|
jb-compose = { id = "org.jetbrains.compose", version.ref = "jb-compose" }
|
||||||
|
|
||||||
|
versions = { id = "com.github.ben-manes.versions", version.ref = "versions" }
|
||||||
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,5 +1,5 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
@@ -13,3 +13,8 @@ dependencies {
|
|||||||
api libs.kotlin.poet
|
api libs.kotlin.poet
|
||||||
api libs.ksp
|
api libs.ksp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
java {
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||||
|
targetCompatibility = JavaVersion.VERSION_1_8
|
||||||
|
}
|
||||||
|
@@ -127,7 +127,7 @@ class Processor(
|
|||||||
addModifiers(KModifier.INLINE)
|
addModifiers(KModifier.INLINE)
|
||||||
targetTypeAsGenericType ?.let {
|
targetTypeAsGenericType ?.let {
|
||||||
addTypeVariable(it)
|
addTypeVariable(it)
|
||||||
returns(it)
|
returns(it.copy(nullable = nullable))
|
||||||
} ?: returns(targetType)
|
} ?: returns(targetType)
|
||||||
addCode(
|
addCode(
|
||||||
"return " + (if (nullable) {
|
"return " + (if (nullable) {
|
||||||
@@ -159,9 +159,7 @@ class Processor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (generateSingle) {
|
if (generateSingle) {
|
||||||
fun FunSpec.Builder.configure(
|
fun FunSpec.Builder.configure() {
|
||||||
useInstead: String? = null
|
|
||||||
) {
|
|
||||||
addKdoc(
|
addKdoc(
|
||||||
"""
|
"""
|
||||||
Will register [definition] with [org.koin.core.module.Module.single] and key "${name}"
|
Will register [definition] with [org.koin.core.module.Module.single] and key "${name}"
|
||||||
@@ -185,30 +183,9 @@ class Processor(
|
|||||||
addTypeVariable(it)
|
addTypeVariable(it)
|
||||||
addModifiers(KModifier.INLINE)
|
addModifiers(KModifier.INLINE)
|
||||||
}
|
}
|
||||||
if (useInstead != null) {
|
|
||||||
addAnnotation(
|
|
||||||
AnnotationSpec.builder(
|
|
||||||
Deprecated::class
|
|
||||||
).apply {
|
|
||||||
addMember(
|
|
||||||
CodeBlock.of(
|
|
||||||
"""
|
|
||||||
"This definition is old style and should not be used anymore. Use $useInstead instead"
|
|
||||||
""".trimIndent()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
addMember(CodeBlock.of("ReplaceWith(\"$useInstead\")"))
|
|
||||||
}.build()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val actualSingleName = "single${name.replaceFirstChar { it.uppercase() }}"
|
val actualSingleName = "single${name.replaceFirstChar { it.uppercase() }}"
|
||||||
if (targetTypeAsGenericType == null) { // classic type
|
|
||||||
addFunction(
|
|
||||||
FunSpec.builder("${name}Single").apply { configure(actualSingleName) }.build()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
addFunction(
|
addFunction(
|
||||||
FunSpec.builder(actualSingleName).apply { configure() }.build()
|
FunSpec.builder(actualSingleName).apply { configure() }.build()
|
||||||
@@ -216,9 +193,7 @@ class Processor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (generateFactory) {
|
if (generateFactory) {
|
||||||
fun FunSpec.Builder.configure(
|
fun FunSpec.Builder.configure() {
|
||||||
useInstead: String? = null
|
|
||||||
) {
|
|
||||||
addKdoc(
|
addKdoc(
|
||||||
"""
|
"""
|
||||||
Will register [definition] with [org.koin.core.module.Module.factory] and key "${name}"
|
Will register [definition] with [org.koin.core.module.Module.factory] and key "${name}"
|
||||||
@@ -234,29 +209,8 @@ class Processor(
|
|||||||
addTypeVariable(it)
|
addTypeVariable(it)
|
||||||
addModifiers(KModifier.INLINE)
|
addModifiers(KModifier.INLINE)
|
||||||
}
|
}
|
||||||
if (useInstead != null) {
|
|
||||||
addAnnotation(
|
|
||||||
AnnotationSpec.builder(
|
|
||||||
Deprecated::class
|
|
||||||
).apply {
|
|
||||||
addMember(
|
|
||||||
CodeBlock.of(
|
|
||||||
"""
|
|
||||||
"This definition is old style and should not be used anymore. Use $useInstead instead"
|
|
||||||
""".trimIndent()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
addMember(CodeBlock.of("ReplaceWith(\"$useInstead\")"))
|
|
||||||
}.build()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
val actualFactoryName = "factory${name.replaceFirstChar { it.uppercase() }}"
|
val actualFactoryName = "factory${name.replaceFirstChar { it.uppercase() }}"
|
||||||
if (targetTypeAsGenericType == null) { // classic type
|
|
||||||
addFunction(
|
|
||||||
FunSpec.builder("${name}Factory").apply { configure(useInstead = actualFactoryName) }.build()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
addFunction(
|
addFunction(
|
||||||
FunSpec.builder(actualFactoryName).apply { configure() }.build()
|
FunSpec.builder(actualFactoryName).apply { configure() }.build()
|
||||||
)
|
)
|
||||||
|
@@ -97,3 +97,28 @@ public inline fun <reified T : Any> Module.singleTest(createdAtStart: Boolean =
|
|||||||
*/
|
*/
|
||||||
public inline fun <reified T : Any> Module.factoryTest(noinline definition: Definition<T>):
|
public inline fun <reified T : Any> Module.factoryTest(noinline definition: Definition<T>):
|
||||||
KoinDefinition<T> = factory(named("test"), definition = definition)
|
KoinDefinition<T> = factory(named("test"), definition = definition)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Definition by key "testNullable" with [parameters]
|
||||||
|
*/
|
||||||
|
public inline fun <reified T : Any> Scope.testNullable(noinline parameters: ParametersDefinition? =
|
||||||
|
null): T? = getOrNull(named("testNullable"), parameters)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Definition by key "testNullable" with [parameters]
|
||||||
|
*/
|
||||||
|
public inline fun <reified T : Any> Koin.testNullable(noinline parameters: ParametersDefinition? =
|
||||||
|
null): T? = getOrNull(named("testNullable"), parameters)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will register [definition] with [org.koin.core.module.Module.single] and key "testNullable"
|
||||||
|
*/
|
||||||
|
public inline fun <reified T : Any> Module.singleTestNullable(createdAtStart: Boolean = false,
|
||||||
|
noinline definition: Definition<T>): KoinDefinition<T> = single(named("testNullable"),
|
||||||
|
createdAtStart = createdAtStart, definition = definition)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will register [definition] with [org.koin.core.module.Module.factory] and key "testNullable"
|
||||||
|
*/
|
||||||
|
public inline fun <reified T : Any> Module.factoryTestNullable(noinline definition: Definition<T>):
|
||||||
|
KoinDefinition<T> = factory(named("testNullable"), definition = definition)
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
@file:GenerateKoinDefinition("sampleInfo", Test::class, String::class, nullable = false)
|
@file:GenerateKoinDefinition("sampleInfo", Test::class, String::class, nullable = false)
|
||||||
@file:GenerateGenericKoinDefinition("test", nullable = false)
|
@file:GenerateGenericKoinDefinition("test", nullable = false)
|
||||||
|
@file:GenerateGenericKoinDefinition("testNullable", nullable = true)
|
||||||
package dev.inmo.micro_utils.koin.generator.test
|
package dev.inmo.micro_utils.koin.generator.test
|
||||||
|
|
||||||
import dev.inmo.micro_utils.koin.annotations.GenerateGenericKoinDefinition
|
import dev.inmo.micro_utils.koin.annotations.GenerateGenericKoinDefinition
|
||||||
|
12
local.migrate.folder.sh
Executable file
12
local.migrate.folder.sh
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function renameFolders() {
|
||||||
|
for folder in $(find . -depth -type d -name "$1");
|
||||||
|
do
|
||||||
|
sedString="s/$1/$2/g"
|
||||||
|
newFolder="$(echo $folder | sed $sedString)"
|
||||||
|
echo $folder "$newFolder"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
renameFolders "androidTest" "androidUnitTest"
|
@@ -45,7 +45,7 @@ kotlin {
|
|||||||
implementation kotlin('test-junit')
|
implementation kotlin('test-junit')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
androidTest {
|
androidUnitTest {
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation kotlin('test-junit')
|
implementation kotlin('test-junit')
|
||||||
implementation libs.android.test.junit
|
implementation libs.android.test.junit
|
||||||
|
@@ -54,7 +54,7 @@ kotlin {
|
|||||||
implementation kotlin('test-junit')
|
implementation kotlin('test-junit')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
androidTest {
|
androidUnitTest {
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation kotlin('test-junit')
|
implementation kotlin('test-junit')
|
||||||
implementation libs.android.test.junit
|
implementation libs.android.test.junit
|
||||||
|
@@ -38,7 +38,7 @@ fun <Key, Value> ReadKeyValueRepo<Key, Value>.cached(
|
|||||||
) = ReadKeyValueCacheRepo(this, kvCache)
|
) = ReadKeyValueCacheRepo(this, kvCache)
|
||||||
|
|
||||||
open class KeyValueCacheRepo<Key,Value>(
|
open class KeyValueCacheRepo<Key,Value>(
|
||||||
parentRepo: KeyValueRepo<Key, Value>,
|
override val parentRepo: KeyValueRepo<Key, Value>,
|
||||||
kvCache: KVCache<Key, Value>,
|
kvCache: KVCache<Key, Value>,
|
||||||
scope: CoroutineScope = CoroutineScope(Dispatchers.Default)
|
scope: CoroutineScope = CoroutineScope(Dispatchers.Default)
|
||||||
) : ReadKeyValueCacheRepo<Key,Value>(parentRepo, kvCache), KeyValueRepo<Key,Value>, WriteKeyValueRepo<Key, Value> by parentRepo, CommonCacheRepo {
|
) : ReadKeyValueCacheRepo<Key,Value>(parentRepo, kvCache), KeyValueRepo<Key,Value>, WriteKeyValueRepo<Key, Value> by parentRepo, CommonCacheRepo {
|
||||||
@@ -46,6 +46,11 @@ open class KeyValueCacheRepo<Key,Value>(
|
|||||||
protected val onRemoveJob = parentRepo.onValueRemoved.onEach { kvCache.unset(it) }.launchIn(scope)
|
protected val onRemoveJob = parentRepo.onValueRemoved.onEach { kvCache.unset(it) }.launchIn(scope)
|
||||||
|
|
||||||
override suspend fun invalidate() = kvCache.clear()
|
override suspend fun invalidate() = kvCache.clear()
|
||||||
|
|
||||||
|
override suspend fun clear() {
|
||||||
|
parentRepo.clear()
|
||||||
|
kvCache.clear()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <Key, Value> KeyValueRepo<Key, Value>.cached(
|
fun <Key, Value> KeyValueRepo<Key, Value>.cached(
|
||||||
|
@@ -21,6 +21,12 @@ open class SimpleFullKVCache<K, V>(
|
|||||||
kvParent.unset(toUnset)
|
kvParent.unset(toUnset)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun clear() {
|
||||||
|
syncMutex.withLock {
|
||||||
|
kvParent.clear()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun <K, V> FullKVCache(
|
inline fun <K, V> FullKVCache(
|
||||||
|
@@ -37,6 +37,10 @@ open class SimpleKVCache<K, V>(
|
|||||||
override suspend fun unset(toUnset: List<K>) {
|
override suspend fun unset(toUnset: List<K>) {
|
||||||
syncMutex.withLock { makeUnset(toUnset) }
|
syncMutex.withLock { makeUnset(toUnset) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun clear() {
|
||||||
|
syncMutex.withLock { makeUnset(cacheQueue) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun <K, V> KVCache(
|
inline fun <K, V> KVCache(
|
||||||
|
@@ -39,4 +39,9 @@ open class AutoRecacheKeyValueRepo<Id, RegisteredObject>(
|
|||||||
).also {
|
).also {
|
||||||
kvCache.unsetWithValues(toUnset)
|
kvCache.unsetWithValues(toUnset)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun clear() {
|
||||||
|
originalRepo.clear()
|
||||||
|
kvCache.clear()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package dev.inmo.micro_utils.repos.cache.full
|
package dev.inmo.micro_utils.repos.cache.full
|
||||||
|
|
||||||
import dev.inmo.micro_utils.common.*
|
import dev.inmo.micro_utils.common.*
|
||||||
|
import dev.inmo.micro_utils.coroutines.launchSafelyWithoutExceptions
|
||||||
import dev.inmo.micro_utils.pagination.Pagination
|
import dev.inmo.micro_utils.pagination.Pagination
|
||||||
import dev.inmo.micro_utils.pagination.PaginationResult
|
import dev.inmo.micro_utils.pagination.PaginationResult
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
@@ -84,6 +85,7 @@ open class FullCRUDCacheRepo<ObjectType, IdType, InputValueType>(
|
|||||||
override val parentRepo: CRUDRepo<ObjectType, IdType, InputValueType>,
|
override val parentRepo: CRUDRepo<ObjectType, IdType, InputValueType>,
|
||||||
kvCache: FullKVCache<IdType, ObjectType>,
|
kvCache: FullKVCache<IdType, ObjectType>,
|
||||||
scope: CoroutineScope = CoroutineScope(Dispatchers.Default),
|
scope: CoroutineScope = CoroutineScope(Dispatchers.Default),
|
||||||
|
skipStartInvalidate: Boolean = false,
|
||||||
idGetter: (ObjectType) -> IdType
|
idGetter: (ObjectType) -> IdType
|
||||||
) : FullReadCRUDCacheRepo<ObjectType, IdType>(
|
) : FullReadCRUDCacheRepo<ObjectType, IdType>(
|
||||||
parentRepo,
|
parentRepo,
|
||||||
@@ -97,6 +99,12 @@ open class FullCRUDCacheRepo<ObjectType, IdType, InputValueType>(
|
|||||||
idGetter
|
idGetter
|
||||||
),
|
),
|
||||||
CRUDRepo<ObjectType, IdType, InputValueType> {
|
CRUDRepo<ObjectType, IdType, InputValueType> {
|
||||||
|
init {
|
||||||
|
if (!skipStartInvalidate) {
|
||||||
|
scope.launchSafelyWithoutExceptions { invalidate() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
actualizeAll()
|
actualizeAll()
|
||||||
}
|
}
|
||||||
@@ -105,12 +113,14 @@ open class FullCRUDCacheRepo<ObjectType, IdType, InputValueType>(
|
|||||||
fun <ObjectType, IdType, InputType> CRUDRepo<ObjectType, IdType, InputType>.fullyCached(
|
fun <ObjectType, IdType, InputType> CRUDRepo<ObjectType, IdType, InputType>.fullyCached(
|
||||||
kvCache: FullKVCache<IdType, ObjectType> = FullKVCache(),
|
kvCache: FullKVCache<IdType, ObjectType> = FullKVCache(),
|
||||||
scope: CoroutineScope = CoroutineScope(Dispatchers.Default),
|
scope: CoroutineScope = CoroutineScope(Dispatchers.Default),
|
||||||
|
skipStartInvalidate: Boolean = false,
|
||||||
idGetter: (ObjectType) -> IdType
|
idGetter: (ObjectType) -> IdType
|
||||||
) = FullCRUDCacheRepo(this, kvCache, scope, idGetter)
|
) = FullCRUDCacheRepo(this, kvCache, scope, skipStartInvalidate, idGetter)
|
||||||
|
|
||||||
@Deprecated("Renamed", ReplaceWith("this.fullyCached(kvCache, scope, idGetter)", "dev.inmo.micro_utils.repos.cache.full.fullyCached"))
|
@Deprecated("Renamed", ReplaceWith("this.fullyCached(kvCache, scope, idGetter)", "dev.inmo.micro_utils.repos.cache.full.fullyCached"))
|
||||||
fun <ObjectType, IdType, InputType> CRUDRepo<ObjectType, IdType, InputType>.cached(
|
fun <ObjectType, IdType, InputType> CRUDRepo<ObjectType, IdType, InputType>.cached(
|
||||||
kvCache: FullKVCache<IdType, ObjectType>,
|
kvCache: FullKVCache<IdType, ObjectType>,
|
||||||
scope: CoroutineScope = CoroutineScope(Dispatchers.Default),
|
scope: CoroutineScope = CoroutineScope(Dispatchers.Default),
|
||||||
|
skipStartInvalidate: Boolean = false,
|
||||||
idGetter: (ObjectType) -> IdType
|
idGetter: (ObjectType) -> IdType
|
||||||
) = fullyCached(kvCache, scope, idGetter)
|
) = fullyCached(kvCache, scope, skipStartInvalidate, idGetter)
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package dev.inmo.micro_utils.repos.cache.full
|
package dev.inmo.micro_utils.repos.cache.full
|
||||||
|
|
||||||
import dev.inmo.micro_utils.common.*
|
import dev.inmo.micro_utils.common.*
|
||||||
|
import dev.inmo.micro_utils.coroutines.launchSafelyWithoutExceptions
|
||||||
import dev.inmo.micro_utils.pagination.Pagination
|
import dev.inmo.micro_utils.pagination.Pagination
|
||||||
import dev.inmo.micro_utils.pagination.PaginationResult
|
import dev.inmo.micro_utils.pagination.PaginationResult
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
@@ -106,15 +107,30 @@ fun <Key, Value> WriteKeyValueRepo<Key, Value>.caching(
|
|||||||
open class FullKeyValueCacheRepo<Key,Value>(
|
open class FullKeyValueCacheRepo<Key,Value>(
|
||||||
protected open val parentRepo: KeyValueRepo<Key, Value>,
|
protected open val parentRepo: KeyValueRepo<Key, Value>,
|
||||||
kvCache: FullKVCache<Key, Value>,
|
kvCache: FullKVCache<Key, Value>,
|
||||||
scope: CoroutineScope = CoroutineScope(Dispatchers.Default)
|
scope: CoroutineScope = CoroutineScope(Dispatchers.Default),
|
||||||
|
skipStartInvalidate: Boolean = false
|
||||||
) : FullWriteKeyValueCacheRepo<Key,Value>(parentRepo, kvCache, scope),
|
) : FullWriteKeyValueCacheRepo<Key,Value>(parentRepo, kvCache, scope),
|
||||||
KeyValueRepo<Key,Value>,
|
KeyValueRepo<Key,Value>,
|
||||||
ReadKeyValueRepo<Key, Value> by FullReadKeyValueCacheRepo(parentRepo, kvCache) {
|
ReadKeyValueRepo<Key, Value> by FullReadKeyValueCacheRepo(
|
||||||
|
parentRepo,
|
||||||
|
kvCache
|
||||||
|
) {
|
||||||
|
init {
|
||||||
|
if (!skipStartInvalidate) {
|
||||||
|
scope.launchSafelyWithoutExceptions { invalidate() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override suspend fun unsetWithValues(toUnset: List<Value>) = parentRepo.unsetWithValues(toUnset)
|
override suspend fun unsetWithValues(toUnset: List<Value>) = parentRepo.unsetWithValues(toUnset)
|
||||||
|
|
||||||
override suspend fun invalidate() {
|
override suspend fun invalidate() {
|
||||||
kvCache.actualizeAll(parentRepo)
|
kvCache.actualizeAll(parentRepo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun clear() {
|
||||||
|
parentRepo.clear()
|
||||||
|
kvCache.clear()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <Key, Value> KeyValueRepo<Key, Value>.fullyCached(
|
fun <Key, Value> KeyValueRepo<Key, Value>.fullyCached(
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package dev.inmo.micro_utils.repos.cache.full
|
package dev.inmo.micro_utils.repos.cache.full
|
||||||
|
|
||||||
import dev.inmo.micro_utils.common.*
|
import dev.inmo.micro_utils.common.*
|
||||||
|
import dev.inmo.micro_utils.coroutines.launchSafelyWithoutExceptions
|
||||||
import dev.inmo.micro_utils.pagination.*
|
import dev.inmo.micro_utils.pagination.*
|
||||||
import dev.inmo.micro_utils.pagination.utils.*
|
import dev.inmo.micro_utils.pagination.utils.*
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
@@ -142,10 +143,17 @@ fun <Key, Value> WriteKeyValuesRepo<Key, Value>.caching(
|
|||||||
open class FullKeyValuesCacheRepo<Key,Value>(
|
open class FullKeyValuesCacheRepo<Key,Value>(
|
||||||
protected open val parentRepo: KeyValuesRepo<Key, Value>,
|
protected open val parentRepo: KeyValuesRepo<Key, Value>,
|
||||||
kvCache: FullKVCache<Key, List<Value>>,
|
kvCache: FullKVCache<Key, List<Value>>,
|
||||||
scope: CoroutineScope = CoroutineScope(Dispatchers.Default)
|
scope: CoroutineScope = CoroutineScope(Dispatchers.Default),
|
||||||
|
skipStartInvalidate: Boolean = false
|
||||||
) : FullWriteKeyValuesCacheRepo<Key, Value>(parentRepo, kvCache, scope),
|
) : FullWriteKeyValuesCacheRepo<Key, Value>(parentRepo, kvCache, scope),
|
||||||
KeyValuesRepo<Key, Value>,
|
KeyValuesRepo<Key, Value>,
|
||||||
ReadKeyValuesRepo<Key, Value> by FullReadKeyValuesCacheRepo(parentRepo, kvCache) {
|
ReadKeyValuesRepo<Key, Value> by FullReadKeyValuesCacheRepo(parentRepo, kvCache) {
|
||||||
|
init {
|
||||||
|
if (!skipStartInvalidate) {
|
||||||
|
scope.launchSafelyWithoutExceptions { invalidate() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override suspend fun clearWithValue(v: Value) {
|
override suspend fun clearWithValue(v: Value) {
|
||||||
doAllWithCurrentPaging {
|
doAllWithCurrentPaging {
|
||||||
keys(v, it).also {
|
keys(v, it).also {
|
||||||
|
@@ -7,6 +7,7 @@ import dev.inmo.micro_utils.pagination.*
|
|||||||
import dev.inmo.micro_utils.pagination.utils.paginate
|
import dev.inmo.micro_utils.pagination.utils.paginate
|
||||||
import dev.inmo.micro_utils.pagination.utils.reverse
|
import dev.inmo.micro_utils.pagination.utils.reverse
|
||||||
import dev.inmo.micro_utils.repos.KeyValueRepo
|
import dev.inmo.micro_utils.repos.KeyValueRepo
|
||||||
|
import dev.inmo.micro_utils.repos.pagination.maxPagePagination
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.*
|
||||||
|
|
||||||
private val cache = HashMap<String, KeyValueStore<*>>()
|
private val cache = HashMap<String, KeyValueStore<*>>()
|
||||||
@@ -159,6 +160,24 @@ class KeyValueStore<T : Any> internal constructor (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun clear() {
|
||||||
|
val keys = mutableSetOf<String>()
|
||||||
|
doWithPagination(maxPagePagination()) {
|
||||||
|
keys(it).also {
|
||||||
|
keys.addAll(it.results)
|
||||||
|
}.nextPageIfNotEmpty()
|
||||||
|
}
|
||||||
|
val success = sharedPreferences.edit().apply {
|
||||||
|
clear()
|
||||||
|
}.commit()
|
||||||
|
|
||||||
|
if (success) {
|
||||||
|
keys.forEach {
|
||||||
|
_onValueRemovedFlow.emit(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
operator fun <T : Any> invoke(
|
operator fun <T : Any> invoke(
|
||||||
context: Context,
|
context: Context,
|
@@ -127,7 +127,11 @@ open class MapperKeyValueRepo<FromKey, FromValue, ToKey, ToValue>(
|
|||||||
) : KeyValueRepo<FromKey, FromValue>,
|
) : KeyValueRepo<FromKey, FromValue>,
|
||||||
MapperRepo<FromKey, FromValue, ToKey, ToValue> by mapper,
|
MapperRepo<FromKey, FromValue, ToKey, ToValue> by mapper,
|
||||||
ReadKeyValueRepo<FromKey, FromValue> by MapperReadKeyValueRepo(to, mapper),
|
ReadKeyValueRepo<FromKey, FromValue> by MapperReadKeyValueRepo(to, mapper),
|
||||||
WriteKeyValueRepo<FromKey, FromValue> by MapperWriteKeyValueRepo(to, mapper)
|
WriteKeyValueRepo<FromKey, FromValue> by MapperWriteKeyValueRepo(to, mapper) {
|
||||||
|
override suspend fun clear() {
|
||||||
|
to.clear()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Suppress("NOTHING_TO_INLINE")
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
inline fun <FromKey, FromValue, ToKey, ToValue> KeyValueRepo<ToKey, ToValue>.withMapper(
|
inline fun <FromKey, FromValue, ToKey, ToValue> KeyValueRepo<ToKey, ToValue>.withMapper(
|
||||||
|
@@ -202,9 +202,14 @@ class FileWriteKeyValueRepo(
|
|||||||
@Warning("Files watching will not correctly works on Android Platform with version of API lower than API 26")
|
@Warning("Files watching will not correctly works on Android Platform with version of API lower than API 26")
|
||||||
@Suppress("DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE")
|
@Suppress("DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE")
|
||||||
class FileKeyValueRepo(
|
class FileKeyValueRepo(
|
||||||
folder: File,
|
private val folder: File,
|
||||||
filesChangedProcessingScope: CoroutineScope? = null
|
filesChangedProcessingScope: CoroutineScope? = null
|
||||||
) : KeyValueRepo<String, File>,
|
) : KeyValueRepo<String, File>,
|
||||||
WriteKeyValueRepo<String, File> by FileWriteKeyValueRepo(folder, filesChangedProcessingScope),
|
WriteKeyValueRepo<String, File> by FileWriteKeyValueRepo(folder, filesChangedProcessingScope),
|
||||||
ReadKeyValueRepo<String, File> by FileReadKeyValueRepo(folder) {
|
ReadKeyValueRepo<String, File> by FileReadKeyValueRepo(folder) {
|
||||||
|
override suspend fun clear() {
|
||||||
|
withContext(Dispatchers.IO) {
|
||||||
|
folder.listFiles() ?.forEach { runCatching { it.deleteRecursively() } }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -73,4 +73,18 @@ abstract class AbstractExposedKeyValueRepo<Key, Value>(
|
|||||||
_onValueRemoved.emit(it)
|
_onValueRemoved.emit(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun clear() {
|
||||||
|
transaction(database) {
|
||||||
|
val keys = selectAll().map { it.asKey }
|
||||||
|
|
||||||
|
deleteAll()
|
||||||
|
|
||||||
|
keys
|
||||||
|
}.also {
|
||||||
|
it.forEach {
|
||||||
|
_onValueRemoved.emit(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -6,6 +6,7 @@ import kotlinx.coroutines.flow.*
|
|||||||
import org.jetbrains.exposed.sql.*
|
import org.jetbrains.exposed.sql.*
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.inList
|
import org.jetbrains.exposed.sql.SqlExpressionBuilder.inList
|
||||||
|
import org.jetbrains.exposed.sql.SqlExpressionBuilder.inSubQuery
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.sql.transactions.transaction
|
||||||
|
|
||||||
open class ExposedKeyValueRepo<Key, Value>(
|
open class ExposedKeyValueRepo<Key, Value>(
|
||||||
@@ -72,4 +73,18 @@ open class ExposedKeyValueRepo<Key, Value>(
|
|||||||
_onValueRemoved.emit(it)
|
_onValueRemoved.emit(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun clear() {
|
||||||
|
transaction(database) {
|
||||||
|
val keys = selectAll().map { it.asKey }
|
||||||
|
|
||||||
|
deleteAll()
|
||||||
|
|
||||||
|
keys
|
||||||
|
}.also {
|
||||||
|
it.forEach {
|
||||||
|
_onValueRemoved.emit(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -14,3 +14,8 @@ dependencies {
|
|||||||
api libs.kotlin.poet
|
api libs.kotlin.poet
|
||||||
api libs.ksp
|
api libs.ksp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
java {
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||||
|
targetCompatibility = JavaVersion.VERSION_1_8
|
||||||
|
}
|
||||||
|
@@ -100,7 +100,11 @@ class Processor(
|
|||||||
primaryConstructor(
|
primaryConstructor(
|
||||||
FunSpec.constructorBuilder().apply {
|
FunSpec.constructorBuilder().apply {
|
||||||
ksClassProperties.forEach {
|
ksClassProperties.forEach {
|
||||||
addParameter(it.simpleName.getShortName(), it.typeName)
|
addParameter(
|
||||||
|
ParameterSpec.builder(it.simpleName.getShortName(), it.typeName).apply {
|
||||||
|
annotations += it.annotations.map { it.toAnnotationSpec() }
|
||||||
|
}.build()
|
||||||
|
)
|
||||||
typeBuilder.addProperty(
|
typeBuilder.addProperty(
|
||||||
PropertySpec.builder(it.simpleName.getShortName(), it.typeName, KModifier.OVERRIDE).apply {
|
PropertySpec.builder(it.simpleName.getShortName(), it.typeName, KModifier.OVERRIDE).apply {
|
||||||
initializer(it.simpleName.getShortName())
|
initializer(it.simpleName.getShortName())
|
||||||
|
@@ -11,18 +11,20 @@ import kotlinx.serialization.Serializable
|
|||||||
@Serializable
|
@Serializable
|
||||||
@SerialName(value = "NewTest")
|
@SerialName(value = "NewTest")
|
||||||
public data class NewTest(
|
public data class NewTest(
|
||||||
public override val property1: String,
|
override val property1: String,
|
||||||
public override val property2: Int,
|
override val property2: Int,
|
||||||
public override val parent: ParentTypeId?,
|
@Serializable
|
||||||
|
override val parent: ParentTypeId?,
|
||||||
) : Test
|
) : Test
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
@SerialName(value = "RegisteredTest")
|
@SerialName(value = "RegisteredTest")
|
||||||
public data class RegisteredTest(
|
public data class RegisteredTest(
|
||||||
public override val id: TestId,
|
override val id: TestId,
|
||||||
public override val property1: String,
|
override val property1: String,
|
||||||
public override val property2: Int,
|
override val property2: Int,
|
||||||
public override val parent: ParentTypeId?,
|
@Serializable
|
||||||
|
override val parent: ParentTypeId?,
|
||||||
) : Test, IRegisteredTest
|
) : Test, IRegisteredTest
|
||||||
|
|
||||||
public fun Test.asNew(): NewTest = NewTest(property1, property2, parent)
|
public fun Test.asNew(): NewTest = NewTest(property1, property2, parent)
|
||||||
|
@@ -17,6 +17,7 @@ typealias ParentTypeId = TestId
|
|||||||
sealed interface Test {
|
sealed interface Test {
|
||||||
val property1: String
|
val property1: String
|
||||||
val property2: Int
|
val property2: Int
|
||||||
|
@Serializable
|
||||||
val parent: ParentTypeId?
|
val parent: ParentTypeId?
|
||||||
|
|
||||||
@GenerateCRUDModelExcludeOverride
|
@GenerateCRUDModelExcludeOverride
|
||||||
|
@@ -94,6 +94,10 @@ class MapKeyValueRepo<Key, Value>(
|
|||||||
private val map: MutableMap<Key, Value> = mutableMapOf()
|
private val map: MutableMap<Key, Value> = mutableMapOf()
|
||||||
) : KeyValueRepo<Key, Value>,
|
) : KeyValueRepo<Key, Value>,
|
||||||
ReadKeyValueRepo<Key, Value> by ReadMapKeyValueRepo(map),
|
ReadKeyValueRepo<Key, Value> by ReadMapKeyValueRepo(map),
|
||||||
WriteKeyValueRepo<Key, Value> by WriteMapKeyValueRepo(map)
|
WriteKeyValueRepo<Key, Value> by WriteMapKeyValueRepo(map) {
|
||||||
|
override suspend fun clear() {
|
||||||
|
map.clear()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun <K, V> MutableMap<K, V>.asKeyValueRepo(): KeyValueRepo<K, V> = MapKeyValueRepo(this)
|
fun <K, V> MutableMap<K, V>.asKeyValueRepo(): KeyValueRepo<K, V> = MapKeyValueRepo(this)
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user