У меня есть следующие интерфейсы:
interface UserRepository {
fun role(codename: String): IO<Option<Role>>
fun accessRights(roleId: Long): IO<List<AccessRight>>
}
Теперь я пытаюсь использовать его для составления эффективных операций, например:
private fun retrieveRole(roleCodename: String): IO<Option<RoleTo>> =
IO.fx {
val role = userRepository.role(roleCodename).bind()
role.map { r ->
val ar = userRepository.accessRights(r.id).bind()
RoleTo.of(r, ar)
}
}
Код не компилируется при втором связывании (вызовuserRepository.accessRights(r.id).bind()
, поскольку bind
- это функция приостановки. Как правильно составить две операции? Я не понимаю, почему первое связывание работает, а второе - нет, и я не хочу, чтобы моя функция приостанавливалась, или я должен это сделатьв любом случае?