123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- //
- // AnyObserver.swift
- // RxSwift
- //
- // Created by Krunoslav Zaher on 2/28/15.
- // Copyright © 2015 Krunoslav Zaher. All rights reserved.
- //
- /// A type-erased `ObserverType`.
- ///
- /// Forwards operations to an arbitrary underlying observer with the same `Element` type, hiding the specifics of the underlying observer type.
- public struct AnyObserver<Element> : ObserverType {
- /// Anonymous event handler type.
- public typealias EventHandler = (Event<Element>) -> Void
- private let observer: EventHandler
- /// Construct an instance whose `on(event)` calls `eventHandler(event)`
- ///
- /// - parameter eventHandler: Event handler that observes sequences events.
- public init(eventHandler: @escaping EventHandler) {
- self.observer = eventHandler
- }
-
- /// Construct an instance whose `on(event)` calls `observer.on(event)`
- ///
- /// - parameter observer: Observer that receives sequence events.
- public init<Observer: ObserverType>(_ observer: Observer) where Observer.Element == Element {
- self.observer = observer.on
- }
-
- /// Send `event` to this observer.
- ///
- /// - parameter event: Event instance.
- public func on(_ event: Event<Element>) {
- return self.observer(event)
- }
- /// Erases type of observer and returns canonical observer.
- ///
- /// - returns: type erased observer.
- public func asObserver() -> AnyObserver<Element> {
- return self
- }
- }
- extension AnyObserver {
- /// Collection of `AnyObserver`s
- typealias s = Bag<(Event<Element>) -> Void>
- }
- extension ObserverType {
- /// Erases type of observer and returns canonical observer.
- ///
- /// - returns: type erased observer.
- public func asObserver() -> AnyObserver<Element> {
- return AnyObserver(self)
- }
- /// Transforms observer of type R to type E using custom transform method.
- /// Each event sent to result observer is transformed and sent to `self`.
- ///
- /// - returns: observer that transforms events.
- public func mapObserver<Result>(_ transform: @escaping (Result) throws -> Element) -> AnyObserver<Result> {
- return AnyObserver { e in
- self.on(e.map(transform))
- }
- }
- }
|