fun interface Reducer { operator fun invoke(state: S, action: Action): S } fun interface ReducerType { operator fun S.invoke(action: A): S } inline fun Reducer( reducer: ReducerType ): Reducer = Reducer { state, action -> when (action) { is A -> reducer.run { state(action) } else -> state } } val TodoReducer: Reducer = Reducer { action -> when (action) { is LoadTodos -> this } }