Skip to content

Instantly share code, notes, and snippets.

View atimca's full-sized avatar

Maxim Smirnov atimca

View GitHub Profile
struct User {
let id: AnyHashable
}
struct NewsState {
var user: User
var step: Step
}
extension NewsState {
enum Step {
case initial
struct AppState {
var user: User
}
enum AppEvent {
case newUserWasLoaded(User)
}
extension AppEvent {
static func reduce(state: AppState, event: AppEvent) -> AppState {
var state = state
switch event {
struct AppState {
var user: User
var newsState: NewsState?
}
enum AppEvent {
case newUserWasLoaded(User)
case newsEvents(NewsEvent)
}
extension AppEvent {
static func reduce(state: AppState, event: AppEvent) -> AppState {
var state = state
switch event {
case .newUserWasLoaded(let user):
state.user = user
case .newsEvents(let event):
switch event {
case .dataLoaded(let data):
state.newsState?.step = .loaded(data: data)
extension AppEvent {
static func reduce(state: AppState, event: AppEvent) -> AppState {
var state = state
switch event {
case .newUserWasLoaded(let user):
state.user = user
case .newsEvents(let event):
if state.newsState == nil {
state.newsState = NewsState(user: state.user, step: .initial)
}
extension AppEvent {
static func reduce(state: AppState, event: AppEvent) -> AppState {
var state = state
switch event {
case .newUserWasLoaded(let user):
state.user = user
case .newsEvents(let event):
if state.newsState == nil {
state.newsState = NewsState(user: state.user, step: .initial)
}
typealias Reducer = (AppState, AppEvent) -> AppState
func combine(_ reducers: Reducer...) -> Reducer
func combine(_ reducers: Reducer...) -> Reducer {
return { state, event in
reducers.reduce(state) { state, reducer in
reducer(state, event)
}
}
}
let firstReducer: Reducer = { state, event in
var state = state
switch event {
case .newUserWasLoaded(let user):
state.user = user
default:
return state
}
return state
}