Skip to content

Commit e50dba0

Browse files
Add partition function for map
1 parent c7b7cee commit e50dba0

File tree

4 files changed

+63
-0
lines changed

4 files changed

+63
-0
lines changed

libraries/stdlib/common/src/generated/_Maps.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,3 +668,20 @@ public fun <K, V> Map<out K, V>.asSequence(): Sequence<Map.Entry<K, V>> {
668668
return entries.asSequence()
669669
}
670670

671+
/**
672+
* Splits the original map into a pair of maps,
673+
* where *first* map contains elements for which [predicate] yielded `true`,
674+
* while *second* map contains elements for which [predicate] yielded `false`.
675+
*
676+
* @sample samples.collections.Maps.Operations.partition
677+
*/
678+
public inline fun <K, V> Map<K, V>.partition(predicate: (Map.Entry<K, V>) -> Boolean): Pair<Map<K, V>, Map<K, V>> {
679+
val first = mutableMapOf<K, V>()
680+
val second = mutableMapOf<K, V>()
681+
forEach {
682+
if (predicate(it)) first[it.key] = it.value
683+
else second[it.key] = it.value
684+
}
685+
return Pair(first, second)
686+
}
687+

libraries/stdlib/samples/test/samples/collections/maps.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,5 +412,30 @@ class Maps {
412412
assertPrints(map.flatMap { (key, value) -> key.take(value).toList() }, "[1, 2, 3, 4, 5]")
413413
}
414414
}
415+
416+
class Operations {
417+
private enum class Status {
418+
NEW, IN_PROGRESS, COMPLETED
419+
}
420+
421+
@Sample
422+
fun partition() {
423+
data class Mission(val id: String) {
424+
override fun toString() = id
425+
}
426+
427+
data class Activity(val status: Status) {
428+
override fun toString() = "$status"
429+
}
430+
431+
val map = mapOf(
432+
Mission("1") to listOf(Activity(Status.NEW), Activity(Status.IN_PROGRESS)),
433+
Mission("2") to listOf(Activity(Status.IN_PROGRESS), Activity(Status.COMPLETED)),
434+
Mission("3") to listOf(Activity(Status.COMPLETED), Activity(Status.COMPLETED)),
435+
)
436+
val result = map.partition { it.value.all { activity -> activity.status == Status.COMPLETED } }
437+
assertPrints(result, "({3=[COMPLETED, COMPLETED]}, {1=[NEW, IN_PROGRESS], 2=[IN_PROGRESS, COMPLETED]})")
438+
}
439+
}
415440
}
416441

libraries/stdlib/test/collections/MapTest.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -978,4 +978,24 @@ class MapTest {
978978
assertEquals(kclasses[A::class], 28)
979979
assertEquals(kclasses[B::class], 29)
980980
}
981+
982+
private enum class Status {
983+
NEW, IN_PROGRESS, COMPLETED
984+
}
985+
986+
@Test
987+
fun partition() {
988+
data class Mission(val id: String)
989+
data class Activity(val status: Status)
990+
991+
val map = mapOf(
992+
Mission("M1") to listOf(Activity(Status.NEW), Activity(Status.IN_PROGRESS)),
993+
Mission("M2") to listOf(Activity(Status.IN_PROGRESS), Activity(Status.COMPLETED)),
994+
Mission("M3") to listOf(Activity(Status.COMPLETED), Activity(Status.COMPLETED)),
995+
)
996+
val result = map.partition { it.value.all { activity -> activity.status == Status.COMPLETED } }
997+
998+
assertEquals(1, result.first.size)
999+
assertEquals(2, result.second.size)
1000+
}
9811001
}

libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2579,6 +2579,7 @@ public final class kotlin/collections/MapsKt {
25792579
public static final fun none (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Z
25802580
public static final fun onEach (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Ljava/util/Map;
25812581
public static final fun onEachIndexed (Ljava/util/Map;Lkotlin/jvm/functions/Function2;)Ljava/util/Map;
2582+
public static final fun partition (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Lkotlin/Pair;
25822583
public static final fun plus (Ljava/util/Map;Ljava/lang/Iterable;)Ljava/util/Map;
25832584
public static final fun plus (Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map;
25842585
public static final fun plus (Ljava/util/Map;Lkotlin/Pair;)Ljava/util/Map;

0 commit comments

Comments
 (0)