0001
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 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 }