Event.swift 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. //
  2. // Event.swift
  3. // RxSwift
  4. //
  5. // Created by Krunoslav Zaher on 2/8/15.
  6. // Copyright © 2015 Krunoslav Zaher. All rights reserved.
  7. //
  8. /// Represents a sequence event.
  9. ///
  10. /// Sequence grammar:
  11. /// **next\* (error | completed)**
  12. public enum Event<Element> {
  13. /// Next element is produced.
  14. case next(Element)
  15. /// Sequence terminated with an error.
  16. case error(Swift.Error)
  17. /// Sequence completed successfully.
  18. case completed
  19. }
  20. extension Event: CustomDebugStringConvertible {
  21. /// Description of event.
  22. public var debugDescription: String {
  23. switch self {
  24. case .next(let value):
  25. return "next(\(value))"
  26. case .error(let error):
  27. return "error(\(error))"
  28. case .completed:
  29. return "completed"
  30. }
  31. }
  32. }
  33. extension Event {
  34. /// Is `completed` or `error` event.
  35. public var isStopEvent: Bool {
  36. switch self {
  37. case .next: return false
  38. case .error, .completed: return true
  39. }
  40. }
  41. /// If `next` event, returns element value.
  42. public var element: Element? {
  43. if case .next(let value) = self {
  44. return value
  45. }
  46. return nil
  47. }
  48. /// If `error` event, returns error.
  49. public var error: Swift.Error? {
  50. if case .error(let error) = self {
  51. return error
  52. }
  53. return nil
  54. }
  55. /// If `completed` event, returns `true`.
  56. public var isCompleted: Bool {
  57. if case .completed = self {
  58. return true
  59. }
  60. return false
  61. }
  62. }
  63. extension Event {
  64. /// Maps sequence elements using transform. If error happens during the transform, `.error`
  65. /// will be returned as value.
  66. public func map<Result>(_ transform: (Element) throws -> Result) -> Event<Result> {
  67. do {
  68. switch self {
  69. case let .next(element):
  70. return .next(try transform(element))
  71. case let .error(error):
  72. return .error(error)
  73. case .completed:
  74. return .completed
  75. }
  76. }
  77. catch let e {
  78. return .error(e)
  79. }
  80. }
  81. }
  82. /// A type that can be converted to `Event<Element>`.
  83. public protocol EventConvertible {
  84. /// Type of element in event
  85. associatedtype Element
  86. @available(*, deprecated, renamed: "Element")
  87. typealias ElementType = Element
  88. /// Event representation of this instance
  89. var event: Event<Element> { get }
  90. }
  91. extension Event: EventConvertible {
  92. /// Event representation of this instance
  93. public var event: Event<Element> {
  94. return self
  95. }
  96. }