Skip to content

Commit c3976ae

Browse files
Add partition function for map
1 parent 41321d3 commit c3976ae

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
@@ -552,5 +552,30 @@ class Maps {
552552
assertTrue(map.isEmpty())
553553
}
554554
}
555+
556+
class Operations {
557+
private enum class Status {
558+
NEW, IN_PROGRESS, COMPLETED
559+
}
560+
561+
@Sample
562+
fun partition() {
563+
data class Mission(val id: String) {
564+
override fun toString() = id
565+
}
566+
567+
data class Activity(val status: Status) {
568+
override fun toString() = "$status"
569+
}
570+
571+
val map = mapOf(
572+
Mission("1") to listOf(Activity(Status.NEW), Activity(Status.IN_PROGRESS)),
573+
Mission("2") to listOf(Activity(Status.IN_PROGRESS), Activity(Status.COMPLETED)),
574+
Mission("3") to listOf(Activity(Status.COMPLETED), Activity(Status.COMPLETED)),
575+
)
576+
val result = map.partition { it.value.all { activity -> activity.status == Status.COMPLETED } }
577+
assertPrints(result, "({3=[COMPLETED, COMPLETED]}, {1=[NEW, IN_PROGRESS], 2=[IN_PROGRESS, COMPLETED]})")
578+
}
579+
}
555580
}
556581

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
@@ -2582,6 +2582,7 @@ public final class kotlin/collections/MapsKt {
25822582
public static final fun none (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Z
25832583
public static final fun onEach (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Ljava/util/Map;
25842584
public static final fun onEachIndexed (Ljava/util/Map;Lkotlin/jvm/functions/Function2;)Ljava/util/Map;
2585+
public static final fun partition (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Lkotlin/Pair;
25852586
public static final fun plus (Ljava/util/Map;Ljava/lang/Iterable;)Ljava/util/Map;
25862587
public static final fun plus (Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map;
25872588
public static final fun plus (Ljava/util/Map;Lkotlin/Pair;)Ljava/util/Map;

0 commit comments

Comments
 (0)