From 77f56c5dda359eeef5ae6892088826e3a0979898 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 26 May 2024 23:35:24 +0600 Subject: [PATCH] make improvements in pagination --- .../pagination/PaginationResult.kt | 24 +++++++++++--- .../micro_utils/pagination/utils/Paginate.kt | 31 +++++++------------ .../pagination/utils/PaginationPaging.kt | 26 +++++++++++++--- 3 files changed, 52 insertions(+), 29 deletions(-) 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 28accc46693..39720d86c80 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 @@ -60,21 +60,35 @@ fun emptyPaginationResult( 0L ) +/** + * @return New [PaginationResult] with [data] without checking of data sizes equality + */ +inline fun PaginationResult.changeResultsUnchecked( + block: PaginationResult.() -> List +): PaginationResult = PaginationResult(page, size, block(), objectsNumber) + /** * @return New [PaginationResult] with [data] without checking of data sizes equality */ fun PaginationResult.changeResultsUnchecked( data: List -): PaginationResult = PaginationResult(page, size, data, objectsNumber) +): PaginationResult = changeResultsUnchecked { data } +/** + * @return New [PaginationResult] with [data] with checking of data sizes equality + */ +inline fun PaginationResult.changeResults( + block: PaginationResult.() -> List +): PaginationResult { + val data = block() + require(data.size == results.size) + return changeResultsUnchecked(data) +} /** * @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) -} +): PaginationResult = changeResults { data } fun List.createPaginationResult( pagination: Pagination, diff --git a/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/utils/Paginate.kt b/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/utils/Paginate.kt index ed196383a52..660635a4c8a 100644 --- a/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/utils/Paginate.kt +++ b/pagination/common/src/commonMain/kotlin/dev/inmo/micro_utils/pagination/utils/Paginate.kt @@ -21,34 +21,25 @@ fun Iterable.paginate(with: Pagination): PaginationResult { } fun List.paginate(with: Pagination): PaginationResult { - val indices = indices - val firstIndex = with.firstIndex.coerceIn(indices) - val lastIndex = with.lastIndex.coerceIn(indices) + 1 // up to size - if (firstIndex > lastIndex) { - return emptyPaginationResult() + if (with.firstIndex !in indices || with.lastIndex !in indices) { + return emptyPaginationResult(with) } - return subList(firstIndex, lastIndex).createPaginationResult( + return asSequence().drop(with.firstIndex).take(with.size).toList().createPaginationResult( with, size.toLong() ) } fun List.paginate(with: Pagination, reversed: Boolean): PaginationResult { - val actualPagination = with.optionallyReverse( - size, - reversed - ) - val indices = indices - val firstIndex = actualPagination.firstIndex.coerceIn(indices) - val lastIndex = actualPagination.lastIndex.coerceIn(indices) + 1 // up to size - if (firstIndex > lastIndex) { - return emptyPaginationResult() + return if (reversed) { + val actualPagination = with.optionallyReverse( + size, + reversed + ) + paginate(actualPagination).changeResultsUnchecked { results.reversed() } + } else { + paginate(with) } - - return subList(firstIndex, lastIndex).optionallyReverse(reversed).createPaginationResult( - with, - size.toLong() - ) } fun Set.paginate(with: Pagination): PaginationResult { diff --git a/pagination/common/src/commonTest/kotlin/dev/inmo/micro_utils/pagination/utils/PaginationPaging.kt b/pagination/common/src/commonTest/kotlin/dev/inmo/micro_utils/pagination/utils/PaginationPaging.kt index aef18c6948e..9dd539110ec 100644 --- a/pagination/common/src/commonTest/kotlin/dev/inmo/micro_utils/pagination/utils/PaginationPaging.kt +++ b/pagination/common/src/commonTest/kotlin/dev/inmo/micro_utils/pagination/utils/PaginationPaging.kt @@ -1,11 +1,9 @@ package dev.inmo.micro_utils.pagination.utils -import dev.inmo.micro_utils.pagination.FirstPagePagination -import dev.inmo.micro_utils.pagination.firstIndex -import dev.inmo.micro_utils.pagination.isLastPage -import dev.inmo.micro_utils.pagination.lastIndexExclusive +import dev.inmo.micro_utils.pagination.* import kotlin.test.Test import kotlin.test.assertEquals +import kotlin.test.assertFalse import kotlin.test.assertTrue class PaginationPaging { @@ -31,4 +29,24 @@ class PaginationPaging { assertTrue(lastPageHappened) } + @Test + fun testEmptyPaginateOnList() { + val list = listOf() + val startPagination = FirstPagePagination(2) + + var paginationHappend = false + doForAllWithNextPaging(startPagination) { + val resultPagination = list.paginate(it) + + assertEquals(resultPagination, emptyPaginationResult(it)) + + assertFalse(paginationHappend) + + paginationHappend = true + + resultPagination + } + + assertTrue(paginationHappend) + } }