diff --git a/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/utils/PaginationReversing.kt b/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/utils/PaginationReversing.kt index 6835c2d0bfc..678b7976bc6 100644 --- a/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/utils/PaginationReversing.kt +++ b/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/utils/PaginationReversing.kt @@ -27,3 +27,8 @@ fun Pagination.reverse(objectsCount: Long): SimplePagination { }.toInt() return PaginationByIndexes(firstIndex, lastIndex) } + +/** + * Shortcut for [reverse] + */ +fun Pagination.reverse(objectsCount: Int) = reverse(objectsCount.toLong()) diff --git a/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapKeyValueRepo.kt b/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapKeyValueRepo.kt index 506033e6c70..dcdec6ca564 100644 --- a/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapKeyValueRepo.kt +++ b/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapKeyValueRepo.kt @@ -2,6 +2,8 @@ package dev.inmo.micro_utils.repos import dev.inmo.micro_utils.coroutines.BroadcastFlow import dev.inmo.micro_utils.pagination.* +import dev.inmo.micro_utils.pagination.utils.paginate +import dev.inmo.micro_utils.pagination.utils.reverse import kotlinx.coroutines.flow.Flow class ReadMapKeyValueRepo( @@ -13,31 +15,27 @@ class ReadMapKeyValueRepo( pagination: Pagination, reversed: Boolean ): PaginationResult { - val firstIndex: Int = if (reversed) { - val size = map.size - (size - pagination.lastIndex).let { if (it < 0) 0 else it } - } else { - pagination.firstIndex + val values = map.values + val actualPagination = if (reversed) pagination.reverse(values.size) else pagination + return values.paginate(actualPagination).let { + if (reversed) { + it.copy(results = it.results.reversed()) + } else { + it + } } - - return map.keys.drop(firstIndex).take(pagination.size).mapNotNull { map[it] }.createPaginationResult( - firstIndex, - count() - ) } override suspend fun keys(pagination: Pagination, reversed: Boolean): PaginationResult { - val firstIndex: Int = if (reversed) { - val size = map.size - (size - pagination.lastIndex).let { if (it < 0) 0 else it } - } else { - pagination.firstIndex + val keys = map.keys + val actualPagination = if (reversed) pagination.reverse(keys.size) else pagination + return keys.paginate(actualPagination).let { + if (reversed) { + it.copy(results = it.results.reversed()) + } else { + it + } } - - return map.keys.drop(firstIndex).take(pagination.size).createPaginationResult( - firstIndex, - count() - ) } override suspend fun contains(key: Key): Boolean = map.containsKey(key) diff --git a/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapOneToManyKeyValueRepo.kt b/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapOneToManyKeyValueRepo.kt index 266f98c3baa..47cdb32b4a5 100644 --- a/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapOneToManyKeyValueRepo.kt +++ b/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapOneToManyKeyValueRepo.kt @@ -3,6 +3,7 @@ package dev.inmo.micro_utils.repos import dev.inmo.micro_utils.coroutines.BroadcastFlow import dev.inmo.micro_utils.pagination.* import dev.inmo.micro_utils.pagination.utils.paginate +import dev.inmo.micro_utils.pagination.utils.reverse import kotlinx.coroutines.flow.Flow class MapReadOneToManyKeyValueRepo( @@ -13,8 +14,7 @@ class MapReadOneToManyKeyValueRepo( return list.paginate( if (reversed) { - val firstIndex = (map.size - pagination.lastIndex).let { if (it < 0) 0 else it } - SimplePagination(firstIndex, pagination.size) + pagination.reverse(list.size) } else { pagination } @@ -22,17 +22,15 @@ class MapReadOneToManyKeyValueRepo( } override suspend fun keys(pagination: Pagination, reversed: Boolean): PaginationResult { - val firstIndex: Int = if (reversed) { - val size = map.size - (size - pagination.lastIndex).let { if (it < 0) 0 else it } - } else { - pagination.firstIndex + val keys = map.keys + val actualPagination = if (reversed) pagination.reverse(keys.size) else pagination + return keys.paginate(actualPagination).let { + if (reversed) { + it.copy(results = it.results.reversed()) + } else { + it + } } - - return map.keys.drop(firstIndex).take(pagination.size).createPaginationResult( - firstIndex, - count() - ) } override suspend fun contains(k: Key): Boolean = map.containsKey(k)