Either
and Option
are simple to use, but what happens if we combine both?
object UserService { fun findAge(user: String): Either<String, Option<Int>> { //Magic } }
UserService.findAge
returns Either<String, Option<Int>>
; Left<String>
for errors accessing the database or any other infrastructure, Right<None>
for no value found on the database, and Right<Some<Int>>
for a value found:
import arrow.core.* import arrow.syntax.function.pipe fun main(args: Array<String>) { val anakinAge: Either<String, Option<Int>> = UserService.findAge("Anakin") anakinAge.fold(::identity, { op -> op.fold({ "Not found" }, Int::toString) }) pipe ::println }
To print an age, we need two nested folds, nothing too complicated. Problems arrive when we need to do operations accessing multiple values:
import arrow.core.* import arrow.syntax.function.pipe import kotlin.math.absoluteValue fun main(args...