commonMain.dev.inmo.micro_utils.repos.mappers.KeyValueMappers.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of micro_utils.repos.common-jvm Show documentation
Show all versions of micro_utils.repos.common-jvm Show documentation
It is set of projects with micro tools for avoiding of routines coding
package dev.inmo.micro_utils.repos.mappers
import dev.inmo.micro_utils.pagination.*
import dev.inmo.micro_utils.repos.*
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
open class MapperReadKeyValueRepo(
private val to: ReadKeyValueRepo,
mapper: MapperRepo
) : ReadKeyValueRepo, MapperRepo by mapper {
override suspend fun get(k: FromKey): FromValue? = to.get(
k.toOutKey()
) ?.toInnerValue()
override suspend fun values(
pagination: Pagination,
reversed: Boolean
): PaginationResult = to.values(
pagination,
reversed
).let {
it.changeResultsUnchecked(
it.results.map { it.toInnerValue() }
)
}
override suspend fun keys(
pagination: Pagination,
reversed: Boolean
): PaginationResult = to.keys(
pagination,
reversed
).let {
it.changeResultsUnchecked(
it.results.map { it.toInnerKey() }
)
}
override suspend fun keys(
v: FromValue,
pagination: Pagination,
reversed: Boolean
): PaginationResult = to.keys(
v.toOutValue(),
pagination,
reversed
).let {
it.changeResultsUnchecked(
it.results.map { it.toInnerKey() }
)
}
override suspend fun contains(key: FromKey): Boolean = to.contains(
key.toOutKey()
)
override suspend fun getAll(): Map = to.getAll().map { (k, v) ->
k.toInnerKey() to v.toInnerValue()
}.toMap()
override suspend fun count(): Long = to.count()
}
@Suppress("NOTHING_TO_INLINE")
inline fun ReadKeyValueRepo.withMapper(
mapper: MapperRepo
): ReadKeyValueRepo = MapperReadKeyValueRepo(this, mapper)
@Suppress("NOTHING_TO_INLINE")
inline fun ReadKeyValueRepo.withMapper(
noinline keyFromToTo: suspend FromKey.() -> ToKey = { this as ToKey },
noinline valueFromToTo: suspend FromValue.() -> ToValue = { this as ToValue },
noinline keyToToFrom: suspend ToKey.() -> FromKey = { this as FromKey },
noinline valueToToFrom: suspend ToValue.() -> FromValue = { this as FromValue },
): ReadKeyValueRepo = withMapper(
mapper(keyFromToTo, valueFromToTo, keyToToFrom, valueToToFrom)
)
open class MapperWriteKeyValueRepo(
private val to: WriteKeyValueRepo,
mapper: MapperRepo
) : WriteKeyValueRepo, MapperRepo by mapper {
override val onNewValue: Flow> = to.onNewValue.map { (k, v) ->
k.toInnerKey() to v.toInnerValue()
}
override val onValueRemoved: Flow = to.onValueRemoved.map { k ->
k.toInnerKey()
}
override suspend fun set(toSet: Map) = to.set(
toSet.map { (k, v) ->
k.toOutKey() to v.toOutValue()
}.toMap()
)
override suspend fun unset(toUnset: List) = to.unset(
toUnset.map { k ->
k.toOutKey()
}
)
override suspend fun unsetWithValues(toUnset: List) = to.unsetWithValues(
toUnset.map { it.toOutValue() }
)
}
@Suppress("NOTHING_TO_INLINE")
inline fun WriteKeyValueRepo.withMapper(
mapper: MapperRepo
): WriteKeyValueRepo = MapperWriteKeyValueRepo(this, mapper)
@Suppress("NOTHING_TO_INLINE")
inline fun WriteKeyValueRepo.withMapper(
noinline keyFromToTo: suspend FromKey.() -> ToKey = { this as ToKey },
noinline valueFromToTo: suspend FromValue.() -> ToValue = { this as ToValue },
noinline keyToToFrom: suspend ToKey.() -> FromKey = { this as FromKey },
noinline valueToToFrom: suspend ToValue.() -> FromValue = { this as FromValue },
): WriteKeyValueRepo = withMapper(
mapper(keyFromToTo, valueFromToTo, keyToToFrom, valueToToFrom)
)
@Suppress("DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE")
open class MapperKeyValueRepo(
private val to: KeyValueRepo,
private val mapper: MapperRepo
) : KeyValueRepo,
MapperRepo by mapper,
ReadKeyValueRepo by MapperReadKeyValueRepo(to, mapper),
WriteKeyValueRepo by MapperWriteKeyValueRepo(to, mapper) {
override suspend fun clear() {
to.clear()
}
}
@Suppress("NOTHING_TO_INLINE")
inline fun KeyValueRepo.withMapper(
mapper: MapperRepo
): KeyValueRepo = MapperKeyValueRepo(this, mapper)
@Suppress("NOTHING_TO_INLINE")
inline fun KeyValueRepo.withMapper(
noinline keyFromToTo: suspend FromKey.() -> ToKey = { this as ToKey },
noinline valueFromToTo: suspend FromValue.() -> ToValue = { this as ToValue },
noinline keyToToFrom: suspend ToKey.() -> FromKey = { this as FromKey },
noinline valueToToFrom: suspend ToValue.() -> FromValue = { this as FromValue },
): KeyValueRepo = withMapper(
mapper(keyFromToTo, valueFromToTo, keyToToFrom, valueToToFrom)
)