Skip to content

Commit 53f991e

Browse files
authored
partition - do a single pass for predicate
1 parent e803404 commit 53f991e

File tree

2 files changed

+9
-7
lines changed

2 files changed

+9
-7
lines changed

Source/RxCocoa/partition+RxCocoa.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ public extension SharedSequence {
1919
*/
2020
func partition(_ predicate: @escaping (E) -> Bool) -> (matches: SharedSequence<S, E>,
2121
nonMatches: SharedSequence<S, E>) {
22-
let hits = self.filter(predicate)
23-
let misses = self.filter { !predicate($0) }
22+
let stream = self.map { ($0, predicate($0)) }
23+
24+
let hits = stream.filter { $0.1 }.map { $0.0 }
25+
let misses = stream.filter { !$0.1 }.map { $0.0 }
2426

2527
return (hits, misses)
2628
}

Source/RxSwift/partition.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ public extension ObservableType {
1717
- returns: A tuple of two streams of elements that match, and don't match, the provided predicate.
1818
*/
1919
func partition(_ predicate: @escaping (E) throws -> Bool) -> (matches: Observable<E>, nonMatches: Observable<E>) {
20-
let stream = self.share()
21-
let hits = stream.filter(predicate)
22-
let misses = stream.filter {
23-
return !(try predicate($0))
24-
}
20+
let stream = self.map{ ($0, try predicate($0)) }.share()
21+
22+
let hits = stream.filter { $0.1 }.map { $0.0 }
23+
let misses = stream.filter { !$0.1 }.map { $0.0 }
24+
2525
return (hits, misses)
2626
}
2727
}

0 commit comments

Comments
 (0)