合并 uncollect 运算符?
Combine uncollect operator?
我正在寻找与 collect 运算符相反的运算符:
- 允许您从一个发射值映射到多个发射值,在流中发射它们。例如,如果我在流中有元素
[1,2,3]
,我想将其转换为发出 1
然后 2
,然后 3
. 的流
- 不更改流的完成状态。诚然,此
uncollect
运算符不会与 collect
完全相反,因为 collect
会等待流完成。使用 uncollect
它应该只在流未完成时处理结果,而不是尝试 finish/unfinish 流。
例如,我想这就是 uncollect
运算符的工作方式:
func fibonacci(_ number: Int) -> AnyPublisher<Int, Never> {
Future { ... }.eraseToAnyPublisher()
}
let serverEventStream: AnyPublisher<[Int], Never> = ...
serverEventStream // AnyPublisher<[Int], Never> // Ex. 2 values: `[12, 24]`, `[1, 10, 50]`
.uncollect { [=10=] } // AnyPublisher<Int, Never> // Ex. 5 values: `12`, `24`, `1`, `10`, `50`
.flatMap { fibonacci([=10=]) } // AnyPublisher<Int, Never> // Ex. 5 values: `144`, `46368`, `1`, `55`, `12586269025`
.sink { print([=10=]) }
我一直在寻找 explode
、splat
或 uncollect
之类的名称,但无济于事。共享有前途名称的最接近的运算符是 flatMap
since Sequence.flatMap
is the equivalent in the non-Combine world. However, .
有没有办法取消收集元素,或者将单个排放映射到任意数量的排放?
我能够让它与我的 一起工作,但这看起来很笨拙:
class Tests: XCTestCase {
func testUncollect() {
func fibonacci(_ number: Int) -> AnyPublisher<Int, Never> {
switch number {
case 1: return Just(1).eraseToAnyPublisher()
case 10: return Just(55).eraseToAnyPublisher()
case 12: return Just(144).eraseToAnyPublisher()
case 24: return Just(46368).eraseToAnyPublisher()
case 50: return Just(12586269025).eraseToAnyPublisher()
default: fatalError("Should actually build this function.")
}
}
let serverEventStream: AnyPublisher<[Int], Never> = JustSeveral([[12, 24], [1, 10, 50]]).eraseToAnyPublisher()
serverEventStream // AnyPublisher<[Int], Never> // Ex. 2 values: `[12, 24]`, `[1, 10, 50]`
.uncollect { [=11=] } // AnyPublisher<Int, Never> // Ex. 5 values: `12`, `24`, `1`, `10`, `50`
.flatMap { fibonacci([=11=]) } // AnyPublisher<Int, Never> // Ex. 5 values: `144`, `46368`, `1`, `55`, `12586269025`
.sink { print([=11=]) }
}
}
extension Publisher {
func uncollect<T>(_ transform: @escaping (Output) -> [T]) -> AnyPublisher<T, Failure> {
self
.flatMap { output -> AnyPublisher<T, Failure> in
JustSeveral(transform(output))
.setFailureType(to: Failure.self)
.eraseToAnyPublisher()
}
.eraseToAnyPublisher()
}
}
您可以 flatMap
与新发布商一起使用
[1,2,3,4,5,6].publisher
.collect()
.flatMap { [=10=].publisher }
.sink { print([=10=]) }
1
2
3
4
5
6
我正在寻找与 collect 运算符相反的运算符:
- 允许您从一个发射值映射到多个发射值,在流中发射它们。例如,如果我在流中有元素
[1,2,3]
,我想将其转换为发出1
然后2
,然后3
. 的流
- 不更改流的完成状态。诚然,此
uncollect
运算符不会与collect
完全相反,因为collect
会等待流完成。使用uncollect
它应该只在流未完成时处理结果,而不是尝试 finish/unfinish 流。
例如,我想这就是 uncollect
运算符的工作方式:
func fibonacci(_ number: Int) -> AnyPublisher<Int, Never> {
Future { ... }.eraseToAnyPublisher()
}
let serverEventStream: AnyPublisher<[Int], Never> = ...
serverEventStream // AnyPublisher<[Int], Never> // Ex. 2 values: `[12, 24]`, `[1, 10, 50]`
.uncollect { [=10=] } // AnyPublisher<Int, Never> // Ex. 5 values: `12`, `24`, `1`, `10`, `50`
.flatMap { fibonacci([=10=]) } // AnyPublisher<Int, Never> // Ex. 5 values: `144`, `46368`, `1`, `55`, `12586269025`
.sink { print([=10=]) }
我一直在寻找 explode
、splat
或 uncollect
之类的名称,但无济于事。共享有前途名称的最接近的运算符是 flatMap
since Sequence.flatMap
is the equivalent in the non-Combine world. However,
有没有办法取消收集元素,或者将单个排放映射到任意数量的排放?
我能够让它与我的
class Tests: XCTestCase {
func testUncollect() {
func fibonacci(_ number: Int) -> AnyPublisher<Int, Never> {
switch number {
case 1: return Just(1).eraseToAnyPublisher()
case 10: return Just(55).eraseToAnyPublisher()
case 12: return Just(144).eraseToAnyPublisher()
case 24: return Just(46368).eraseToAnyPublisher()
case 50: return Just(12586269025).eraseToAnyPublisher()
default: fatalError("Should actually build this function.")
}
}
let serverEventStream: AnyPublisher<[Int], Never> = JustSeveral([[12, 24], [1, 10, 50]]).eraseToAnyPublisher()
serverEventStream // AnyPublisher<[Int], Never> // Ex. 2 values: `[12, 24]`, `[1, 10, 50]`
.uncollect { [=11=] } // AnyPublisher<Int, Never> // Ex. 5 values: `12`, `24`, `1`, `10`, `50`
.flatMap { fibonacci([=11=]) } // AnyPublisher<Int, Never> // Ex. 5 values: `144`, `46368`, `1`, `55`, `12586269025`
.sink { print([=11=]) }
}
}
extension Publisher {
func uncollect<T>(_ transform: @escaping (Output) -> [T]) -> AnyPublisher<T, Failure> {
self
.flatMap { output -> AnyPublisher<T, Failure> in
JustSeveral(transform(output))
.setFailureType(to: Failure.self)
.eraseToAnyPublisher()
}
.eraseToAnyPublisher()
}
}
您可以 flatMap
与新发布商一起使用
[1,2,3,4,5,6].publisher
.collect()
.flatMap { [=10=].publisher }
.sink { print([=10=]) }
1
2
3
4
5
6