0001    //
0002    //  Amb.swift
0003    //  RxSwift
0004    //
0005    //  Created by Krunoslav Zaher on 6/14/15.
0006    //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
0007    //
0008    
0009    import Foundation
0010    
0011    enum AmbState
Amb.swift:59
    private var _choice = AmbState.Neither
Amb.swift:75
        let decide = { (o: AmbObserverType, event: Event<ElementType>, me: AmbState, otherSubscription: Disposable) in
{ 0012 case Neither
Amb.swift:59
    private var _choice = AmbState.Neither
Amb.swift:77
                if self._choice == .Neither {
0013 case Left
Amb.swift:94
            decide(o, e, .Left, subscription2)
0014 case Right
Amb.swift:98
            decide(o, e, .Right, subscription1)
0015 } 0016 0017 class AmbObserver
Amb.swift:20
    typealias This = AmbObserver<ElementType, O>
Amb.swift:53
    typealias AmbObserverType = AmbObserver<ElementType, O>
Amb.swift:93
        let sink1 = AmbObserver(parent: self, cancel: subscription1) { o, e in
Amb.swift:97
        let sink2 = AmbObserver(parent: self, cancel: subscription1) { o, e in
<ElementType
Amb.swift:18
    typealias Element = ElementType
Amb.swift:19
    typealias Parent = AmbSink<ElementType, O>
Amb.swift:20
    typealias This = AmbObserver<ElementType, O>
, O
Amb.swift:19
    typealias Parent = AmbSink<ElementType, O>
Amb.swift:20
    typealias This = AmbObserver<ElementType, O>
: ObserverType where O.E == ElementType> : ObserverType { 0018 typealias Element
Amb.swift:21
    typealias Sink = (This, Event<Element>) -> Void
Amb.swift:37
    func on(event: Event<Element>) {
= ElementType 0019 typealias Parent
Amb.swift:23
    private let _parent: Parent
Amb.swift:27
    init(parent: Parent, cancel: Disposable, sink: Sink) {
= AmbSink<ElementType, O> 0020 typealias This
Amb.swift:21
    typealias Sink = (This, Event<Element>) -> Void
= AmbObserver<ElementType, O> 0021 typealias Sink
Amb.swift:24
    private var _sink: Sink
Amb.swift:27
    init(parent: Parent, cancel: Disposable, sink: Sink) {
= (This, Event<Element>) -> Void 0022 0023 private let _parent
Amb.swift:32
        _parent = parent
: Parent 0024 private var _sink
Amb.swift:33
        _sink = sink
Amb.swift:38
        _sink(self, event)
Amb.swift:79
                    o._sink = forwardEvent
: Sink 0025 private var _cancel
Amb.swift:34
        _cancel = cancel
Amb.swift:40
            _cancel.dispose()
Amb.swift:80
                    o._cancel = disposeAll
: Disposable 0026 0027 init
Amb.swift:93
        let sink1 = AmbObserver(parent: self, cancel: subscription1) { o, e in
Amb.swift:97
        let sink2 = AmbObserver(parent: self, cancel: subscription1) { o, e in
(parent: Parent, cancel: Disposable, sink: Sink) { 0028 #if TRACE_RESOURCES 0029 AtomicIncrement(&resourceCount) 0030 #endif 0031 0032 _parent = parent 0033 _sink = sink 0034 _cancel = cancel 0035 } 0036 0037 func on(event: Event<Element>) { 0038 _sink(self, event) 0039 if event.isStopEvent { 0040 _cancel.dispose() 0041 } 0042 } 0043 0044 deinit { 0045 #if TRACE_RESOURCES 0046 AtomicDecrement(&resourceCount) 0047 #endif 0048 } 0049 } 0050 0051 class AmbSink
Amb.swift:19
    typealias Parent = AmbSink<ElementType, O>
Amb.swift:118
        let sink = AmbSink(parent: self, observer: observer)
<ElementType
Amb.swift:52
    typealias Parent = Amb<ElementType>
Amb.swift:53
    typealias AmbObserverType = AmbObserver<ElementType, O>
Amb.swift:71
        let forwardEvent = { (o: AmbObserverType, event: Event<ElementType>) -> Void in
Amb.swift:75
        let decide = { (o: AmbObserverType, event: Event<ElementType>, me: AmbState, otherSubscription: Disposable) in
, O
Amb.swift:51
class AmbSink<ElementType, O: ObserverType where O.E == ElementType> : Sink<O> {
Amb.swift:53
    typealias AmbObserverType = AmbObserver<ElementType, O>
Amb.swift:61
    init(parent: Parent, observer: O) {
: ObserverType where O.E == ElementType> : Sink<O> { 0052 typealias Parent
Amb.swift:55
    private let _parent: Parent
Amb.swift:61
    init(parent: Parent, observer: O) {
= Amb<ElementType> 0053 typealias AmbObserverType
Amb.swift:71
        let forwardEvent = { (o: AmbObserverType, event: Event<ElementType>) -> Void in
Amb.swift:75
        let decide = { (o: AmbObserverType, event: Event<ElementType>, me: AmbState, otherSubscription: Disposable) in
= AmbObserver<ElementType, O> 0054 0055 private let _parent
Amb.swift:62
        _parent = parent
Amb.swift:101
        subscription1.disposable = _parent._left.subscribe(sink1)
Amb.swift:102
        subscription2.disposable = _parent._right.subscribe(sink2)
: Parent 0056 0057 private let _lock
Amb.swift:76
            self._lock.performLocked {
= NSRecursiveLock() 0058 // state 0059 private var _choice
Amb.swift:77
                if self._choice == .Neither {
Amb.swift:78
                    self._choice = me
Amb.swift:84
                if self._choice == me {
= AmbState.Neither 0060 0061 init
Amb.swift:118
        let sink = AmbSink(parent: self, observer: observer)
(parent: Parent, observer: O) { 0062 _parent = parent 0063 super.init(observer: observer) 0064 } 0065 0066 func run
Amb.swift:119
        sink.disposable = sink.run()
() -> Disposable { 0067 let subscription1 = SingleAssignmentDisposable() 0068 let subscription2 = SingleAssignmentDisposable() 0069 let disposeAll = StableCompositeDisposable.create(subscription1, subscription2) 0070 0071 let forwardEvent = { (o: AmbObserverType, event: Event<ElementType>) -> Void in 0072 self.forwardOn(event) 0073 } 0074 0075 let decide = { (o: AmbObserverType, event: Event<ElementType>, me: AmbState, otherSubscription: Disposable) in 0076 self._lock.performLocked { 0077 if self._choice == .Neither { 0078 self._choice = me 0079 o._sink = forwardEvent 0080 o._cancel = disposeAll 0081 otherSubscription.dispose() 0082 } 0083 0084 if self._choice == me { 0085 self.forwardOn(event) 0086 if event.isStopEvent { 0087 self.dispose() 0088 } 0089 } 0090 } 0091 } 0092 0093 let sink1 = AmbObserver(parent: self, cancel: subscription1) { o, e in 0094 decide(o, e, .Left, subscription2) 0095 } 0096 0097 let sink2 = AmbObserver(parent: self, cancel: subscription1) { o, e in 0098 decide(o, e, .Right, subscription1) 0099 } 0100 0101 subscription1.disposable = _parent._left.subscribe(sink1) 0102 subscription2.disposable = _parent._right.subscribe(sink2) 0103 0104 return disposeAll 0105 } 0106 } 0107 0108 class Amb
Amb.swift:52
    typealias Parent = Amb<ElementType>
Observable+Multiple.swift:280
        return Amb(left: asObservable(), right: right.asObservable())
<Element
Amb.swift:108
class Amb<Element>: Producer<Element> {
Amb.swift:109
    private let _left: Observable<Element>
Amb.swift:110
    private let _right: Observable<Element>
Amb.swift:112
    init(left: Observable<Element>, right: Observable<Element>) {
Amb.swift:112
    init(left: Observable<Element>, right: Observable<Element>) {
Amb.swift:117
    override func run<O : ObserverType where O.E == Element>(observer: O) -> Disposable {
>: Producer<Element> { 0109 private let _left
Amb.swift:101
        subscription1.disposable = _parent._left.subscribe(sink1)
Amb.swift:113
        _left = left
: Observable<Element> 0110 private let _right
Amb.swift:102
        subscription2.disposable = _parent._right.subscribe(sink2)
Amb.swift:114
        _right = right
: Observable<Element> 0111 0112 init
Observable+Multiple.swift:280
        return Amb(left: asObservable(), right: right.asObservable())
(left: Observable<Element>, right: Observable<Element>) { 0113 _left = left 0114 _right = right 0115 } 0116 0117 override func run<O : ObserverType where O.E == Element>(observer: O) -> Disposable { 0118 let sink = AmbSink(parent: self, observer: observer) 0119 sink.disposable = sink.run() 0120 return sink 0121 } 0122 }