From 5ded43d3b4ee5ccf84b31f01738f3ae8bb491c34 Mon Sep 17 00:00:00 2001 From: Michael Bull Date: Sat, 2 Mar 2024 16:51:45 +0000 Subject: [PATCH] Add flatten Converts from Result, E> to Result See: https://doc.rust-lang.org/std/result/enum.Result.html#method.flatten --- .../com/github/michaelbull/result/Map.kt | 9 ++++ .../com/github/michaelbull/result/MapTest.kt | 48 +++++++++++++++++++ 2 files changed, 57 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 cc83f74..e2fd3ef 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 @@ -167,6 +167,15 @@ public inline infix fun Result.flatMap(transform: (V) -> Result< return andThen(transform) } +/** + * Maps this [Result, E>][Result] to [Result][Result]. + * + * - Rust: [Result.flatten](https://doc.rust-lang.org/std/result/enum.Result.html#method.flatten) + */ +public inline fun Result, E>.flatten(): Result { + return andThen { it } +} + /** * Returns the [transformation][transform] of the [value][Ok.value] if this [Result] is [Ok] * and satisfies the given [predicate], otherwise this [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 4e073f6..9a3eb0d 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 @@ -176,6 +176,54 @@ class MapTest { } } + class Flatten { + + @Test + fun returnsFlattenedValueIfOk() { + val result = Ok(Ok("hello")) + + assertEquals( + expected = Ok("hello"), + actual = result.flatten() + ) + } + + @Test + fun returnsFlattenedErrIfErr() { + val result = Ok(Err(6)) + + assertEquals( + expected = Err(6), + actual = result.flatten() + ) + } + + @Test + fun returnsErrIfFlatErr() { + val result = Err(6) + + assertEquals( + expected = Err(6), + actual = result.flatten() + ) + } + + @Test + fun returnsFlattenNestedResult() { + val result = Ok(Ok(Ok("hello"))) + + assertEquals( + expected = Ok(Ok("hello")), + actual = result.flatten() + ) + + assertEquals( + expected = Ok("hello"), + actual = result.flatten().flatten() + ) + } + } + class ToErrorIfNull { @Test