0001 // 0002 // Zip+CollectionType.swift 0003 // Rx 0004 // 0005 // Created by Krunoslav Zaher on 8/30/15. 0006 // Copyright © 2015 Krunoslav Zaher. All rights reserved. 0007 // 0008 0009 import Foundation 0010 0011 class ZipCollectionTypeSink<C
Zip+CollectionType.swift:133 let sink = ZipCollectionTypeSink(parent: self, observer: observer): CollectionType, R
Zip+CollectionType.swift:13 typealias Parent = ZipCollectionType<C, R>Zip+CollectionType.swift:14 typealias SourceElement = C.Generator.Element.E, O
Zip+CollectionType.swift:13 typealias Parent = ZipCollectionType<C, R>: ObserverType where C.Generator.Element : ObservableConvertibleType, O.E == R> 0012 : Sink<O> { 0013 typealias Parent
Zip+CollectionType.swift:12 : Sink<O> {Zip+CollectionType.swift:27 init(parent: Parent, observer: O) {= ZipCollectionType<C, R> 0014 typealias SourceElement
Zip+CollectionType.swift:16 private let _parent: ParentZip+CollectionType.swift:27 init(parent: Parent, observer: O) {= C.Generator.Element.E 0015 0016 private let _parent
Zip+CollectionType.swift:22 private var _values: [Queue<SourceElement>]Zip+CollectionType.swift:29 _values = [Queue<SourceElement>](count: parent.count, repeatedValue: Queue(capacity: 4))Zip+CollectionType.swift:41 func on(event: Event<SourceElement>, atIndex: Int) {Zip+CollectionType.swift:61 var arguments = [SourceElement](): Parent 0017 0018 private let _lock
Zip+CollectionType.swift:28 _parent = parentZip+CollectionType.swift:51 if _numberOfValues < _parent.count {Zip+CollectionType.swift:53 if numberOfOthersThatAreDone == _parent.count - 1 {Zip+CollectionType.swift:62 arguments.reserveCapacity(_parent.count)Zip+CollectionType.swift:74 let result = try _parent.resultSelector(arguments)Zip+CollectionType.swift:93 if _numberOfDone == _parent.count {Zip+CollectionType.swift:106 for i in _parent.sources.startIndex ..< _parent.sources.endIndex {Zip+CollectionType.swift:106 for i in _parent.sources.startIndex ..< _parent.sources.endIndex {Zip+CollectionType.swift:108 let source = _parent.sources[i].asObservable()= NSRecursiveLock() 0019 0020 // state 0021 private var _numberOfValues
Zip+CollectionType.swift:42 _lock.lock(); defer { _lock.unlock() } // {Zip+CollectionType.swift:42 _lock.lock(); defer { _lock.unlock() } // {= 0 0022 private var _values
Zip+CollectionType.swift:48 _numberOfValues += 1Zip+CollectionType.swift:51 if _numberOfValues < _parent.count {Zip+CollectionType.swift:65 _numberOfValues = 0Zip+CollectionType.swift:70 _numberOfValues += 1: [Queue<SourceElement>] 0023 private var _isDone
Zip+CollectionType.swift:29 _values = [Queue<SourceElement>](count: parent.count, repeatedValue: Queue(capacity: 4))Zip+CollectionType.swift:45 _values[atIndex].enqueue(element)Zip+CollectionType.swift:47 if _values[atIndex].count == 1 {Zip+CollectionType.swift:67 for i in 0 ..< _values.count {Zip+CollectionType.swift:68 arguments.append(_values[i].dequeue()!)Zip+CollectionType.swift:69 if _values[i].count > 0 {: [Bool] 0024 private var _numberOfDone
Zip+CollectionType.swift:30 _isDone = [Bool](count: parent.count, repeatedValue: false)Zip+CollectionType.swift:52 let numberOfOthersThatAreDone = _numberOfDone - (_isDone[atIndex] ? 1 : 0)Zip+CollectionType.swift:86 if _isDone[atIndex] {Zip+CollectionType.swift:90 _isDone[atIndex] = true= 0 0025 private var _subscriptions
Zip+CollectionType.swift:52 let numberOfOthersThatAreDone = _numberOfDone - (_isDone[atIndex] ? 1 : 0)Zip+CollectionType.swift:91 _numberOfDone += 1Zip+CollectionType.swift:93 if _numberOfDone == _parent.count {: [SingleAssignmentDisposable] 0026 0027 init
Zip+CollectionType.swift:31 _subscriptions = Array<SingleAssignmentDisposable>()Zip+CollectionType.swift:32 _subscriptions.reserveCapacity(parent.count)Zip+CollectionType.swift:35 _subscriptions.append(SingleAssignmentDisposable())Zip+CollectionType.swift:98 _subscriptions[atIndex].dispose()Zip+CollectionType.swift:109 _subscriptions[j].disposable = source.subscribe(AnyObserver { event inZip+CollectionType.swift:115 return CompositeDisposable(disposables: _subscriptions.map { $0 })(parent: Parent, observer: O) { 0028 _parent = parent 0029 _values = [Queue<SourceElement>](count: parent.count, repeatedValue: Queue(capacity: 4)) 0030 _isDone = [Bool](count: parent.count, repeatedValue: false) 0031 _subscriptions = Array<SingleAssignmentDisposable>() 0032 _subscriptions.reserveCapacity(parent.count) 0033 0034 for _ in 0 ..< parent.count { 0035 _subscriptions.append(SingleAssignmentDisposable()) 0036 } 0037 0038 super.init(observer: observer) 0039 } 0040 0041 func on
Zip+CollectionType.swift:133 let sink = ZipCollectionTypeSink(parent: self, observer: observer)(event: Event<SourceElement>, atIndex: Int) { 0042 _lock.lock(); defer { _lock.unlock() } // { 0043 switch event { 0044 case .Next(let element): 0045 _values[atIndex].enqueue(element) 0046 0047 if _values[atIndex].count == 1 { 0048 _numberOfValues += 1 0049 } 0050 0051 if _numberOfValues < _parent.count { 0052 let numberOfOthersThatAreDone = _numberOfDone - (_isDone[atIndex] ? 1 : 0) 0053 if numberOfOthersThatAreDone == _parent.count - 1 { 0054 self.forwardOn(.Completed) 0055 self.dispose() 0056 } 0057 return 0058 } 0059 0060 do { 0061 var arguments = [SourceElement]() 0062 arguments.reserveCapacity(_parent.count) 0063 0064 // recalculate number of values 0065 _numberOfValues = 0 0066 0067 for i in 0 ..< _values.count { 0068 arguments.append(_values[i].dequeue()!) 0069 if _values[i].count > 0 { 0070 _numberOfValues += 1 0071 } 0072 } 0073 0074 let result = try _parent.resultSelector(arguments) 0075 self.forwardOn(.Next(result)) 0076 } 0077 catch let error { 0078 self.forwardOn(.Error(error)) 0079 self.dispose() 0080 } 0081 0082 case .Error(let error): 0083 self.forwardOn(.Error(error)) 0084 self.dispose() 0085 case .Completed: 0086 if _isDone[atIndex] { 0087 return 0088 } 0089 0090 _isDone[atIndex] = true 0091 _numberOfDone += 1 0092 0093 if _numberOfDone == _parent.count { 0094 self.forwardOn(.Completed) 0095 self.dispose() 0096 } 0097 else { 0098 _subscriptions[atIndex].dispose() 0099 } 0100 } 0101 // } 0102 } 0103 0104 func run
Zip+CollectionType.swift:110 self.on(event, atIndex: index)() -> Disposable { 0105 var j = 0 0106 for i in _parent.sources.startIndex ..< _parent.sources.endIndex { 0107 let index = j 0108 let source = _parent.sources[i].asObservable() 0109 _subscriptions[j].disposable = source.subscribe(AnyObserver { event in 0110 self.on(event, atIndex: index) 0111 }) 0112 j += 1 0113 } 0114 0115 return CompositeDisposable(disposables: _subscriptions.map { $0 }) 0116 } 0117 } 0118 0119 class ZipCollectionType
Zip+CollectionType.swift:134 sink.disposable = sink.run()<C
Observable+Multiple.swift:43 return ZipCollectionType(sources: self, resultSelector: resultSelector)Zip+CollectionType.swift:13 typealias Parent = ZipCollectionType<C, R>: CollectionType, R
Zip+CollectionType.swift:120 typealias ResultSelector = [C.Generator.Element.E] throws -> RZip+CollectionType.swift:122 let sources: CZip+CollectionType.swift:126 init(sources: C, resultSelector: ResultSelector) {where C.Generator.Element : ObservableConvertibleType> : Producer<R> { 0120 typealias ResultSelector
Zip+CollectionType.swift:119 class ZipCollectionType<C: CollectionType, R where C.Generator.Element : ObservableConvertibleType> : Producer<R> {Zip+CollectionType.swift:120 typealias ResultSelector = [C.Generator.Element.E] throws -> RZip+CollectionType.swift:132 override func run<O : ObserverType where O.E == R>(observer: O) -> Disposable {= [C.Generator.Element.E] throws -> R 0121 0122 let sources
Zip+CollectionType.swift:123 let resultSelector: ResultSelectorZip+CollectionType.swift:126 init(sources: C, resultSelector: ResultSelector) {: C 0123 let resultSelector
Zip+CollectionType.swift:106 for i in _parent.sources.startIndex ..< _parent.sources.endIndex {Zip+CollectionType.swift:106 for i in _parent.sources.startIndex ..< _parent.sources.endIndex {Zip+CollectionType.swift:108 let source = _parent.sources[i].asObservable()Zip+CollectionType.swift:127 self.sources = sourcesZip+CollectionType.swift:129 self.count = Int(self.sources.count.toIntMax()): ResultSelector 0124 let count
Zip+CollectionType.swift:74 let result = try _parent.resultSelector(arguments)Zip+CollectionType.swift:128 self.resultSelector = resultSelector: Int 0125 0126 init
Zip+CollectionType.swift:29 _values = [Queue<SourceElement>](count: parent.count, repeatedValue: Queue(capacity: 4))Zip+CollectionType.swift:30 _isDone = [Bool](count: parent.count, repeatedValue: false)Zip+CollectionType.swift:32 _subscriptions.reserveCapacity(parent.count)Zip+CollectionType.swift:34 for _ in 0 ..< parent.count {Zip+CollectionType.swift:51 if _numberOfValues < _parent.count {Zip+CollectionType.swift:53 if numberOfOthersThatAreDone == _parent.count - 1 {Zip+CollectionType.swift:62 arguments.reserveCapacity(_parent.count)Zip+CollectionType.swift:93 if _numberOfDone == _parent.count {Zip+CollectionType.swift:129 self.count = Int(self.sources.count.toIntMax())(sources: C, resultSelector: ResultSelector) { 0127 self.sources = sources 0128 self.resultSelector = resultSelector 0129 self.count = Int(self.sources.count.toIntMax()) 0130 } 0131 0132 override func run<O : ObserverType where O.E == R>(observer: O) -> Disposable { 0133 let sink = ZipCollectionTypeSink(parent: self, observer: observer) 0134 sink.disposable = sink.run() 0135 return sink 0136 } 0137 } 0138
Observable+Multiple.swift:43 return ZipCollectionType(sources: self, resultSelector: resultSelector)