ファイル
check-ios-bus/src/Bus.swift
Михаил Капелько 06c143efb4 d
2023-12-25 18:27:24 +03:00

93 行
2.4 KiB
Swift

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<AnyCancellable>()
func send(_ key: String, _ value: Any) {
/**/print("ИГР BusS.send key/value: '\(key)'/'\(value)'")
events.send((key, value))
}
}
}
public extension Bus {
static func receiveAsync<T>(
_ subscriptions: inout Set<AnyCancellable>,
_ keys: Set<String>,
_ 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<T>(
_ subscriptions: inout Set<AnyCancellable>,
_ keys: Set<String>,
_ 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<T>(
_ subscriptions: inout Set<AnyCancellable>,
_ key: String,
_ node: AnyPublisher<T, Never>
) {
node
.receive(on: DispatchQueue.main)
.sink { v in Service.singleton.send(key, v) }
.store(in: &subscriptions)
}
static func sendSync<T>(
_ subscriptions: inout Set<AnyCancellable>,
_ key: String,
_ node: AnyPublisher<T, Never>
) {
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<Src, Dst>(
_ subscriptions: inout Set<AnyCancellable>,
_ 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<Src, Dst>(
_ 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)
}
}