arekolek
01/29/2019, 10:55 AMinterface Data
data class Response(
val data: List<Data>,
val hasNextPage: Boolean,
val nextPageId: Int?
)
fun makeRequest(nextPageId: Int): Single<Response> = TODO()
fun getData(page: Int = 0): Flowable<Data> = makeRequest(page)
.flatMapPublisher {
Flowable.fromIterable(it.data)
.concatWith(it.nextPageId?.let(::getData) ?: Flowable.empty())
}
@ubu not sure how you want to do it without recursion thoughubu
01/29/2019, 11:45 AMarekolek
01/29/2019, 11:46 AMpublisher
?arekolek
01/29/2019, 11:46 AMconcatWith(Flowable.empty())
doesubu
01/29/2019, 11:47 AMubu
01/29/2019, 11:50 AM.concatWith { publisher -> .... }
arekolek
01/29/2019, 11:55 AMmakeRequest
in your test?arekolek
01/29/2019, 11:56 AMdata class Data(val foo: Int)
data class Response(
val data: List<Data>,
val hasNextPage: Boolean,
val nextPageId: Int?
)
fun makeRequest(page: Int): Single<Response> = Single.just(Response(listOf(Data(page)), page < 10, page.takeIf { it < 10 }?.plus(1)))
fun getPagesFrom(page: Int): Flowable<List<Data>> = makeRequest(page)
.flatMapPublisher {
Flowable.just(it.data)
.concatWith(it.nextPageId?.let(::getPagesFrom) ?: Flowable.empty())
}
fun getData(): Flowable<List<Data>> = getPagesFrom(0).scan { acc, page -> acc + page }
getData()
.doOnNext { println(it) }
.doOnComplete { println("completed") }
.doOnError { println("error") }
.subscribe()
arekolek
01/29/2019, 11:57 AMscratch_23.kts:31 [Data(foo=0)]
scratch_23.kts:31 [Data(foo=0), Data(foo=1)]
scratch_23.kts:31 [Data(foo=0), Data(foo=1), Data(foo=2)]
scratch_23.kts:31 [Data(foo=0), Data(foo=1), Data(foo=2), Data(foo=3)]
scratch_23.kts:31 [Data(foo=0), Data(foo=1), Data(foo=2), Data(foo=3), Data(foo=4)]
scratch_23.kts:31 [Data(foo=0), Data(foo=1), Data(foo=2), Data(foo=3), Data(foo=4), Data(foo=5)]
scratch_23.kts:31 [Data(foo=0), Data(foo=1), Data(foo=2), Data(foo=3), Data(foo=4), Data(foo=5), Data(foo=6)]
scratch_23.kts:31 [Data(foo=0), Data(foo=1), Data(foo=2), Data(foo=3), Data(foo=4), Data(foo=5), Data(foo=6), Data(foo=7)]
scratch_23.kts:31 [Data(foo=0), Data(foo=1), Data(foo=2), Data(foo=3), Data(foo=4), Data(foo=5), Data(foo=6), Data(foo=7), Data(foo=8)]
scratch_23.kts:31 [Data(foo=0), Data(foo=1), Data(foo=2), Data(foo=3), Data(foo=4), Data(foo=5), Data(foo=6), Data(foo=7), Data(foo=8), Data(foo=9)]
scratch_23.kts:31 [Data(foo=0), Data(foo=1), Data(foo=2), Data(foo=3), Data(foo=4), Data(foo=5), Data(foo=6), Data(foo=7), Data(foo=8), Data(foo=9), Data(foo=10)]
scratch_23.kts:31 completed
ubu
01/29/2019, 11:57 AMubu
01/29/2019, 12:28 PMarekolek
01/29/2019, 12:30 PM{ }
) than it is when you pass a flowable as first argument (using ()
)ubu
01/29/2019, 12:40 PM