scan運算

/**
Applies an accumulator function over an
observable sequence and returns each
intermediate result. The specified seed value
is used as the initial accumulator value.
For aggregation behavior with no
intermediate results, see 'reduce'

see also: 'http://reactivex.io/documentation/operators/scan.html'
*/

圖片描述如下:

scan
extension ObservableType {
    public func scan<A>(seed: A, accumulator: (A, E) throws -> A)-> Observable<A> {
        return Scan(source: self.asObservable(), seed: seed, accumulator: accumulator)
    }
}


class Scan<Element, Accumulate>: Producer<Accumulate> {
    typealias Accumulator = (Accumulator, Element) throws -> Accumulate

    private let _source: Observable<Element>
    private let _seed: Accumulate
    private let _accumulator: Accumulator

    init(source: Observable<Element>, seed: Accumulate, accumulator: Accumulator) {
        _source = source
        _seed = seed
        _accumulator = accumulator
    }

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

class ScanSink<ElementType, Accumulate, O: ObserverType where O.E == Accumulate>: Sink<)>, ObserverType {
    typealias Parent = Scan<ElementType, Accumulate>
    typealias E = ElementType

    private let _parent: Parent
    private var _accumulate: Accumulate

    init(parent: Parent, observer: O) {
        _parent = parent
        _accumulate = parent._seed
        super.init(observer: observer)
    }

    func on(event: Event<ElementType>) {
        switch event {
        case .Next(let element):
            do {
                _accumulate = try _parent._accumulator(_accumulate, element)
                forwardOn(.Next(_accumulate))
            }catch let error {
                forwardOn(.Error(error))
                dispose()
            }
        case .Error(let error):
            forwardOn(.Error(error))
            dispose()
        case .Completed:
            forwardOn(.Completed)
            dispose()
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末是目,一起剝皮案震驚了整個濱河市蛉威,隨后出現(xiàn)的幾起案子地回,更是在濱河造成了極大的恐慌贱纠,老刑警劉巖甥绿,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機挨约,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來产雹,“玉大人诫惭,你說我怎么就攤上這事÷冢” “怎么了夕土?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瘟判。 經(jīng)常有香客問我怨绣,道長,這世上最難降的妖魔是什么荒适? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任梨熙,我火速辦了婚禮开镣,結(jié)果婚禮上刀诬,老公的妹妹穿的比我還像新娘。我一直安慰自己邪财,他們只是感情好陕壹,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著树埠,像睡著了一般糠馆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怎憋,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天又碌,我揣著相機與錄音九昧,去河邊找鬼。 笑死毕匀,一個胖子當著我的面吹牛铸鹰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播皂岔,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼蹋笼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了躁垛?” 一聲冷哼從身側(cè)響起剖毯,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎教馆,沒想到半個月后逊谋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡活玲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年涣狗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舒憾。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡镀钓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出镀迂,到底是詐尸還是另有隱情丁溅,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布探遵,位于F島的核電站窟赏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏箱季。R本人自食惡果不足惜涯穷,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望藏雏。 院中可真熱鬧拷况,春花似錦、人聲如沸掘殴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奏寨。三九已至起意,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間病瞳,已是汗流浹背揽咕。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工悲酷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亲善。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓舔涎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親逗爹。 傳聞我的和親對象是個殘疾皇子亡嫌,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,522評論 25 707
  • Android Studio目前已經(jīng)成為開發(fā)Android的主要工具,用熟了可謂相當順手掘而。作為開發(fā)者挟冠,調(diào)試并發(fā)現(xiàn)b...
    7d3fadbb4407閱讀 552評論 0 3
  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 13,677評論 0 15
  • 每個人的一生大概都要經(jīng)歷酸、甜袍睡、苦知染、辣。 在不同時間段斑胜,經(jīng)歷一種味道的生活或多種味道交織的生活控淡。 如果我的前28年...
    辛味閱讀 171評論 0 0
  • 敬畏生命,好似一個無比古老的話題止潘,卻可無止境地被提及掺炭。 前些天我又去醫(yī)院巡游了一圈,無意碰見一個剛手術(shù)完正送往病...
    胡楊柳子閱讀 406評論 0 5