Jorge Castillo
03/02/2020, 10:46 AMfun childIOError() = setState {
onIO {
error("Boom on IO")
}
}
Following docs, in uniflow all actions can run on a coroutine using a DSL prepared for it, functions like onIO onMain , onDefault just translate to standard withContext(IO) ,withContext(Main), withContext(Default). Same for launchOnIO, launchOnMain, launchOnDefault if you need to launch it not just switch the dispatcher.
If you look at how the DSL functions are defined, you’ll find this: https://github.com/uniflow-kt/uniflow-kt/blob/5152c197131c7f9d8b3129a37017671c4aea49ae/uniflow-core/src/main/kotlin/io/uniflow/core/threading/Threading.kt
Launch ones are defined over a coroutine scope, like:
fun CoroutineScope.launchOnIO(block: suspend CoroutineScope.() -> Unit) = launch(<http://UniFlowDispatcher.dispatcher.io|UniFlowDispatcher.dispatcher.io>(), block = block)
Those get block as a suspend function so you can pass an arrow `IO`one there by calling `suspended() or suspendCancellable()`as suggested by Alberto. Alternatively you can write an “overload” that enforces block to be an arrow IO instead, so you have both syntax available. Then you can `launch`the IO task inside with the new extension functions to run the passed IO scoped to the receiver scope. (This is just available starting on the snapshot 0.10.5)
For the onXXX ones are suspend functions you can wrap into IO.effect {}