Я исследую Kotlin Coroutines & Channels в своем текущем приложении для Android.
У меня есть следующий код, который управляет удаленными вызовами API и контролирует побочные эффекты пользовательского интерфейса.
private val historical: CompletableDeferred<List<Any>> = CompletableDeferred()
private val mutex = Mutex()
@ExperimentalCoroutinesApi
fun perform(action: Action): ReceiveChannel<List<Any>> =
produce {
mutex.withLock {
if (historical.isCompleted) {
send(historical.getCompleted())
return@produce
}
send(action.sideEffects)
val networkResponse = repository.perform(action)
send(networkResponse.sideEffects)
send(listOf(networkResponse)).also {
historical.complete(listOf(response))
}
}
}
Приведенный выше код дает мне желаемый результат, однако я хотел бы преобразовать его во что-то, напоминающее «Железнодорожный шаблон» функционального программирования https://android.jlelse.eu/real-world-functional-programming-with-kotlin-arrow-b5a98e72f5e3
где мой процесс
stepOne(Historical.completed)
.stepTwo(action.sideEffects)
.stepThree(getReaction())
.stepFour(reaction.sideEffects)
.finalStep(reaction)
который будет «короткое замыкание» либо при сбоях любого шага, либо когда History «isCompleted»
можно ли добиться такого стиля вызова в Котлине? и/или Kotlin и Arrow.kt?