diff --git a/CHANGELOG.md b/CHANGELOG.md index 60dfc95d187..c2a0f57b93a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,31 @@ # Changelog +## 0.4.31 + +* `Versions`: + * `Kotlin`: `1.4.31` -> `1.4.32` +* `Pagination`: + * New extensions `PaginationResult.changeResultsUnchecked` and `PaginationResult.changeResults` for mapping results + with the same parameters, but different data + * Extension `PaginationResult.thisPageIfNotEmpty` now is typed and will return `PaginationResult?` with the same + generic type as income `PaginationResult` + * New extension `PaginationResult.currentPageIfNotEmpty` - shortcut for `PaginationResult.thisPageIfNotEmpty` + * New common functions. They were created as replacements for currently available for more comfortable work + with repos pagination: + * `doForAll` + * `doForAllWithNextPaging` + * `doForAllWithCurrentPaging` + * `getAll` + * `getAllWithNextPaging` + * `getAllWithCurrentPaging` +* `Coroutines`: + * Rewrite `subscribeSafelyWithoutExceptions` + * Now `subscribeSafelyWithoutExceptions` will use default handler instead of skipping + * New extension `subscribeSafelySkippingExceptions` +* `Repos` + * New subproject `repos.cache` - this subproject will contain repos with data caching mechanisms + * Most old `doForAll` methods have been deprecated + ## 0.4.30 * `Versions`: diff --git a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/FlowSubscription.kt b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/FlowSubscription.kt index 26588ac166c..76546375293 100644 --- a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/FlowSubscription.kt +++ b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/FlowSubscription.kt @@ -25,13 +25,25 @@ inline fun Flow.subscribeSafely( } /** - * Use [subscribeSafelyWithoutExceptions], but all exceptions inside of [safely] will be skipped + * Use [subscribeSafelyWithoutExceptions], but all exceptions will be passed to [defaultSafelyExceptionHandler] */ inline fun Flow.subscribeSafelyWithoutExceptions( scope: CoroutineScope, noinline block: suspend (T) -> Unit -) = subscribeSafely( - scope, - {}, - block -) +) = subscribe(scope) { + safelyWithoutExceptions { + block(it) + } +} + +/** + * Use [subscribeSafelyWithoutExceptions], but all exceptions inside of [safely] will be skipped + */ +inline fun Flow.subscribeSafelySkippingExceptions( + scope: CoroutineScope, + noinline block: suspend (T) -> Unit +) = subscribe(scope) { + safelyWithoutExceptions({ /* skip exceptions */ }) { + block(it) + } +} diff --git a/gradle.properties b/gradle.properties index 7cf9f57a1bd..3b8fde88d41 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ kotlin.incremental.js=true android.useAndroidX=true android.enableJetifier=true -kotlin_version=1.4.31 +kotlin_version=1.4.32 kotlin_coroutines_version=1.4.3 kotlin_serialisation_core_version=1.1.0 kotlin_exposed_version=0.29.1 @@ -44,5 +44,5 @@ dokka_version=1.4.20 # Project data group=dev.inmo -version=0.4.30 -android_code_version=34 +version=0.4.31 +android_code_version=35 diff --git a/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/PaginationResult.kt b/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/PaginationResult.kt index 35c3f3939a8..fbc092069d4 100644 --- a/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/PaginationResult.kt +++ b/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/PaginationResult.kt @@ -12,6 +12,22 @@ data class PaginationResult( fun emptyPaginationResult() = PaginationResult(0, 0, emptyList(), 0) +/** + * @return New [PaginationResult] with [data] without checking of data sizes equality + */ +fun PaginationResult.changeResultsUnchecked( + data: List +): PaginationResult = PaginationResult(page, pagesNumber, data, size) +/** + * @return New [PaginationResult] with [data] with checking of data sizes equality + */ +fun PaginationResult.changeResults( + data: List +): PaginationResult { + require(data.size == results.size) + return changeResultsUnchecked(data) +} + fun List.createPaginationResult( pagination: Pagination, commonObjectsNumber: Long diff --git a/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/WalkPagination.kt b/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/WalkPagination.kt index aed3d2716fa..05c1087fed8 100644 --- a/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/WalkPagination.kt +++ b/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/WalkPagination.kt @@ -21,8 +21,10 @@ inline fun PaginationResult<*>.nextPageIfNotEmpty() = if (results.isNotEmpty()) } @Suppress("NOTHING_TO_INLINE") -inline fun PaginationResult<*>.thisPageIfNotEmpty(): Pagination? = if (results.isNotEmpty()) { +inline fun PaginationResult.thisPageIfNotEmpty(): PaginationResult? = if (results.isNotEmpty()) { this } else { null } + +inline fun PaginationResult.currentPageIfNotEmpty() = thisPageIfNotEmpty() diff --git a/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/utils/DoForAll.kt b/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/utils/DoForAll.kt new file mode 100644 index 00000000000..761e3b63629 --- /dev/null +++ b/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/utils/DoForAll.kt @@ -0,0 +1,35 @@ +package dev.inmo.micro_utils.pagination.utils + +import dev.inmo.micro_utils.pagination.* + +suspend fun doForAll( + initialPagination: Pagination = FirstPagePagination(), + paginationMapper: (PaginationResult) -> Pagination?, + block: suspend (Pagination) -> PaginationResult +) { + doWithPagination(initialPagination) { + block(it).let(paginationMapper) + } +} + +suspend fun doForAllWithNextPaging( + initialPagination: Pagination = FirstPagePagination(), + block: suspend (Pagination) -> PaginationResult +) { + doForAll( + initialPagination, + { it.nextPageIfNotEmpty() }, + block + ) +} + +suspend fun doAllWithCurrentPaging( + initialPagination: Pagination = FirstPagePagination(), + block: suspend (Pagination) -> PaginationResult +) { + doForAll( + initialPagination, + { it.currentPageIfNotEmpty() }, + block + ) +} diff --git a/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/utils/GetAll.kt b/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/utils/GetAll.kt new file mode 100644 index 00000000000..5ad674cb746 --- /dev/null +++ b/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/utils/GetAll.kt @@ -0,0 +1,35 @@ +package dev.inmo.micro_utils.pagination.utils + +import dev.inmo.micro_utils.pagination.* + +suspend fun getAll( + initialPagination: Pagination = FirstPagePagination(), + paginationMapper: (PaginationResult) -> Pagination?, + block: suspend (Pagination) -> PaginationResult +): List { + val results = mutableListOf() + doForAll(initialPagination, paginationMapper) { + block(it).also { + results.addAll(it.results) + } + } + return results.toList() +} + +suspend fun getAllWithNextPaging( + initialPagination: Pagination = FirstPagePagination(), + block: suspend (Pagination) -> PaginationResult +): List = getAll( + initialPagination, + { it.nextPageIfNotEmpty() }, + block +) + +suspend fun getAllWithCurrentPaging( + initialPagination: Pagination = FirstPagePagination(), + block: suspend (Pagination) -> PaginationResult +): List = getAll( + initialPagination, + { it.currentPageIfNotEmpty() }, + block +) diff --git a/repos/cache/build.gradle b/repos/cache/build.gradle new file mode 100644 index 00000000000..e128b1e3cff --- /dev/null +++ b/repos/cache/build.gradle @@ -0,0 +1,18 @@ +plugins { + id "org.jetbrains.kotlin.multiplatform" + id "org.jetbrains.kotlin.plugin.serialization" + id "com.android.library" +} + +apply from: "$mppProjectWithSerializationPresetPath" + +kotlin { + sourceSets { + commonMain { + dependencies { + api internalProject("micro_utils.repos.common") + api internalProject("micro_utils.repos.inmemory") + } + } + } +} \ No newline at end of file diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/CRUDCacheRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/CRUDCacheRepo.kt new file mode 100644 index 00000000000..22ffbb489c9 --- /dev/null +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/CRUDCacheRepo.kt @@ -0,0 +1,24 @@ +package dev.inmo.micro_utils.repos.cache + +import dev.inmo.micro_utils.repos.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach + +open class CRUDCacheRepo( + protected val parentRepo: CRUDRepo, + protected val kvCache: KVCache, + scope: CoroutineScope = CoroutineScope(Dispatchers.Default), + protected val idGetter: (ObjectType) -> IdType +) : CRUDRepo by parentRepo { + protected val onNewJob = parentRepo.newObjectsFlow.onEach { kvCache.set(idGetter(it), it) }.launchIn(scope) + protected val onUpdatedJob = parentRepo.updatedObjectsFlow.onEach { kvCache.set(idGetter(it), it) }.launchIn(scope) + protected val onRemoveJob = parentRepo.deletedObjectsIdsFlow.onEach { kvCache.unset(it) }.launchIn(scope) + + override suspend fun getById(id: IdType): ObjectType? = kvCache.get(id) ?: (parentRepo.getById(id) ?.also { + kvCache.set(id, it) + }) + + override suspend fun contains(id: IdType): Boolean = kvCache.contains(id) || parentRepo.contains(id) +} diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/KVCache.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/KVCache.kt new file mode 100644 index 00000000000..a7248352446 --- /dev/null +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/KVCache.kt @@ -0,0 +1,41 @@ +package dev.inmo.micro_utils.repos.cache + +import dev.inmo.micro_utils.repos.* +import dev.inmo.micro_utils.pagination.utils.getAllWithNextPaging +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock + +interface KVCache : KeyValueRepo + +open class SimpleKVCache( + protected val cachedValuesCount: Int, + private val kvParent: KeyValueRepo = MapKeyValueRepo() +) : KVCache, KeyValueRepo by kvParent { + protected open val cacheStack = ArrayList(cachedValuesCount) + protected val syncMutex = Mutex() + + protected suspend fun makeUnset(toUnset: List) { + cacheStack.removeAll(toUnset) + kvParent.unset(toUnset) + } + + override suspend fun set(toSet: Map) { + syncMutex.withLock { + if (toSet.size > cachedValuesCount) { + cacheStack.clear() + + kvParent.unset(getAllWithNextPaging { kvParent.keys(it) }) + val keysToInclude = toSet.keys.drop(toSet.size - cachedValuesCount) + + cacheStack.addAll(keysToInclude) + kvParent.set(keysToInclude.associateWith { toSet.getValue(it) }) + } else { + makeUnset(cacheStack.take(toSet.size)) + } + } + } + + override suspend fun unset(toUnset: List) { + syncMutex.withLock { makeUnset(toUnset) } + } +} diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/KeyValueCacheRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/KeyValueCacheRepo.kt new file mode 100644 index 00000000000..86d865afe03 --- /dev/null +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/KeyValueCacheRepo.kt @@ -0,0 +1,20 @@ +package dev.inmo.micro_utils.repos.cache + +import dev.inmo.micro_utils.repos.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.* +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock + +open class KeyValueCacheRepo( + protected val parentRepo: KeyValueRepo, + protected val kvCache: KVCache, + scope: CoroutineScope = CoroutineScope(Dispatchers.Default) +) : KeyValueRepo by parentRepo { + protected val onNewJob = parentRepo.onNewValue.onEach { kvCache.set(it.first, it.second) }.launchIn(scope) + protected val onRemoveJob = parentRepo.onValueRemoved.onEach { kvCache.unset(it) }.launchIn(scope) + + override suspend fun get(k: Key): Value? = kvCache.get(k) ?: parentRepo.get(k) ?.also { kvCache.set(k, it) } + override suspend fun contains(key: Key): Boolean = kvCache.contains(key) || parentRepo.contains(key) +} diff --git a/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/KeyValuesCacheRepo.kt b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/KeyValuesCacheRepo.kt new file mode 100644 index 00000000000..26b12af4fd2 --- /dev/null +++ b/repos/cache/src/commonMain/kotlin/dev/inmo/micro_utils/repos/cache/KeyValuesCacheRepo.kt @@ -0,0 +1,37 @@ +package dev.inmo.micro_utils.repos.cache + +import dev.inmo.micro_utils.pagination.Pagination +import dev.inmo.micro_utils.pagination.PaginationResult +import dev.inmo.micro_utils.pagination.utils.paginate +import dev.inmo.micro_utils.pagination.utils.reverse +import dev.inmo.micro_utils.repos.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.* +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock + +open class KeyValuesCacheRepo( + protected val parentRepo: KeyValuesRepo, + protected val kvCache: KVCache>, + scope: CoroutineScope = CoroutineScope(Dispatchers.Default) +) : KeyValuesRepo by parentRepo { + protected val onNewJob = parentRepo.onNewValue.onEach { kvCache.set(it.first, kvCache.get(it.first) ?.plus(it.second) ?: listOf(it.second)) }.launchIn(scope) + protected val onRemoveJob = parentRepo.onValueRemoved.onEach { kvCache.set(it.first, kvCache.get(it.first) ?.minus(it.second) ?: return@onEach) }.launchIn(scope) + protected val onDataClearedJob = parentRepo.onDataCleared.onEach { kvCache.unset(it) }.launchIn(scope) + + override suspend fun get(k: Key, pagination: Pagination, reversed: Boolean): PaginationResult { + return kvCache.get(k) ?.paginate( + pagination.let { if (reversed) it.reverse(count(k)) else it } + ) ?.let { + if (reversed) it.copy(results = it.results.reversed()) else it + } ?: parentRepo.get(k, pagination, reversed) + } + override suspend fun getAll(k: Key, reversed: Boolean): List { + return kvCache.get(k) ?.let { + if (reversed) it.reversed() else it + } ?: parentRepo.getAll(k, reversed) + } + override suspend fun contains(k: Key, v: Value): Boolean = kvCache.get(k) ?.contains(v) ?: parentRepo.contains(k, v) + override suspend fun contains(k: Key): Boolean = kvCache.contains(k) || parentRepo.contains(k) +} diff --git a/repos/cache/src/main/AndroidManifest.xml b/repos/cache/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..6abbe185efb --- /dev/null +++ b/repos/cache/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/OneToManyKeyValueRepo.kt b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/OneToManyKeyValueRepo.kt index b08e10ff5da..001c618851b 100644 --- a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/OneToManyKeyValueRepo.kt +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/OneToManyKeyValueRepo.kt @@ -1,6 +1,7 @@ package dev.inmo.micro_utils.repos import dev.inmo.micro_utils.pagination.* +import dev.inmo.micro_utils.pagination.utils.getAllWithNextPaging import kotlinx.coroutines.flow.Flow interface ReadOneToManyKeyValueRepo : Repo { @@ -12,14 +13,12 @@ interface ReadOneToManyKeyValueRepo : Repo { suspend fun count(k: Key): Long suspend fun count(): Long - suspend fun getAll(k: Key, reversed: Boolean = false): List = mutableListOf().also { list -> - doWithPagination { - get(k, it).also { - list.addAll(it.results) - }.nextPageIfNotEmpty() - } - if (reversed) { - list.reverse() + suspend fun getAll(k: Key, reversed: Boolean = false): List { + val results = getAllWithNextPaging { get(k, it) } + return if (reversed) { + results.reversed() + } else { + results } } diff --git a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartKeyValueRepo.kt b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartKeyValueRepo.kt index 449396889c9..90ad3a0b92f 100644 --- a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartKeyValueRepo.kt +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartKeyValueRepo.kt @@ -1,6 +1,7 @@ package dev.inmo.micro_utils.repos import dev.inmo.micro_utils.pagination.* +import dev.inmo.micro_utils.pagination.utils.doAllWithCurrentPaging import kotlinx.coroutines.flow.Flow interface ReadStandardKeyValueRepo : Repo { @@ -41,7 +42,7 @@ suspend inline fun WriteStandardKeyValueRepo.unsetWithV interface StandardKeyValueRepo : ReadStandardKeyValueRepo, WriteStandardKeyValueRepo { override suspend fun unsetWithValues(toUnset: List) = toUnset.forEach { v -> - doWithPagination { + doAllWithCurrentPaging { keys(v, it).also { unset(it.results) } diff --git a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/pagination/CRUDPaginationExtensions.kt b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/pagination/CRUDPaginationExtensions.kt index e626262f229..75478b0a2ae 100644 --- a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/pagination/CRUDPaginationExtensions.kt +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/pagination/CRUDPaginationExtensions.kt @@ -1,31 +1,33 @@ package dev.inmo.micro_utils.repos.pagination import dev.inmo.micro_utils.pagination.* +import dev.inmo.micro_utils.pagination.utils.doForAllWithNextPaging +import dev.inmo.micro_utils.pagination.utils.getAllWithNextPaging import dev.inmo.micro_utils.repos.ReadStandardCRUDRepo +@Deprecated("Will be removed soon due to redundancy. Can be replaced with other doForAll extensions") suspend inline fun > REPO.doForAll( @Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE") - methodCaller: suspend REPO.(Pagination) -> PaginationResult, - block: (List) -> Unit + crossinline methodCaller: suspend REPO.(Pagination) -> PaginationResult, + crossinline block: (List) -> Unit ) { - doWithPagination { + doForAllWithNextPaging { methodCaller(it).also { block(it.results) - }.nextPageIfNotEmpty() + } } } +@Deprecated("Will be removed soon due to redundancy. Can be replaced with other doForAll extensions") suspend inline fun > REPO.doForAll( - block: (List) -> Unit -) = doForAll({ getByPagination(it) }, block) + crossinline block: (List) -> Unit +) = doForAllWithNextPaging { + getByPagination(it).also { block(it.results) } +} suspend inline fun > REPO.getAll( @Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE") - methodCaller: suspend REPO.(Pagination) -> PaginationResult -): List { - val resultList = mutableListOf() - doForAll(methodCaller) { - resultList.addAll(it) - } - return resultList + crossinline methodCaller: suspend REPO.(Pagination) -> PaginationResult +): List = getAllWithNextPaging { + methodCaller(this, it) } diff --git a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/pagination/KeyValuePaginationExtensions.kt b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/pagination/KeyValuePaginationExtensions.kt index 9a4b3391f2f..bb9a75b91a7 100644 --- a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/pagination/KeyValuePaginationExtensions.kt +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/pagination/KeyValuePaginationExtensions.kt @@ -1,8 +1,10 @@ package dev.inmo.micro_utils.repos.pagination import dev.inmo.micro_utils.pagination.* +import dev.inmo.micro_utils.pagination.utils.getAllWithNextPaging import dev.inmo.micro_utils.repos.ReadStandardKeyValueRepo +@Deprecated("Will be removed soon due to redundancy") suspend inline fun > REPO.doForAll( @Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE") methodCaller: suspend REPO.(Pagination) -> PaginationResult, @@ -15,17 +17,17 @@ suspend inline fun > REP } } +@Deprecated("Will be removed soon due to redundancy") suspend inline fun > REPO.doForAll( block: (List>) -> Unit ) = doForAll({ keys(it, false) }, block) suspend inline fun > REPO.getAll( @Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE") - methodCaller: suspend REPO.(Pagination) -> PaginationResult -): List> { - val resultList = mutableListOf>() - doForAll(methodCaller) { - resultList.addAll(it) - } - return resultList + crossinline methodCaller: suspend REPO.(Pagination) -> PaginationResult +): List> = getAllWithNextPaging { + val result = methodCaller(it) + result.changeResultsUnchecked( + result.results.mapNotNull { it to (get(it) ?: return@mapNotNull null) } + ) } diff --git a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/pagination/OneToManyPaginationExtensions.kt b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/pagination/OneToManyPaginationExtensions.kt index 28d3405e595..5e46015a060 100644 --- a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/pagination/OneToManyPaginationExtensions.kt +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/pagination/OneToManyPaginationExtensions.kt @@ -1,8 +1,10 @@ package dev.inmo.micro_utils.repos.pagination import dev.inmo.micro_utils.pagination.* +import dev.inmo.micro_utils.pagination.utils.getAllWithNextPaging import dev.inmo.micro_utils.repos.ReadOneToManyKeyValueRepo +@Deprecated("Will be removed soon due to redundancy") suspend inline fun > REPO.doForAll( @Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE") methodCaller: suspend REPO.(Pagination) -> PaginationResult, @@ -25,17 +27,19 @@ suspend inline fun > RE } } +@Deprecated("Will be removed soon due to redundancy") suspend inline fun > REPO.doForAll( block: (List>>) -> Unit ) = doForAll({ keys(it, false) }, block) suspend inline fun > REPO.getAll( @Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE") - methodCaller: suspend REPO.(Pagination) -> PaginationResult -): List>> { - val resultList = mutableListOf>>() - doForAll(methodCaller) { - resultList.addAll(it) - } - return resultList + crossinline methodCaller: suspend REPO.(Pagination) -> PaginationResult +): List>> = getAllWithNextPaging { + val keysResult = methodCaller(it) + keysResult.changeResultsUnchecked( + keysResult.results.map { k -> + k to getAll(k) + } + ) } diff --git a/settings.gradle b/settings.gradle index ea4cd8a08b3..5d0afc1c814 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,6 +11,7 @@ String[] includes = [ ":pagination:ktor:server", ":mime_types", ":repos:common", + ":repos:cache", ":repos:exposed", ":repos:inmemory", ":repos:ktor:client",