mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2024-11-17 22:03:50 +00:00
SimpleMapper, SimpleSuspendableMapper, mappers for CRUDRepo
This commit is contained in:
parent
7ac12455c8
commit
b40c093917
@ -2,9 +2,11 @@
|
|||||||
|
|
||||||
## 0.11.7
|
## 0.11.7
|
||||||
|
|
||||||
|
* `Common`:
|
||||||
|
* New abstractions `SimpleMapper` and `SimpleSuspendableMapper`
|
||||||
* `Repos`:
|
* `Repos`:
|
||||||
* `Common`:
|
* `Common`:
|
||||||
* Add mappers for `ReadCRUDRepo`
|
* Add mappers for `CRUDRepo`
|
||||||
|
|
||||||
## 0.11.6
|
## 0.11.6
|
||||||
|
|
||||||
|
@ -0,0 +1,53 @@
|
|||||||
|
package dev.inmo.micro_utils.common
|
||||||
|
|
||||||
|
interface SimpleMapper<T1, T2> {
|
||||||
|
fun t1(from: T2): T1
|
||||||
|
fun t2(from: T1): T2
|
||||||
|
|
||||||
|
operator fun T2.invoke(): T1 = t1(this)
|
||||||
|
operator fun T1.invoke(): T2 = t2(this)
|
||||||
|
|
||||||
|
fun T2.convert(): T1 = t1(this)
|
||||||
|
fun T1.convert(): T2 = t2(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
class SimpleMapperImpl<T1, T2>(
|
||||||
|
private val t1: (T2) -> T1,
|
||||||
|
private val t2: (T1) -> T2,
|
||||||
|
) : SimpleMapper<T1, T2> {
|
||||||
|
override fun t1(from: T2): T1 = t1.invoke(from)
|
||||||
|
|
||||||
|
override fun t2(from: T1): T2 = t2.invoke(from)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun <T1, T2> simpleMapper(
|
||||||
|
noinline t1: (T2) -> T1,
|
||||||
|
noinline t2: (T1) -> T2,
|
||||||
|
) = SimpleMapperImpl(t1, t2)
|
||||||
|
|
||||||
|
interface SimpleSuspendableMapper<T1, T2> {
|
||||||
|
suspend fun t1(from: T2): T1
|
||||||
|
suspend fun t2(from: T1): T2
|
||||||
|
|
||||||
|
suspend operator fun T2.invoke(): T1 = t1(this)
|
||||||
|
suspend operator fun T1.invoke(): T2 = t2(this)
|
||||||
|
|
||||||
|
suspend fun T2.convert(): T1 = t1(this)
|
||||||
|
suspend fun T1.convert(): T2 = t2(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
class SimpleSuspendableMapperImpl<T1, T2>(
|
||||||
|
private val t1: suspend (T2) -> T1,
|
||||||
|
private val t2: suspend (T1) -> T2,
|
||||||
|
) : SimpleSuspendableMapper<T1, T2> {
|
||||||
|
override suspend fun t1(from: T2): T1 = t1.invoke(from)
|
||||||
|
|
||||||
|
override suspend fun t2(from: T1): T2 = t2.invoke(from)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun <T1, T2> simpleSuspendableMapper(
|
||||||
|
noinline t1: suspend (T2) -> T1,
|
||||||
|
noinline t2: suspend (T1) -> T2,
|
||||||
|
) = SimpleSuspendableMapperImpl(t1, t2)
|
@ -1,7 +1,20 @@
|
|||||||
package dev.inmo.micro_utils.repos
|
package dev.inmo.micro_utils.repos
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.common.*
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
interface MapperRepo<FromKey, FromValue, ToKey, ToValue> {
|
interface MapperRepo<FromKey, FromValue, ToKey, ToValue> {
|
||||||
|
val keyMapper: SimpleSuspendableMapper<FromKey, ToKey>
|
||||||
|
get() = simpleSuspendableMapper(
|
||||||
|
{ it.toInnerKey() },
|
||||||
|
{ it.toOutKey() }
|
||||||
|
)
|
||||||
|
val valueMapper: SimpleSuspendableMapper<FromValue, ToValue>
|
||||||
|
get() = simpleSuspendableMapper(
|
||||||
|
{ it.toInnerValue() },
|
||||||
|
{ it.toOutValue() }
|
||||||
|
)
|
||||||
|
|
||||||
suspend fun FromKey.toOutKey() = this as ToKey
|
suspend fun FromKey.toOutKey() = this as ToKey
|
||||||
suspend fun FromValue.toOutValue() = this as ToValue
|
suspend fun FromValue.toOutValue() = this as ToValue
|
||||||
|
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
package dev.inmo.micro_utils.repos.mappers
|
package dev.inmo.micro_utils.repos.mappers
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.common.SimpleSuspendableMapper
|
||||||
|
import dev.inmo.micro_utils.common.simpleSuspendableMapper
|
||||||
import dev.inmo.micro_utils.pagination.*
|
import dev.inmo.micro_utils.pagination.*
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
import kotlinx.coroutines.flow.map
|
||||||
|
|
||||||
open class MapperReadCRUDRepo<FromId, FromRegistered, ToId, ToRegistered>(
|
open class MapperReadCRUDRepo<FromId, FromRegistered, ToId, ToRegistered>(
|
||||||
private val to: ReadCRUDRepo<ToRegistered, ToId>,
|
private val to: ReadCRUDRepo<ToRegistered, ToId>,
|
||||||
@ -40,3 +44,88 @@ inline fun <reified FromKey, reified FromValue, reified ToKey, reified ToValue>
|
|||||||
): ReadCRUDRepo<FromValue, FromKey> = withMapper(
|
): ReadCRUDRepo<FromValue, FromKey> = withMapper(
|
||||||
mapper(keyFromToTo, valueFromToTo, keyToToFrom, valueToToFrom)
|
mapper(keyFromToTo, valueFromToTo, keyToToFrom, valueToToFrom)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
open class MapperWriteCRUDRepo<FromId, FromRegistered, FromInput, ToId, ToRegistered, ToInput>(
|
||||||
|
private val to: WriteCRUDRepo<ToRegistered, ToId, ToInput>,
|
||||||
|
mapper: MapperRepo<FromId, FromRegistered, ToId, ToRegistered>,
|
||||||
|
inputMapper: SimpleSuspendableMapper<FromInput, ToInput>
|
||||||
|
) : WriteCRUDRepo<FromRegistered, FromId, FromInput>,
|
||||||
|
MapperRepo<FromId, FromRegistered, ToId, ToRegistered> by mapper,
|
||||||
|
SimpleSuspendableMapper<FromInput, ToInput> by inputMapper {
|
||||||
|
override val newObjectsFlow: Flow<FromRegistered> = to.newObjectsFlow.map { it.toInnerValue() }
|
||||||
|
override val updatedObjectsFlow: Flow<FromRegistered> = to.updatedObjectsFlow.map { it.toInnerValue() }
|
||||||
|
override val deletedObjectsIdsFlow: Flow<FromId> = to.deletedObjectsIdsFlow.map { it.toInnerKey() }
|
||||||
|
|
||||||
|
override suspend fun deleteById(ids: List<FromId>) = to.deleteById(ids.map { it.toOutKey() })
|
||||||
|
|
||||||
|
override suspend fun update(
|
||||||
|
values: List<UpdatedValuePair<FromId, FromInput>>
|
||||||
|
): List<FromRegistered> = to.update(
|
||||||
|
values.map {
|
||||||
|
it.first.toOutKey() to it.second.convert()
|
||||||
|
}
|
||||||
|
).map { it.toInnerValue() }
|
||||||
|
|
||||||
|
override suspend fun update(
|
||||||
|
id: FromId,
|
||||||
|
value: FromInput
|
||||||
|
): FromRegistered? = to.update(id.toOutKey(), value.convert()) ?.toInnerValue()
|
||||||
|
|
||||||
|
override suspend fun create(values: List<FromInput>): List<FromRegistered> = to.create(
|
||||||
|
values.map {
|
||||||
|
it.convert()
|
||||||
|
}
|
||||||
|
).map {
|
||||||
|
it.toInnerValue()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun <FromKey, FromValue, FromInput, ToKey, ToValue, ToInput> WriteCRUDRepo<ToValue, ToKey, ToInput>.withMapper(
|
||||||
|
mapper: MapperRepo<FromKey, FromValue, ToKey, ToValue>,
|
||||||
|
simpleSuspendableMapper: SimpleSuspendableMapper<FromInput, ToInput>
|
||||||
|
): WriteCRUDRepo<FromValue, FromKey, FromInput> = MapperWriteCRUDRepo(this, mapper, simpleSuspendableMapper)
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun <reified FromKey, reified FromValue, reified FromInput, reified ToKey, reified ToValue, reified ToInput> WriteCRUDRepo<ToValue, ToKey, ToInput>.withMapper(
|
||||||
|
crossinline keyFromToTo: suspend FromKey.() -> ToKey = { this as ToKey },
|
||||||
|
crossinline valueFromToTo: suspend FromValue.() -> ToValue = { this as ToValue },
|
||||||
|
crossinline inputFromToTo: suspend FromInput.() -> ToInput = { this as ToInput },
|
||||||
|
crossinline keyToToFrom: suspend ToKey.() -> FromKey = { this as FromKey },
|
||||||
|
crossinline valueToToFrom: suspend ToValue.() -> FromValue = { this as FromValue },
|
||||||
|
crossinline inputToToFrom: suspend ToInput.() -> FromInput = { this as FromInput },
|
||||||
|
): WriteCRUDRepo<FromValue, FromKey, FromInput> = withMapper(
|
||||||
|
mapper(keyFromToTo, valueFromToTo, keyToToFrom, valueToToFrom),
|
||||||
|
simpleSuspendableMapper({ inputToToFrom(it) }, { inputFromToTo(it) })
|
||||||
|
)
|
||||||
|
|
||||||
|
@Suppress("DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE")
|
||||||
|
open class MapperCRUDRepo<FromId, FromRegistered, FromInput, ToId, ToRegistered, ToInput>(
|
||||||
|
private val to: CRUDRepo<ToRegistered, ToId, ToInput>,
|
||||||
|
private val mapper: MapperRepo<FromId, FromRegistered, ToId, ToRegistered>,
|
||||||
|
private val inputMapper: SimpleSuspendableMapper<FromInput, ToInput>
|
||||||
|
) : CRUDRepo<FromRegistered, FromId, FromInput>,
|
||||||
|
MapperRepo<FromId, FromRegistered, ToId, ToRegistered> by mapper,
|
||||||
|
ReadCRUDRepo<FromRegistered, FromId> by MapperReadCRUDRepo(to, mapper),
|
||||||
|
WriteCRUDRepo<FromRegistered, FromId, FromInput> by MapperWriteCRUDRepo(to, mapper, inputMapper)
|
||||||
|
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun <FromKey, FromValue, FromInput, ToKey, ToValue, ToInput> CRUDRepo<ToValue, ToKey, ToInput>.withMapper(
|
||||||
|
mapper: MapperRepo<FromKey, FromValue, ToKey, ToValue>,
|
||||||
|
simpleSuspendableMapper: SimpleSuspendableMapper<FromInput, ToInput>
|
||||||
|
): CRUDRepo<FromValue, FromKey, FromInput> = MapperCRUDRepo(this, mapper, simpleSuspendableMapper)
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun <reified FromKey, reified FromValue, reified FromInput, reified ToKey, reified ToValue, reified ToInput> CRUDRepo<ToValue, ToKey, ToInput>.withMapper(
|
||||||
|
crossinline keyFromToTo: suspend FromKey.() -> ToKey = { this as ToKey },
|
||||||
|
crossinline valueFromToTo: suspend FromValue.() -> ToValue = { this as ToValue },
|
||||||
|
crossinline inputFromToTo: suspend FromInput.() -> ToInput = { this as ToInput },
|
||||||
|
crossinline keyToToFrom: suspend ToKey.() -> FromKey = { this as FromKey },
|
||||||
|
crossinline valueToToFrom: suspend ToValue.() -> FromValue = { this as FromValue },
|
||||||
|
crossinline inputToToFrom: suspend ToInput.() -> FromInput = { this as FromInput },
|
||||||
|
): CRUDRepo<FromValue, FromKey, FromInput> = withMapper(
|
||||||
|
mapper(keyFromToTo, valueFromToTo, keyToToFrom, valueToToFrom),
|
||||||
|
simpleSuspendableMapper({ inputToToFrom(it) }, { inputFromToTo(it) })
|
||||||
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user