Skip to content

Commit 46a7262

Browse files
committed
Improved partition to all execute the predicate a single time.
1 parent 16d8000 commit 46a7262

1 file changed

Lines changed: 12 additions & 21 deletions

File tree

Sources/Signal.swift

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -287,28 +287,19 @@ public extension SignalType {
287287
/// Splits the signal into two signals. The first signal in the tuple matches the
288288
/// predicate, the second signal does not match the predicate
289289
public func partition(_ predicate: @escaping (Value) -> Bool) -> (Signal<Value, ErrorType>, Signal<Value, ErrorType>) {
290-
let left = Signal<Value, ErrorType> { observer in
291-
return self.on { (event: Event<Value, ErrorType>) -> Void in
292-
guard let value = event.value else {
293-
observer.sendEvent(event)
294-
return
295-
}
296-
297-
if predicate(value) {
298-
observer.sendNext(value)
299-
}
290+
let (left, leftObserver) = Signal<Value, ErrorType>.pipe()
291+
let (right, rightObserver) = Signal<Value, ErrorType>.pipe()
292+
self.on { (event: Event<Value, ErrorType>) -> Void in
293+
guard let value = event.value else {
294+
leftObserver.sendEvent(event)
295+
rightObserver.sendEvent(event)
296+
return
300297
}
301-
}
302-
let right = Signal<Value, ErrorType> { observer in
303-
return self.on { (event: Event<Value, ErrorType>) -> Void in
304-
guard let value = event.value else {
305-
observer.sendEvent(event)
306-
return
307-
}
308-
309-
if !predicate(value) {
310-
observer.sendNext(value)
311-
}
298+
299+
if predicate(value) {
300+
leftObserver.sendNext(value)
301+
} else {
302+
rightObserver.sendNext(value)
312303
}
313304
}
314305
return (left, right)

0 commit comments

Comments
 (0)