package moe.kageru.kagebot.extensions import arrow.Kind import arrow.core.Either import arrow.core.Tuple3 import arrow.core.getOrElse import arrow.typeclasses.Functor fun Either.on(op: (R) -> Unit): Either { this.map { op(it) } return this } fun Either<*, T>.unwrap(): T = getOrElse { error("Attempted to unwrap Either.left") } fun Tuple3.mapFirst(AP: Functor, op: (A) -> Kind) = let { (a, b, c) -> AP.run { op(a).map { Tuple3(it, b, c) } } } fun Tuple3.mapSecond(AP: Functor, op: (B) -> Kind) = let { (a, b, c) -> AP.run { op(b).map { Tuple3(a, it, c) } } }