All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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