0001    //
0002    //  Switch.swift
0003    //  Rx
0004    //
0005    //  Created by Krunoslav Zaher on 3/12/15.
0006    //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
0007    //
0008    
0009    import Foundation
0010    
0011    class SwitchSink
Switch.swift:87
    typealias Parent = SwitchSink<SourceType, S, O>
Switch.swift:136
final class SwitchIdentitySink<S: ObservableConvertibleType, O: ObserverType where O.E == S.E> : SwitchSink<S, S, O> {
Switch.swift:146
final class MapSwitchSink<SourceType, S: ObservableConvertibleType, O: ObserverType where O.E == S.E> : SwitchSink<SourceType, S, O> {
<SourceType
Switch.swift:16
    typealias E = SourceType
Switch.swift:32
    func run(source: Observable<SourceType>) -> Disposable {
Switch.swift:42
    func performMap(element: SourceType) throws -> S {
, S
Switch.swift:42
    func performMap(element: SourceType) throws -> S {
: ObservableConvertibleType, O
Switch.swift:12
    : Sink<O>
Switch.swift:28
    override init(observer: O) {
: ObserverType where S.E == O.E> 0012 : Sink<O> 0013 , ObserverType 0014 , LockOwnerType 0015 , SynchronizedOnType { 0016 typealias E
Switch.swift:38
    func on(event: Event<E>) {
Switch.swift:46
    func _synchronized_on(event: Event<E>) {
= SourceType 0017 0018 private let _subscriptions
Switch.swift:34
        _subscriptions.disposable = subscription
Switch.swift:35
        return StableCompositeDisposable.create(_subscriptions, _innerSubscription)
Switch.swift:72
            _subscriptions.dispose()
: SingleAssignmentDisposable = SingleAssignmentDisposable() 0019 private let _innerSubscription
Switch.swift:35
        return StableCompositeDisposable.create(_subscriptions, _innerSubscription)
Switch.swift:56
                _innerSubscription.disposable = d
: SerialDisposable = SerialDisposable() 0020 0021 let _lock
Switch.swift:94
        return _parent._lock
= NSRecursiveLock() 0022 0023 // state 0024 private var _stopped
Switch.swift:70
            _stopped = true
Switch.swift:126
            if _parent._stopped {
= false 0025 private var _latest
Switch.swift:52
                _latest = _latest &+ 1
Switch.swift:52
                _latest = _latest &+ 1
Switch.swift:53
                let latest = _latest
Switch.swift:114
        if _parent._latest != _id {
= 0 0026 private var _hasLatest
Switch.swift:51
                _hasLatest = true
Switch.swift:74
            if !_hasLatest {
Switch.swift:125
            _parent._hasLatest = false
= false 0027 0028 override init
Switch.swift:138
        super.init(observer: observer)
Switch.swift:153
        super.init(observer: observer)
(observer: O) { 0029 super.init(observer: observer) 0030 } 0031 0032 func run
Switch.swift:172
        sink.disposable = sink.run(_source)
Switch.swift:190
        sink.disposable = sink.run(_source)
(source: Observable<SourceType>) -> Disposable { 0033 let subscription = source.subscribe(self) 0034 _subscriptions.disposable = subscription 0035 return StableCompositeDisposable.create(_subscriptions, _innerSubscription) 0036 } 0037 0038 func on(event: Event<E>) { 0039 synchronizedOn(event) 0040 } 0041 0042 func performMap
Switch.swift:50
                let observable = try performMap(element).asObservable()
(element: SourceType) throws -> S { 0043 abstractMethod() 0044 } 0045 0046 func _synchronized_on(event: Event<E>) { 0047 switch event { 0048 case .Next(let element): 0049 do { 0050 let observable = try performMap(element).asObservable() 0051 _hasLatest = true 0052 _latest = _latest &+ 1 0053 let latest = _latest 0054 0055 let d = SingleAssignmentDisposable() 0056 _innerSubscription.disposable = d 0057 0058 let observer = SwitchSinkIter(parent: self, id: latest, _self: d) 0059 let disposable = observable.subscribe(observer) 0060 d.disposable = disposable 0061 } 0062 catch let error { 0063 forwardOn(.Error(error)) 0064 dispose() 0065 } 0066 case .Error(let error): 0067 forwardOn(.Error(error)) 0068 dispose() 0069 case .Completed: 0070 _stopped = true 0071 0072 _subscriptions.dispose() 0073 0074 if !_hasLatest { 0075 forwardOn(.Completed) 0076 dispose() 0077 } 0078 } 0079 } 0080 } 0081 0082 class SwitchSinkIter
Switch.swift:58
                let observer = SwitchSinkIter(parent: self, id: latest, _self: d)
<SourceType
Switch.swift:87
    typealias Parent = SwitchSink<SourceType, S, O>
, S
Switch.swift:86
    typealias E = S.E
Switch.swift:87
    typealias Parent = SwitchSink<SourceType, S, O>
: ObservableConvertibleType, O
Switch.swift:87
    typealias Parent = SwitchSink<SourceType, S, O>
: ObserverType where S.E == O.E> 0083 : ObserverType 0084 , LockOwnerType 0085 , SynchronizedOnType { 0086 typealias E
Switch.swift:103
    func on(event: Event<E>) {
Switch.swift:107
    func _synchronized_on(event: Event<E>) {
= S.E 0087 typealias Parent
Switch.swift:89
    private let _parent: Parent
Switch.swift:97
    init(parent: Parent, id: Int, _self: Disposable) {
= SwitchSink<SourceType, S, O> 0088 0089 private let _parent
Switch.swift:94
        return _parent._lock
Switch.swift:98
        _parent = parent
Switch.swift:114
        if _parent._latest != _id {
Switch.swift:120
            _parent.forwardOn(event)
Switch.swift:122
            _parent.forwardOn(event)
Switch.swift:123
            _parent.dispose()
Switch.swift:125
            _parent._hasLatest = false
Switch.swift:126
            if _parent._stopped {
Switch.swift:127
                _parent.forwardOn(event)
Switch.swift:128
                _parent.dispose()
: Parent 0090 private let _id
Switch.swift:99
        _id = id
Switch.swift:114
        if _parent._latest != _id {
: Int 0091 private let _self
Switch.swift:100
        self._self = _self
Switch.swift:111
            _self.dispose()
: Disposable 0092 0093 var _lock: NSRecursiveLock { 0094 return _parent._lock 0095 } 0096 0097 init
Switch.swift:58
                let observer = SwitchSinkIter(parent: self, id: latest, _self: d)
(parent: Parent, id: Int, _self: Disposable) { 0098 _parent = parent 0099 _id = id 0100 self._self = _self 0101 } 0102 0103 func on(event: Event<E>) { 0104 synchronizedOn(event) 0105 } 0106 0107 func _synchronized_on(event: Event<E>) { 0108 switch event { 0109 case .Next: break 0110 case .Error, .Completed: 0111 _self.dispose() 0112 } 0113 0114 if _parent._latest != _id { 0115 return 0116 } 0117 0118 switch event { 0119 case .Next: 0120 _parent.forwardOn(event) 0121 case .Error: 0122 _parent.forwardOn(event) 0123 _parent.dispose() 0124 case .Completed: 0125 _parent._hasLatest = false 0126 if _parent._stopped { 0127 _parent.forwardOn(event) 0128 _parent.dispose() 0129 } 0130 } 0131 } 0132 } 0133 0134 // MARK: Specializations 0135 0136 final class SwitchIdentitySink
Switch.swift:171
        let sink = SwitchIdentitySink<S, O>(observer: observer)
<S
Switch.swift:136
final class SwitchIdentitySink<S: ObservableConvertibleType, O: ObserverType where O.E == S.E> : SwitchSink<S, S, O> {
Switch.swift:136
final class SwitchIdentitySink<S: ObservableConvertibleType, O: ObserverType where O.E == S.E> : SwitchSink<S, S, O> {
Switch.swift:141
    override func performMap(element: S) throws -> S {
Switch.swift:141
    override func performMap(element: S) throws -> S {
: ObservableConvertibleType, O
Switch.swift:136
final class SwitchIdentitySink<S: ObservableConvertibleType, O: ObserverType where O.E == S.E> : SwitchSink<S, S, O> {
Switch.swift:137
    override init(observer: O) {
: ObserverType where O.E == S.E> : SwitchSink<S, S, O> { 0137 override init(observer: O) { 0138 super.init(observer: observer) 0139 } 0140 0141 override func performMap(element: S) throws -> S { 0142 return element 0143 } 0144 } 0145 0146 final class MapSwitchSink
Switch.swift:189
        let sink = MapSwitchSink<SourceType, S, O>(selector: _selector, observer: observer)
<SourceType
Switch.swift:146
final class MapSwitchSink<SourceType, S: ObservableConvertibleType, O: ObserverType where O.E == S.E> : SwitchSink<SourceType, S, O> {
Switch.swift:147
    typealias Selector = SourceType throws -> S
Switch.swift:156
    override func performMap(element: SourceType) throws -> S {
, S
Switch.swift:146
final class MapSwitchSink<SourceType, S: ObservableConvertibleType, O: ObserverType where O.E == S.E> : SwitchSink<SourceType, S, O> {
Switch.swift:147
    typealias Selector = SourceType throws -> S
Switch.swift:156
    override func performMap(element: SourceType) throws -> S {
: ObservableConvertibleType, O
Switch.swift:146
final class MapSwitchSink<SourceType, S: ObservableConvertibleType, O: ObserverType where O.E == S.E> : SwitchSink<SourceType, S, O> {
Switch.swift:151
    init(selector: Selector, observer: O) {
: ObserverType where O.E == S.E> : SwitchSink<SourceType, S, O> { 0147 typealias Selector
Switch.swift:149
    private let _selector: Selector
Switch.swift:151
    init(selector: Selector, observer: O) {
= SourceType throws -> S 0148 0149 private let _selector
Switch.swift:152
        _selector = selector
Switch.swift:157
        return try _selector(element)
: Selector 0150 0151 init(selector: Selector, observer: O) { 0152 _selector = selector 0153 super.init(observer: observer) 0154 } 0155 0156 override func performMap(element: SourceType) throws -> S { 0157 return try _selector(element) 0158 } 0159 } 0160 0161 // MARK: Producers 0162 0163 final class Switch
Observable+Multiple.swift:64
        return Switch(source: asObservable())
<S
Switch.swift:163
final class Switch<S: ObservableConvertibleType> : Producer<S.E> {
Switch.swift:164
    private let _source: Observable<S>
Switch.swift:166
    init(source: Observable<S>) {
Switch.swift:170
    override func run<O : ObserverType where O.E == S.E>(observer: O) -> Disposable {
Switch.swift:171
        let sink = SwitchIdentitySink<S, O>(observer: observer)
: ObservableConvertibleType> : Producer<S.E> { 0164 private let _source
Switch.swift:167
        _source = source
Switch.swift:172
        sink.disposable = sink.run(_source)
: Observable<S> 0165 0166 init
Observable+Multiple.swift:64
        return Switch(source: asObservable())
(source: Observable<S>) { 0167 _source = source 0168 } 0169 0170 override func run<O : ObserverType where O.E == S.E>(observer: O) -> Disposable { 0171 let sink = SwitchIdentitySink<S, O>(observer: observer) 0172 sink.disposable = sink.run(_source) 0173 return sink 0174 } 0175 } 0176 0177 final class FlatMapLatest
Observable+StandardSequenceOperators.swift:267
            return FlatMapLatest(source: asObservable(), selector: selector)
<SourceType
Switch.swift:178
    typealias Selector = SourceType throws -> S
Switch.swift:180
    private let _source: Observable<SourceType>
Switch.swift:183
    init(source: Observable<SourceType>, selector: Selector) {
Switch.swift:189
        let sink = MapSwitchSink<SourceType, S, O>(selector: _selector, observer: observer)
, S
Switch.swift:177
final class FlatMapLatest<SourceType, S: ObservableConvertibleType> : Producer<S.E> {
Switch.swift:178
    typealias Selector = SourceType throws -> S
Switch.swift:188
    override func run<O : ObserverType where O.E == S.E>(observer: O) -> Disposable {
Switch.swift:189
        let sink = MapSwitchSink<SourceType, S, O>(selector: _selector, observer: observer)
: ObservableConvertibleType> : Producer<S.E> { 0178 typealias Selector
Switch.swift:181
    private let _selector: Selector
Switch.swift:183
    init(source: Observable<SourceType>, selector: Selector) {
= SourceType throws -> S 0179 0180 private let _source
Switch.swift:184
        _source = source
Switch.swift:190
        sink.disposable = sink.run(_source)
: Observable<SourceType> 0181 private let _selector
Switch.swift:185
        _selector = selector
Switch.swift:189
        let sink = MapSwitchSink<SourceType, S, O>(selector: _selector, observer: observer)
: Selector 0182 0183 init
Observable+StandardSequenceOperators.swift:267
            return FlatMapLatest(source: asObservable(), selector: selector)
(source: Observable<SourceType>, selector: Selector) { 0184 _source = source 0185 _selector = selector 0186 } 0187 0188 override func run<O : ObserverType where O.E == S.E>(observer: O) -> Disposable { 0189 let sink = MapSwitchSink<SourceType, S, O>(selector: _selector, observer: observer) 0190 sink.disposable = sink.run(_source) 0191 return sink 0192 } 0193 }