Skip to content

Instantly share code, notes, and snippets.

@marty-suzuki
Created February 22, 2020 08:58
Show Gist options
  • Save marty-suzuki/bee4d447def7770244a079dcf9b38601 to your computer and use it in GitHub Desktop.
Save marty-suzuki/bee4d447def7770244a079dcf9b38601 to your computer and use it in GitHub Desktop.
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