mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2025-09-18 14:59:24 +00:00
Compare commits
10 Commits
Author | SHA1 | Date | |
---|---|---|---|
f4af28059b | |||
c1476bd075 | |||
16c720fddd | |||
8b4b4a5eca | |||
32e6e5b7e2 | |||
a9f7fd8e32 | |||
95be1a26f2 | |||
ef9b31aee0 | |||
df3c01ff0a | |||
551d8ec480 |
19
CHANGELOG.md
19
CHANGELOG.md
@@ -1,5 +1,24 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.16.10
|
||||||
|
|
||||||
|
* `Repos`:
|
||||||
|
* `Cache`:
|
||||||
|
* New transformer type: `ReadCRUDFromKeyValueRepo`
|
||||||
|
* New transformer type: `ReadKeyValueFromCRUDRepo`
|
||||||
|
* `Pagination`:
|
||||||
|
* New `paginate` extensions with `reversed` support for `List`/`Set`
|
||||||
|
|
||||||
|
## 0.16.9
|
||||||
|
|
||||||
|
* `Versions`:
|
||||||
|
* `Koin`: `3.2.2` -> `3.3.2`
|
||||||
|
* `AppCompat`: `1.5.1` -> `1.6.0`
|
||||||
|
* `Ktor`:
|
||||||
|
* `Client`
|
||||||
|
* `HttpResponse.bodyOrNull` now retrieve callback to check if body should be received or null
|
||||||
|
* New extension `HttpResponse.bodyOrNullOnNoContent`
|
||||||
|
|
||||||
## 0.16.8
|
## 0.16.8
|
||||||
|
|
||||||
* `Versions`:
|
* `Versions`:
|
||||||
|
@@ -14,5 +14,5 @@ crypto_js_version=4.1.1
|
|||||||
# Project data
|
# Project data
|
||||||
|
|
||||||
group=dev.inmo
|
group=dev.inmo
|
||||||
version=0.16.8
|
version=0.16.10
|
||||||
android_code_version=176
|
android_code_version=178
|
||||||
|
@@ -17,21 +17,21 @@ ktor = "2.2.3"
|
|||||||
|
|
||||||
gh-release = "2.4.1"
|
gh-release = "2.4.1"
|
||||||
|
|
||||||
koin = "3.2.2"
|
koin = "3.3.2"
|
||||||
|
|
||||||
android-gradle = "7.3.0"
|
android-gradle = "7.3.0"
|
||||||
dexcount = "3.1.0"
|
dexcount = "3.1.0"
|
||||||
|
|
||||||
android-coreKtx = "1.9.0"
|
android-coreKtx = "1.9.0"
|
||||||
android-recyclerView = "1.2.1"
|
android-recyclerView = "1.2.1"
|
||||||
android-appCompat = "1.5.1"
|
android-appCompat = "1.6.0"
|
||||||
android-fragment = "1.5.5"
|
android-fragment = "1.5.5"
|
||||||
android-espresso = "3.4.0"
|
android-espresso = "3.4.0"
|
||||||
android-test = "1.1.3"
|
android-test = "1.1.3"
|
||||||
|
|
||||||
android-props-minSdk = "21"
|
android-props-minSdk = "21"
|
||||||
android-props-compileSdk = "33"
|
android-props-compileSdk = "33"
|
||||||
android-props-buildTools = "33.0.0"
|
android-props-buildTools = "33.0.1"
|
||||||
|
|
||||||
[libraries]
|
[libraries]
|
||||||
|
|
||||||
|
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.5.1-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package dev.inmo.micro_utils.koin
|
package dev.inmo.micro_utils.koin
|
||||||
|
|
||||||
import org.koin.core.definition.Definition
|
import org.koin.core.definition.Definition
|
||||||
|
import org.koin.core.definition.KoinDefinition
|
||||||
import org.koin.core.instance.InstanceFactory
|
import org.koin.core.instance.InstanceFactory
|
||||||
import org.koin.core.module.Module
|
import org.koin.core.module.Module
|
||||||
import org.koin.core.qualifier.Qualifier
|
import org.koin.core.qualifier.Qualifier
|
||||||
@@ -13,7 +14,7 @@ inline fun <reified T : Any> Module.factoryWithBinds(
|
|||||||
qualifier: Qualifier? = null,
|
qualifier: Qualifier? = null,
|
||||||
bindFilter: (KClass<*>) -> Boolean = { true },
|
bindFilter: (KClass<*>) -> Boolean = { true },
|
||||||
noinline definition: Definition<T>
|
noinline definition: Definition<T>
|
||||||
): Pair<Module, InstanceFactory<*>> {
|
): KoinDefinition<*> {
|
||||||
return factory(qualifier, definition) binds (T::class.allSuperclasses.filter(bindFilter).toTypedArray())
|
return factory(qualifier, definition) binds (T::class.allSuperclasses.filter(bindFilter).toTypedArray())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -21,7 +22,7 @@ inline fun <reified T : Any> Module.factoryWithBinds(
|
|||||||
qualifier: String,
|
qualifier: String,
|
||||||
bindFilter: (KClass<*>) -> Boolean = { true },
|
bindFilter: (KClass<*>) -> Boolean = { true },
|
||||||
noinline definition: Definition<T>
|
noinline definition: Definition<T>
|
||||||
): Pair<Module, InstanceFactory<*>> {
|
): KoinDefinition<*> {
|
||||||
return factory(qualifier, definition) binds (T::class.allSuperclasses.filter(bindFilter).toTypedArray())
|
return factory(qualifier, definition) binds (T::class.allSuperclasses.filter(bindFilter).toTypedArray())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package dev.inmo.micro_utils.koin
|
package dev.inmo.micro_utils.koin
|
||||||
|
|
||||||
import org.koin.core.definition.Definition
|
import org.koin.core.definition.Definition
|
||||||
|
import org.koin.core.definition.KoinDefinition
|
||||||
import org.koin.core.instance.InstanceFactory
|
import org.koin.core.instance.InstanceFactory
|
||||||
import org.koin.core.module.Module
|
import org.koin.core.module.Module
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
@@ -8,6 +9,6 @@ import kotlin.reflect.KClass
|
|||||||
inline fun <reified T : Any> Module.factoryWithRandomQualifierAndBinds(
|
inline fun <reified T : Any> Module.factoryWithRandomQualifierAndBinds(
|
||||||
bindFilter: (KClass<*>) -> Boolean = { true },
|
bindFilter: (KClass<*>) -> Boolean = { true },
|
||||||
noinline definition: Definition<T>
|
noinline definition: Definition<T>
|
||||||
): Pair<Module, InstanceFactory<*>> {
|
): KoinDefinition<*> {
|
||||||
return factoryWithBinds(RandomQualifier(), bindFilter, definition)
|
return factoryWithBinds(RandomQualifier(), bindFilter, definition)
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package dev.inmo.micro_utils.koin
|
package dev.inmo.micro_utils.koin
|
||||||
|
|
||||||
import org.koin.core.definition.Definition
|
import org.koin.core.definition.Definition
|
||||||
|
import org.koin.core.definition.KoinDefinition
|
||||||
import org.koin.core.instance.InstanceFactory
|
import org.koin.core.instance.InstanceFactory
|
||||||
import org.koin.core.module.Module
|
import org.koin.core.module.Module
|
||||||
import org.koin.core.qualifier.Qualifier
|
import org.koin.core.qualifier.Qualifier
|
||||||
@@ -14,7 +15,7 @@ inline fun <reified T : Any> Module.singleWithBinds(
|
|||||||
createdAtStart: Boolean = false,
|
createdAtStart: Boolean = false,
|
||||||
bindFilter: (KClass<*>) -> Boolean = { true },
|
bindFilter: (KClass<*>) -> Boolean = { true },
|
||||||
noinline definition: Definition<T>
|
noinline definition: Definition<T>
|
||||||
): Pair<Module, InstanceFactory<*>> {
|
): KoinDefinition<*> {
|
||||||
return single(qualifier, createdAtStart, definition) binds (T::class.allSuperclasses.filter(bindFilter).toTypedArray())
|
return single(qualifier, createdAtStart, definition) binds (T::class.allSuperclasses.filter(bindFilter).toTypedArray())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -24,7 +25,7 @@ inline fun <reified T : Any> Module.singleWithBinds(
|
|||||||
createdAtStart: Boolean = false,
|
createdAtStart: Boolean = false,
|
||||||
bindFilter: (KClass<*>) -> Boolean = { true },
|
bindFilter: (KClass<*>) -> Boolean = { true },
|
||||||
noinline definition: Definition<T>
|
noinline definition: Definition<T>
|
||||||
): Pair<Module, InstanceFactory<*>> {
|
): KoinDefinition<*> {
|
||||||
return single(qualifier, createdAtStart, definition) binds (T::class.allSuperclasses.filter(bindFilter).toTypedArray())
|
return single(qualifier, createdAtStart, definition) binds (T::class.allSuperclasses.filter(bindFilter).toTypedArray())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package dev.inmo.micro_utils.koin
|
package dev.inmo.micro_utils.koin
|
||||||
|
|
||||||
import org.koin.core.definition.Definition
|
import org.koin.core.definition.Definition
|
||||||
|
import org.koin.core.definition.KoinDefinition
|
||||||
import org.koin.core.instance.InstanceFactory
|
import org.koin.core.instance.InstanceFactory
|
||||||
import org.koin.core.module.Module
|
import org.koin.core.module.Module
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
@@ -9,6 +10,6 @@ inline fun <reified T : Any> Module.singleWithRandomQualifierAndBinds(
|
|||||||
createdAtStart: Boolean = false,
|
createdAtStart: Boolean = false,
|
||||||
bindFilter: (KClass<*>) -> Boolean = { true },
|
bindFilter: (KClass<*>) -> Boolean = { true },
|
||||||
noinline definition: Definition<T>
|
noinline definition: Definition<T>
|
||||||
): Pair<Module, InstanceFactory<*>> {
|
): KoinDefinition<*> {
|
||||||
return singleWithBinds(RandomQualifier(), createdAtStart, bindFilter, definition)
|
return singleWithBinds(RandomQualifier(), createdAtStart, bindFilter, definition)
|
||||||
}
|
}
|
||||||
|
@@ -4,6 +4,10 @@ import io.ktor.client.call.body
|
|||||||
import io.ktor.client.statement.HttpResponse
|
import io.ktor.client.statement.HttpResponse
|
||||||
import io.ktor.http.HttpStatusCode
|
import io.ktor.http.HttpStatusCode
|
||||||
|
|
||||||
suspend inline fun <reified T : Any> HttpResponse.bodyOrNull() = takeIf {
|
suspend inline fun <reified T : Any> HttpResponse.bodyOrNull(
|
||||||
status == HttpStatusCode.OK
|
statusFilter: (HttpResponse) -> Boolean = { it.status == HttpStatusCode.OK }
|
||||||
} ?.body<T>()
|
) = takeIf(statusFilter) ?.body<T>()
|
||||||
|
|
||||||
|
suspend inline fun <reified T : Any> HttpResponse.bodyOrNullOnNoContent() = bodyOrNull<T> {
|
||||||
|
it.status != HttpStatusCode.NoContent
|
||||||
|
}
|
||||||
|
@@ -0,0 +1,29 @@
|
|||||||
|
package dev.inmo.micro_utils.pagination.utils
|
||||||
|
|
||||||
|
fun <T> Iterable<T>.optionallyReverse(reverse: Boolean): Iterable<T> = when (this) {
|
||||||
|
is List<T> -> optionallyReverse(reverse)
|
||||||
|
is Set<T> -> optionallyReverse(reverse)
|
||||||
|
else -> if (reverse) {
|
||||||
|
reversed()
|
||||||
|
} else {
|
||||||
|
this
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fun <T> List<T>.optionallyReverse(reverse: Boolean): List<T> = if (reverse) {
|
||||||
|
reversed()
|
||||||
|
} else {
|
||||||
|
this
|
||||||
|
}
|
||||||
|
fun <T> Set<T>.optionallyReverse(reverse: Boolean): Set<T> = if (reverse) {
|
||||||
|
reversed().toSet()
|
||||||
|
} else {
|
||||||
|
this
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <reified T> Array<T>.optionallyReverse(reverse: Boolean) = if (reverse) {
|
||||||
|
Array(size) {
|
||||||
|
get(lastIndex - it)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this
|
||||||
|
}
|
@@ -32,6 +32,24 @@ fun <T> List<T>.paginate(with: Pagination): PaginationResult<T> {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun <T> List<T>.paginate(with: Pagination, reversed: Boolean): PaginationResult<T> {
|
||||||
|
val actualPagination = with.optionallyReverse(
|
||||||
|
size,
|
||||||
|
reversed
|
||||||
|
)
|
||||||
|
|
||||||
|
val firstIndex = maxOf(actualPagination.firstIndex, 0)
|
||||||
|
val lastIndex = minOf(actualPagination.lastIndexExclusive, size)
|
||||||
|
if (firstIndex > lastIndex) {
|
||||||
|
return emptyPaginationResult()
|
||||||
|
}
|
||||||
|
|
||||||
|
return subList(firstIndex, lastIndex).optionallyReverse(reversed).createPaginationResult(
|
||||||
|
with,
|
||||||
|
size.toLong()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fun <T> Set<T>.paginate(with: Pagination): PaginationResult<T> {
|
fun <T> Set<T>.paginate(with: Pagination): PaginationResult<T> {
|
||||||
return this.drop(with.firstIndex).take(with.size).createPaginationResult(
|
return this.drop(with.firstIndex).take(with.size).createPaginationResult(
|
||||||
with,
|
with,
|
||||||
@@ -39,30 +57,20 @@ fun <T> Set<T>.paginate(with: Pagination): PaginationResult<T> {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T> Iterable<T>.optionallyReverse(reverse: Boolean): Iterable<T> = when (this) {
|
fun <T> Set<T>.paginate(with: Pagination, reversed: Boolean): PaginationResult<T> {
|
||||||
is List<T> -> optionallyReverse(reverse)
|
val actualPagination = with.optionallyReverse(
|
||||||
is Set<T> -> optionallyReverse(reverse)
|
size,
|
||||||
else -> if (reverse) {
|
reversed
|
||||||
reversed()
|
)
|
||||||
} else {
|
|
||||||
this
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fun <T> List<T>.optionallyReverse(reverse: Boolean): List<T> = if (reverse) {
|
|
||||||
reversed()
|
|
||||||
} else {
|
|
||||||
this
|
|
||||||
}
|
|
||||||
fun <T> Set<T>.optionallyReverse(reverse: Boolean): Set<T> = if (reverse) {
|
|
||||||
reversed().toSet()
|
|
||||||
} else {
|
|
||||||
this
|
|
||||||
}
|
|
||||||
|
|
||||||
inline fun <reified T> Array<T>.optionallyReverse(reverse: Boolean) = if (reverse) {
|
val firstIndex = maxOf(actualPagination.firstIndex, 0)
|
||||||
Array(size) {
|
val lastIndex = minOf(actualPagination.lastIndexExclusive, size)
|
||||||
get(lastIndex - it)
|
if (firstIndex > lastIndex) {
|
||||||
|
return emptyPaginationResult()
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
this
|
return this.drop(firstIndex).take(lastIndex - firstIndex).optionallyReverse(reversed).createPaginationResult(
|
||||||
|
with,
|
||||||
|
size.toLong()
|
||||||
|
)
|
||||||
}
|
}
|
@@ -2,6 +2,8 @@ package dev.inmo.micro_utils.repos
|
|||||||
|
|
||||||
import dev.inmo.micro_utils.pagination.*
|
import dev.inmo.micro_utils.pagination.*
|
||||||
import dev.inmo.micro_utils.pagination.utils.doAllWithCurrentPaging
|
import dev.inmo.micro_utils.pagination.utils.doAllWithCurrentPaging
|
||||||
|
import dev.inmo.micro_utils.pagination.utils.getAllWithNextPaging
|
||||||
|
import dev.inmo.micro_utils.pagination.utils.paginate
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -17,24 +19,32 @@ interface ReadKeyValueRepo<Key, Value> : Repo {
|
|||||||
suspend fun get(k: Key): Value?
|
suspend fun get(k: Key): Value?
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method should use sorted by [Key]s search and take the [PaginationResult]. By default, it should use
|
* This method should use sorted by [Key]s search and return the [PaginationResult]. By default, it should use
|
||||||
* ascending sort for [Key]s
|
* ascending sort for [Key]s
|
||||||
*/
|
*/
|
||||||
suspend fun values(pagination: Pagination, reversed: Boolean = false): PaginationResult<Value>
|
suspend fun values(pagination: Pagination, reversed: Boolean = false): PaginationResult<Value>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method should use sorted by [Key]s search and take the [PaginationResult]. By default, it should use
|
* This method should use sorted by [Key]s search and return the [PaginationResult]. By default, it should use
|
||||||
* ascending sort for [Key]s
|
* ascending sort for [Key]s
|
||||||
*/
|
*/
|
||||||
suspend fun keys(pagination: Pagination, reversed: Boolean = false): PaginationResult<Key>
|
suspend fun keys(pagination: Pagination, reversed: Boolean = false): PaginationResult<Key>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method should use sorted by [Key]s search and take the [PaginationResult]. By default, it should use
|
* This method should use sorted by [Key]s search and return the [PaginationResult]. By default, it should use
|
||||||
* ascending sort for [Key]s
|
* ascending sort for [Key]s.
|
||||||
|
*
|
||||||
|
* **DEFAULT REALIZATION IS NOT OPTIMAL AND HAS BEEN ADDED TO COVER CASES OF DIFFERENT COMMON MAPPINGS AND TRANSFORMATIONS**
|
||||||
*
|
*
|
||||||
* @param v This value should be used to exclude from search the items with different [Value]s
|
* @param v This value should be used to exclude from search the items with different [Value]s
|
||||||
*/
|
*/
|
||||||
suspend fun keys(v: Value, pagination: Pagination, reversed: Boolean = false): PaginationResult<Key>
|
suspend fun keys(v: Value, pagination: Pagination, reversed: Boolean = false): PaginationResult<Key> {
|
||||||
|
return getAllWithNextPaging {
|
||||||
|
keys(it)
|
||||||
|
}.filter {
|
||||||
|
get(it) == v
|
||||||
|
}.paginate(pagination, reversed)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true if [key] is presented in current collection or false otherwise
|
* @return true if [key] is presented in current collection or false otherwise
|
||||||
|
@@ -0,0 +1,10 @@
|
|||||||
|
package dev.inmo.micro_utils.repos.transforms.crud
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.repos.KeyValueRepo
|
||||||
|
import dev.inmo.micro_utils.repos.KeyValuesRepo
|
||||||
|
import dev.inmo.micro_utils.repos.ReadKeyValueRepo
|
||||||
|
import dev.inmo.micro_utils.repos.ReadKeyValuesRepo
|
||||||
|
import kotlin.js.JsName
|
||||||
|
import kotlin.jvm.JvmName
|
||||||
|
|
||||||
|
fun <K, V> ReadKeyValueRepo<K, V>.asReadCRUDRepo() = ReadCRUDFromKeyValueRepo(this)
|
@@ -0,0 +1,20 @@
|
|||||||
|
package dev.inmo.micro_utils.repos.transforms.crud
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.pagination.Pagination
|
||||||
|
import dev.inmo.micro_utils.pagination.PaginationResult
|
||||||
|
import dev.inmo.micro_utils.repos.ReadCRUDRepo
|
||||||
|
import dev.inmo.micro_utils.repos.ReadKeyValueRepo
|
||||||
|
|
||||||
|
open class ReadCRUDFromKeyValueRepo<RegisteredType, IdType>(
|
||||||
|
protected open val original: ReadKeyValueRepo<IdType, RegisteredType>
|
||||||
|
) : ReadCRUDRepo<RegisteredType, IdType> {
|
||||||
|
override suspend fun contains(id: IdType): Boolean = original.contains(id)
|
||||||
|
|
||||||
|
override suspend fun count(): Long = original.count()
|
||||||
|
|
||||||
|
override suspend fun getByPagination(pagination: Pagination): PaginationResult<RegisteredType> = original.values(pagination)
|
||||||
|
|
||||||
|
override suspend fun getIdsByPagination(pagination: Pagination): PaginationResult<IdType> = original.keys(pagination)
|
||||||
|
|
||||||
|
override suspend fun getById(id: IdType): RegisteredType? = original.get(id)
|
||||||
|
}
|
@@ -2,6 +2,7 @@ package dev.inmo.micro_utils.repos.transforms.kv
|
|||||||
|
|
||||||
import dev.inmo.micro_utils.repos.KeyValueRepo
|
import dev.inmo.micro_utils.repos.KeyValueRepo
|
||||||
import dev.inmo.micro_utils.repos.KeyValuesRepo
|
import dev.inmo.micro_utils.repos.KeyValuesRepo
|
||||||
|
import dev.inmo.micro_utils.repos.ReadCRUDRepo
|
||||||
import dev.inmo.micro_utils.repos.ReadKeyValueRepo
|
import dev.inmo.micro_utils.repos.ReadKeyValueRepo
|
||||||
import dev.inmo.micro_utils.repos.ReadKeyValuesRepo
|
import dev.inmo.micro_utils.repos.ReadKeyValuesRepo
|
||||||
import kotlin.js.JsName
|
import kotlin.js.JsName
|
||||||
@@ -10,3 +11,5 @@ import kotlin.jvm.JvmName
|
|||||||
fun <K, V> ReadKeyValuesRepo<K, V>.asReadKeyValueRepo() = ReadKeyValueFromKeyValuesRepo(this)
|
fun <K, V> ReadKeyValuesRepo<K, V>.asReadKeyValueRepo() = ReadKeyValueFromKeyValuesRepo(this)
|
||||||
|
|
||||||
fun <K, V> KeyValuesRepo<K, V>.asKeyValueRepo() = KeyValueFromKeyValuesRepo(this)
|
fun <K, V> KeyValuesRepo<K, V>.asKeyValueRepo() = KeyValueFromKeyValuesRepo(this)
|
||||||
|
|
||||||
|
fun <K, V> ReadCRUDRepo<K, V>.asReadKeyValueRepo() = ReadKeyValueFromCRUDRepo(this)
|
||||||
|
@@ -0,0 +1,46 @@
|
|||||||
|
package dev.inmo.micro_utils.repos.transforms.kv
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.pagination.FirstPagePagination
|
||||||
|
import dev.inmo.micro_utils.pagination.Pagination
|
||||||
|
import dev.inmo.micro_utils.pagination.PaginationResult
|
||||||
|
import dev.inmo.micro_utils.pagination.changeResults
|
||||||
|
import dev.inmo.micro_utils.pagination.changeResultsUnchecked
|
||||||
|
import dev.inmo.micro_utils.pagination.utils.doForAllWithNextPaging
|
||||||
|
import dev.inmo.micro_utils.pagination.utils.optionallyReverse
|
||||||
|
import dev.inmo.micro_utils.pagination.utils.paginate
|
||||||
|
import dev.inmo.micro_utils.repos.ReadCRUDRepo
|
||||||
|
import dev.inmo.micro_utils.repos.ReadKeyValueRepo
|
||||||
|
import dev.inmo.micro_utils.repos.ReadKeyValuesRepo
|
||||||
|
import dev.inmo.micro_utils.repos.transforms.kvs.ReadKeyValuesFromKeyValueRepo
|
||||||
|
import kotlin.jvm.JvmInline
|
||||||
|
|
||||||
|
@JvmInline
|
||||||
|
value class ReadKeyValueFromCRUDRepo<Key, Value>(
|
||||||
|
private val original: ReadCRUDRepo<Value, Key>
|
||||||
|
) : ReadKeyValueRepo<Key, Value> {
|
||||||
|
override suspend fun get(k: Key): Value? = original.getById(k)
|
||||||
|
|
||||||
|
override suspend fun values(pagination: Pagination, reversed: Boolean): PaginationResult<Value> = original.getByPagination(
|
||||||
|
pagination.optionallyReverse(count(), reversed)
|
||||||
|
).let {
|
||||||
|
if (reversed) {
|
||||||
|
it.changeResultsUnchecked(it.results.reversed())
|
||||||
|
} else {
|
||||||
|
it
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun keys(pagination: Pagination, reversed: Boolean): PaginationResult<Key> = original.getIdsByPagination(
|
||||||
|
pagination.optionallyReverse(count(), reversed)
|
||||||
|
).let {
|
||||||
|
if (reversed) {
|
||||||
|
it.changeResultsUnchecked(it.results.reversed())
|
||||||
|
} else {
|
||||||
|
it
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun count(): Long = original.count()
|
||||||
|
|
||||||
|
override suspend fun contains(key: Key): Boolean = original.contains(key)
|
||||||
|
}
|
Reference in New Issue
Block a user