
me.aartikov.sesame.loading.paged.internal.PagedLoadingImpl.kt Maven / Gradle / Ivy
package me.aartikov.sesame.loading.paged.internal
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.StateFlow
import me.aartikov.sesame.loading.paged.DataMerger
import me.aartikov.sesame.loading.paged.PagedLoader
import me.aartikov.sesame.loading.paged.PagedLoading
import me.aartikov.sesame.loading.paged.PagedLoading.Event
import me.aartikov.sesame.loading.paged.PagedLoading.State
import me.aartikov.sesame.loop.startIn
internal class PagedLoadingImpl(
scope: CoroutineScope,
loader: PagedLoader,
initialState: State,
dataMerger: DataMerger
) : PagedLoading {
private val mutableEventFlow = MutableSharedFlow>(
extraBufferCapacity = 100, onBufferOverflow = BufferOverflow.DROP_OLDEST
)
private val loop: PagedLoadingLoop = PagedLoadingLoop(
initialState = initialState,
reducer = PagedLoadingReducer(dataMerger),
effectHandlers = listOf(
PagedLoadingEffectHandler(loader),
EventEffectHandler { event -> mutableEventFlow.tryEmit(event) }
)
)
override val stateFlow: StateFlow>
get() = loop.stateFlow
override val eventFlow: Flow>
get() = mutableEventFlow
init {
loop.startIn(scope)
}
override fun loadFirstPage(fresh: Boolean, reset: Boolean) {
loop.dispatch(Action.LoadFirstPage(fresh, reset))
}
override fun loadMore() {
loop.dispatch(Action.LoadMore)
}
override fun cancel(reset: Boolean) {
loop.dispatch(Action.Cancel(reset))
}
override fun mutateData(transform: (List) -> List) {
loop.dispatch(Action.MutateData(transform))
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy