From 61e8e33cd7fdc9a1daee9b5607655729c3df8ce2 Mon Sep 17 00:00:00 2001 From: Junior B Date: Fri, 23 Oct 2015 11:03:39 +0200 Subject: [PATCH] Improves `elementAt` to be platform consistent --- .../Observables/Implementations/ElementAt.swift | 15 +++++++++++++-- .../Observable+StandardSequenceOperators.swift | 2 +- RxSwift/Rx.swift | 9 +++++++++ ...Observable+StandardSequenceOperatorsTest.swift | 2 +- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/RxSwift/Observables/Implementations/ElementAt.swift b/RxSwift/Observables/Implementations/ElementAt.swift index a5772062..bfc1d8d7 100644 --- a/RxSwift/Observables/Implementations/ElementAt.swift +++ b/RxSwift/Observables/Implementations/ElementAt.swift @@ -26,13 +26,24 @@ class ElementAtSink : Sink< switch event { case .Next(_): + if i < 0 { + rxFatalError("index can't be negative") + } + if (i == 0) { observer?.on(event) observer?.on(.Completed) self.dispose() } - - i-- + + do { + try decrementChecked(&i) + } catch(let e) { + observer?.onError(e) + dispose() + return + } + case .Error(let e): observer?.on(.Error(e)) self.dispose() diff --git a/RxSwift/Observables/Observable+StandardSequenceOperators.swift b/RxSwift/Observables/Observable+StandardSequenceOperators.swift index ffc78908..fadccece 100644 --- a/RxSwift/Observables/Observable+StandardSequenceOperators.swift +++ b/RxSwift/Observables/Observable+StandardSequenceOperators.swift @@ -194,6 +194,6 @@ extension ObservableType { @warn_unused_result(message="http://git.io/rxs.uo") public func elementAt(index: Int) -> Observable { - return ElementAt(source: self.asObservable(), index: index, throwOnEmpty: false) + return ElementAt(source: self.asObservable(), index: index, throwOnEmpty: true) } } \ No newline at end of file diff --git a/RxSwift/Rx.swift b/RxSwift/Rx.swift index 90598ec3..4621c980 100644 --- a/RxSwift/Rx.swift +++ b/RxSwift/Rx.swift @@ -37,6 +37,15 @@ func incrementChecked(inout i: Int) throws -> Int { return result } +func decrementChecked(inout i: Int) throws -> Int { + if i == Int.min { + throw RxError.OverflowError + } + let result = i + i -= 1 + return result +} + extension NSObject { func rx_synchronized(@noescape action: () -> T) -> T { objc_sync_enter(self) diff --git a/RxTests/RxSwiftTests/Tests/Observable+StandardSequenceOperatorsTest.swift b/RxTests/RxSwiftTests/Tests/Observable+StandardSequenceOperatorsTest.swift index fe9f0b0c..ecdc305c 100644 --- a/RxTests/RxSwiftTests/Tests/Observable+StandardSequenceOperatorsTest.swift +++ b/RxTests/RxSwiftTests/Tests/Observable+StandardSequenceOperatorsTest.swift @@ -3708,7 +3708,7 @@ extension ObservableStandardSequenceOperators { } XCTAssertEqual(res.messages, [ - completed(320) + error(320, RxError.ArgumentOutOfRange) ]) XCTAssertEqual(xs.subscriptions, [