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...