Guest User

Untitled

a guest
Apr 25th, 2018
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.59 KB | None | 0 0
  1. private typealias Handler<T> = (GenericResult<T>) -> Void
  2. private enum Sealant<T> {
  3.  
  4. case sealed([Handler<T>])
  5. case resolved(GenericResult<T>)
  6. }
  7.  
  8. private final class Resolver<T> {
  9.  
  10. private let lock = NSLock()
  11. private var value: Sealant<T> = .sealed([])
  12.  
  13. func resolve(_ result: GenericResult<T>) {
  14. lock.lock()
  15.  
  16. var handlers: [Handler<T>]?
  17.  
  18. switch value {
  19. case .resolved:
  20. return // already resolved
  21. case .sealed(let _handlers):
  22. handlers = _handlers
  23. value = .resolved(result)
  24. }
  25.  
  26. lock.unlock()
  27.  
  28. handlers?.forEach { $0(result) }
  29. }
  30.  
  31. func inspect(_ call: @escaping (GenericResult<T>) -> Void) {
  32. let result: GenericResult<T>
  33.  
  34. lock.lock()
  35.  
  36. switch value {
  37. case .sealed(var handlers):
  38. handlers.append(call)
  39. value = .sealed(handlers)
  40. return
  41. case .resolved(let _result):
  42. result = _result
  43. }
  44.  
  45. lock.unlock()
  46.  
  47. call(result)
  48. }
  49.  
  50. func fulfill(_ newValue: T) {
  51. resolve(.success(newValue))
  52. }
  53.  
  54. func reject(_ error: Error) {
  55. resolve(.failure(error))
  56. }
  57. }
  58.  
  59. public struct NetworkFuture<T> {
  60.  
  61. private let resolver = Resolver<T>()
  62.  
  63. public func onResolved(_ call: @escaping (GenericResult<T>) -> Void) {
  64. resolver.inspect(call)
  65. }
  66.  
  67. func fulfill(_ newValue: T) {
  68. resolver.fulfill(newValue)
  69. }
  70.  
  71. func reject(_ error: Error) {
  72. resolver.reject(error)
  73. }
  74.  
  75. func resolve(_ result: GenericResult<T>) {
  76. resolver.resolve(result)
  77. }
  78. }
Add Comment
Please, Sign In to add comment