Skip to content

Instantly share code, notes, and snippets.

@xxKRASHxx
Created February 28, 2018 14:46
Show Gist options
  • Save xxKRASHxx/0d2420328b081fc0cc941ac737d3ebd5 to your computer and use it in GitHub Desktop.
Save xxKRASHxx/0d2420328b081fc0cc941ac737d3ebd5 to your computer and use it in GitHub Desktop.
import Foundation
class DisposeToken {
let block: (Void) -> Void
init(block: @escaping (Void) -> Void) { self.block = block }
deinit { block() }
}
class Store<State> {
typealias Callback = (State) -> Void
fileprivate var callbacks = [:] as [Int: Callback]
fileprivate var nextID = 0
var state: State {
didSet {
for (_, callback) in callbacks {
callback(state)
}
}
}
init(initial state: State) {
self.state = state
}
func update(_ block: @escaping (inout (State)) -> Void) {
var state = self.state
block(&state)
self.state = state
}
func onUpdate(_ callback: @escaping (State) -> Void) -> DisposeToken {
let id = nextID
nextID += 1
callbacks[id] = callback
callback(state)
return DisposeToken { [weak self] in self?.callbacks[id] = nil }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment