diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e8ba924460..f56c225cb53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,4 +8,7 @@ Inited :) * `Repos` * `Common` - * Extension `ReadStandardCRUDRepo#doWithAll` has been added + * Extensions `doForAll` and `getAll` were added for all current types of repos: + * `ReadStandardCRUDRepo` + * `StandardReadKeyValueRepo` + * `OneToManyReadKeyValueRepo` 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 b3a1a4637f7..6cc2c6a03f7 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 @@ -6,8 +6,8 @@ import kotlinx.coroutines.flow.Flow interface StandardReadKeyValueRepo : Repo { suspend fun get(k: Key): Value? - suspend fun values(pagination: Pagination, reversed: Boolean): PaginationResult - suspend fun keys(pagination: Pagination, reversed: Boolean): PaginationResult + suspend fun values(pagination: Pagination, reversed: Boolean = false): PaginationResult + suspend fun keys(pagination: Pagination, reversed: Boolean = false): PaginationResult suspend fun contains(key: Key): Boolean suspend fun count(): Long } 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 new file mode 100644 index 00000000000..e626262f229 --- /dev/null +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/pagination/CRUDPaginationExtensions.kt @@ -0,0 +1,31 @@ +package dev.inmo.micro_utils.repos.pagination + +import dev.inmo.micro_utils.pagination.* +import dev.inmo.micro_utils.repos.ReadStandardCRUDRepo + +suspend inline fun > REPO.doForAll( + @Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE") + methodCaller: suspend REPO.(Pagination) -> PaginationResult, + block: (List) -> Unit +) { + doWithPagination { + methodCaller(it).also { + block(it.results) + }.nextPageIfNotEmpty() + } +} + +suspend inline fun > REPO.doForAll( + block: (List) -> Unit +) = doForAll({ getByPagination(it) }, 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 +} 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 new file mode 100644 index 00000000000..8bd84afdce0 --- /dev/null +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/pagination/KeyValuePaginationExtensions.kt @@ -0,0 +1,31 @@ +package dev.inmo.micro_utils.repos.pagination + +import dev.inmo.micro_utils.pagination.* +import dev.inmo.micro_utils.repos.* + +suspend inline fun > REPO.doForAll( + @Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE") + methodCaller: suspend REPO.(Pagination) -> PaginationResult, + block: (List>) -> Unit +) { + doWithPagination { + methodCaller(it).also { keys -> + block(keys.results.mapNotNull { key -> get(key) ?.let { value -> key to value } }) + }.nextPageIfNotEmpty() + } +} + +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 +} 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 new file mode 100644 index 00000000000..313721d170b --- /dev/null +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/pagination/OneToManyPaginationExtensions.kt @@ -0,0 +1,41 @@ +package dev.inmo.micro_utils.repos.pagination + +import dev.inmo.micro_utils.pagination.* +import dev.inmo.micro_utils.repos.* + +suspend inline fun > REPO.doForAll( + @Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE") + methodCaller: suspend REPO.(Pagination) -> PaginationResult, + block: (List>>) -> Unit +) { + doWithPagination { + methodCaller(it).also { keys -> + block( + keys.results.mapNotNull { key -> + val values = mutableListOf() + doWithPagination { + get(key, it).also { + values.addAll(it.results) + }.nextPageIfNotEmpty() + } + key to values + } + ) + }.nextPageIfNotEmpty() + } +} + +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 +} diff --git a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/pagination/PaginationExtensions.kt b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/pagination/PaginationExtensions.kt deleted file mode 100644 index 38d351c21ef..00000000000 --- a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/pagination/PaginationExtensions.kt +++ /dev/null @@ -1,15 +0,0 @@ -package dev.inmo.micro_utils.repos.pagination - -import dev.inmo.micro_utils.pagination.doWithPagination -import dev.inmo.micro_utils.pagination.nextPageIfNotEmpty -import dev.inmo.micro_utils.repos.ReadStandardCRUDRepo - -suspend inline fun > REPO.doWithAll( - block: (List) -> Unit -) { - doWithPagination { - getByPagination(it).also { - block(it.results) - }.nextPageIfNotEmpty() - } -}