Skip to content

Commit c46a292

Browse files
committed
1 parent aca9ad9 commit c46a292

File tree

2 files changed

+50
-0
lines changed
  • kotlin-result/src
    • commonMain/kotlin/com/github/michaelbull/result
    • commonTest/kotlin/com/github/michaelbull/result

2 files changed

+50
-0
lines changed

kotlin-result/src/commonMain/kotlin/com/github/michaelbull/result/Map.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,25 @@ public inline infix fun <V, U> Result<V, Throwable>.mapCatching(transform: (V) -
4545
}
4646
}
4747

48+
/**
49+
* Transposes this [Result<V?, E>][Result] to [Result<V, E>][Result].
50+
*
51+
* Returns null if this [Result] is [Ok] and the [value][Ok.value] is `null`, otherwise this [Result].
52+
*
53+
* - Rust: [Result.transpose][https://doc.rust-lang.org/std/result/enum.Result.html#method.transpose]
54+
*/
55+
public inline fun <V, E> Result<V?, E>.transpose(): Result<V, E>? {
56+
return when (this) {
57+
is Ok -> if (value == null) {
58+
null
59+
} else {
60+
Ok(value)
61+
}
62+
63+
is Err -> this
64+
}
65+
}
66+
4867
/**
4968
* Maps this [Result<Result<V, E>, E>][Result] to [Result<V, E>][Result].
5069
*

kotlin-result/src/commonTest/kotlin/com/github/michaelbull/result/MapTest.kt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.github.michaelbull.result
22

33
import kotlin.test.Test
44
import kotlin.test.assertEquals
5+
import kotlin.test.assertNull
56

67
class MapTest {
78
private sealed interface MapErr {
@@ -76,6 +77,36 @@ class MapTest {
7677
}
7778
}
7879

80+
class Transpose {
81+
82+
@Test
83+
fun returnsNullIfValueIsNull() {
84+
val result = Ok(null)
85+
86+
assertNull(result.transpose())
87+
}
88+
89+
@Test
90+
fun returnsOkIfValueIsNotNull() {
91+
val result = Ok("non null")
92+
93+
assertEquals(
94+
expected = Ok("non null"),
95+
actual = result.transpose()
96+
)
97+
}
98+
99+
@Test
100+
fun returnsErrIfErr() {
101+
val result = Err("non null error")
102+
103+
assertEquals(
104+
expected = Err("non null error"),
105+
actual = result.transpose()
106+
)
107+
}
108+
}
109+
79110
class Flatten {
80111

81112
@Test

0 commit comments

Comments
 (0)