Guest User

Untitled

a guest
Nov 22nd, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.02 KB | None | 0 0
  1. public class Token {
  2.  
  3. public typealias DisposeAction = () -> Void
  4.  
  5. private let action: DisposeAction
  6. private var isDisposed: Bool = false
  7.  
  8. public init(action: @escaping DisposeAction) { self.action = action }
  9.  
  10. private func innerDispose() {
  11. guard !isDisposed else { return }
  12. isDisposed = true
  13. action()
  14. }
  15.  
  16. public func dispose() { innerDispose() }
  17. deinit { innerDispose() }
  18. }
  19.  
  20. public class Pipe<Element> {
  21.  
  22. public let signal = Signal<Element>()
  23.  
  24. public func dispatch(_ value: Element) {
  25. signal.dispatch(value)
  26. }
  27.  
  28. public init() {}
  29. }
  30.  
  31. public class Signal<Element> {
  32.  
  33. public typealias Callback = (Element) -> Void
  34.  
  35. private var callbacks = [:] as [Int: Callback]
  36. private var nextID = 0
  37.  
  38. fileprivate func dispatch(_ value: Element) {
  39. callbacks.forEach { $1(value) }
  40. }
  41.  
  42. public func onUpdate(_ callback: @escaping Callback) -> Token {
  43.  
  44. let id = nextID
  45. nextID += 1
  46. callbacks[id] = callback
  47.  
  48. return Token { [weak self] in self?.callbacks[id] = nil }
  49. }
  50. }
Add Comment
Please, Sign In to add comment