Revision control
Copy as Markdown
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
package mozilla.components.lib.state.ext
import android.view.View
import androidx.fragment.app.Fragment
import androidx.lifecycle.LifecycleOwner
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.channels.consumeEach
import kotlinx.coroutines.launch
import mozilla.components.lib.state.Action
import mozilla.components.lib.state.State
import mozilla.components.lib.state.Store
import mozilla.components.support.ktx.android.view.toScope
/**
* Helper extension method for consuming [State] from a [Store] sequentially in order scoped to the
* lifetime of the [View]. The [block] function will get invoked for every [State] update.
*
* This helper will automatically stop observing the [Store] once the [View] gets detached. The
* provided [LifecycleOwner] is used to determine when observing should be stopped or resumed.
*
* Inside a [Fragment] prefer to use [Fragment.consumeFrom].
*/
@ExperimentalCoroutinesApi // Channel
fun <S : State, A : Action> View.consumeFrom(
store: Store<S, A>,
owner: LifecycleOwner,
block: (S) -> Unit,
) {
val scope = toScope()
val channel = store.channel(owner)
scope.launch {
channel.consumeEach { state -> block(state) }
}
}