Skip to content

Commit 6db9f58

Browse files
authored
Add multicast latest (#27)
1 parent 82c8f23 commit 6db9f58

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import Combine
2+
3+
public extension Publisher {
4+
func multicastLatest() -> some Publisher<Output, Failure> {
5+
map(Optional.some)
6+
.multicast({ CurrentValueSubject<Output?, Failure>(nil) })
7+
.autoconnect()
8+
.compactMap { $0 }
9+
}
10+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import Combine
2+
import CombineExtensions
3+
import CombineTestExtensions
4+
import XCTest
5+
6+
class MulticastLatestSubjectTests: XCTestCase {
7+
func testMulticastLatest() {
8+
let voidSubject = PassthroughSubject<Void, Never>()
9+
let intSubject = PassthroughSubject<Int, Never>()
10+
var mapCalledCount = 0
11+
12+
let multicastedPublisher = voidSubject
13+
.map {
14+
mapCalledCount += 1
15+
return intSubject
16+
}
17+
.switchToLatest()
18+
.multicastLatest()
19+
20+
let outputExpectation = multicastedPublisher.expectOutput([1, 2])
21+
22+
voidSubject.send(())
23+
intSubject.send(1)
24+
intSubject.send(2)
25+
26+
let expectation1 = expectation(description: "first subscriber")
27+
let subscription1 = multicastedPublisher.sink { value in
28+
XCTAssertEqual(value, 2)
29+
expectation1.fulfill()
30+
}
31+
defer { subscription1.cancel() }
32+
33+
let expectation2 = expectation(description: "second subscriber")
34+
let subscription2 = multicastedPublisher.sink { value in
35+
XCTAssertEqual(value, 2)
36+
expectation2.fulfill()
37+
}
38+
defer { subscription2.cancel() }
39+
40+
wait(for: [outputExpectation, expectation1, expectation2], timeout: 0.5)
41+
XCTAssertEqual(mapCalledCount, 1)
42+
}
43+
}

0 commit comments

Comments
 (0)