Skip to content

Commit 40bd0f4

Browse files
serrasnomisRev
andauthored
ignoreErrors for Raise (#3100)
Co-authored-by: Simon Vergauwen <[email protected]>
1 parent 90587dd commit 40bd0f4

File tree

3 files changed

+91
-0
lines changed

3 files changed

+91
-0
lines changed

arrow-libs/core/arrow-core/api/arrow-core.api

+26
Original file line numberDiff line numberDiff line change
@@ -3333,6 +3333,30 @@ public final class arrow/core/raise/DefaultRaise : arrow/core/raise/Raise {
33333333
public abstract interface annotation class arrow/core/raise/ExperimentalTraceApi : java/lang/annotation/Annotation {
33343334
}
33353335

3336+
public final class arrow/core/raise/IgnoreErrorsRaise : arrow/core/raise/Raise {
3337+
public fun <init> (Larrow/core/raise/Raise;Lkotlin/jvm/functions/Function0;)V
3338+
public fun attempt (Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
3339+
public fun bind (Larrow/core/Either;)Ljava/lang/Object;
3340+
public final fun bind (Larrow/core/Option;)Ljava/lang/Object;
3341+
public fun bind (Larrow/core/Validated;)Ljava/lang/Object;
3342+
public fun bind (Larrow/core/continuations/EagerEffect;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
3343+
public fun bind (Larrow/core/continuations/Effect;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
3344+
public final fun bind (Ljava/lang/Object;)Ljava/lang/Object;
3345+
public fun bind (Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
3346+
public fun bind (Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
3347+
public fun bindAll (Larrow/core/NonEmptyList;)Larrow/core/NonEmptyList;
3348+
public fun bindAll (Ljava/lang/Iterable;)Ljava/util/List;
3349+
public fun bindAll (Ljava/util/Map;)Ljava/util/Map;
3350+
public fun bindAll-1TN0_VU (Ljava/util/Set;)Ljava/util/Set;
3351+
public fun catch (Larrow/core/continuations/Effect;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
3352+
public final fun ensure (Z)V
3353+
public final fun ensureNotNull (Ljava/lang/Object;)Ljava/lang/Object;
3354+
public fun invoke (Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
3355+
public fun invoke (Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
3356+
public fun raise (Ljava/lang/Object;)Ljava/lang/Void;
3357+
public fun shift (Ljava/lang/Object;)Ljava/lang/Object;
3358+
}
3359+
33363360
public final class arrow/core/raise/IorRaise : arrow/core/raise/Raise {
33373361
public fun <init> (Lkotlin/jvm/functions/Function2;Ljava/util/concurrent/atomic/AtomicReference;Larrow/core/raise/Raise;)V
33383362
public fun attempt (Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
@@ -3381,6 +3405,7 @@ public final class arrow/core/raise/NullableRaise : arrow/core/raise/Raise {
33813405
public fun catch (Larrow/core/continuations/Effect;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
33823406
public final fun ensure (Z)V
33833407
public final fun ensureNotNull (Ljava/lang/Object;)Ljava/lang/Object;
3408+
public final fun ignoreErrors (Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
33843409
public fun invoke (Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
33853410
public fun invoke (Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
33863411
public synthetic fun raise (Ljava/lang/Object;)Ljava/lang/Void;
@@ -3411,6 +3436,7 @@ public final class arrow/core/raise/OptionRaise : arrow/core/raise/Raise {
34113436
public fun catch (Larrow/core/continuations/Effect;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
34123437
public final fun ensure (Z)V
34133438
public final fun ensureNotNull (Ljava/lang/Object;)Ljava/lang/Object;
3439+
public final fun ignoreErrors (Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
34143440
public fun invoke (Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
34153441
public fun invoke (Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
34163442
public fun raise (Larrow/core/None;)Ljava/lang/Void;

arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/raise/Builders.kt

+49
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,37 @@ public inline fun <Error, A> ior(noinline combineError: (Error, Error) -> Error,
9494
)
9595
}
9696

97+
/**
98+
* Implementation of [Raise] used by `ignoreErrors`.
99+
* You should never use this directly.
100+
*/
101+
public class IgnoreErrorsRaise<N>(
102+
private val raise: Raise<N>,
103+
private val error: () -> N
104+
) : Raise<Any?> {
105+
@RaiseDSL
106+
override fun raise(r: Any?): Nothing =
107+
raise.raise(error())
108+
109+
@RaiseDSL
110+
public fun ensure(value: Boolean): Unit = ensure(value) { null }
111+
112+
@RaiseDSL
113+
public fun <A> Option<A>.bind(): A = getOrElse { raise(null) }
114+
115+
@RaiseDSL
116+
public fun <A> A?.bind(): A {
117+
contract { returns() implies (this@bind != null) }
118+
return this ?: raise(null)
119+
}
120+
121+
@RaiseDSL
122+
public fun <A> ensureNotNull(value: A?): A {
123+
contract { returns() implies (value != null) }
124+
return ensureNotNull(value) { null }
125+
}
126+
}
127+
97128
public typealias Null = Nothing?
98129

99130
/**
@@ -136,6 +167,15 @@ public class NullableRaise(private val raise: Raise<Null>) : Raise<Null> by rais
136167
null -> recover()
137168
else -> nullable
138169
}
170+
171+
/**
172+
* Introduces a scope where you can [bind] errors of any type,
173+
* but no information is saved in the [raise] case.
174+
*/
175+
@RaiseDSL
176+
public inline fun <A> ignoreErrors(
177+
@BuilderInference block: IgnoreErrorsRaise<Null>.() -> A,
178+
): A = block(IgnoreErrorsRaise(this) { null })
139179
}
140180

141181
/**
@@ -219,6 +259,15 @@ public class OptionRaise(private val raise: Raise<None>) : Raise<None> by raise
219259
is None -> recover()
220260
is Some<A> -> option.value
221261
}
262+
263+
/**
264+
* Introduces a scope where you can [bind] errors of any type,
265+
* but no information is saved in the [raise] case.
266+
*/
267+
@RaiseDSL
268+
public inline fun <A> ignoreErrors(
269+
@BuilderInference block: IgnoreErrorsRaise<None>.() -> A,
270+
): A = block(IgnoreErrorsRaise(this) { None })
222271
}
223272

224273
/**

arrow-libs/core/arrow-core/src/commonTest/kotlin/arrow/core/raise/NullableSpec.kt

+16
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,22 @@ class NullableSpec : StringSpec({
6969
} shouldBe "1"
7070
}
7171

72+
"binding either in nullable" {
73+
nullable {
74+
val number = Either.Right("s".length)
75+
val string = number.map(Int::toString).bind()
76+
string
77+
} shouldBe "1"
78+
}
79+
80+
"binding either in nullable, ignore errors" {
81+
nullable {
82+
val number = Either.Right("s".length) as Either<Boolean, Int>
83+
val string = ignoreErrors { number.map(Int::toString).bind() }
84+
string
85+
} shouldBe "1"
86+
}
87+
7288
"short circuit option" {
7389
nullable<Int> {
7490
val number = Some("s".length)

0 commit comments

Comments
 (0)