diff --git a/.gitignore b/.gitignore index 90dd34230e7..9d766410e18 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,6 @@ local.properties kotlin-js-store publishing.sh + +local.* +local/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 6793ed77ed6..32e85587991 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.20.49 + +* `Repos`: + * `Common`: + * All `Repo`s get `diff` extensions + * `KeyValueRepo` and `KeyValuesRepo` get `applyDiff` extension + * Add new extensions `on*` flows for crud repos + ## 0.20.48 * `Versions`: diff --git a/gradle.properties b/gradle.properties index a8c719bed16..7e2261078a4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,5 +15,5 @@ crypto_js_version=4.1.1 # Project data group=dev.inmo -version=0.20.48 -android_code_version=254 +version=0.20.49 +android_code_version=255 diff --git a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartCRUDRepo.kt b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartCRUDRepo.kt index 8ea1b8e8f92..28a9b94983f 100644 --- a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartCRUDRepo.kt +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartCRUDRepo.kt @@ -42,6 +42,22 @@ interface WriteCRUDRepo : Repo { } typealias WriteStandardCRUDRepo = WriteCRUDRepo +/** + * Just mirroring [WriteCRUDRepo.newObjectsFlow] to be same as in KV repos + */ +val WriteCRUDRepo.onNewObjects: Flow + get() = newObjectsFlow +/** + * Just mirroring [WriteCRUDRepo.updatedObjectsFlow] to be same as in KV repos + */ +val WriteCRUDRepo.onUpdatedObjects: Flow + get() = updatedObjectsFlow +/** + * Just mirroring [WriteCRUDRepo.deletedObjectsIdsFlow] to be same as in KV repos + */ +val WriteCRUDRepo<*, IdType, *>.onDeletedObjectsIds: Flow + get() = deletedObjectsIdsFlow + suspend fun WriteCRUDRepo.create( vararg values: InputValueType ): List = create(values.toList()) diff --git a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/diff/CRUDRepoDiff.kt b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/diff/CRUDRepoDiff.kt new file mode 100644 index 00000000000..f0ab647577b --- /dev/null +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/diff/CRUDRepoDiff.kt @@ -0,0 +1,20 @@ +package dev.inmo.micro_utils.repos.diff + +import dev.inmo.micro_utils.common.MapDiff +import dev.inmo.micro_utils.common.applyDiff +import dev.inmo.micro_utils.common.diff +import dev.inmo.micro_utils.repos.CRUDRepo +import dev.inmo.micro_utils.repos.ReadCRUDRepo +import dev.inmo.micro_utils.repos.unset + +suspend fun ReadCRUDRepo.diff(other: Map): MapDiff { + return getAll().diff(other) +} + +suspend fun Map.diff(other: ReadCRUDRepo): MapDiff { + return diff(other.getAll()) +} + +suspend fun MutableMap.applyDiff(other: ReadCRUDRepo) { + applyDiff(diff(other)) +} \ No newline at end of file diff --git a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/diff/KeyValueRepoDiff.kt b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/diff/KeyValueRepoDiff.kt new file mode 100644 index 00000000000..58a88d83943 --- /dev/null +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/diff/KeyValueRepoDiff.kt @@ -0,0 +1,33 @@ +package dev.inmo.micro_utils.repos.diff + +import dev.inmo.micro_utils.common.MapDiff +import dev.inmo.micro_utils.common.applyDiff +import dev.inmo.micro_utils.common.diff +import dev.inmo.micro_utils.repos.KeyValueRepo +import dev.inmo.micro_utils.repos.ReadKeyValueRepo +import dev.inmo.micro_utils.repos.unset + +suspend fun ReadKeyValueRepo.diff(other: Map): MapDiff { + return getAll().diff(other) +} + +suspend fun Map.diff(other: ReadKeyValueRepo): MapDiff { + return diff(other.getAll()) +} + +suspend fun KeyValueRepo.applyDiff(diff: MapDiff) { + unset(diff.removed.map { it.key }) + set( + diff.changed.map { (k, oldNew) -> + k to oldNew.second + }.toMap() + diff.added + ) +} + +suspend fun KeyValueRepo.applyDiff(other: Map) { + applyDiff(diff(other)) +} + +suspend fun MutableMap.applyDiff(other: ReadKeyValueRepo) { + applyDiff(diff(other)) +} \ No newline at end of file diff --git a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/diff/KeyValuesRepoDiff.kt b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/diff/KeyValuesRepoDiff.kt new file mode 100644 index 00000000000..9fd09f73c53 --- /dev/null +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/diff/KeyValuesRepoDiff.kt @@ -0,0 +1,33 @@ +package dev.inmo.micro_utils.repos.diff + +import dev.inmo.micro_utils.common.MapDiff +import dev.inmo.micro_utils.common.applyDiff +import dev.inmo.micro_utils.common.diff +import dev.inmo.micro_utils.repos.* + +suspend fun ReadKeyValuesRepo.diff(other: Map>): MapDiff> { + return getAll().diff(other) +} + +suspend fun Map>.diff(other: ReadKeyValuesRepo): MapDiff> { + return diff(other.getAll()) +} + +suspend fun KeyValuesRepo.applyDiff(diff: MapDiff>) { + diff.removed.forEach { + clear(it.key) + } + set( + diff.changed.map { (k, oldNew) -> + k to oldNew.second + }.toMap() + diff.added + ) +} + +suspend fun KeyValuesRepo.applyDiff(other: Map>) { + applyDiff(diff(other)) +} + +suspend fun MutableMap>.applyDiff(other: ReadKeyValuesRepo) { + applyDiff(diff(other)) +} \ No newline at end of file