# Either / Option in Kotlin

In some functional languages, such as Scala, Either and Option is provided. Either represents what type of exception a function may throws and what type of value the function returns in success cases. Option represents absence of a value instead of nullable.

## Either / Option in Kotlin

Since Kotlin do not provide Either or Option (at least for version 1.5), we have to use third-patry library to introduce Either or Option. The most realistic option at this moment is using Arrow. Arrow is “Functional companion to Kotlin’s Standard Library”.

I also re-implemented Either and Option in Kotlin. The code is published as a library so you can use it. It’s completely a hobby project, so be care to use it in production :)

## Either

Either has subtypes of Left and Right. Left represents an exception. Right represents success cases and has a value. It goes something like this.

sealed class Either<out E : Throwable, out T : Any> {
data class Left<out E : Throwable>(val error: E) : Either<E, Nothing>()
data class Right<out T : Any>(val value: T) : Either<Nothing, T>()
}


For example, if a function returns a value or throws an exception, the returned value could be lifted to Either. Requesting via Web API is the typical case.

suspend fun getAwesomeValue(): Either<AwesomeException, AwesomeValue> {
val response = apiClient.getAwesomeResponse()
return if (response.isSuccessful) {
Either.Right(value = requireNotNull(response.body()))
} else {
Either.Left(error = AwesomeException())
}
}


On the side receiving the Either, when could be used instead of pattern matching since Kotlin does not provide pattern matching (at least for version 1.5).

when (it) {
is Either.Left -> {
// do something here
}
is Either.Right -> {
// do something here
}
}


## Option

Option has subtypes of Some and None. Some represents that Option has a value. None represents that Option does not have any value.

sealed class Option<out T : Any> {
data class Some<out T : Any>(val value: T) : Option<T>()
object None : Option<Nothing>()
}


Nullable could be replaced with Option. Like Either, when could be used for Option value also.