0
RxJava3
Kotlin

I have the following method and I am trying to control the downstream to return the Pair<Customer, Profile> after the map operator

However, after the first flatMap the data is changes to customer. Basically, I want to return the Pair<Customer, Profile> and not the customer dowwstream.

override fun execute(): Single<Pair<Customer, Profile>> {
        return Single.fromObservable(
            graphQLProfileService.getCustomerProfile()
        ).map {
            Pair(
                it.mdc.toCustomer(),
                it.profile
            )
        } /* Single<Pair<Customer, Profile>> */
            .flatMap { /* it: Pair<Customer, Profile> */
                updateProfileUseCase.execute(topsCustomer = it.first)
            }
            .flatMap { /* it: Customer */
                updateUserUseCase.execute().toSingleDefault(it) /* it.first, as the first item will be customer */
            }
            .flatMap { /* it: Customer */
                updateAppUseCase.execute().toSingleDefault(it) /* it.first */
            }
}

I think the solution should be something like this but I haven't managed to get it to work: https://medium.com/@douglas.iacovelli/rxjava-kotlin-keep-the-original-value-in-a-flatmap-bbd6a6974a99

ant2009
  • 27,094
  • 154
  • 411
  • 609

1 Answers1

1

You have to put those flatMaps inside a flatMap and once they succeed, you have to replace their results back to the value by ignoring it and concatenating with a just of the pair:

Single.fromObservable(
    graphQLProfileService.getCustomerProfile()
).map {
    Pair(
        it.mdc.toCustomer(),
        it.profile
    )
}
.flatMap { original ->
    Single.just(original) // <--------------------------------------
    .flatMap { /* it: Pair<Customer, Profile> */
        updateProfileUseCase.execute(topsCustomer = it.first)
    }
    .flatMap { /* it: Customer */
        updateUserUseCase.execute().toSingleDefault(it) /* it.first, as the first item will be customer */
    }
    .flatMap { /* it: Customer */
        updateAppUseCase.execute().toSingleDefault(it) /* it.first */
    }
    .ignoreElement() // <--------------------------------------
    .andThen(Single.just(original))
}
akarnokd
  • 69,132
  • 14
  • 157
  • 192