Kotlin coroutines and Arrow are a nice way to avoid nesting flatmaps, introducing monadic comprehensions in Kotlin. However Kotlin's Flow
type still relies on declarative flatmapping, so we get into a mixture of direct and declarative styles:
override suspend fun findAll(page: Pageable): Either<BusinessException, Flow<PageElement<ClientOut>>> = either {
val count = clientRepository.count().awaitSingle().bind()
return clientRepository.findByIdNotNull(page).asFlow()
.flatMapMerge { client ->
flow { emit(mapDetailedClientOut(client)) }
}
}
val count
has been bound inside the either {...}
comprehension. However, there doesn't seem to be a way to do the same with Flow
, forcing us to nest a flatmapMerge()
.
Is there a way to do it, or is it planned to be somehow included in the near future?
Sadly there is currently no way to build comphrehensions for the KotlinX Flow
datatype, since Coroutines in Kotlin only support for single-shot emission/bind
.
Therefore it's only possible to build comphrensions for data types with 0..1
elements such as Either
or Nullable
, but not 0..N
like the Flow
or List
data types.