Skip to content

Commit e4da6ad

Browse files
authored
Merge pull request #188 from MortMerr/feature/applySingle
[feature/applySingle] implement apply for SingleTrait #trivial
2 parents 8157295 + 24d0c29 commit e4da6ad

File tree

4 files changed

+76
-0
lines changed

4 files changed

+76
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ master
88
- added `toSortedArray` operator
99
- rolled `map(to:)` back to `mapTo(_:)` for `SharedSequenceConvertibleType`
1010
- added `unwrap()` operator for SharedSequence
11+
- added `apply(_:)` for `Single`
1112

1213
3.3.0
1314
-----

Playground/RxSwiftExtPlayground.playground/Pages/apply.xcplaygroundpage/Contents.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,24 @@ func addOne(input: Observable<Int>) -> Observable<String> {
2626
.map { "The next number is \($0)" }
2727
}
2828

29+
func addOne(input: Single<Int>) -> Single<String> {
30+
return input
31+
.map { $0 + 1 }
32+
.map { "The next number is \($0)" }
33+
}
34+
2935
example("apply a transformation") {
3036
let numbers1 = Observable.from([1, 2, 3])
3137
let numbers2 = Observable.from([100, 101, 102])
38+
let number3 = Single.just(1)
39+
let number4 = Single.just(100)
3240

3341
print("apply() calls the transform function on the Observable sequence: ")
3442

3543
let transformed1 = numbers1.apply(addOne)
3644
let transformed2 = numbers2.apply(addOne)
45+
let transformed3 = number3.apply(addOne)
46+
let transformed4 = number4.apply(addOne)
3747

3848
transformed1.subscribe(onNext: { result in
3949
print(result)
@@ -42,6 +52,14 @@ example("apply a transformation") {
4252
transformed2.subscribe(onNext: { result in
4353
print(result)
4454
})
55+
56+
transformed3.subscribe(onSuccess: { result in
57+
print(result)
58+
})
59+
60+
transformed4.subscribe(onSuccess: { result in
61+
print(result)
62+
})
4563
}
4664

4765
//: [Next](@next)

Source/RxSwift/apply.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,10 @@ extension ObservableType {
1515
return transform(self.asObservable())
1616
}
1717
}
18+
19+
extension PrimitiveSequenceType where TraitType == SingleTrait {
20+
/// Apply a transformation function to the Single.
21+
public func apply<T>(_ transform: (Single<Self.ElementType>) -> Single<T>) -> Single<T> {
22+
return transform(self.primitiveSequence)
23+
}
24+
}

Tests/RxSwift/applyTests.swift

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ class ApplyTests: XCTestCase {
2929
.filter { $0 > 0 }
3030
.map { $0 * $0 }
3131
}
32+
33+
private func transform(input: Single<Int>) -> Single<Int> {
34+
return input.map { $0 * $0 }
35+
}
3236

3337
func testApply() {
3438
let values = [0, 42, -7, 100, 1000, 1]
@@ -52,12 +56,37 @@ class ApplyTests: XCTestCase {
5256

5357
XCTAssertEqual(observer.events, correct)
5458
}
59+
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 = [
73+
next(0, 10*10),
74+
completed(0)
75+
]
76+
77+
XCTAssertEqual(observer.events, correct)
78+
}
5579

5680
func transformToString(input: Observable<Int>) -> Observable<String> {
5781
return input
5882
.distinctUntilChanged()
5983
.map { String(describing: $0) }
6084
}
85+
86+
func transformToString(input: Single<Int>) -> Single<String> {
87+
return input.map(String.init)
88+
}
89+
6190

6291
func testApplyTransformingType() {
6392
let values = [0, 0, 42, 42, -7, 100, 1000, 1, 1]
@@ -83,4 +112,25 @@ class ApplyTests: XCTestCase {
83112

84113
XCTAssertEqual(observer.events, correct)
85114
}
115+
116+
func testApplyTransformingTypeSingle() {
117+
let value = -7
118+
119+
let scheduler = TestScheduler(initialClock: 0)
120+
let observer = scheduler.createObserver(String.self)
121+
122+
_ = Single.just(value)
123+
.apply(transformToString)
124+
.asObservable()
125+
.subscribe(observer)
126+
127+
scheduler.start()
128+
129+
let correct = [
130+
next(0, "-7"),
131+
completed(0)
132+
]
133+
134+
XCTAssertEqual(observer.events, correct)
135+
}
86136
}

0 commit comments

Comments
 (0)