Created
February 22, 2020 08:58
-
-
Save marty-suzuki/bee4d447def7770244a079dcf9b38601 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Combine | |
extension Publisher { | |
func flatMapLatest<T: Publisher>(_ transform: @escaping (Output) -> T) -> Publishers.SwitchToLatest<T, Publishers.Map<Self, T>> where T.Failure == Failure { | |
map(transform).switchToLatest() | |
} | |
} | |
enum Pattern { | |
case one | |
case two | |
} | |
let trigger = PassthroughSubject<Pattern, Never>() | |
let subject1 = PassthroughSubject<Int, Never>() | |
let subject2 = PassthroughSubject<Int, Never>() | |
let cancellable = trigger | |
.flatMapLatest { pattern -> AnyPublisher<Int, Never> in | |
switch pattern { | |
case .one: | |
return subject1.eraseToAnyPublisher() | |
case .two: | |
return subject2.eraseToAnyPublisher() | |
} | |
} | |
.sink(receiveValue: { intValue in | |
print(intValue) | |
}) | |
subject1.send(1) | |
subject2.send(2) | |
trigger.send(.one) | |
subject1.send(3) | |
subject2.send(4) | |
trigger.send(.two) | |
subject1.send(5) | |
subject2.send(6) | |
trigger.send(.one) | |
subject1.send(7) | |
subject2.send(8) | |
cancellable.cancel() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment