Skip to content

Instantly share code, notes, and snippets.

@atimca
Created June 19, 2020 09:23
Show Gist options
  • Save atimca/2af2d7312df48b1601c988bc50df3ea0 to your computer and use it in GitHub Desktop.
Save atimca/2af2d7312df48b1601c988bc50df3ea0 to your computer and use it in GitHub Desktop.
class ViewController: UIViewController {
var cancellables: Set<AnyCancellable> = []
}
enum InputEvent {
case newUserWasLoaded(User)
var user: User {
switch self {
case .newUserWasLoaded(let user):
return user
}
}
}
enum OutputEvent {
case newsStateStepWasUpdated(NewsState.Step)
}
class NewsStore {
@Published private(set) var state: NewsState
private let input: AnyPublisher<InputEvent, Never>
private let reducer: (NewsState, NewsEvent) -> NewsState
init(
initialState: NewsState,
input: AnyPublisher<InputEvent, Never>,
reducer: @escaping (NewsState, NewsEvent) -> NewsState
) {
self.state = initialState
self.reducer = reducer
self.input = input
}
func accept(event: NewsEvent) {
state = reducer(state, event)
}
func start() -> (UIViewController, AnyPublisher<OutputEvent, Never>) {
let viewController = ViewController()
input
.map(\.user)
.sink { self.state.user = $0 }
.store(in: &viewController.cancellables)
let output = $state
.map(\.step)
.map(OutputEvent.newsStateStepWasUpdated)
.setFailureType(to: Never.self)
.eraseToAnyPublisher()
return (viewController, output)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment