dave08
02/22/2023, 4:22 PMsimon.vergauwen
02/22/2023, 4:29 PMEither
is a value, where Effect<E, A>
is suspend Raise<E>.() -> A
.
Either
is the result of invoking (suspend) Raise<E>.() -> A
.Effect<E, A>
I can invoke it many times, but if you pass me a Either<E, A>
value I can only inspect it but I cannot recompute it. If I need to recompute it then you need to pass me (suspend) () -> Either<E, A>
or (suspend) Raise<E>.() -> A
.dave08
02/22/2023, 4:40 PMSam Painter
02/22/2023, 4:43 PMdave08
02/22/2023, 4:43 PMprivate suspend inline fun <reified A : Any> KtorCtx.respond(
statusCode: HttpStatusCode,
noinline action: suspend Raise<ServiceError>.() -> A
): Unit = effect(action).fold(
{ error ->
when (error) {
is ServiceError -> call.respond(BadRequest, error)
// is UserAlreadyExists -> call.respond(Conflict, "${error.user} already exists")
// is UserNotFound -> call.respond(NotFound, "User with id ${error.id} not found")
}
}) { a -> call.respond(statusCode, a) }
For the same reasons you ever want a lazy value.So why would it be used in that previous case?
simon.vergauwen
02/22/2023, 4:47 PMsuspend fun one(): Either<String, Int> = TODO("")
fun two(): Effect<String, Int> =
effect { one().bind() }
suspend fun three(): Either<String, Int> =
either { two().bind() }
dave08
02/22/2023, 4:47 PMsimon.vergauwen
02/22/2023, 4:49 PMsuspend fun
is what makes one
and three
"lazy". Here they they have very different meaning however.
val one: Either<String, Int> = 1.right()
val two: Effect<String, Int> = effect { 1 }
You can inspect one
but you cannot do anything with two
unless you invoke it in some suspend fun
first.Raise
is that it power everything in Arrow, it allows this entire mechanism of either { }
, ensure
, ensureNotNull
etc to work. All these APIs and DSLs are build on-top of it.Effect
is also not even a type anymore, it's just a typealias
for a lambda.dave08
02/22/2023, 4:53 PMsimon.vergauwen
02/22/2023, 4:55 PMEither
is a computedEffect š
but it depends a bit on whether it was an Effect
or EagerEffect
since suspend
is allowed to pass through the runtimedave08
02/22/2023, 4:56 PMsimon.vergauwen
02/22/2023, 4:57 PMdave08
02/22/2023, 4:58 PMsimon.vergauwen
02/22/2023, 5:04 PM