AnyObserver.swift 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. //
  2. // AnyObserver.swift
  3. // RxSwift
  4. //
  5. // Created by Krunoslav Zaher on 2/28/15.
  6. // Copyright © 2015 Krunoslav Zaher. All rights reserved.
  7. //
  8. /// A type-erased `ObserverType`.
  9. ///
  10. /// Forwards operations to an arbitrary underlying observer with the same `Element` type, hiding the specifics of the underlying observer type.
  11. public struct AnyObserver<Element> : ObserverType {
  12. /// Anonymous event handler type.
  13. public typealias EventHandler = (Event<Element>) -> Void
  14. private let observer: EventHandler
  15. /// Construct an instance whose `on(event)` calls `eventHandler(event)`
  16. ///
  17. /// - parameter eventHandler: Event handler that observes sequences events.
  18. public init(eventHandler: @escaping EventHandler) {
  19. self.observer = eventHandler
  20. }
  21. /// Construct an instance whose `on(event)` calls `observer.on(event)`
  22. ///
  23. /// - parameter observer: Observer that receives sequence events.
  24. public init<Observer: ObserverType>(_ observer: Observer) where Observer.Element == Element {
  25. self.observer = observer.on
  26. }
  27. /// Send `event` to this observer.
  28. ///
  29. /// - parameter event: Event instance.
  30. public func on(_ event: Event<Element>) {
  31. return self.observer(event)
  32. }
  33. /// Erases type of observer and returns canonical observer.
  34. ///
  35. /// - returns: type erased observer.
  36. public func asObserver() -> AnyObserver<Element> {
  37. return self
  38. }
  39. }
  40. extension AnyObserver {
  41. /// Collection of `AnyObserver`s
  42. typealias s = Bag<(Event<Element>) -> Void>
  43. }
  44. extension ObserverType {
  45. /// Erases type of observer and returns canonical observer.
  46. ///
  47. /// - returns: type erased observer.
  48. public func asObserver() -> AnyObserver<Element> {
  49. return AnyObserver(self)
  50. }
  51. /// Transforms observer of type R to type E using custom transform method.
  52. /// Each event sent to result observer is transformed and sent to `self`.
  53. ///
  54. /// - returns: observer that transforms events.
  55. public func mapObserver<Result>(_ transform: @escaping (Result) throws -> Element) -> AnyObserver<Result> {
  56. return AnyObserver { e in
  57. self.on(e.map(transform))
  58. }
  59. }
  60. }