Я написал эту настраиваемую вариационную функцию c combineLatest
, которая объединяет N издателей. Надеюсь, это то, что вам нужно:
func combineLatestN<P, T, E>(identity: T, reductionFunction: @escaping (T, T) -> T, publishers: P...) -> AnyPublisher<T, E>
where P: Publisher, P.Output == T, P.Failure == E {
publishers.reduce(
Publishers.Sequence<[T], E>(sequence: [identity]).eraseToAnyPublisher(),
{ $0.combineLatest($1).map(reductionFunction).eraseToAnyPublisher() }
)
}
Труднее всего было выяснить, какой должна быть идентичность reduce
. Какой издатель x
удовлетворяет x.combineLatest(y).map(f) == y
для всех y
? Одним из решений для x
может быть издатель, который публикует личность f
один раз.
Использование:
let anyTrue = combineLatestN(
identity: false,
reductionFunction: { $0 || $1 },
publishers: test.$one, test.$two, test.$three, test.$four, test.$five)