diff --git a/arrow-libs/core/arrow-core-test/api/arrow-core-test.api b/arrow-libs/core/arrow-core-test/api/arrow-core-test.api
index 8bf623467eb..d6324cf5073 100644
--- a/arrow-libs/core/arrow-core-test/api/arrow-core-test.api
+++ b/arrow-libs/core/arrow-core-test/api/arrow-core-test.api
@@ -61,6 +61,7 @@ public final class arrow/core/test/generators/GeneratorsKt {
public static final fun nonZeroInt (Lio/kotest/property/Arb$Companion;)Lio/kotest/property/Arb;
public static final fun option (Lio/kotest/property/Arb$Companion;Lio/kotest/property/Arb;)Lio/kotest/property/Arb;
public static final fun or (Lio/kotest/property/Arb;Lio/kotest/property/Arb;)Lio/kotest/property/Arb;
+ public static final fun result (Lio/kotest/property/Arb$Companion;Lio/kotest/property/Arb;)Lio/kotest/property/Arb;
public static final fun sequence (Lio/kotest/property/Arb$Companion;Lio/kotest/property/Arb;)Lio/kotest/property/Arb;
public static final fun shortSmall (Lio/kotest/property/Arb$Companion;)Lio/kotest/property/Arb;
public static final fun suspendFunThatReturnsAnyLeft (Lio/kotest/property/Arb$Companion;)Lio/kotest/property/Arb;
@@ -79,6 +80,11 @@ public final class arrow/core/test/generators/GeneratorsKt {
public static final fun validated (Lio/kotest/property/Arb$Companion;Lio/kotest/property/Arb;Lio/kotest/property/Arb;)Lio/kotest/property/Arb;
}
+public final class arrow/core/test/generators/UtilsKt {
+ public static final fun suspend (Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+ public static final fun suspend (Ljava/lang/Throwable;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+}
+
public final class arrow/core/test/laws/FxLaws {
public static final field INSTANCE Larrow/core/test/laws/FxLaws;
public final fun eager (Lio/kotest/property/Arb;Lio/kotest/property/Arb;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function3;)Ljava/util/List;
diff --git a/arrow-libs/core/arrow-core-test/src/commonMain/kotlin/arrow/core/test/generators/Generators.kt b/arrow-libs/core/arrow-core-test/src/commonMain/kotlin/arrow/core/test/generators/Generators.kt
index 82a4f6c40b1..8daf5a919b0 100644
--- a/arrow-libs/core/arrow-core-test/src/commonMain/kotlin/arrow/core/test/generators/Generators.kt
+++ b/arrow-libs/core/arrow-core-test/src/commonMain/kotlin/arrow/core/test/generators/Generators.kt
@@ -40,6 +40,8 @@ import io.kotest.property.arbitrary.of
import io.kotest.property.arbitrary.orNull
import io.kotest.property.arbitrary.short
import io.kotest.property.arbitrary.string
+import kotlin.Result.Companion.failure
+import kotlin.Result.Companion.success
import kotlin.jvm.JvmOverloads
import kotlin.math.abs
import kotlin.random.nextInt
@@ -62,6 +64,9 @@ public fun Arb.Companion.functionToA(arb: Arb): Arb<() -> A> =
public fun Arb.Companion.throwable(): Arb =
Arb.of(listOf(RuntimeException(), NoSuchElementException(), IllegalArgumentException()))
+public fun Arb.Companion.result(arbA: Arb): Arb> =
+ Arb.choice(arbA.map(::success), throwable().map(::failure))
+
public fun Arb.Companion.doubleSmall(): Arb =
Arb.numericDoubles(from = 0.0, to = 100.0)
diff --git a/arrow-libs/core/arrow-core-test/src/commonMain/kotlin/arrow/core/test/generators/utils.kt b/arrow-libs/core/arrow-core-test/src/commonMain/kotlin/arrow/core/test/generators/utils.kt
new file mode 100644
index 00000000000..b6d8f37299e
--- /dev/null
+++ b/arrow-libs/core/arrow-core-test/src/commonMain/kotlin/arrow/core/test/generators/utils.kt
@@ -0,0 +1,30 @@
+package arrow.core.test.generators
+
+import kotlin.coroutines.Continuation
+import kotlin.coroutines.intrinsics.COROUTINE_SUSPENDED
+import kotlin.coroutines.intrinsics.intercepted
+import kotlin.coroutines.intrinsics.suspendCoroutineUninterceptedOrReturn
+import kotlin.coroutines.startCoroutine
+import kotlinx.coroutines.Dispatchers
+
+public suspend fun Throwable.suspend(): Nothing =
+ suspendCoroutineUninterceptedOrReturn { cont ->
+ suspend { throw this }.startCoroutine(
+ Continuation(Dispatchers.Default) {
+ cont.intercepted().resumeWith(it)
+ }
+ )
+
+ COROUTINE_SUSPENDED
+ }
+
+public suspend fun A.suspend(): A =
+ suspendCoroutineUninterceptedOrReturn { cont ->
+ suspend { this }.startCoroutine(
+ Continuation(Dispatchers.Default) {
+ cont.intercepted().resumeWith(it)
+ }
+ )
+
+ COROUTINE_SUSPENDED
+ }
diff --git a/arrow-libs/core/arrow-core/api/arrow-core.api b/arrow-libs/core/arrow-core/api/arrow-core.api
index b2494371901..6b2b567d1ce 100644
--- a/arrow-libs/core/arrow-core/api/arrow-core.api
+++ b/arrow-libs/core/arrow-core/api/arrow-core.api
@@ -595,6 +595,7 @@ public final class arrow/core/IterableKt {
public static final fun separateValidated (Ljava/lang/Iterable;)Lkotlin/Pair;
public static final fun sequenceEither (Ljava/lang/Iterable;)Larrow/core/Either;
public static final fun sequenceOption (Ljava/lang/Iterable;)Larrow/core/Option;
+ public static final fun sequenceResult (Ljava/lang/Iterable;)Ljava/lang/Object;
public static final fun sequenceValidated (Ljava/lang/Iterable;)Larrow/core/Validated;
public static final fun sequenceValidated (Ljava/lang/Iterable;Larrow/typeclasses/Semigroup;)Larrow/core/Validated;
public static final fun singleOrNone (Ljava/lang/Iterable;)Larrow/core/Option;
@@ -603,6 +604,7 @@ public final class arrow/core/IterableKt {
public static final fun tail (Ljava/lang/Iterable;)Ljava/util/List;
public static final fun traverseEither (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Larrow/core/Either;
public static final fun traverseOption (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Larrow/core/Option;
+ public static final fun traverseResult (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
public static final fun traverseValidated (Ljava/lang/Iterable;Larrow/typeclasses/Semigroup;Lkotlin/jvm/functions/Function1;)Larrow/core/Validated;
public static final fun traverseValidated (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Larrow/core/Validated;
public static final fun unalign (Ljava/lang/Iterable;)Lkotlin/Pair;
@@ -1383,6 +1385,22 @@ public final class arrow/core/PredefKt {
public static final fun identity (Ljava/lang/Object;)Ljava/lang/Object;
}
+public final class arrow/core/ResultKt {
+ public static final fun composeErrors ([Ljava/lang/Throwable;)Ljava/lang/Throwable;
+ public static final fun flatMap (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
+ public static final fun handleErrorWith (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
+ public static final fun redeemWith (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
+ public static final fun zip (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function10;)Ljava/lang/Object;
+ public static final fun zip (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function9;)Ljava/lang/Object;
+ public static final fun zip (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function8;)Ljava/lang/Object;
+ public static final fun zip (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function7;)Ljava/lang/Object;
+ public static final fun zip (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function6;)Ljava/lang/Object;
+ public static final fun zip (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function5;)Ljava/lang/Object;
+ public static final fun zip (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function4;)Ljava/lang/Object;
+ public static final fun zip (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object;
+ public static final fun zip (Ljava/lang/Object;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;
+}
+
public final class arrow/core/SequenceKt {
public static final fun align (Lkotlin/sequences/Sequence;Lkotlin/sequences/Sequence;)Lkotlin/sequences/Sequence;
public static final fun align (Lkotlin/sequences/Sequence;Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence;
@@ -2386,12 +2404,14 @@ public final class arrow/core/ValidatedKt {
public abstract interface class arrow/core/computations/EitherEffect : arrow/continuations/Effect {
public abstract fun bind (Larrow/core/Either;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public abstract fun bind (Larrow/core/Validated;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+ public abstract fun bind (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public abstract fun ensure (ZLkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
}
public final class arrow/core/computations/EitherEffect$DefaultImpls {
public static fun bind (Larrow/core/computations/EitherEffect;Larrow/core/Either;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public static fun bind (Larrow/core/computations/EitherEffect;Larrow/core/Validated;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+ public static fun bind (Larrow/core/computations/EitherEffect;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public static fun ensure (Larrow/core/computations/EitherEffect;ZLkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
}
@@ -2445,6 +2465,7 @@ public abstract interface class arrow/core/computations/RestrictedEitherEffect :
public final class arrow/core/computations/RestrictedEitherEffect$DefaultImpls {
public static fun bind (Larrow/core/computations/RestrictedEitherEffect;Larrow/core/Either;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public static fun bind (Larrow/core/computations/RestrictedEitherEffect;Larrow/core/Validated;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+ public static fun bind (Larrow/core/computations/RestrictedEitherEffect;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public static fun ensure (Larrow/core/computations/RestrictedEitherEffect;ZLkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
}
@@ -2473,6 +2494,13 @@ public final class arrow/core/computations/RestrictedOptionEffect$DefaultImpls {
public static fun ensure (Larrow/core/computations/RestrictedOptionEffect;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;
}
+public final class arrow/core/computations/ResultEffect {
+ public static final field INSTANCE Larrow/core/computations/ResultEffect;
+ public final fun bind (Larrow/core/Either;)Ljava/lang/Object;
+ public final fun bind (Larrow/core/Validated;)Ljava/lang/Object;
+ public final fun bind (Ljava/lang/Object;)Ljava/lang/Object;
+}
+
public final class arrow/core/computations/either {
public static final field INSTANCE Larrow/core/computations/either;
public final fun eager (Lkotlin/jvm/functions/Function2;)Larrow/core/Either;
@@ -2497,6 +2525,11 @@ public final class arrow/core/computations/option {
public final fun invoke (Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
}
+public final class arrow/core/computations/result {
+ public static final field INSTANCE Larrow/core/computations/result;
+ public final fun invoke-IoAF18A (Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
+}
+
public abstract interface class arrow/typeclasses/Monoid : arrow/typeclasses/Semigroup {
public static final field Companion Larrow/typeclasses/Monoid$Companion;
public static fun Boolean ()Larrow/typeclasses/Monoid;
diff --git a/arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/Iterable.kt b/arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/Iterable.kt
index c0629ce5cbf..f5987388dc4 100644
--- a/arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/Iterable.kt
+++ b/arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/Iterable.kt
@@ -6,6 +6,7 @@ import arrow.core.Either.Left
import arrow.core.Either.Right
import arrow.typeclasses.Monoid
import arrow.typeclasses.Semigroup
+import kotlin.Result.Companion.success
import kotlin.collections.foldRight as _foldRight
public inline fun Iterable.zip(
@@ -292,25 +293,32 @@ public inline fun Iterable.foldRight(initial: B, operation: (A, acc: B
else -> reversed().fold(initial) { acc, a -> operation(a, acc) }
}
-public inline fun Iterable.traverseEither(f: (A) -> Either): Either> {
- val acc = mutableListOf()
- forEach { a ->
+public inline fun Iterable.traverseEither(f: (A) -> Either): Either> =
+ map { a ->
when (val res = f(a)) {
- is Right -> acc.add(res.value)
+ is Right -> res.value
is Left -> return@traverseEither res
}
- }
- return acc.right()
-}
+ }.right()
public fun Iterable>.sequenceEither(): Either> =
traverseEither(::identity)
+public inline fun Iterable.traverseResult(f: (A) -> Result): Result> =
+ map { a ->
+ f(a).fold(::identity) { throwable ->
+ return@traverseResult Result.failure(throwable)
+ }
+ }.let(::success)
+
+public fun Iterable>.sequenceResult(): Result> =
+ traverseResult(::identity)
+
public inline fun Iterable.traverseValidated(
semigroup: Semigroup,
f: (A) -> Validated
): Validated> = semigroup.run {
- fold(Valid(mutableListOf()) as Validated>) { acc, a ->
+ fold(Valid(ArrayList(collectionSizeOrDefault(10))) as Validated>) { acc, a ->
when (val res = f(a)) {
is Validated.Valid -> when (acc) {
is Valid -> acc.also { it.value.add(res.value) }
@@ -333,22 +341,19 @@ public fun Iterable>.sequenceValidated(semigroup: Semigro
public fun Iterable>.sequenceValidated(): ValidatedNel> =
traverseValidated(Semigroup.nonEmptyList(), ::identity)
-public inline fun Iterable.traverseOption(f: (A) -> Option): Option> {
- val acc = mutableListOf()
- forEach { a ->
+public inline fun Iterable.traverseOption(f: (A) -> Option): Option> =
+ map { a ->
when (val res = f(a)) {
- is Some -> acc.add(res.value)
+ is Some -> res.value
is None -> return@traverseOption res
}
- }
- return acc.some()
-}
+ }.some()
public fun Iterable