If Alternative
is for Applicative
functors that also have a Monoid
structure, MonadCombine
is for Monads
with monoid capabilities.
MonadCombine
is just a claim indicating something is both an Alternative
and a Monad
.
fun <G, A> Kind<F, Kind<G, A>>.unite(FG: Foldable<G>): Kind<F, A>
This function takes “interesting” values from the inner G context and combines them into a flat F context.
import arrow.core.ListK
import arrow.core.Option
import arrow.core.extensions.listk.monadCombine.monadCombine
import arrow.core.extensions.option.applicative.just
import arrow.core.extensions.option.foldable.foldable
import arrow.core.k
val f = listOf(1.just(), Option.empty(), 2.just()).k()
ListK.monadCombine().run {
f.unite(Option.foldable())
}
// [1, 2]
fun <G, A, B> Kind<F, Kind2<G, A, B>>.separate(BG: Bifoldable<G>): Tuple2<Kind<F, A>, Kind<F, B>>
This function takes A and B values from inner Bifoldable G and returns them separated into two flat F contexts.
import arrow.core.Either
import arrow.core.ListK
import arrow.core.extensions.either.bifoldable.bifoldable
import arrow.core.extensions.listk.monadCombine.monadCombine
import arrow.core.k
import arrow.core.left
import arrow.core.right
val f = listOf(1.right(), 2.left(), 3.right(), 4.left()).k()
ListK.monadCombine().run {
f.separate(Either.bifoldable())
}
// ([2, 4], [1, 3])
Do you like Arrow?
✖