diff --git a/arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/Result.kt b/arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/Result.kt
index 6947a89675f..c787c60f447 100644
--- a/arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/Result.kt
+++ b/arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/Result.kt
@@ -155,6 +155,7 @@ public inline fun Result.zip(
): Result =
zip(b, c, d, e, f, g, h, i, UnitResult) { a, b, c, d, e, f, g, h, i, _ -> transform(a, b, c, d, e, f, g, h, i) }
+@Suppress("UNCHECKED_CAST")
public inline fun Result.zip(
b: Result,
c: Result,
@@ -165,31 +166,35 @@ public inline fun Result.zip(
h: Result,
i: Result,
j: Result,
- transform: (A, B, C, D, E, F, G, H, I, J) -> K
-): Result = Nullable.zip(
- getOrNull(),
- b.getOrNull(),
- c.getOrNull(),
- d.getOrNull(),
- e.getOrNull(),
- f.getOrNull(),
- g.getOrNull(),
- h.getOrNull(),
- i.getOrNull(),
- j.getOrNull(),
- transform
-)?.let { success(it) } ?: composeErrors(
- exceptionOrNull(),
- b.exceptionOrNull(),
- c.exceptionOrNull(),
- d.exceptionOrNull(),
- e.exceptionOrNull(),
- f.exceptionOrNull(),
- g.exceptionOrNull(),
- h.exceptionOrNull(),
- i.exceptionOrNull(),
- j.exceptionOrNull(),
-)!!.let(::failure)
+ transform: (A, B, C, D, E, F, G, H, I, J) -> K,
+): Result =
+ if (isSuccess && b.isSuccess && c.isSuccess && d.isSuccess && e.isSuccess && f.isSuccess && g.isSuccess && h.isSuccess && i.isSuccess && j.isSuccess)
+ success(
+ transform(
+ getOrNull() as A,
+ b.getOrNull() as B,
+ c.getOrNull() as C,
+ d.getOrNull() as D,
+ e.getOrNull() as E,
+ f.getOrNull() as F,
+ g.getOrNull() as G,
+ h.getOrNull() as H,
+ i.getOrNull() as I,
+ j.getOrNull() as J
+ )
+ ) else
+ composeErrors(
+ exceptionOrNull(),
+ b.exceptionOrNull(),
+ c.exceptionOrNull(),
+ d.exceptionOrNull(),
+ e.exceptionOrNull(),
+ f.exceptionOrNull(),
+ g.exceptionOrNull(),
+ h.exceptionOrNull(),
+ i.exceptionOrNull(),
+ j.exceptionOrNull(),
+ )!!.let(::failure)
@PublishedApi
internal fun composeErrors(vararg other: Throwable?): Throwable? =
diff --git a/arrow-libs/core/arrow-core/src/commonTest/kotlin/arrow/core/ResultTest.kt b/arrow-libs/core/arrow-core/src/commonTest/kotlin/arrow/core/ResultTest.kt
new file mode 100644
index 00000000000..af57748b263
--- /dev/null
+++ b/arrow-libs/core/arrow-core/src/commonTest/kotlin/arrow/core/ResultTest.kt
@@ -0,0 +1,15 @@
+package arrow.core
+
+import io.kotest.core.spec.style.StringSpec
+import io.kotest.matchers.shouldBe
+
+class ResultTest : StringSpec({
+
+ "null zip null" {
+ val x = Result.success(null)
+ x.zip(x) { y, z ->
+ (y?.plus(z ?: -2)) ?: -1
+ } shouldBe Result.success(-1)
+ }
+
+})