import Combine import Foundation public enum Bus { } extension Bus { final class Service { static let singleton = Service() let events = PassthroughSubject<(key: String, value: Any), Never>() var subscriptions = Set() func send(_ key: String, _ value: Any) { /**/print("ИГР BusS.send key/value: '\(key)'/'\(value)'") events.send((key, value)) } } } public extension Bus { static func receiveAsync( _ subscriptions: inout Set, _ keys: Set, _ handler: @escaping ((String, T) -> Void) ) { Service.singleton.events .compactMap { convertKeyValue(keys, $0) } .receive(on: DispatchQueue.main) .sink { v in handler(v.0, v.1) } .store(in: &subscriptions) } static func receiveSync( _ subscriptions: inout Set, _ keys: Set, _ handler: @escaping ((String, T) -> Void) ) { Service.singleton.events .compactMap { convertKeyValue(keys, $0) } .sink { v in handler(v.0, v.1) } .store(in: &subscriptions) } static func sendAsync( _ subscriptions: inout Set, _ key: String, _ node: AnyPublisher ) { node .receive(on: DispatchQueue.main) .sink { v in Service.singleton.send(key, v) } .store(in: &subscriptions) } static func sendSync( _ subscriptions: inout Set, _ key: String, _ node: AnyPublisher ) { node .sink { v in Service.singleton.send(key, v) } .store(in: &subscriptions) } static func send(_ key: String, _ value: Any) { Service.singleton.send(key, value) } } public extension Bus { static func processSync( _ subscriptions: inout Set, _ handler: @escaping ((Src) -> Dst?), _ keyIn: String, _ keyOut: String ) { Service.singleton.events .compactMap { processKeyValue($0, keyIn, handler) } .sink { vOut in Service.singleton.send(keyOut, vOut) } .store(in: &subscriptions) } static func processSyncG( _ handler: @escaping ((Src) -> Dst?), _ keyIn: String, _ keyOut: String ) { Service.singleton.events .compactMap { processKeyValue($0, keyIn, handler) } .sink { vOut in Service.singleton.send(keyOut, vOut) } .store(in: &Service.singleton.subscriptions) } }