Skip to content

Commit 841edc2

Browse files
M0rtyMerrfreak4pc
authored andcommitted
Add apply for Single, Maybe & Completable (#222)
1 parent 4e7e443 commit 841edc2

File tree

3 files changed

+80
-53
lines changed

3 files changed

+80
-53
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Changelog
77
- `once` now uses a `NSRecursiveLock` instead of the deprecated `OSAtomicOr32OrigBarrier`
88
- added `merge(with:)` for `Observable`
99
- removed `flatMapSync` operator
10+
- added `apply` for `Completable` and `Maybe`
1011
- added `mapTo` for `Single` and `Maybe`
1112
- added SPM support
1213

Source/RxSwift/apply.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ extension ObservableType {
1616
}
1717
}
1818

19-
extension PrimitiveSequenceType where Trait == SingleTrait {
20-
/// Apply a transformation function to the Single.
21-
public func apply<T>(_ transform: (Single<Element>) -> Single<T>) -> Single<T> {
19+
extension PrimitiveSequenceType {
20+
/// Apply a transformation function to the primitive sequence.
21+
public func apply<Result>(_ transform: (PrimitiveSequence<Trait, Element>) -> PrimitiveSequence<Trait, Result>)
22+
-> PrimitiveSequence<Trait, Result> {
2223
return transform(self.primitiveSequence)
2324
}
2425
}

Tests/RxSwift/applyTests.swift

Lines changed: 75 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,12 @@ import RxTest
1414

1515
class ApplyTests: XCTestCase {
1616

17-
override func setUp() {
18-
super.setUp()
19-
// Put setup code here. This method is called before the invocation of each test method in the class.
20-
}
21-
22-
override func tearDown() {
23-
// Put teardown code here. This method is called after the invocation of each test method in the class.
24-
super.tearDown()
25-
}
26-
2717
func transform(input: Observable<Int>) -> Observable<Int> {
2818
return input
2919
.filter { $0 > 0 }
3020
.map { $0 * $0 }
3121
}
3222

33-
private func transform(input: Single<Int>) -> Single<Int> {
34-
return input.map { $0 * $0 }
35-
}
36-
3723
func testApply() {
3824
let values = [0, 42, -7, 100, 1000, 1]
3925

@@ -57,36 +43,12 @@ class ApplyTests: XCTestCase {
5743
XCTAssertEqual(observer.events, correct)
5844
}
5945

60-
func testApplySingle() {
61-
let value = 10
62-
let scheduler = TestScheduler(initialClock: 0)
63-
let observer = scheduler.createObserver(Int.self)
64-
65-
_ = Single.just(value)
66-
.apply(transform)
67-
.asObservable()
68-
.subscribe(observer)
69-
70-
scheduler.start()
71-
72-
let correct = Recorded.events([
73-
.next(0, 10*10),
74-
.completed(0)
75-
])
76-
77-
XCTAssertEqual(observer.events, correct)
78-
}
79-
8046
func transformToString(input: Observable<Int>) -> Observable<String> {
8147
return input
8248
.distinctUntilChanged()
8349
.map { String(describing: $0) }
8450
}
8551

86-
func transformToString(input: Single<Int>) -> Single<String> {
87-
return input.map(String.init)
88-
}
89-
9052
func testApplyTransformingType() {
9153
let values = [0, 0, 42, 42, -7, 100, 1000, 1, 1]
9254

@@ -111,25 +73,88 @@ class ApplyTests: XCTestCase {
11173

11274
XCTAssertEqual(observer.events, correct)
11375
}
76+
}
77+
78+
// MARK: - Single
79+
extension ApplyTests {
80+
private func transformToString(input: Single<Int>) -> Single<String> {
81+
return input.map(String.init)
82+
}
83+
84+
private func transform(input: Single<Int>) -> Single<Int> {
85+
return input.map { $0 * $0 }
86+
}
87+
88+
func testApplySingle() {
89+
// Given
90+
let value = 10
91+
let scheduler = TestScheduler(initialClock: 0)
92+
// When
93+
let result = scheduler.start {
94+
Single.just(value).apply(self.transform).asObservable()
95+
}
96+
// Then
97+
let correct = Recorded.events([
98+
.next(TestScheduler.Defaults.subscribed, 10 * 10),
99+
.completed(TestScheduler.Defaults.subscribed)
100+
])
101+
XCTAssertEqual(result.events, correct)
102+
}
114103

115104
func testApplyTransformingTypeSingle() {
105+
// Given
116106
let value = -7
117-
118107
let scheduler = TestScheduler(initialClock: 0)
119-
let observer = scheduler.createObserver(String.self)
108+
// When
109+
let result = scheduler.start {
110+
Single.just(value).apply(self.transformToString).asObservable()
111+
}
112+
let correct = Recorded.events([
113+
.next(TestScheduler.Defaults.subscribed, "-7"),
114+
.completed(TestScheduler.Defaults.subscribed)
115+
])
116+
XCTAssertEqual(result.events, correct)
117+
}
118+
}
120119

121-
_ = Single.just(value)
122-
.apply(transformToString)
123-
.asObservable()
124-
.subscribe(observer)
120+
// MARK: - Maybe
121+
extension ApplyTests {
122+
private func transform(input: Maybe<Int>) -> Maybe<Int> {
123+
return input.map { $0 * $0 }
124+
}
125125

126-
scheduler.start()
126+
func testApplyMaybe() {
127+
// Given
128+
let value = 10
129+
let scheduler = TestScheduler(initialClock: 0)
130+
// When
131+
let result = scheduler.start {
132+
Maybe.just(value).apply(self.transform).asObservable()
133+
}
134+
// Then
135+
XCTAssertEqual(result.events, Recorded.events([
136+
.next(TestScheduler.Defaults.subscribed, value * value),
137+
.completed(TestScheduler.Defaults.subscribed)
138+
]))
139+
}
140+
}
127141

128-
let correct = Recorded.events([
129-
.next(0, "-7"),
130-
.completed(0)
131-
])
142+
// MARK: - Completable
143+
extension ApplyTests {
144+
private func transform(input: Completable) -> Completable {
145+
return input.do(onError: { print($0) })
146+
}
132147

133-
XCTAssertEqual(observer.events, correct)
148+
func testApplyCompletable() {
149+
// Given
150+
let scheduler = TestScheduler(initialClock: 0)
151+
// When
152+
let result = scheduler.start {
153+
Observable.just(1).ignoreElements().asObservable()
154+
}
155+
// Then
156+
XCTAssertEqual(result.events, Recorded.events([
157+
.completed(TestScheduler.Defaults.subscribed)
158+
]))
134159
}
135160
}

0 commit comments

Comments
 (0)