Skip to content

Instantly share code, notes, and snippets.

@ryotapoi
Created November 6, 2020 04:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ryotapoi/f0f72e9c5223311179394b41322e4c93 to your computer and use it in GitHub Desktop.
Save ryotapoi/f0f72e9c5223311179394b41322e4c93 to your computer and use it in GitHub Desktop.
Publisherの配列を先頭からひとつずつ順次実行する。
import Foundation
import Combine
extension Combine.Publishers {
struct Sequencial<Sequence, Output, Failure>: Publisher
where
Sequence: Swift.Sequence,
Sequence.Element: Publisher,
Sequence.Element.Output == Output,
Sequence.Element.Failure == Failure
{
var publishers: Sequence
init(publishers: Sequence) {
self.publishers = publishers
}
func receive<S>(
subscriber: S
) where S : Subscriber, Failure == S.Failure, Output == S.Input {
publishers.publisher.setFailureType(to: Sequence.Element.Failure.self)
.flatMap(maxPublishers: .max(1)) { $0 }
.receive(subscriber: subscriber)
}
}
}
extension Array where Element: Publisher {
var sequentialPublisher: Publishers.Sequencial<Self, Element.Output, Element.Failure> {
Publishers.Sequencial(publishers: self)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment