Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions libraries/stdlib/common/src/generated/_Maps.kt
Original file line number Diff line number Diff line change
Expand Up @@ -672,3 +672,20 @@ public fun <K, V> Map<out K, V>.asSequence(): Sequence<Map.Entry<K, V>> {
return entries.asSequence()
}

/**
* Splits the original map into a pair of maps,
* where *first* map contains elements for which [predicate] yielded `true`,
* while *second* map contains elements for which [predicate] yielded `false`.
*
* @sample samples.collections.Maps.Operations.partition
*/
public inline fun <K, V> Map<K, V>.partition(predicate: (Map.Entry<K, V>) -> Boolean): Pair<Map<K, V>, Map<K, V>> {
val first = mutableMapOf<K, V>()
val second = mutableMapOf<K, V>()
forEach {
if (predicate(it)) first[it.key] = it.value
else second[it.key] = it.value
}
return Pair(first, second)
}

25 changes: 25 additions & 0 deletions libraries/stdlib/samples/test/samples/collections/maps.kt
Original file line number Diff line number Diff line change
Expand Up @@ -552,5 +552,30 @@ class Maps {
assertTrue(map.isEmpty())
}
}

class Operations {
private enum class Status {
NEW, IN_PROGRESS, COMPLETED
}

@Sample
fun partition() {
data class Mission(val id: String) {
override fun toString() = id
}

data class Activity(val status: Status) {
override fun toString() = "$status"
}

val map = mapOf(
Mission("1") to listOf(Activity(Status.NEW), Activity(Status.IN_PROGRESS)),
Mission("2") to listOf(Activity(Status.IN_PROGRESS), Activity(Status.COMPLETED)),
Mission("3") to listOf(Activity(Status.COMPLETED), Activity(Status.COMPLETED)),
)
val result = map.partition { it.value.all { activity -> activity.status == Status.COMPLETED } }
assertPrints(result, "({3=[COMPLETED, COMPLETED]}, {1=[NEW, IN_PROGRESS], 2=[IN_PROGRESS, COMPLETED]})")
}
}
}

20 changes: 20 additions & 0 deletions libraries/stdlib/test/collections/MapTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -978,4 +978,24 @@ class MapTest {
assertEquals(kclasses[A::class], 28)
assertEquals(kclasses[B::class], 29)
}

private enum class Status {
NEW, IN_PROGRESS, COMPLETED
}

@Test
fun partition() {
data class Mission(val id: String)
data class Activity(val status: Status)

val map = mapOf(
Mission("M1") to listOf(Activity(Status.NEW), Activity(Status.IN_PROGRESS)),
Mission("M2") to listOf(Activity(Status.IN_PROGRESS), Activity(Status.COMPLETED)),
Mission("M3") to listOf(Activity(Status.COMPLETED), Activity(Status.COMPLETED)),
)
val result = map.partition { it.value.all { activity -> activity.status == Status.COMPLETED } }

assertEquals(1, result.first.size)
assertEquals(2, result.second.size)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2582,6 +2582,7 @@ public final class kotlin/collections/MapsKt {
public static final fun none (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Z
public static final fun onEach (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Ljava/util/Map;
public static final fun onEachIndexed (Ljava/util/Map;Lkotlin/jvm/functions/Function2;)Ljava/util/Map;
public static final fun partition (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Lkotlin/Pair;
public static final fun plus (Ljava/util/Map;Ljava/lang/Iterable;)Ljava/util/Map;
public static final fun plus (Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map;
public static final fun plus (Ljava/util/Map;Lkotlin/Pair;)Ljava/util/Map;
Expand Down