Skip to content

Instantly share code, notes, and snippets.

View fvilarino's full-sized avatar

Francesc Vilariño Güell fvilarino

View GitHub Profile
@fvilarino
fvilarino / mvi_framework_updated_counter_screen.kt
Created September 18, 2023 20:50
MVI Framework - Updated Counter Screen
View mvi_framework_updated_counter_screen.kt
@Composable
fun CounterScreen(
state: CounterState,
onDecreaseClick: () -> Unit,
onIncreaseClick: () -> Unit,
onGenerateRandom: () -> Unit,
modifier: Modifier = Modifier,
) {
Box(
contentAlignment = Alignment.Center,
@fvilarino
fvilarino / mvi_framework_upadted_counter_middleware.kt
Created September 18, 2023 20:42
MVI Framework - Updated Counter Middleware
View mvi_framework_upadted_counter_middleware.kt
class CounterViewModel(
// 1
middleware: CounterMiddleware = CounterMiddleware(),
reducer: CounterReducer = CounterReducer(),
) : MviViewModel<CounterState, CounterAction>(
reducer = reducer,
// 2
middlewares = listOf(middleware),
initialState = CounterState.initial,
) {
@fvilarino
fvilarino / mvi_framework_updated_reducer.kt
Created September 18, 2023 20:38
MVI Framework - Updated Reducer
View mvi_framework_updated_reducer.kt
class CounterReducer : Reducer<CounterState, CounterAction> {
override fun reduce(state: CounterState, action: CounterAction): CounterState {
return when (action) {
// 1
CounterAction.Loading -> state.copy(loading = true)
CounterAction.Decrement -> state.copy(counter = state.counter - 1)
CounterAction.Increment -> state.copy(counter = state.counter + 1)
// 2
is CounterAction.CounterUpdated -> state.copy(
@fvilarino
fvilarino / mvi_framework_counter_middleware.kt
Last active September 18, 2023 20:49
MVI Framework - Counter Middleware
View mvi_framework_counter_middleware.kt
// 1
class CounterMiddleware : Middleware<CounterState, CounterAction>() {
// 2
override suspend fun process(state: CounterState, action: CounterAction) {
// 3
when (action) {
CounterAction.GenerateRandom -> generateRandom()
else -> { /* no-op */ }
}
@fvilarino
fvilarino / mvi_framework_updated_actions.kt
Last active September 18, 2023 20:29
MVI Framework - Updated Actions
View mvi_framework_updated_actions.kt
sealed interface CounterAction : Action {
data object Loading : CounterAction
data object Increment : CounterAction
data object Decrement : CounterAction
data object GenerateRandom : CounterAction
data class CounterUpdated(val value: Int) : CounterAction
}
@fvilarino
fvilarino / mvi_framework_updated_counter_state.kt
Created September 18, 2023 19:14
MVI Framework - Updated State
View mvi_framework_updated_counter_state.kt
data class CounterState(
// 1
val loading: Boolean,
val counter: Int,
) : State {
companion object {
val initial: CounterState = CounterState(
// 2
loading = false,
counter = 0,
@fvilarino
fvilarino / mvi_framework_updated_viewmodel.kt
Last active September 18, 2023 18:53
MVI Framework - Updated ViewModel
View mvi_framework_updated_viewmodel.kt
open class MviViewModel<S : State, A : Action>(
private val reducer: Reducer<S, A>,
// 1
private val middlewares: List<Middleware<S, A>> = emptyList(),
initialState: S,
) : ViewModel(), Dispatcher<A> {
// 2
private data class ActionImpl<S : State, A : Action>(
val state: S,
@fvilarino
fvilarino / mvi_framework_middleware.kt
Created September 18, 2023 18:42
MVI Framework - Middleware
View mvi_framework_middleware.kt
// 1
interface Dispatcher<A : Action> {
fun dispatch(action: A)
}
// 2
abstract class Middleware<S : State, A : Action>() {
// 3
private lateinit var dispatcher: Dispatcher<A>
@fvilarino
fvilarino / mvi_framework_counter_screen.kt
Created September 18, 2023 18:33
MVI Framework - Counter Screen
View mvi_framework_counter_screen.kt
@Composable
fun CounterScreen(
viewModel: CounterViewModel,
modifier: Modifier = Modifier,
) {
CounterScreen(
state = viewModel.state,
onDecreaseClick = viewModel::onDecrement,
onIncreaseClick = viewModel::onIncrement,
modifier = modifier,
@fvilarino
fvilarino / mvi_framework_counter_viewmodel.kt
Last active September 18, 2023 18:23
MVI Framework - Counter ViewModel
View mvi_framework_counter_viewmodel.kt
class CounterViewModel(
// 1
reducer: CounterReducer = CounterReducer(),
// 2
) : MviViewModel<CounterState, CounterAction>(
reducer = reducer,
initialState = CounterState.initial,
) {
// 3
fun onDecrement() {