advanced
StateT
also known as the State
monad transformer allows to compute inside the context when State
is nested in a different monad.
One issue we face with monads is that they don’t compose. This can cause your code to get really hairy when trying to combine structures like Either
and State
. But there’s a simple solution, and we’re going to explain how you can use Monad Transformers to alleviate this problem.
For our purposes here, we’re going to transform a monad that serves as a container that represents branching as an an error (left) or state (right) where computation can be performed. Given that both State<S, A>
and Either<L, R>
would be examples of datatypes that provide instances for the Monad
typeclasses.
Because monads don’t compose, we may end up with nested structures such as Either<Error, State<Either<Error, State<S, Unit>>, Unit>>
when using Either
and State
together. Using Monad Transformers can help us to reduce this boilerplate.
In the most basic of scenarios, we’ll only be dealing with one monad at a time making our lives nice and easy. However, it’s not uncommon to get into scenarios where some function calls will return Either<Error, A>
, and others will return State<S, A>
.
So let’s rewrite the example of State
docs, but instead of representing the Stack
as an optional NonEmptyList
let’s represent it as a List
.
import arrow.core.Tuple2
import arrow.core.toT
typealias Stack = List<String>
fun pop(stack: Stack): Tuple2<Stack, String> = stack.first().let {
stack.drop(1) toT it
}
fun push(s: String, stack: Stack): Tuple2<Stack, Unit> =
listOf(s, *stack.toTypedArray()) toT Unit
fun stackOperations(stack: Stack): Tuple2<Stack, String> {
val (s1, _) = push("a", stack)
val (s2, _) = pop(s1)
return pop(s2)
}
import arrow.core.Tuple2
import arrow.core.toT
typealias Stack = List<String>
fun pop(stack: Stack): Tuple2<Stack, String> = stack.first().let {
stack.drop(1) toT it
}
fun push(s: String, stack: Stack): Tuple2<Stack, Unit> =
listOf(s, *stack.toTypedArray()) toT Unit
fun stackOperations(stack: Stack): Tuple2<Stack, String> {
val (s1, _) = push("a", stack)
val (s2, _) = pop(s1)
return pop(s2)
}
fun main() {
//sampleStart
val value = stackOperations(listOf("hello", "world", "!"))
//sampleEnd
println("value=$value")
}
But if we now pop
an empty Stack
it will result in java.util.NoSuchElementException: List is empty.
.
import arrow.core.Tuple2
import arrow.core.toT
typealias Stack = List<String>
fun pop(stack: Stack): Tuple2<Stack, String> = stack.first().let {
stack.drop(1) toT it
}
fun push(s: String, stack: Stack): Tuple2<Stack, Unit> =
listOf(s, *stack.toTypedArray()) toT Unit
fun stackOperations(stack: Stack): Tuple2<Stack, String> {
val (s1, _) = push("a", stack)
val (s2, _) = pop(s1)
return pop(s2)
}
stackOperations(listOf())
javax.script.ScriptException: java.util.NoSuchElementException: List is empty.
at kotlin.collections.CollectionsKt___CollectionsKt.first(_Collections.kt:196)
at Line_3.pop(Line_3.kts:7)
at Line_3.stackOperations(Line_3.kts:17)
at org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineBase.compileAndEval(KotlinJsr223JvmScriptEngineBase.kt:65)
at org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineBase.eval(KotlinJsr223JvmScriptEngineBase.kt:31)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
at arrow.ank.InterpreterKt$interpreter$1$compileCode$2.invoke(interpreter.kt:176)
at arrow.ank.InterpreterKt$interpreter$1$compileCode$2.invoke(interpreter.kt:85)
at kotlin.sequences.TransformingIndexedSequence$iterator$1.next(Sequences.kt:196)
at arrow.core.SequenceK.foldLeft(SequenceK.kt:94)
at arrow.core.extensions.SequenceKFoldable$DefaultImpls.foldLeft(sequenceK.kt:153)
at arrow.core.extensions.sequence.foldable.SequenceKFoldableKt$foldable_singleton$1.foldLeft(SequenceKFoldable.kt:312)
at arrow.core.extensions.sequence.foldable.SequenceKFoldableKt.foldLeft(SequenceKFoldable.kt:30)
at arrow.ank.InterpreterKt$interpreter$1.replaceAnkToLang(interpreter.kt:222)
at arrow.ank.AnkKt$ank$$inlined$with$lambda$1$5$1$1.invokeSuspend(ank.kt:52)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.trampoline(IORunLoop.kt:455)
at arrow.fx.IORunLoop$RestartCallback$resumeWith$$inlined$let$lambda$1.run(Utils.kt:304)
at arrow.fx.internal.Platform$TrampolineExecutor.immediateLoop(Utils.kt:247)
at arrow.fx.internal.Platform$TrampolineExecutor.startLoop(Utils.kt:218)
at arrow.fx.internal.Platform$TrampolineExecutor.execute(Utils.kt:225)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:492)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
at arrow.fx.IORunLoop$RestartCallback.resumeWith(IORunLoop.kt:445)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:114)
at arrow.fx.IORunLoop$RestartCallback.start(IORunLoop.kt:402)
at arrow.fx.IORunLoop.loop(IORunLoop.kt:227)
at arrow.fx.IORunLoop.access$loop(IORunLoop.kt:21)
at arrow.fx.IORunLoop$RestartCallback.signal(IORunLoop.kt:414)
Luckily Arrow offers some nice solutions Functional Error Handling
docs.
Now we can model our error domain with ease.
import arrow.core.Either
import arrow.core.Tuple2
import arrow.core.flatMap
import arrow.core.left
import arrow.core.right
import arrow.core.toT
typealias Stack = List<String>
typealias StackEmpty = StackError.StackEmpty
sealed class StackError {
object StackEmpty : StackError()
}
fun popE(stack: Stack): Either<StackError, Tuple2<Stack, String>> =
if (stack.isEmpty()) StackEmpty.left()
else stack.first().let {
stack.drop(1) toT it
}.right()
fun pushE(s: String, stack: Stack): Either<StackError, Tuple2<Stack, Unit>> =
(listOf(s, *stack.toTypedArray()) toT Unit).right()
fun stackOperationsE(stack: Stack): Either<StackError, Tuple2<Stack, String>> {
return pushE("a", stack).flatMap { (s1, _) ->
popE(s1).flatMap { (s2, _) ->
popE(s2)
}
}
}
import arrow.core.Either
import arrow.core.Tuple2
import arrow.core.flatMap
import arrow.core.left
import arrow.core.right
import arrow.core.toT
typealias Stack = List<String>
typealias StackEmpty = StackError.StackEmpty
sealed class StackError {
object StackEmpty : StackError()
}
fun popE(stack: Stack): Either<StackError, Tuple2<Stack, String>> =
if (stack.isEmpty()) StackEmpty.left()
else stack.first().let {
stack.drop(1) toT it
}.right()
fun pushE(s: String, stack: Stack): Either<StackError, Tuple2<Stack, Unit>> =
(listOf(s, *stack.toTypedArray()) toT Unit).right()
fun stackOperationsE(stack: Stack): Either<StackError, Tuple2<Stack, String>> {
return pushE("a", stack).flatMap { (s1, _) ->
popE(s1).flatMap { (s2, _) ->
popE(s2)
}
}
}
fun main() {
val value =
//sampleStart
stackOperationsE(listOf("hello", "world", "!"))
//sampleEnd
println(value)
}
import arrow.core.Either
import arrow.core.Tuple2
import arrow.core.flatMap
import arrow.core.left
import arrow.core.right
import arrow.core.toT
typealias Stack = List<String>
typealias StackEmpty = StackError.StackEmpty
sealed class StackError {
object StackEmpty : StackError()
}
fun popE(stack: Stack): Either<StackError, Tuple2<Stack, String>> =
if (stack.isEmpty()) StackEmpty.left()
else stack.first().let {
stack.drop(1) toT it
}.right()
fun pushE(s: String, stack: Stack): Either<StackError, Tuple2<Stack, Unit>> =
(listOf(s, *stack.toTypedArray()) toT Unit).right()
fun stackOperationsE(stack: Stack): Either<StackError, Tuple2<Stack, String>> {
return pushE("a", stack).flatMap { (s1, _) ->
popE(s1).flatMap { (s2, _) ->
popE(s2)
}
}
}
fun main() {
val value =
//sampleStart
stackOperationsE(listOf())
//sampleEnd
println(value)
}
As is immediately clear, this code while properly modelling the errors, has become more complex but our signature now represents a simple Stack
as a List
with an error domain.
Let’s refactor our manual state management in the form of (S) -> Tuple2<S, A>
to State
.
So what we want is a return type that represents Either
a StackError
or a certain State
of Stack.
When working with State
we don’t pass around Stack
anymore, so there is no parameter to check if the Stack
is empty.
import arrow.core.ForId
import arrow.mtl.StateT
fun _popS(): Either<StackError, StateT<ForId, Stack, String>> = TODO()
The only thing we can do is handle this with StateT
. We want to wrap State
with Either
.
EitherKindPartial
is an alias that helps us to fix StackError
as the left type parameter for Either<L, R>
.
import arrow.core.Either
import arrow.core.EitherPartialOf
import arrow.core.extensions.either.monad.monad
import arrow.core.extensions.either.monadError.monadError
import arrow.core.left
import arrow.core.right
import arrow.core.toT
import arrow.mtl.StateT
import arrow.mtl.runM
import arrow.mtl.fix
typealias Stack = List<String>
typealias StackEmpty = StackError.StackEmpty
sealed class StackError {
object StackEmpty : StackError()
}
//sampleStart
fun popS() = StateT<EitherPartialOf<StackError>, Stack, String>(Either.monad()) { stack: Stack ->
if (stack.isEmpty()) StackEmpty.left()
else stack.first().let {
stack.drop(1) toT it
}.right()
}
fun pushS(s: String) = StateT<EitherPartialOf<StackError>, Stack, Unit>(Either.monad()) { stack: Stack ->
(listOf(s, *stack.toTypedArray()) toT Unit).right()
}
fun stackOperationsS(): StateT<EitherPartialOf<StackError>, Stack, String> =
pushS("a").flatMap(Either.monad()) { _ ->
popS().flatMap(Either.monad()) { _ ->
popS()
}
}.fix()
fun main() {
val value = stackOperationsS().runM(Either.monad<StackError>(), listOf("hello", "world", "!"))
println(value)
}
//sampleEnd
import arrow.core.Either
import arrow.core.EitherPartialOf
import arrow.core.extensions.either.monad.monad
import arrow.core.extensions.either.monadError.monadError
import arrow.core.left
import arrow.core.right
import arrow.core.toT
import arrow.mtl.StateT
import arrow.mtl.runM
import arrow.mtl.fix
typealias Stack = List<String>
typealias StackEmpty = StackError.StackEmpty
sealed class StackError {
object StackEmpty : StackError()
}
fun popS() = StateT<EitherPartialOf<StackError>, Stack, String>(Either.monad()) { stack: Stack ->
if (stack.isEmpty()) StackEmpty.left()
else stack.first().let {
stack.drop(1) toT it
}.right()
}
fun pushS(s: String) = StateT<EitherPartialOf<StackError>, Stack, Unit>(Either.monad()) { stack: Stack ->
(listOf(s, *stack.toTypedArray()) toT Unit).right()
}
fun stackOperationsS(): StateT<EitherPartialOf<StackError>, Stack, String> =
pushS("a").flatMap(Either.monad()) { _ ->
popS().flatMap(Either.monad()) { _ ->
popS()
}
}.fix()
fun main() {
val value =
//sampleStart
stackOperationsS().runM(Either.monad<StackError>(), listOf())
//sampleEnd
println(value)
}
While our code looks very similar to what we had before there are some key advantages. State management is now contained within State
and we are dealing only with 1 monad instead of 2 nested monads so we can use monad bindings!
import arrow.core.Either
import arrow.core.EitherPartialOf
import arrow.core.extensions.either.monad.monad
import arrow.core.extensions.either.monadError.monadError
import arrow.core.left
import arrow.core.right
import arrow.core.toT
import arrow.mtl.StateT
import arrow.mtl.extensions.fx
typealias Stack = List<String>
typealias StackEmpty = StackError.StackEmpty
sealed class StackError {
object StackEmpty : StackError()
}
fun popS() = StateT<EitherPartialOf<StackError>, Stack, String>(Either.monad()) { stack: Stack ->
if (stack.isEmpty()) StackEmpty.left()
else stack.first().let {
stack.drop(1) toT it
}.right()
}
fun pushS(s: String) = StateT<EitherPartialOf<StackError>, Stack, Unit>(Either.monad()) { stack: Stack ->
(listOf(s, *stack.toTypedArray()) toT Unit).right()
}
//sampleStart
fun stackOperationsS2() =
StateT.fx<EitherPartialOf<StackError>, Stack, String>(Either.monadError<StackError>()) {
!pushS("a")
!popS()
val (string) = popS()
string
}
fun main() {
val value = stackOperationsS2().runM(Either.monad<StackError>(), listOf("hello", "world", "!"))
println(value)
}
//sampleEnd
import arrow.core.Either
import arrow.core.EitherPartialOf
import arrow.core.extensions.either.monad.monad
import arrow.core.extensions.either.monadError.monadError
import arrow.core.left
import arrow.core.right
import arrow.core.toT
import arrow.mtl.StateT
import arrow.mtl.extensions.fx
typealias Stack = List<String>
typealias StackEmpty = StackError.StackEmpty
sealed class StackError {
object StackEmpty : StackError()
}
fun popS() = StateT<EitherPartialOf<StackError>, Stack, String>(Either.monad()) { stack: Stack ->
if (stack.isEmpty()) StackEmpty.left()
else stack.first().let {
stack.drop(1) toT it
}.right()
}
fun pushS(s: String) = StateT<EitherPartialOf<StackError>, Stack, Unit>(Either.monad()) { stack: Stack ->
(listOf(s, *stack.toTypedArray()) toT Unit).right()
}
//sampleStart
fun stackOperationsS2() =
StateT.fx<EitherPartialOf<StackError>, Stack, String>(Either.monadError<StackError>()) {
!pushS("a")
!popS()
val (string) = popS()
string
}
fun main() {
val value =
//sampleStart
stackOperationsS2().runM(Either.monad<StackError>(), listOf())
//sampleEnd
println(value)
}
Module | Type classes |
arrow.mtl.typeclasses | MonadState |
arrow.typeclasses | Alternative, Applicative, ApplicativeError, Contravariant, Decidable, Divide, Divisible, Functor, Monad, MonadCombine, MonadError, MonadThrow, MonoidK, SemigroupK |
Take a look at the EitherT
docs or OptionT
docs for an alternative version monad transformer for achieving different goals.