美文网首页
zip2运算

zip2运算

作者: 幸运的小强本人 | 来源:发表于2016-03-12 19:03 被阅读10次

class Zip2<E1, E2, R> : Producer<R> {
typealias ResultSelector = (E1, E2) throws ->R

    let source1 = Observable<E1>
    let source2 = Observable<E2>

    let _resultSelector: ResultSelector

    init(source1: Observable<E1>, source2: Observable<E2>, resultSelector: ResultSelector) {
        self.source1 = source1
        self.source2 = source2

        _resultSelector = resultSelector
    }

    override func run<O: ObserverType where O.E == R>(observer: O)-> Disposable {
        let sink = ZipSink2_(parent: self, observer: observer)
        sink.disposable = sink.run()
        return sink
    }
}

class ZipSink2_<E1, E2, O: ObserverType> : ZipSink<O> {
    typealias R = O.E
    typealias Parent = Zip2<E1, E2, R>

    let _parent: Parent

    var _values1: Queue<E1> = Queue(capacity: 2)
    var _values2: Queue<E2> = Queue(capacity: 2)

    init(parent: Parent, observer: O) {
        _parent = parent
        super.init(arity: 2, observer: observer)
    }

    override func hasElements(index: Int)->Bool {
        switch(index) {
        case 0: return _values1.count > 0
        case 1: return _values2.count > 0

        default:
            rxFatalError("Unhandled case (Function)")
        }

        return false
    }

    func run()->Disposable {
        let subscription1 = SingleAssignmentDisposable()
        let subscription2 = SingleAssignmentDisposable()

        let observer1 = ZipObserver(lock: _lock, parent: self, index: 0, setNextValue: { self._values1.enqueue($0) }, this: subscription)
        let observer2 = ZipObserver(lock: _lock, parent: self, index: 1, setNextValue: {self._values2.enqueue($0) }, this: subscription2)

        subscription1.disposable = _parent.source1.subscribe(observer)
        subscription2.disposable = _parent.subscribe(observer)

        return CompositeDisposable(disposables: [
            subscription1,
            subscription2
        ])
    }

    override func getResult() throws->R {
        return try _parent._resultSelector(_values1.dequeue()!, _values2.dequeue()!)
    }
}

extension Observable {
    /**
    Merges the specified observable sequences into 
    one observable sequence by using the selector 
    function whenever all of the observable sequence 
    have producted an element at a corresponding index.

    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.
    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.
    */
    @warn_unused_result(message="http://git.io/rxs.uo")
    public static funczip<01: ObservableType, 02: ObservableType>(source1: 01, _ source2: 02, resultSelector: (01.E, 02.E) throws ->E)->Observable<E> {
        return Zip2(
            source1: source1.asObservable(), source2: source2.asObservable(), resultSelector: resultSelector
        )
    }
}

相关文章

  • zip2运算

    class Zip2 : Producer {typealias ResultSele...

  • windows安装mysql

    1、下载zip2、解压到D:,改名为D:\mysql ,创建D:\mydata\,把D:\mysql\data复...

  • Elon Musk Chapter 5--Paypal Mafi

    一. 本章感悟: 善于发现商机,行动力非常强 Zip2卖掉之后,27岁的Musk成为了...

  • 思维模型 | 002 - 第一性原理

    Why Elon Musk创办了好几家非常棒的公司: 互联网公司zip2;支付工具PayPal;特斯拉电动汽车;太...

  • 2、Swift 基础运算

    赋值运算 算数运算 余数运算 一元加减法运算 混合赋值运算 比较运算 三元运算 空合运算符 范围运算 逻辑运算

  • Python 入门之常用运算符

    Python中的运算按种类可分为算数运算、比较运算、逻辑运算、赋值运算、成员运算、身份运算、位运算 1、常用运算符...

  • 黑猴子的家:Python 数据运算

    1、算术运算 2、比较运算 3、赋值运算 4、逻辑运算 5、成员运算 6、身份运算 7、位运算 code 8、运算...

  • 运算 & 运算符

    运算 & 运算符 算术运算 比较运算 比较运算的结果为bool值 赋值运算 逻辑运算 位运算 二进制的运算 身份检...

  • 2019-07-23

    R中的基本运算包括:算术运算、关系运算、逻辑运算、赋值运算以及其他运算。 算术运算:四则运算(+,-,*, /),...

  • 硅谷钢铁侠,埃隆马斯克读后总结

    1、取得的成绩 创立了Zip2 、Paypal、SpaceX、特斯拉、太阳城 2、取得成绩的意义 如果埃隆马斯克没...

网友评论

      本文标题:zip2运算

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