All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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