美文网首页
zip6运算

zip6运算

作者: 幸运的小强本人 | 来源:发表于2016-03-12 19:51 被阅读23次
    extension Observable {
        public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType>
        (source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E)
        -> Observable<E> {
            return Zip6(
                source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(),
                resultSelector: resultSelector
            )
        }
    }
    
    class ZipSink6_<E1, E2, E3, E4, E5, E6, O: ObserverType> : ZipSink<O> {
        typealias R = O.E
        typealias Parent = Zip6<E1, E2, E3, E4, E5, E6, R>
    
        let _parent: Parent
    
        var _values1: Queue<E1> = Queue(capacity: 2)
        var _values2: Queue<E2> = Queue(capacity: 2)
        var _values3: Queue<E3> = Queue(capacity: 2)
        var _values4: Queue<E4> = Queue(capacity: 2)
        var _values5: Queue<E5> = Queue(capacity: 2)
        var _values6: Queue<E6> = Queue(capacity: 2)
    
        init(parent: Parent, observer: O) {
            _parent = parent
            super.init(arity: 6, observer: observer)
        }
    
        override func hasElements(index: Int) -> Bool {
            switch (index) {
            case 0: return _values1.count > 0
            case 1: return _values2.count > 0
            case 2: return _values3.count > 0
            case 3: return _values4.count > 0
            case 4: return _values5.count > 0
            case 5: return _values6.count > 0
    
            default:
                rxFatalError("Unhandled case (Function)")
            }
    
            return false
        }
    
        func run() -> Disposable {
            let subscription1 = SingleAssignmentDisposable()
            let subscription2 = SingleAssignmentDisposable()
            let subscription3 = SingleAssignmentDisposable()
            let subscription4 = SingleAssignmentDisposable()
            let subscription5 = SingleAssignmentDisposable()
            let subscription6 = SingleAssignmentDisposable()
    
            let observer1 = ZipObserver(lock: _lock, parent: self, index: 0, setNextValue: { self._values1.enqueue($0) }, this: subscription1)
            let observer2 = ZipObserver(lock: _lock, parent: self, index: 1, setNextValue: { self._values2.enqueue($0) }, this: subscription2)
            let observer3 = ZipObserver(lock: _lock, parent: self, index: 2, setNextValue: { self._values3.enqueue($0) }, this: subscription3)
            let observer4 = ZipObserver(lock: _lock, parent: self, index: 3, setNextValue: { self._values4.enqueue($0) }, this: subscription4)
            let observer5 = ZipObserver(lock: _lock, parent: self, index: 4, setNextValue: { self._values5.enqueue($0) }, this: subscription5)
            let observer6 = ZipObserver(lock: _lock, parent: self, index: 5, setNextValue: { self._values6.enqueue($0) }, this: subscription6)
    
            subscription1.disposable = _parent.source1.subscribe(observer1)
            subscription2.disposable = _parent.source2.subscribe(observer2)
            subscription3.disposable = _parent.source3.subscribe(observer3)
           subscription4.disposable = _parent.source4.subscribe(observer4)
            subscription5.disposable = _parent.source5.subscribe(observer5)
            subscription6.disposable = _parent.source6.subscribe(observer6)
    
            return CompositeDisposable(disposables: [
               subscription1,
               subscription2,
               subscription3,
               subscription4,
               subscription5,
               subscription6
            ])
        }
    
        override func getResult() throws -> R {
            return try _parent._resultSelector(_values1.dequeue()!, _values2.dequeue()!, _values3.dequeue()!, _values4.dequeue()!, _values5.dequeue()!, _values6.dequeue()!)
        }
    }
    
    class Zip6<E1, E2, E3, E4, E5, E6, R> : Producer<R> {
        typealias ResultSelector = (E1, E2, E3, E4, E5, E6) throws -> R
    
        let source1: Observable<E1>
        let source2: Observable<E2>
        let source3: Observable<E3>
        let source4: Observable<E4>
        let source5: Observable<E5>
        let source6: Observable<E6>
    
        let _resultSelector: ResultSelector
    
        init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, source5: Observable<E5>, source6: Observable<E6>, resultSelector: ResultSelector) {
            self.source1 = source1
            self.source2 = source2
            self.source3 = source3
            self.source4 = source4
            self.source5 = source5
            self.source6 = source6
    
            _resultSelector = resultSelector
        }
    
        override func run<O: ObserverType where O.E == R>(observer: O) -> Disposable {
            let sink = ZipSink6_(parent: self, observer: observer)
            sink.disposable = sink.run()
            return sink
        }
    }

    相关文章

      网友评论

          本文标题:zip6运算

          本文链接:https://www.haomeiwen.com/subject/uovxlttx.html