From 2e0209395a0baa27bd44d281443d33fa1c0c4042 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Tue, 17 Jan 2017 04:34:51 +0300 Subject: [PATCH] Restore Map.minus(key/keys) and Map.minusAssign(key/keys) operators. #KT-13353 --- .../stdlib/src/kotlin/collections/Maps.kt | 75 +++++++++++++++++++ libraries/stdlib/test/collections/MapTest.kt | 35 +++++++++ .../kotlin-stdlib-runtime-merged.txt | 4 + .../reference-public-api/kotlin-stdlib.txt | 4 + 4 files changed, 118 insertions(+) diff --git a/libraries/stdlib/src/kotlin/collections/Maps.kt b/libraries/stdlib/src/kotlin/collections/Maps.kt index 7908b311214..ef30c94e3f6 100644 --- a/libraries/stdlib/src/kotlin/collections/Maps.kt +++ b/libraries/stdlib/src/kotlin/collections/Maps.kt @@ -602,6 +602,81 @@ public inline operator fun MutableMap.plusAssign(map: Map Map.minus(key: K): Map + = this.toMutableMap().apply { minusAssign(key) }.optimizeReadOnlyMap() + +/** + * Returns a map containing all entries of the original map except those entries + * the keys of which are contained in the given [keys] collection. + * + * The returned map preserves the entry iteration order of the original map. + */ +@SinceKotlin("1.1") +public operator fun Map.minus(keys: Iterable): Map + = this.toMutableMap().apply { minusAssign(keys) }.optimizeReadOnlyMap() + +/** + * Returns a map containing all entries of the original map except those entries + * the keys of which are contained in the given [keys] array. + * + * The returned map preserves the entry iteration order of the original map. + */ +@SinceKotlin("1.1") +public operator fun Map.minus(keys: Array): Map + = this.toMutableMap().apply { minusAssign(keys) }.optimizeReadOnlyMap() + +/** + * Returns a map containing all entries of the original map except those entries + * the keys of which are contained in the given [keys] sequence. + * + * The returned map preserves the entry iteration order of the original map. + */ +@SinceKotlin("1.1") +public operator fun Map.minus(keys: Sequence): Map + = this.toMutableMap().apply { minusAssign(keys) }.optimizeReadOnlyMap() + +/** + * Removes the entry with the given [key] from this mutable map. + */ +@SinceKotlin("1.1") +@kotlin.internal.InlineOnly +public inline operator fun MutableMap.minusAssign(key: K) { + remove(key) +} + +/** + * Removes all entries the keys of which are contained in the given [keys] collection from this mutable map. + */ +@SinceKotlin("1.1") +@kotlin.internal.InlineOnly +public inline operator fun MutableMap.minusAssign(keys: Iterable) { + this.keys.removeAll(keys) +} + +/** + * Removes all entries the keys of which are contained in the given [keys] array from this mutable map. + */ +@SinceKotlin("1.1") +@kotlin.internal.InlineOnly +public inline operator fun MutableMap.minusAssign(keys: Array) { + this.keys.removeAll(keys) +} + +/** + * Removes all entries from the keys of which are contained in the given [keys] sequence from this mutable map. + */ +@SinceKotlin("1.1") +@kotlin.internal.InlineOnly +public inline operator fun MutableMap.minusAssign(keys: Sequence) { + this.keys.removeAll(keys) +} + // do not expose for now @PublishedApi internal fun Map.optimizeReadOnlyMap() = when (size) { diff --git a/libraries/stdlib/test/collections/MapTest.kt b/libraries/stdlib/test/collections/MapTest.kt index eb1148f4910..2c995d37381 100644 --- a/libraries/stdlib/test/collections/MapTest.kt +++ b/libraries/stdlib/test/collections/MapTest.kt @@ -413,6 +413,41 @@ class MapTest { } + fun testMinus(doMinus: (Map) -> Map) { + val original = mapOf("A" to 1, "B" to 2) + val shortened = doMinus(original) + assertEquals("A" to 1, shortened.entries.single().toPair()) + } + + @Test fun minus() = testMinus { it - "B" - "C" } + + @Test fun minusList() = testMinus { it - listOf("B", "C") } + + @Test fun minusArray() = testMinus { it - arrayOf("B", "C") } + + @Test fun minusSequence() = testMinus { it - sequenceOf("B", "C") } + + @Test fun minusSet() = testMinus { it - setOf("B", "C") } + + + + fun testMinusAssign(doMinusAssign: (MutableMap) -> Unit) { + val original = hashMapOf("A" to 1, "B" to 2) + doMinusAssign(original) + assertEquals("A" to 1, original.entries.single().toPair()) + } + + @Test fun minusAssign() = testMinusAssign { + it -= "B" + it -= "C" + } + + @Test fun minusAssignList() = testMinusAssign { it -= listOf("B", "C") } + + @Test fun minusAssignArray() = testMinusAssign { it -= arrayOf("B", "C") } + + @Test fun minusAssignSequence() = testMinusAssign { it -= sequenceOf("B", "C") } + fun testIdempotent(operation: (Map) -> Map) { val original = mapOf("A" to 1, "B" to 2) diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt index 978c963e98d..f3b2f55ce89 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt @@ -1850,6 +1850,10 @@ public final class kotlin/collections/MapsKt { public static final fun mapValuesTo (Ljava/util/Map;Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Ljava/util/Map; public static final fun minBy (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Ljava/util/Map$Entry; public static final fun minWith (Ljava/util/Map;Ljava/util/Comparator;)Ljava/util/Map$Entry; + public static final fun minus (Ljava/util/Map;Ljava/lang/Iterable;)Ljava/util/Map; + public static final fun minus (Ljava/util/Map;Ljava/lang/Object;)Ljava/util/Map; + public static final fun minus (Ljava/util/Map;Lkotlin/sequences/Sequence;)Ljava/util/Map; + public static final fun minus (Ljava/util/Map;[Ljava/lang/Object;)Ljava/util/Map; public static final fun mutableMapOf ([Lkotlin/Pair;)Ljava/util/Map; public static final fun none (Ljava/util/Map;)Z public static final fun none (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Z diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib.txt index 19141090703..7ec76a0eecd 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib.txt @@ -1677,6 +1677,10 @@ public final class kotlin/collections/MapsKt { public static final fun mapValuesTo (Ljava/util/Map;Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Ljava/util/Map; public static final fun minBy (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Ljava/util/Map$Entry; public static final fun minWith (Ljava/util/Map;Ljava/util/Comparator;)Ljava/util/Map$Entry; + public static final fun minus (Ljava/util/Map;Ljava/lang/Iterable;)Ljava/util/Map; + public static final fun minus (Ljava/util/Map;Ljava/lang/Object;)Ljava/util/Map; + public static final fun minus (Ljava/util/Map;Lkotlin/sequences/Sequence;)Ljava/util/Map; + public static final fun minus (Ljava/util/Map;[Ljava/lang/Object;)Ljava/util/Map; public static final fun mutableMapOf ([Lkotlin/Pair;)Ljava/util/Map; public static final fun none (Ljava/util/Map;)Z public static final fun none (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Z