Skip to content

Instantly share code, notes, and snippets.

View linean's full-sized avatar

Maciej Sady linean

View GitHub Profile
fun <STATE, EVENT> ViewModel.StateReducerFlow(
initialState: STATE,
reduceState: (STATE, EVENT) -> STATE,
): StateReducerFlow<STATE, EVENT> = StateReducerFlowImpl(initialState, reduceState, viewModelScope)
private class StateReducerFlowImpl<STATE, EVENT>(
initialState: STATE,
reduceState: (STATE, EVENT) -> STATE,
scope: CoroutineScope
) : StateReducerFlow<STATE, EVENT> {
private val events = Channel<EVENT>()
private val stateFlow = events
.receiveAsFlow()
interface StateReducerFlow<STATE, EVENT> : StateFlow<STATE> {
fun handleEvent(event: EVENT)
}
class ViewModel {
private val events = Channel<Event>()
val state = events.receiveAsFlow()
.runningFold(State(), ::reduceState)
.stateIn(viewModelScope, Eagerly, State())
fun handleEvent(event: Event) {
events.trySend(event)
class ViewModel {
private val events = Channel<Event>()
val state = MutableStateFlow(State())
init {
events.receiveAsFlow()
.onEach(::updateState)
.launchIn(viewModelScope)
sealed class Event {
object Increment : Event()
object Decrement : Event()
}
data class State(
val counter: Int = 0
)
class ViewModel {