diff --git a/modules/core/arrow-free/src/main/kotlin/arrow/free/Free.kt b/modules/core/arrow-free/src/main/kotlin/arrow/free/Free.kt index 1dd582f2a97..b44daaab0a6 100644 --- a/modules/core/arrow-free/src/main/kotlin/arrow/free/Free.kt +++ b/modules/core/arrow-free/src/main/kotlin/arrow/free/Free.kt @@ -2,10 +2,10 @@ package arrow.free import arrow.Kind import arrow.core.Either +import arrow.core.FunctionK import arrow.core.identity import arrow.higherkind import arrow.typeclasses.Applicative -import arrow.core.FunctionK import arrow.typeclasses.Monad inline fun FreeOf.foldMapK(f: FunctionK, MM: Monad): Kind = @@ -79,20 +79,20 @@ tailrec fun Free.step(): Free = } @Suppress("UNCHECKED_CAST") -fun Free.foldMap(f: FunctionK, MM: Monad): Kind = MM.run { - tailRecM(this@foldMap) { +fun Free.foldMap(f: FunctionK, MM: Monad): Kind = + MM.tailRecM(this@foldMap) { val x = it.step() when (x) { - is Free.Pure -> just(Either.Right(x.a)) - is Free.Suspend -> f(x.a).map({ Either.Right(it) }) + is Free.Pure -> MM.just(Either.Right(x.a)) + is Free.Suspend -> MM.run { f(x.a).map { Either.Right(it) } } is Free.FlatMapped -> { val g = (x.fm as (A) -> Free) val c = x.c as Free - c.foldMap(f, MM).map({ cc -> Either.Left(g(cc)) }) + val folded = c.foldMap(f, MM) + MM.run { folded.map { cc -> Either.Left(g(cc)) } } } } } -} fun A.free(): Free = Free.just(this) diff --git a/modules/core/arrow-mtl/src/main/kotlin/arrow/mtl/instances/option.kt b/modules/core/arrow-mtl/src/main/kotlin/arrow/mtl/instances/option.kt index 87820dd9ebf..088a27432d0 100644 --- a/modules/core/arrow-mtl/src/main/kotlin/arrow/mtl/instances/option.kt +++ b/modules/core/arrow-mtl/src/main/kotlin/arrow/mtl/instances/option.kt @@ -14,16 +14,16 @@ interface OptionTraverseFilterInstance : TraverseFilter { override fun Kind.filter(f: (A) -> Boolean): Option = fix().filter(f) - override fun Kind.traverseFilter(AP: Applicative, f: (A) -> Kind>): arrow.Kind> = + override fun Kind.traverseFilter(AP: Applicative, f: (A) -> Kind>): Kind> = optionTraverseFilter(AP, f) override fun Kind.map(f: (A) -> B): Option = fix().map(f) - override fun Kind.traverse(AP: Applicative, f: (A) -> Kind): arrow.Kind> = + override fun Kind.traverse(AP: Applicative, f: (A) -> Kind): Kind> = optionTraverse(AP, f) - override fun Kind.exists(p: (A) -> Boolean): kotlin.Boolean = + override fun Kind.exists(p: (A) -> Boolean): Boolean = fix().exists(p) override fun Kind.foldLeft(b: B, f: (B, A) -> B): B = @@ -32,13 +32,13 @@ interface OptionTraverseFilterInstance : TraverseFilter { override fun Kind.foldRight(lb: Eval, f: (A, Eval) -> Eval): Eval = fix().foldRight(lb, f) - override fun OptionOf.forAll(p: (A) -> Boolean): kotlin.Boolean = + override fun OptionOf.forAll(p: (A) -> Boolean): Boolean = fix().forall(p) - override fun Kind.isEmpty(): kotlin.Boolean = + override fun Kind.isEmpty(): Boolean = fix().isEmpty() - override fun Kind.nonEmpty(): kotlin.Boolean = + override fun Kind.nonEmpty(): Boolean = fix().nonEmpty() } @@ -71,7 +71,7 @@ object OptionMtlContext : OptionMonadFilterInstance, OptionTraverseFilterInstanc fix().filter(f) override fun Kind.mapFilter(f: (A) -> Option): Option = - this.flatMap({ a -> f(a).fold({ empty() }, { just(it) }) }) + flatMap { a -> f(a).fold({ empty() }, { just(it) }) } override fun Kind.map(f: (A) -> B): Option = fix().map(f) diff --git a/modules/core/arrow-mtl/src/main/kotlin/arrow/mtl/instances/optiont.kt b/modules/core/arrow-mtl/src/main/kotlin/arrow/mtl/instances/optiont.kt index 9939eece3cd..76195083cf0 100644 --- a/modules/core/arrow-mtl/src/main/kotlin/arrow/mtl/instances/optiont.kt +++ b/modules/core/arrow-mtl/src/main/kotlin/arrow/mtl/instances/optiont.kt @@ -39,9 +39,9 @@ interface OptionTTraverseFilterInstance : fix().traverseFilter(f, AP, FFF()) } -fun OptionT.traverseFilter(f: (A) -> Kind>, GA: Applicative, FF: Traverse): Kind> = GA.run { +fun OptionT.traverseFilter(f: (A) -> Kind>, GA: Applicative, FF: Traverse): Kind> { val fa = ComposedTraverseFilter(FF, Option.traverseFilter(), Option.applicative()).traverseFilterC(value, f, GA) - fa.map({ OptionT(FF.run { it.unnest().map({ it.fix() }) }) }) + return GA.run { fa.map { OptionT(FF.run { it.unnest().map { it.fix() } }) } } } class OptionTMtlContext(val MF: Monad, val TF: TraverseFilter) : OptionTMonadInstance, OptionTMonoidKInstance, OptionTTraverseFilterInstance { diff --git a/modules/effects/arrow-effects-reactor/src/main/kotlin/arrow/effects/CoroutineContextScheduler.kt b/modules/effects/arrow-effects-reactor/src/main/kotlin/arrow/effects/CoroutineContextReactorScheduler.kt similarity index 97% rename from modules/effects/arrow-effects-reactor/src/main/kotlin/arrow/effects/CoroutineContextScheduler.kt rename to modules/effects/arrow-effects-reactor/src/main/kotlin/arrow/effects/CoroutineContextReactorScheduler.kt index d6637ecbe91..77bc2a0a459 100644 --- a/modules/effects/arrow-effects-reactor/src/main/kotlin/arrow/effects/CoroutineContextScheduler.kt +++ b/modules/effects/arrow-effects-reactor/src/main/kotlin/arrow/effects/CoroutineContextReactorScheduler.kt @@ -6,7 +6,7 @@ import kotlin.coroutines.experimental.Continuation import kotlin.coroutines.experimental.CoroutineContext import kotlin.coroutines.experimental.startCoroutine -object CoroutineContextScheduler { +object CoroutineContextReactorScheduler { private interface NonCancellableContinuation : Continuation, Disposable private val emptyDisposable = object : Disposable { diff --git a/modules/effects/arrow-effects-reactor/src/main/kotlin/arrow/effects/FluxK.kt b/modules/effects/arrow-effects-reactor/src/main/kotlin/arrow/effects/FluxK.kt index b893ec4784d..3ae01919f0a 100644 --- a/modules/effects/arrow-effects-reactor/src/main/kotlin/arrow/effects/FluxK.kt +++ b/modules/effects/arrow-effects-reactor/src/main/kotlin/arrow/effects/FluxK.kt @@ -6,7 +6,7 @@ import arrow.core.Eval import arrow.core.Left import arrow.core.Right import arrow.core.identity -import arrow.effects.CoroutineContextScheduler.asScheduler +import arrow.effects.CoroutineContextReactorScheduler.asScheduler import arrow.effects.typeclasses.Proc import arrow.higherkind import arrow.typeclasses.Applicative diff --git a/modules/effects/arrow-effects-reactor/src/main/kotlin/arrow/effects/MonoK.kt b/modules/effects/arrow-effects-reactor/src/main/kotlin/arrow/effects/MonoK.kt index 45fd982df97..6a6f06bf2e9 100644 --- a/modules/effects/arrow-effects-reactor/src/main/kotlin/arrow/effects/MonoK.kt +++ b/modules/effects/arrow-effects-reactor/src/main/kotlin/arrow/effects/MonoK.kt @@ -3,7 +3,7 @@ package arrow.effects import arrow.core.Either import arrow.core.Either.Left import arrow.core.Either.Right -import arrow.effects.CoroutineContextScheduler.asScheduler +import arrow.effects.CoroutineContextReactorScheduler.asScheduler import arrow.effects.typeclasses.Proc import arrow.higherkind import reactor.core.publisher.Mono diff --git a/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/CoroutineContextScheduler.kt b/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/CoroutineContextRx2Scheduler.kt similarity index 97% rename from modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/CoroutineContextScheduler.kt rename to modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/CoroutineContextRx2Scheduler.kt index e976502d276..54d154921c1 100644 --- a/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/CoroutineContextScheduler.kt +++ b/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/CoroutineContextRx2Scheduler.kt @@ -8,7 +8,7 @@ import kotlin.coroutines.experimental.Continuation import kotlin.coroutines.experimental.CoroutineContext import kotlin.coroutines.experimental.startCoroutine -object CoroutineContextScheduler { +object CoroutineContextRx2Scheduler { private interface NonCancellableContinuation : Continuation, Disposable fun CoroutineContext.asScheduler(): Scheduler = diff --git a/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/FlowableK.kt b/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/FlowableK.kt index c55cae4a09d..3d1f119839a 100644 --- a/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/FlowableK.kt +++ b/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/FlowableK.kt @@ -2,7 +2,7 @@ package arrow.effects import arrow.Kind import arrow.core.* -import arrow.effects.CoroutineContextScheduler.asScheduler +import arrow.effects.CoroutineContextRx2Scheduler.asScheduler import arrow.effects.typeclasses.Proc import arrow.higherkind import arrow.typeclasses.Applicative @@ -44,11 +44,10 @@ data class FlowableK(val flowable: Flowable) : FlowableKOf, FlowableKKi return Eval.defer { loop(this) } } - fun traverse(GA: Applicative, f: (A) -> Kind): Kind> = GA.run { - foldRight(Eval.always { just(Flowable.empty().k()) }) { a, eval -> - f(a).map2Eval(eval) { Flowable.concat(Flowable.just(it.a), it.b.flowable).k() } + fun traverse(GA: Applicative, f: (A) -> Kind): Kind> = + foldRight(Eval.always { GA.just(Flowable.empty().k()) }) { a, eval -> + GA.run { f(a).map2Eval(eval) { Flowable.concat(Flowable.just(it.a), it.b.flowable).k() } } }.value() - } fun handleErrorWith(function: (Throwable) -> FlowableK): FlowableK = flowable.onErrorResumeNext { t: Throwable -> function(t).flowable }.k() diff --git a/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/MaybeK.kt b/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/MaybeK.kt index 0218b4d6eec..379cb9a77bc 100644 --- a/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/MaybeK.kt +++ b/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/MaybeK.kt @@ -1,7 +1,7 @@ package arrow.effects import arrow.core.* -import arrow.effects.CoroutineContextScheduler.asScheduler +import arrow.effects.CoroutineContextRx2Scheduler.asScheduler import arrow.effects.typeclasses.Proc import arrow.higherkind import io.reactivex.Maybe diff --git a/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/ObservableK.kt b/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/ObservableK.kt index 664d7ac332a..5378f82c9c2 100644 --- a/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/ObservableK.kt +++ b/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/ObservableK.kt @@ -2,13 +2,13 @@ package arrow.effects import arrow.Kind import arrow.core.* +import arrow.effects.CoroutineContextRx2Scheduler.asScheduler import arrow.effects.typeclasses.Proc import arrow.higherkind import arrow.typeclasses.Applicative import io.reactivex.Observable import io.reactivex.ObservableEmitter import kotlin.coroutines.experimental.CoroutineContext -import arrow.effects.CoroutineContextScheduler.asScheduler fun Observable.k(): ObservableK = ObservableK(this) @@ -43,11 +43,10 @@ data class ObservableK(val observable: Observable) : ObservableKOf, Obs return Eval.defer { loop(this) } } - fun traverse(GA: Applicative, f: (A) -> Kind): Kind> = GA.run { + fun traverse(GA: Applicative, f: (A) -> Kind): Kind> = foldRight(Eval.always { GA.just(Observable.empty().k()) }) { a, eval -> - f(a).map2Eval(eval) { Observable.concat(Observable.just(it.a), it.b.observable).k() } + GA.run { f(a).map2Eval(eval) { Observable.concat(Observable.just(it.a), it.b.observable).k() } } }.value() - } fun handleErrorWith(function: (Throwable) -> ObservableK): ObservableK = this.fix().observable.onErrorResumeNext { t: Throwable -> function(t).observable }.k() diff --git a/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/SingleK.kt b/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/SingleK.kt index 85c3d15ec09..a36a3ed44f7 100644 --- a/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/SingleK.kt +++ b/modules/effects/arrow-effects-rx2/src/main/kotlin/arrow/effects/SingleK.kt @@ -3,7 +3,7 @@ package arrow.effects import arrow.core.Either import arrow.core.Left import arrow.core.Right -import arrow.effects.CoroutineContextScheduler.asScheduler +import arrow.effects.CoroutineContextRx2Scheduler.asScheduler import arrow.effects.typeclasses.Proc import arrow.higherkind import io.reactivex.Single