From 40abfcf4b5212cc4545c1ca08dfeb84c7e13e98c Mon Sep 17 00:00:00 2001 From: Krunoslav Zaher Date: Thu, 13 Aug 2015 23:24:28 +0200 Subject: [PATCH] `trySend` to `?.on` and cleanup for `tap` --- CHANGELOG.md | 1 + Rx.xcworkspace/contents.xcworkspacedata | 3 ++ .../Observables/Implementations/Do.swift | 29 +++++++------- .../Observables/Observable+Single.swift | 13 ++----- .../Tests/Observable+MultipleTest.swift | 4 +- .../Tests/Observable+SingleTest.swift | 38 +++++++++++++++---- 6 files changed, 55 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7c69173..d8173878 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,5 +11,6 @@ All notable changes to this project will be documented in this file. * Moved from using `>-` operator to protocol extensions * Change from `disposeBag.addDisposable` to `disposable.addDisposableTo` * Changes in RxCocoa extensions to enable fluent style +* Rename of `do*` to `tap*` ####Fixed diff --git a/Rx.xcworkspace/contents.xcworkspacedata b/Rx.xcworkspace/contents.xcworkspacedata index 92bb55e5..66596050 100644 --- a/Rx.xcworkspace/contents.xcworkspacedata +++ b/Rx.xcworkspace/contents.xcworkspacedata @@ -7,6 +7,9 @@ + + diff --git a/RxSwift/RxSwift/Observables/Implementations/Do.swift b/RxSwift/RxSwift/Observables/Implementations/Do.swift index e28a5360..2ac8a4f6 100644 --- a/RxSwift/RxSwift/Observables/Implementations/Do.swift +++ b/RxSwift/RxSwift/Observables/Implementations/Do.swift @@ -8,35 +8,34 @@ import Foundation -class Do_ : Sink, ObserverType { +class TapSink : Sink, ObserverType { typealias Element = O.Element - typealias DoType = Do + typealias Parent = Tap - let parent: DoType + let parent: Parent - init(parent: DoType, observer: O, cancel: Disposable) { + init(parent: Parent, observer: O, cancel: Disposable) { self.parent = parent super.init(observer: observer, cancel: cancel) } func on(event: Event) { - parent.eventHandler(event).recoverWith { error in - // catch clause - trySendError(observer, error) - self.dispose() - return SuccessResult - }.flatMap { _ -> RxResult in - trySend(observer, event) + do { + try parent.eventHandler(event) + observer?.on(event) if event.isStopEvent { self.dispose() } - return SuccessResult + } + catch let error { + observer?.on(.Error(error)) + self.dispose() } } } -class Do : Producer { - typealias EventHandler = Event -> RxResult +class Tap : Producer { + typealias EventHandler = Event throws -> Void let source: Observable let eventHandler: EventHandler @@ -47,7 +46,7 @@ class Do : Producer { } override func run(observer: O, cancel: Disposable, setSink: (Disposable) -> Void) -> Disposable { - let sink = Do_(parent: self, observer: observer, cancel: cancel) + let sink = TapSink(parent: self, observer: observer, cancel: cancel) setSink(sink) diff --git a/RxSwift/RxSwift/Observables/Observable+Single.swift b/RxSwift/RxSwift/Observables/Observable+Single.swift index 539c6463..f4e476d3 100644 --- a/RxSwift/RxSwift/Observables/Observable+Single.swift +++ b/RxSwift/RxSwift/Observables/Observable+Single.swift @@ -65,23 +65,18 @@ extension ObservableType { // do extension ObservableType { - public func doOrDie(eventHandler: (Event) -> RxResult) + public func tap(eventHandler: (Event) throws -> Void) -> Observable { - return Do(source: self.normalize(), eventHandler: eventHandler) - } - - public func `do`(eventHandler: (Event) -> Void) - -> Observable { - return Do(source: self.normalize(), eventHandler: { success(eventHandler($0)) }) + return Tap(source: self.normalize(), eventHandler: eventHandler) } } // doOnNext extension ObservableType { - public func doOnNext(actionOnNext: E -> Void) + public func tapOnNext(actionOnNext: E -> Void) -> Observable { - return self.`do` { event in + return self.tap { event in switch event { case .Next(let value): actionOnNext(value) diff --git a/RxTests/RxSwiftTests/Tests/Observable+MultipleTest.swift b/RxTests/RxSwiftTests/Tests/Observable+MultipleTest.swift index bd5adb47..2edc98ea 100644 --- a/RxTests/RxSwiftTests/Tests/Observable+MultipleTest.swift +++ b/RxTests/RxSwiftTests/Tests/Observable+MultipleTest.swift @@ -2520,7 +2520,7 @@ extension ObservableMultipleTest { var sourceNotDisposed = false let res = scheduler.start { - l .`do` { _ in sourceNotDisposed = true } .takeUntil(r) + l .tap { _ in sourceNotDisposed = true } .takeUntil(r) } XCTAssertEqual(res.messages, [ @@ -2548,7 +2548,7 @@ extension ObservableMultipleTest { var sourceNotDisposed = false let res = scheduler.start { - l .takeUntil(r .`do` { _ in sourceNotDisposed = true }) + l .takeUntil(r .tap { _ in sourceNotDisposed = true }) } XCTAssertEqual(res.messages, [ diff --git a/RxTests/RxSwiftTests/Tests/Observable+SingleTest.swift b/RxTests/RxSwiftTests/Tests/Observable+SingleTest.swift index 6b3f751a..68eed207 100644 --- a/RxTests/RxSwiftTests/Tests/Observable+SingleTest.swift +++ b/RxTests/RxSwiftTests/Tests/Observable+SingleTest.swift @@ -288,7 +288,7 @@ extension ObservableSingleTest { var i = 0 var sum = 2 + 3 + 4 + 5 - let res = scheduler.start { xs.`do` { e in + let res = scheduler.start { xs.tap { e in switch e { case .Next(let _): i++ @@ -331,7 +331,7 @@ extension ObservableSingleTest { ]) var i = 0 - let res = scheduler.start { xs.`do` { e in + let res = scheduler.start { xs.tap { e in switch e { case .Next(_): i++ @@ -373,7 +373,7 @@ extension ObservableSingleTest { var i = 0 var sum = 2 + 3 + 4 + 5 var completedEvaluation = false - let res = scheduler.start { xs.`do` { e in + let res = scheduler.start { xs.tap { e in switch e { case .Next(let value): i++ @@ -415,7 +415,7 @@ extension ObservableSingleTest { var i = 0 var completedEvaluation = false - let res = scheduler.start { xs.`do` { e in + let res = scheduler.start { xs.tap { e in switch e { case .Next(_): i++ @@ -455,7 +455,7 @@ extension ObservableSingleTest { var i = 0 var sum = 2 + 3 + 4 + 5 var sawError = false - let res = scheduler.start { xs.`do` { e in + let res = scheduler.start { xs.tap { e in switch e { case .Next(let value): i++ @@ -502,7 +502,7 @@ extension ObservableSingleTest { var i = 0 var sum = 2 + 3 + 4 + 5 var sawError = false - let res = scheduler.start { xs.`do` { e in + let res = scheduler.start { xs.tap { e in switch e { case .Next(let value): i++ @@ -534,7 +534,31 @@ extension ObservableSingleTest { XCTAssertEqual(xs.subscriptions, correctSubscriptions) } - // ... + func testDo_Throws() { + let scheduler = TestScheduler(initialClock: 0) + + let xs = scheduler.createHotObservable([ + next(150, 1), + next(210, 2), + completed(250) + ]) + + let res = scheduler.start { xs.tap { _ in + throw testError + } + } + + let correctMessages = [ + error(210, testError) as Recorded + ] + + let correctSubscriptions = [ + Subscription(200, 210) + ] + + XCTAssertEqual(res.messages, correctMessages) + XCTAssertEqual(xs.subscriptions, correctSubscriptions) + } } // retry