// // 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 : ObserverType { /// The type of elements in sequence that observer can observe. public typealias E = Element /// Anonymous event handler type. public typealias EventHandler = (Event) -> 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: O) where O.E == Element { self.observer = observer.on } /// Send `event` to this observer. /// /// - parameter event: Event instance. public func on(_ event: Event) { return self.observer(event) } /// Erases type of observer and returns canonical observer. /// /// - returns: type erased observer. public func asObserver() -> AnyObserver { return self } } extension AnyObserver { /// Collection of `AnyObserver`s typealias s = Bag<(Event) -> ()> } extension ObserverType { /// Erases type of observer and returns canonical observer. /// /// - returns: type erased observer. public func asObserver() -> AnyObserver { 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(_ transform: @escaping (R) throws -> E) -> AnyObserver { return AnyObserver { e in self.on(e.map(transform)) } } }