This commit is contained in:
InsanusMokrassar 2021-10-28 18:02:02 +06:00
parent c4dd19dd00
commit 162294d6c6
2 changed files with 48 additions and 0 deletions

View File

@ -2,6 +2,9 @@
## 0.7.4
* `Common`:
* New type `Either`
## 0.7.3
* `Versions`:

View File

@ -0,0 +1,45 @@
package dev.inmo.micro_utils.common
/**
* Realization of this interface will contains at least one not null - [t1] or [t2]
*
* @see EitherFirst
* @see EitherSecond
* @see Either.Companion.first
* @see Either.Companion.second
* @see Either.onFirst
* @see Either.onSecond
*/
sealed interface Either<T1, T2> {
val t1: T1?
val t2: T2?
companion object
}
data class EitherFirst<T1, T2>(
override val t1: T1
) : Either<T1, T2> {
override val t2: T2?
get() = null
}
data class EitherSecond<T1, T2>(
override val t2: T2
) : Either<T1, T2> {
override val t1: T1?
get() = null
}
inline fun <T1, T2> Either.Companion.first(t1: T1): Either<T1, T2> = EitherFirst(t1)
inline fun <T1, T2> Either.Companion.second(t1: T1): Either<T1, T2> = EitherFirst(t1)
inline fun <T1, T2, E : Either<T1, T2>> E.onFirst(crossinline block: (T1) -> Unit): E {
if (this is EitherFirst<*, *>) block(t1 as T1)
return this
}
inline fun <T1, T2, E : Either<T1, T2>> E.onSecond(crossinline block: (T2) -> Unit): E {
if (this is EitherSecond<*, *>) block(t2 as T2)
return this
}