From 0a8453b4d220476d4001fe4b5b38d396fded369f Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 5 May 2023 11:58:27 +0600 Subject: [PATCH] add MapDiff#reversed and MutableMap#applyDiff(MapDiff) --- .../dev/inmo/micro_utils/common/MapDiff.kt | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/common/src/commonMain/kotlin/dev/inmo/micro_utils/common/MapDiff.kt b/common/src/commonMain/kotlin/dev/inmo/micro_utils/common/MapDiff.kt index 7e3ca009c6c..dc275c347d1 100644 --- a/common/src/commonMain/kotlin/dev/inmo/micro_utils/common/MapDiff.kt +++ b/common/src/commonMain/kotlin/dev/inmo/micro_utils/common/MapDiff.kt @@ -75,6 +75,23 @@ fun Map.diff( compareFun = createCompareFun(strictComparison) ) +/** + * Will apply [mapDiff] to [this] [MutableMap] + */ +fun MutableMap.applyDiff( + mapDiff: MapDiff +) { + mapDiff.apply { + removed.keys.forEach { remove(it) } + changed.forEach { (k, oldNew) -> + put(k, oldNew.second) + } + added.forEach { (k, new) -> + put(k, new) + } + } +} + /** * Will apply changes with [from] map into [this] one * @@ -86,14 +103,8 @@ fun MutableMap.applyDiff( from: Map, compareFun: (K, V, V) -> Boolean ): MapDiff { - return diff(from, compareFun).apply { - removed.keys.forEach { remove(it) } - changed.forEach { (k, oldNew) -> - put(k, oldNew.second) - } - added.forEach { (k, new) -> - put(k, new) - } + return diff(from, compareFun).also { + applyDiff(it) } } @@ -112,3 +123,13 @@ fun MutableMap.applyDiff( from, compareFun = createCompareFun(strictComparison) ) + +/** + * Reverse [this] [MapDiff]. Result will contain [MapDiff.added] on [MapDiff.removed] (and vice-verse), all the + * [MapDiff.changed] values will be reversed too + */ +fun MapDiff.reversed(): MapDiff = MapDiff( + removed = added, + changed = changed.mapValues { (_, oldNew) -> oldNew.second to oldNew.first }, + added = removed +)