From bc9bf92cc98e01c21bdd2bf8640cf7db0f97204a Mon Sep 17 00:00:00 2001 From: Phil Davies Date: Mon, 28 Oct 2024 20:25:30 +0000 Subject: [PATCH] refactor: rename Map.flatMap and Map.mapNotNull (#3512) --- arrow-libs/core/arrow-core/api/arrow-core.api | 4 ++-- arrow-libs/core/arrow-core/api/arrow-core.klib.api | 4 ++-- .../src/commonMain/kotlin/arrow/core/map.kt | 8 ++++---- .../src/commonTest/kotlin/arrow/core/MapKTest.kt | 12 ++++++------ 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/arrow-libs/core/arrow-core/api/arrow-core.api b/arrow-libs/core/arrow-core/api/arrow-core.api index e8c75137883..a6202acc399 100644 --- a/arrow-libs/core/arrow-core/api/arrow-core.api +++ b/arrow-libs/core/arrow-core/api/arrow-core.api @@ -309,12 +309,12 @@ public final class arrow/core/MapKt { public static final fun align (Ljava/util/Map;Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Ljava/util/Map; public static final fun combine (Ljava/util/Map;Ljava/util/Map;Lkotlin/jvm/functions/Function2;)Ljava/util/Map; public static final fun filterOption (Ljava/util/Map;)Ljava/util/Map; - public static final fun flatMap (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Ljava/util/Map; + public static final fun flatMapValues (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Ljava/util/Map; public static final fun fold (Ljava/util/Map;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; public static final fun getOrNone (Ljava/util/Map;Ljava/lang/Object;)Larrow/core/Option; - public static final fun mapNotNull (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Ljava/util/Map; public static final fun mapOrAccumulate (Ljava/util/Map;Lkotlin/jvm/functions/Function2;)Larrow/core/Either; public static final fun mapOrAccumulate (Ljava/util/Map;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;)Larrow/core/Either; + public static final fun mapValuesNotNull (Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Ljava/util/Map; public static final fun padZip (Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map; public static final fun padZip (Ljava/util/Map;Ljava/util/Map;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)Ljava/util/Map; public static final fun padZip (Ljava/util/Map;Ljava/util/Map;Lkotlin/jvm/functions/Function3;)Ljava/util/Map; diff --git a/arrow-libs/core/arrow-core/api/arrow-core.klib.api b/arrow-libs/core/arrow-core/api/arrow-core.klib.api index 4fdc4eff68f..9cf4cc2b31e 100644 --- a/arrow-libs/core/arrow-core/api/arrow-core.klib.api +++ b/arrow-libs/core/arrow-core/api/arrow-core.klib.api @@ -729,8 +729,7 @@ final fun <#A: kotlin/Any?, #B: kotlin/Any?, #C: kotlin/Any?> (arrow.core/Either final fun <#A: kotlin/Any?, #B: kotlin/Any?, #C: kotlin/Any?> (arrow.core/NonEmptyList<#C>).arrow.core/unzip(kotlin/Function1<#C, kotlin/Pair<#A, #B>>): kotlin/Pair, arrow.core/NonEmptyList<#B>> // arrow.core/unzip|unzip@arrow.core.NonEmptyList<0:2>(kotlin.Function1<0:2,kotlin.Pair<0:0,0:1>>){0§;1§;2§}[0] final fun <#A: kotlin/Any?, #B: kotlin/Any?, #C: kotlin/Any?> (kotlin.collections/Iterable<#A>).arrow.core/crosswalkMap(kotlin/Function1<#A, kotlin.collections/Map<#B, #C>>): kotlin.collections/Map<#B, kotlin.collections/List<#C>> // arrow.core/crosswalkMap|crosswalkMap@kotlin.collections.Iterable<0:0>(kotlin.Function1<0:0,kotlin.collections.Map<0:1,0:2>>){0§;1§;2§}[0] final fun <#A: kotlin/Any?, #B: kotlin/Any?, #C: kotlin/Any?> (kotlin.collections/Map<#A, #B>).arrow.core/align(kotlin.collections/Map<#A, #C>): kotlin.collections/Map<#A, arrow.core/Ior<#B, #C>> // arrow.core/align|align@kotlin.collections.Map<0:0,0:1>(kotlin.collections.Map<0:0,0:2>){0§;1§;2§}[0] -final fun <#A: kotlin/Any?, #B: kotlin/Any?, #C: kotlin/Any?> (kotlin.collections/Map<#A, #B>).arrow.core/flatMap(kotlin/Function1, kotlin.collections/Map<#A, #C>>): kotlin.collections/Map<#A, #C> // arrow.core/flatMap|flatMap@kotlin.collections.Map<0:0,0:1>(kotlin.Function1,kotlin.collections.Map<0:0,0:2>>){0§;1§;2§}[0] -final fun <#A: kotlin/Any?, #B: kotlin/Any?, #C: kotlin/Any?> (kotlin.collections/Map<#A, #B>).arrow.core/mapNotNull(kotlin/Function1, #C?>): kotlin.collections/Map<#A, #C> // arrow.core/mapNotNull|mapNotNull@kotlin.collections.Map<0:0,0:1>(kotlin.Function1,0:2?>){0§;1§;2§}[0] +final fun <#A: kotlin/Any?, #B: kotlin/Any?, #C: kotlin/Any?> (kotlin.collections/Map<#A, #B>).arrow.core/flatMapValues(kotlin/Function1, kotlin.collections/Map<#A, #C>>): kotlin.collections/Map<#A, #C> // arrow.core/flatMapValues|flatMapValues@kotlin.collections.Map<0:0,0:1>(kotlin.Function1,kotlin.collections.Map<0:0,0:2>>){0§;1§;2§}[0] final fun <#A: kotlin/Any?, #B: kotlin/Any?, #C: kotlin/Any?> (kotlin.collections/Map<#A, #B>).arrow.core/padZip(kotlin.collections/Map<#A, #C>): kotlin.collections/Map<#A, kotlin/Pair<#B?, #C?>> // arrow.core/padZip|padZip@kotlin.collections.Map<0:0,0:1>(kotlin.collections.Map<0:0,0:2>){0§;1§;2§}[0] final fun <#A: kotlin/Any?, #B: kotlin/Any?, #C: kotlin/Any?> (kotlin.collections/Map<#A, #B>).arrow.core/zip(kotlin.collections/Map<#A, #C>): kotlin.collections/Map<#A, kotlin/Pair<#B, #C>> // arrow.core/zip|zip@kotlin.collections.Map<0:0,0:1>(kotlin.collections.Map<0:0,0:2>){0§;1§;2§}[0] final fun <#A: kotlin/Any?, #B: kotlin/Any?, #C: kotlin/Any?> (kotlin.collections/Map<#A, arrow.core/Ior<#B, #C>>).arrow.core/unalign(): kotlin/Pair, kotlin.collections/Map<#A, #C>> // arrow.core/unalign|unalign@kotlin.collections.Map<0:0,arrow.core.Ior<0:1,0:2>>(){0§;1§;2§}[0] @@ -934,6 +933,7 @@ final inline fun <#A: kotlin/Any?, #B: kotlin/Any?, #C: kotlin/Any?> (kotlin.col final inline fun <#A: kotlin/Any?, #B: kotlin/Any?, #C: kotlin/Any?> (kotlin.collections/Iterable<#B>).arrow.core/mapOrAccumulate(kotlin/Function2, #B, #C>): arrow.core/Either, kotlin.collections/List<#C>> // arrow.core/mapOrAccumulate|mapOrAccumulate@kotlin.collections.Iterable<0:1>(kotlin.Function2,0:1,0:2>){0§;1§;2§}[0] final inline fun <#A: kotlin/Any?, #B: kotlin/Any?, #C: kotlin/Any?> (kotlin.collections/Iterable<#C>).arrow.core/unalign(kotlin/Function1<#C, arrow.core/Ior<#A, #B>>): kotlin/Pair, kotlin.collections/List<#B?>> // arrow.core/unalign|unalign@kotlin.collections.Iterable<0:2>(kotlin.Function1<0:2,arrow.core.Ior<0:0,0:1>>){0§;1§;2§}[0] final inline fun <#A: kotlin/Any?, #B: kotlin/Any?, #C: kotlin/Any?> (kotlin.collections/Map<#A, #B>).arrow.core/fold(#C, kotlin/Function2<#C, kotlin.collections/Map.Entry<#A, #B>, #C>): #C // arrow.core/fold|fold@kotlin.collections.Map<0:0,0:1>(0:2;kotlin.Function2<0:2,kotlin.collections.Map.Entry<0:0,0:1>,0:2>){0§;1§;2§}[0] +final inline fun <#A: kotlin/Any?, #B: kotlin/Any?, #C: kotlin/Any?> (kotlin.collections/Map<#A, #B>).arrow.core/mapValuesNotNull(kotlin/Function1, #C?>): kotlin.collections/Map<#A, #C> // arrow.core/mapValuesNotNull|mapValuesNotNull@kotlin.collections.Map<0:0,0:1>(kotlin.Function1,0:2?>){0§;1§;2§}[0] final inline fun <#A: kotlin/Any?, #B: kotlin/Any?, #C: kotlin/Any?> (kotlin/Function1, #B>).arrow.core.raise/fold(kotlin/Function1<#A, #C>, kotlin/Function1<#B, #C>): #C // arrow.core.raise/fold|fold@kotlin.Function1,0:1>(kotlin.Function1<0:0,0:2>;kotlin.Function1<0:1,0:2>){0§;1§;2§}[0] final inline fun <#A: kotlin/Any?, #B: kotlin/Any?, #C: kotlin/Any?> (kotlin/Function1, #B>).arrow.core.raise/fold(kotlin/Function1, kotlin/Function1<#A, #C>, kotlin/Function1<#B, #C>): #C // arrow.core.raise/fold|fold@kotlin.Function1,0:1>(kotlin.Function1;kotlin.Function1<0:0,0:2>;kotlin.Function1<0:1,0:2>){0§;1§;2§}[0] final inline fun <#A: kotlin/Any?, #B: kotlin/Any?, #C: kotlin/Any?> arrow.core.raise/accumulate(kotlin/Function1>, #B>, #C>, crossinline kotlin/Function1, #B>): #C // arrow.core.raise/accumulate|accumulate(kotlin.Function1>,0:1>,0:2>;kotlin.Function1,0:1>){0§;1§;2§}[0] diff --git a/arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/map.kt b/arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/map.kt index 2ce773040f0..df8e0013740 100644 --- a/arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/map.kt +++ b/arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/map.kt @@ -244,9 +244,9 @@ public inline fun Map.zip( * only keeping the [Map.Entry] of the transformed map that match the input [Map.Entry]. */ @Suppress("UNCHECKED_CAST") -public fun Map.flatMap(f: (Map.Entry) -> Map): Map = +public fun Map.flatMapValues(f: (Map.Entry) -> Map): Map = buildMap { - this@flatMap.forEach { entry -> + this@flatMapValues.forEach { entry -> val nestedMap = f(entry) if (nestedMap.containsKey(entry.key)) { put(entry.key, nestedMap[entry.key] as B) @@ -267,9 +267,9 @@ public inline fun Map.mapOrAccumulate( mapOrAccumulate(this@mapOrAccumulate, transform) } -public fun Map.mapNotNull(transform: (Map.Entry) -> B?): Map = +public inline fun Map.mapValuesNotNull(transform: (Map.Entry) -> B?): Map = buildMap { - this@mapNotNull.forEach { entry -> + this@mapValuesNotNull.forEach { entry -> transform(entry)?.let { put(entry.key, it) } } } diff --git a/arrow-libs/core/arrow-core/src/commonTest/kotlin/arrow/core/MapKTest.kt b/arrow-libs/core/arrow-core/src/commonTest/kotlin/arrow/core/MapKTest.kt index e6ba1a9d7e1..4535cba4984 100644 --- a/arrow-libs/core/arrow-core/src/commonTest/kotlin/arrow/core/MapKTest.kt +++ b/arrow-libs/core/arrow-core/src/commonTest/kotlin/arrow/core/MapKTest.kt @@ -409,11 +409,11 @@ class MapKTest { } } - @Test fun mapNotNullOk() = runTest { + @Test fun mapValuesNotNullOk() = runTest { checkAll( Arb.map(Arb.int(), Arb.boolean(), maxSize = 30) ) { xs -> - val rs = xs.mapNotNull { (_, pred) -> if(pred) true else null } + val rs = xs.mapValuesNotNull { (_, pred) -> if(pred) true else null } xs.forAll { if (it.value) @@ -678,11 +678,11 @@ class MapKTest { } } - @Test fun flatMapOk() = runTest { + @Test fun flatMapValuesOk() = runTest { checkAll( Arb.map2(Arb.int(), Arb.int(), Arb.int()) ) { (a, b) -> - val result = a.flatMap { b } + val result = a.flatMapValues { b } val expected = a.filter { (k, _) -> b.containsKey(k) } .map { (k, _) -> Pair(k, b[k]!!) } .toMap() @@ -725,11 +725,11 @@ class MapKTest { } } - @Test fun flatMapNull() = runTest { + @Test fun flatMapValuesNull() = runTest { checkAll( Arb.map2(Arb.int(), Arb.int(), Arb.int().orNull()) ) { (mapA, mapB) -> - val result = mapA.flatMap { mapB } + val result = mapA.flatMapValues { mapB } val expected = mapA.filter { (k, _) -> mapB.containsKey(k) } .map { (k, _) -> Pair(k, mapB[k]) } .toMap()