Emcee
1import CLTExtensions
2import Dispatch
3import Foundation
4
5public final class EventBus {
6private var streams = [EventStream]()
7private let lock = NSLock()
8private let eventDeliveryQueue = DispatchQueue(label: "ru.avito.EventBus.eventDeliveryQueue")
9
10public init() {}
11
12public func add(stream: EventStream) {
13lock.whileLocked {
14streams.append(stream)
15}
16}
17
18public func post(event: BusEvent) {
19lock.whileLocked {
20streams.forEach { stream in
21eventDeliveryQueue.async {
22stream.process(event: event)
23}
24}
25}
26}
27
28public func uponDeliveryOfAllEvents(work: @escaping () -> ()) {
29eventDeliveryQueue.async {
30work()
31}
32}
33
34public func tearDown() {
35post(event: .tearDown)
36eventDeliveryQueue.sync(flags: .barrier) {}
37}
38}
39