
arrow.data.OptionT.kt Maven / Gradle / Ivy
package arrow.data
import arrow.*
import arrow.core.*
import arrow.typeclasses.Applicative
import arrow.typeclasses.Functor
import arrow.typeclasses.Monad
import arrow.typeclasses.applicative
/**
* [OptionT]`` is a light wrapper on an `F<`[Option]`>` with some
* convenient methods for working with this nested structure.
*
* It may also be said that [OptionT] is a monad transformer for [Option].
*/
@higherkind data class OptionT(val value: HK>) : OptionTKind, OptionTKindedJ {
companion object {
operator fun invoke(value: HK>): OptionT = OptionT(value)
inline fun pure(a: A, AF: Applicative = applicative()): OptionT = OptionT(AF.pure(Some(a)))
inline fun none(AF: Applicative = applicative()): OptionT = OptionT(AF.pure(None))
inline fun fromOption(value: Option, AF: Applicative = applicative()): OptionT =
OptionT(AF.pure(value))
fun tailRecM(a: A, f: (A) -> OptionTKind>, MF: Monad): OptionT =
OptionT(MF.tailRecM(a, {
MF.map(f(it).ev().value, {
it.fold({
Right
© 2015 - 2025 Weber Informatics LLC | Privacy Policy