From d7dbf35bcf305ea3dcfbe4f22e02b2fa5d6ee43d Mon Sep 17 00:00:00 2001 From: Kirill Zhukov Date: Tue, 9 May 2023 12:29:31 -0700 Subject: [PATCH] Improve type constraint on toErrorIfNull Closes #84 and closes #86 --- build.gradle.kts | 5 ++++ .../com/github/michaelbull/result/Map.kt | 26 ++++++++++++------- .../com/github/michaelbull/result/MapTest.kt | 4 +-- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 19b4327..88b64ba 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -223,6 +223,11 @@ subprojects { name.set("Matthias Geisler") url.set("https://github.com/bitPogo") } + + contributor { + name.set("Kirill Zhukov") + url.set("https://github.com/kirillzh") + } } scm { diff --git a/kotlin-result/src/commonMain/kotlin/com/github/michaelbull/result/Map.kt b/kotlin-result/src/commonMain/kotlin/com/github/michaelbull/result/Map.kt index fdbfc2f..cc83f74 100644 --- a/kotlin-result/src/commonMain/kotlin/com/github/michaelbull/result/Map.kt +++ b/kotlin-result/src/commonMain/kotlin/com/github/michaelbull/result/Map.kt @@ -195,15 +195,19 @@ public inline fun Result.toErrorIf(predicate: (V) -> Boolean, trans * * @see [toErrorIf] */ -public inline fun Result.toErrorIfNull(error: () -> E): Result { +public inline fun Result.toErrorIfNull(error: () -> E): Result { contract { callsInPlace(error, InvocationKind.AT_MOST_ONCE) } - return toErrorIf( - { it == null }, - { error() } - ) + return when (this) { + is Ok -> if(value == null) { + Err(error()) + } else { + Ok(value) + } + is Err -> this + } } /** @@ -239,8 +243,12 @@ public inline fun Result.toErrorUnlessNull(error: () -> E): Result< callsInPlace(error, InvocationKind.AT_MOST_ONCE) } - return toErrorUnless( - { it == null }, - { error() } - ) + return when (this) { + is Ok -> if (value == null) { + this + } else { + Err(error()) + } + is Err -> Err(error()) + } } diff --git a/kotlin-result/src/commonTest/kotlin/com/github/michaelbull/result/MapTest.kt b/kotlin-result/src/commonTest/kotlin/com/github/michaelbull/result/MapTest.kt index 51c22a2..4e073f6 100644 --- a/kotlin-result/src/commonTest/kotlin/com/github/michaelbull/result/MapTest.kt +++ b/kotlin-result/src/commonTest/kotlin/com/github/michaelbull/result/MapTest.kt @@ -192,7 +192,7 @@ class MapTest { @Test fun returnsTransformedErrorIfNull() { - val result = Ok(null).toErrorIfNull { "a" } + val result: Result = Ok(null).toErrorIfNull { "a" } result as Err @@ -245,7 +245,7 @@ class MapTest { result as Err assertEquals( - expected = "a", + expected = "b", actual = result.error ) }