ursus
12/21/2024, 8:04 PMFlow<List<Foo>>
, then I need to subscribe FooDetails
where such flow is accessed by foo.id
allFoos
.flatMapLatest { foos -> ..fooDetailsProvider.fooDetails(each foos.id) ???
basically I need the flatMap lambda to return a List<Flow<FooDetails>>
, i.e. for each of foos
I need to subscribe a fooDetailsProvider.fooDetails(it.id)
Any idea as how to do this?Daniel Pitts
12/21/2024, 10:04 PMursus
12/21/2024, 10:05 PMDaniel Pitts
12/21/2024, 10:17 PMDaniel Pitts
12/21/2024, 10:18 PMDaniel Pitts
12/21/2024, 10:19 PMursus
12/21/2024, 10:20 PMursus
12/21/2024, 10:20 PMDaniel Pitts
12/21/2024, 10:21 PMallFoos.map { list -> list.map { fooDetailsProvider.fooDetails(it.id) } }
ursus
12/21/2024, 10:22 PMDaniel Pitts
12/21/2024, 10:22 PMursus
12/21/2024, 10:22 PMDaniel Pitts
12/21/2024, 10:22 PMursus
12/21/2024, 10:23 PMDaniel Pitts
12/21/2024, 10:23 PMdata class Foo(val id: String)
class FooDetails
interface FooDetailProvider {
fun getDetails(id: String): Flow<FooDetails>
}
ursus
12/21/2024, 10:24 PMDaniel Pitts
12/21/2024, 10:25 PMfun Flow<List<Foo>>.details(provider: FooDetailProvider): Flow<List<FooDetails>> =
map { foos ->
foos.map { foo ->
provider.getDetails(foo.id).single()
}
}
ursus
12/21/2024, 10:25 PMflow { .. }
but what it ended up being is not what I want, it emitted each detail right awayDaniel Pitts
12/21/2024, 10:26 PMDeferred<FooDetails>
instead though.ursus
12/21/2024, 10:26 PMursus
12/21/2024, 10:26 PMList<FooAndFooDetails>
Daniel Pitts
12/21/2024, 10:28 PMdata class Foo(val id: String)
class FooDetails
interface FooDetailProvider {
fun getDetails(id: String): Deferred<FooDetails>
}
fun Flow<List<Foo>>.details(provider: FooDetailProvider): Flow<List<Pair<Foo, FooDetails>>> =
map { foos -> foos.map { foo -> foo to provider.getDetails(foo.id).await() } }
ursus
12/21/2024, 10:29 PMDaniel Pitts
12/21/2024, 10:30 PMDaniel Pitts
12/21/2024, 10:31 PMFlow<List<Pair<Foo, Flow<FooDetails>>>>
Daniel Pitts
12/21/2024, 10:32 PMursus
12/21/2024, 10:32 PMoneFoo.flatMapLatest { provider.details(it.id }
but over all foos, i.e a Flow<List<Foo>>
ursus
12/21/2024, 10:33 PMProvider.allDetails(ids)
but unfortunatelly just a Provider.details(id)
ursus
12/21/2024, 10:34 PMDaniel Pitts
12/21/2024, 10:35 PMfun Flow<List<Foo>>.details(provider: FooDetailProvider): Flow<List<Pair<Foo, FooDetails>>> =
flatMapLatest { foos ->
val list = foos.map { foo ->
provider.getDetails(foo.id).map { foo to it }
}
combine(list) { it.toList() }
}
Daniel Pitts
12/21/2024, 10:36 PMursus
12/21/2024, 10:36 PMursus
12/21/2024, 10:36 PMDaniel Pitts
12/21/2024, 10:37 PMursus
12/21/2024, 10:37 PMDaniel Pitts
12/21/2024, 10:38 PMcombine(list)
code for me, once I set the rest of the context.ursus
12/21/2024, 10:38 PMDaniel Pitts
12/21/2024, 10:39 PM