From c46a2925b17a87b98081b7b10214e1468ffc483d Mon Sep 17 00:00:00 2001 From: Michael Bull Date: Sat, 9 Mar 2024 00:22:51 +0000 Subject: [PATCH] Add transpose See: https://doc.rust-lang.org/std/result/enum.Result.html#method.transpose --- .../com/github/michaelbull/result/Map.kt | 19 ++++++++++++ .../com/github/michaelbull/result/MapTest.kt | 31 +++++++++++++++++++ 2 files changed, 50 insertions(+) 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 67690e3..5449bf2 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 @@ -45,6 +45,25 @@ public inline infix fun Result.mapCatching(transform: (V) - } } +/** + * Transposes this [Result][Result] to [Result][Result]. + * + * Returns null if this [Result] is [Ok] and the [value][Ok.value] is `null`, otherwise this [Result]. + * + * - Rust: [Result.transpose][https://doc.rust-lang.org/std/result/enum.Result.html#method.transpose] + */ +public inline fun Result.transpose(): Result? { + return when (this) { + is Ok -> if (value == null) { + null + } else { + Ok(value) + } + + is Err -> this + } +} + /** * Maps this [Result, E>][Result] to [Result][Result]. * 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 31cabd1..f547a9f 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 @@ -2,6 +2,7 @@ package com.github.michaelbull.result import kotlin.test.Test import kotlin.test.assertEquals +import kotlin.test.assertNull class MapTest { private sealed interface MapErr { @@ -76,6 +77,36 @@ class MapTest { } } + class Transpose { + + @Test + fun returnsNullIfValueIsNull() { + val result = Ok(null) + + assertNull(result.transpose()) + } + + @Test + fun returnsOkIfValueIsNotNull() { + val result = Ok("non null") + + assertEquals( + expected = Ok("non null"), + actual = result.transpose() + ) + } + + @Test + fun returnsErrIfErr() { + val result = Err("non null error") + + assertEquals( + expected = Err("non null error"), + actual = result.transpose() + ) + } + } + class Flatten { @Test