Skip to content

2. QuickStart

kimdohun0104 edited this page Oct 18, 2020 · 2 revisions

Quick Start

State, Event, SideEffect 정의

data class CountState(
    val count: Int = 0,
    val toastEvent: Event<String> = Event()
) : KindaState

sealed class CountEvent : KindaEvent {
    object Increase : CountEvent()
    object Decrease : CountEvent()
    object AttemptMagic : CountEvent()
    object Increase1000 : CountEvent()
}

sealed class CountSideEffect : KindaSideEffect {
    object Magic : CountSideEffect()
}

Reducer 구현

class CountReducer : KindaReducer<CountState, CountEvent, CountSideEffect> {
    override fun reduce(state: CountState, event: CountEvent): Next<CountState, CountSideEffect> {
        return when (event) {
            CountEvent.AttemptMagic -> Next(null, CountSideEffect.Magic)
            CountEvent.Increase -> Next(state.copy(count = state.count + 1))
            CountEvent.Decrease -> Next(state.copy(count = state.count - 1))
            CountEvent.Increase1000 -> Next(
                state.copy(
                    count = state.count + 1000,
                    toastEvent = Event("Increase 1000, It's magic!")
                )
            )
        }
    }
}

SideEffectHandler 구현

class CountSideEffectHandler : KindaSideEffectHandler<CountState, CountEvent, CountSideEffect> {
    override suspend fun handle(state: CountState, sideEffect: CountSideEffect): CountEvent {
        return when (sideEffect) {
            CountSideEffect.Magic -> {
                delay(1000)
                CountEvent.Increase1000
            }
        }
    }
}

Kinda 구성 및 사용

val countKinda = Kinda.Builder<CountState, CountEvent, CountSideEffect>()
            .initialState(CountState())
            .coroutineScope(GlobalScope)
            .reducer(CountReducer())
            .sideEffectHandler(CountSideEffectHandler())
            .render { state ->
                println(state.count)
            }
            .build()
            
countKinda.intent(CountEvent.Increase)