
arrow.data.Cokleisli.kt Maven / Gradle / Ivy
package arrow.data
import arrow.*
import arrow.typeclasses.Comonad
import arrow.typeclasses.comonad
typealias CokleisliFun = (HK) -> B
typealias CoreaderT = Cokleisli
@higherkind data class Cokleisli(val MM: Comonad, val run: CokleisliFun) : CokleisliKind, CokleisliKindedJ {
inline fun bimap(noinline g: (D) -> A, crossinline f: (B) -> C): Cokleisli = Cokleisli(MM, { f(run(MM.map(it, g))) })
fun lmap(g: (D) -> A): Cokleisli = Cokleisli(MM, { run(MM.map(it, g)) })
inline fun map(crossinline f: (B) -> C): Cokleisli = Cokleisli(MM, { f(run(it)) })
inline fun contramapValue(crossinline f: (HK) -> HK): Cokleisli = Cokleisli(MM, { run(f(it)) })
fun compose(a: Cokleisli): Cokleisli = Cokleisli(MM, { run(MM.coflatMap(it, a.run)) })
@JvmName("andThenK")
fun andThen(a: HK): Cokleisli = Cokleisli(MM, { MM.extract(a) })
fun andThen(a: Cokleisli): Cokleisli = a.compose(this)
inline fun flatMap(crossinline f: (B) -> Cokleisli): Cokleisli = Cokleisli(MM, { f(run(it)).run(it) })
companion object {
inline operator fun invoke(noinline run: (HK) -> B, MF: Comonad = comonad()): Cokleisli = Cokleisli(MF, run)
inline fun pure(b: B, MF: Comonad = comonad()): Cokleisli = Cokleisli(MF, { b })
inline fun ask(MF: Comonad = comonad()): Cokleisli = Cokleisli(MF, { MF.extract(it) })
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy