Event.swift 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. //
  2. // Event.swift
  3. // ReactiveSwift
  4. //
  5. // Created by Justin Spahr-Summers on 2015-01-16.
  6. // Copyright (c) 2015 GitHub. All rights reserved.
  7. //
  8. /// Represents a signal event.
  9. ///
  10. /// Signals must conform to the grammar:
  11. /// `value* (failed | completed | interrupted)?`
  12. public enum Event<Value, Error: Swift.Error> {
  13. /// A value provided by the signal.
  14. case value(Value)
  15. /// The signal terminated because of an error. No further events will be
  16. /// received.
  17. case failed(Error)
  18. /// The signal successfully terminated. No further events will be received.
  19. case completed
  20. /// Event production on the signal has been interrupted. No further events
  21. /// will be received.
  22. ///
  23. /// - important: This event does not signify the successful or failed
  24. /// completion of the signal.
  25. case interrupted
  26. /// Whether this event is a completed event.
  27. public var isCompleted: Bool {
  28. switch self {
  29. case .completed:
  30. return true
  31. case .value, .failed, .interrupted:
  32. return false
  33. }
  34. }
  35. /// Whether this event indicates signal termination (i.e., that no further
  36. /// events will be received).
  37. public var isTerminating: Bool {
  38. switch self {
  39. case .value:
  40. return false
  41. case .failed, .completed, .interrupted:
  42. return true
  43. }
  44. }
  45. /// Lift the given closure over the event's value.
  46. ///
  47. /// - important: The closure is called only on `value` type events.
  48. ///
  49. /// - parameters:
  50. /// - f: A closure that accepts a value and returns a new value
  51. ///
  52. /// - returns: An event with function applied to a value in case `self` is a
  53. /// `value` type of event.
  54. public func map<U>(_ f: (Value) -> U) -> Event<U, Error> {
  55. switch self {
  56. case let .value(value):
  57. return .value(f(value))
  58. case let .failed(error):
  59. return .failed(error)
  60. case .completed:
  61. return .completed
  62. case .interrupted:
  63. return .interrupted
  64. }
  65. }
  66. /// Lift the given closure over the event's error.
  67. ///
  68. /// - important: The closure is called only on failed type event.
  69. ///
  70. /// - parameters:
  71. /// - f: A closure that accepts an error object and returns
  72. /// a new error object
  73. ///
  74. /// - returns: An event with function applied to an error object in case
  75. /// `self` is a `.Failed` type of event.
  76. public func mapError<F>(_ f: (Error) -> F) -> Event<Value, F> {
  77. switch self {
  78. case let .value(value):
  79. return .value(value)
  80. case let .failed(error):
  81. return .failed(f(error))
  82. case .completed:
  83. return .completed
  84. case .interrupted:
  85. return .interrupted
  86. }
  87. }
  88. /// Unwrap the contained `value` value.
  89. public var value: Value? {
  90. if case let .value(value) = self {
  91. return value
  92. } else {
  93. return nil
  94. }
  95. }
  96. /// Unwrap the contained `Error` value.
  97. public var error: Error? {
  98. if case let .failed(error) = self {
  99. return error
  100. } else {
  101. return nil
  102. }
  103. }
  104. }
  105. public func == <Value: Equatable, Error: Equatable> (lhs: Event<Value, Error>, rhs: Event<Value, Error>) -> Bool {
  106. switch (lhs, rhs) {
  107. case let (.value(left), .value(right)):
  108. return left == right
  109. case let (.failed(left), .failed(right)):
  110. return left == right
  111. case (.completed, .completed):
  112. return true
  113. case (.interrupted, .interrupted):
  114. return true
  115. default:
  116. return false
  117. }
  118. }
  119. extension Event: CustomStringConvertible {
  120. public var description: String {
  121. switch self {
  122. case let .value(value):
  123. return "VALUE \(value)"
  124. case let .failed(error):
  125. return "FAILED \(error)"
  126. case .completed:
  127. return "COMPLETED"
  128. case .interrupted:
  129. return "INTERRUPTED"
  130. }
  131. }
  132. }
  133. /// Event protocol for constraining signal extensions
  134. public protocol EventProtocol {
  135. /// The value type of an event.
  136. associatedtype Value
  137. /// The error type of an event. If errors aren't possible then `NoError` can
  138. /// be used.
  139. associatedtype Error: Swift.Error
  140. /// Extracts the event from the receiver.
  141. var event: Event<Value, Error> { get }
  142. }
  143. extension Event: EventProtocol {
  144. public var event: Event<Value, Error> {
  145. return self
  146. }
  147. }