Skip to content

Instantly share code, notes, and snippets.

View atimca's full-sized avatar

Maxim Smirnov atimca

View GitHub Profile
func transform(newsReducer: (NewsState, NewsEvent) -> NewsState) -> Reducer
func transform(
newsReducer: @escaping (NewsState, NewsEvent) -> NewsState,
stateKeyPath: WritableKeyPath<AppState, NewsState>
) -> Reducer {
return { appState, appEvent in
var appState = appState
appState[keyPath: stateKeyPath] = newsReducer(appState[keyPath: stateKeyPath], appEvent)
return appState
}
}
enum AppEvent {
case newUserWasLoaded(User)
case newsEvents(NewsEvent)
var newsEvent: NewsEvent? {
guard case .newsEvents(let event) = self else { return nil }
return event
}
}
func transform(
newsReducer: @escaping (NewsState, NewsEvent) -> NewsState,
stateKeyPath: WritableKeyPath<AppState, NewsState>
) -> Reducer {
return { appState, appEvent in
guard let newsEvent = appEvent.newsEvent else { return appState }
var appState = appState
appState[keyPath: stateKeyPath] = newsReducer(appState[keyPath: stateKeyPath], newsEvent)
return appState
}
func transform(
newsReducer: @escaping (NewsState, NewsEvent) -> NewsState,
stateKeyPath: WritableKeyPath<AppState, NewsState>,
toNewsEvent: @escaping (AppEvent) -> NewsEvent?
) -> Reducer {
return { appState, appEvent in
guard let newsEvent = toNewsEvent(appEvent) else { return appState }
var appState = appState
appState[keyPath: stateKeyPath] = newsReducer(appState[keyPath: stateKeyPath], newsEvent)
return appState
func combine<State, Event>(_ reducers: (State, Event) -> State...) -> (State, Event) -> State {
return { state, event in
reducers.reduce(state) { state, reducer in
reducer(state, event)
}
}
}
func transform<GlobalState, GlobalEvent, LocalState, LocalEvent>(
localReducer: @escaping (LocalState, LocalEvent) -> LocalState,
stateKeyPath: WritableKeyPath<GlobalState, LocalState?>,
let appReducer: Reducer = { state, event in
var state = state
switch event {
case .newUserWasLoaded(let user):
state.user = user
default:
return state
}
return state
}
class NewsStore {
@Published private(set) var state: NewsState
private let reducer: (NewsState, NewsEvent) -> NewsState
init(
initialState: NewsState,
reducer: @escaping (NewsState, NewsEvent) -> NewsState
) {
self.state = initialState
self.reducer = reducer
}
class ViewController: UIViewController {
var cancellables: Set<AnyCancellable> = []
}
enum InputEvent {
case newUserWasLoaded(User)
var user: User {
switch self {
case .newUserWasLoaded(let user):
return user
}
class ViewController: UIViewController {
var cancellables: Set<AnyCancellable> = []
}
enum InputEvent {
case newUserWasLoaded(User)
var user: User {
switch self {
case .newUserWasLoaded(let user):
return user
}