d
This commit is contained in:
@@ -7,19 +7,17 @@ public extension Bus {
|
||||
public init(
|
||||
_ handler: @escaping ((Src) -> Dst?),
|
||||
_ keyIn: String,
|
||||
_ keyOut: String,
|
||||
opt: [Option] = []
|
||||
_ keyOut: String
|
||||
) {
|
||||
Bus.process([keyIn], keyOut, handler, opt: opt, sub: &subscriptions)
|
||||
Bus.processSync([keyIn], keyOut, handler, &subscriptions)
|
||||
}
|
||||
|
||||
public init(
|
||||
_ handler: @escaping ((Src) -> Dst?),
|
||||
_ keysIn: Set<String>,
|
||||
_ keyOut: String,
|
||||
opt: [Option] = []
|
||||
_ keyOut: String
|
||||
) {
|
||||
Bus.process(keysIn, keyOut, handler, opt: opt, sub: &subscriptions)
|
||||
Bus.processSync(keysIn, keyOut, handler, &subscriptions)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,22 +10,12 @@ public enum Bus {
|
||||
}
|
||||
|
||||
public extension Bus {
|
||||
enum Option {
|
||||
case async
|
||||
}
|
||||
}
|
||||
|
||||
public extension Bus {
|
||||
static func receive<T>(
|
||||
/// Асинхронно обрабатывать входящие события из шины.
|
||||
static func receiveAsync<T>(
|
||||
_ keys: Set<String>,
|
||||
_ handler: @escaping ((String, T) -> Void),
|
||||
opt: [Option] = [],
|
||||
sub subscriptions: inout [AnyCancellable]
|
||||
_ subscriptions: inout [AnyCancellable]
|
||||
) {
|
||||
let isAsync = opt.contains(.async)
|
||||
|
||||
// Async.
|
||||
if isAsync {
|
||||
Self.events
|
||||
.compactMap { convertKeyValue(keys, $0) }
|
||||
.receive(on: DispatchQueue.main)
|
||||
@@ -33,56 +23,54 @@ public extension Bus {
|
||||
.store(in: &subscriptions)
|
||||
}
|
||||
|
||||
// Async.
|
||||
if !isAsync {
|
||||
/// Синхронно обрабатывать входящие события из шины.
|
||||
static func receiveSync<T>(
|
||||
_ keys: Set<String>,
|
||||
_ handler: @escaping ((String, T) -> Void),
|
||||
_ subscriptions: inout [AnyCancellable]
|
||||
) {
|
||||
Self.events
|
||||
.compactMap { convertKeyValue(keys, $0) }
|
||||
.sink { v in handler(v.0, v.1) }
|
||||
.store(in: &subscriptions)
|
||||
}
|
||||
}
|
||||
|
||||
static func send<T>(
|
||||
/// Асинхронно отправлять события из узла в шину.
|
||||
static func sendAsync<T>(
|
||||
_ key: String,
|
||||
_ node: AnyPublisher<T, Never>,
|
||||
opt: [Option] = [],
|
||||
sub subscriptions: inout [AnyCancellable]
|
||||
_ subscriptions: inout [AnyCancellable]
|
||||
) {
|
||||
let isAsync = opt.contains(.async)
|
||||
|
||||
// Async.
|
||||
if isAsync {
|
||||
node
|
||||
.receive(on: DispatchQueue.main)
|
||||
.sink { v in Self.e.send((key, v)) }
|
||||
.store(in: &subscriptions)
|
||||
}
|
||||
|
||||
// Sync.
|
||||
if !isAsync {
|
||||
/// Синхронно отправлять события из узла в шину.
|
||||
static func sendSync<T>(
|
||||
_ key: String,
|
||||
_ node: AnyPublisher<T, Never>,
|
||||
_ subscriptions: inout [AnyCancellable]
|
||||
) {
|
||||
node
|
||||
.sink { v in Self.e.send((key, v)) }
|
||||
.store(in: &subscriptions)
|
||||
}
|
||||
}
|
||||
|
||||
/// Синхронно отправить событие в шину один раз.
|
||||
static func send(_ key: String, _ value: Any) {
|
||||
Self.e.send((key, value))
|
||||
}
|
||||
}
|
||||
|
||||
public extension Bus {
|
||||
static func process<Src, Dst>(
|
||||
static func processAsync<Src, Dst>(
|
||||
_ keysIn: Set<String>,
|
||||
_ keyOut: String,
|
||||
_ handler: @escaping ((Src) -> Dst?),
|
||||
opt: [Option] = [],
|
||||
sub subscriptions: inout [AnyCancellable]
|
||||
_ subscriptions: inout [AnyCancellable]
|
||||
) {
|
||||
let isAsync = opt.contains(.async)
|
||||
|
||||
// Async.
|
||||
if isAsync {
|
||||
Self.events
|
||||
.compactMap { processKeysValue($0, keysIn, handler) }
|
||||
.receive(on: DispatchQueue.main)
|
||||
@@ -90,12 +78,15 @@ public extension Bus {
|
||||
.store(in: &subscriptions)
|
||||
}
|
||||
|
||||
// Sync.
|
||||
if !isAsync {
|
||||
static func processSync<Src, Dst>(
|
||||
_ keysIn: Set<String>,
|
||||
_ keyOut: String,
|
||||
_ handler: @escaping ((Src) -> Dst?),
|
||||
_ subscriptions: inout [AnyCancellable]
|
||||
) {
|
||||
Self.events
|
||||
.compactMap { processKeysValue($0, keysIn, handler) }
|
||||
.sink { vOut in Self.e.send((keyOut, vOut)) }
|
||||
.store(in: &subscriptions)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,10 +6,10 @@ extension BusUI {
|
||||
var subscriptions = [AnyCancellable]()
|
||||
|
||||
public init(_ key: String) {
|
||||
Bus.send(
|
||||
Bus.sendSync(
|
||||
key,
|
||||
v.map { true }.eraseToAnyPublisher(),
|
||||
sub: &subscriptions
|
||||
&subscriptions
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,19 +10,19 @@ extension BusUI {
|
||||
_ textApp: String,
|
||||
_ textUI: String
|
||||
) {
|
||||
Bus.send(
|
||||
Bus.sendSync(
|
||||
textUI,
|
||||
$v
|
||||
.removeDuplicates()
|
||||
.compactMap(onlyUIText)
|
||||
.eraseToAnyPublisher(),
|
||||
sub: &subscriptions
|
||||
&subscriptions
|
||||
)
|
||||
|
||||
Bus.receive(
|
||||
Bus.receiveSync(
|
||||
[textApp],
|
||||
{ [weak self] (_, v: String) in self?.v = "a:\(v)" },
|
||||
sub: &subscriptions
|
||||
&subscriptions
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,10 +10,10 @@ extension BusUI {
|
||||
_ defaultValue: T
|
||||
) {
|
||||
v = defaultValue
|
||||
Bus.receive(
|
||||
Bus.receiveSync(
|
||||
[key],
|
||||
{ [weak self] (_, v: T) in self?.v = v },
|
||||
sub: &subscriptions
|
||||
&subscriptions
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,19 +12,19 @@ extension MeetupId {
|
||||
_ src: String,
|
||||
_ dst: String
|
||||
) {
|
||||
Bus.receive(
|
||||
Bus.receiveSync(
|
||||
[src],
|
||||
{ [weak self] _, v in self?.v.send(v) },
|
||||
sub: &subscriptions
|
||||
&subscriptions
|
||||
)
|
||||
|
||||
Bus.send(
|
||||
Bus.sendSync(
|
||||
dst,
|
||||
v
|
||||
.debounce(for: .seconds(sec), scheduler: DispatchQueue.main)
|
||||
.compactMap { (v: Src) in handler(v) }
|
||||
.eraseToAnyPublisher(),
|
||||
sub: &subscriptions
|
||||
&subscriptions
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,19 +12,19 @@ extension MeetupId {
|
||||
_ src: String,
|
||||
_ dst: String
|
||||
) {
|
||||
Bus.receive(
|
||||
Bus.receiveSync(
|
||||
[src],
|
||||
{ [weak self] _, v in self?.v.send(v) },
|
||||
sub: &subscriptions
|
||||
&subscriptions
|
||||
)
|
||||
|
||||
Bus.send(
|
||||
Bus.sendSync(
|
||||
dst,
|
||||
v
|
||||
.delay(for: .seconds(sec), scheduler: DispatchQueue.main)
|
||||
.compactMap { (v: Src) in handler(v) }
|
||||
.eraseToAnyPublisher(),
|
||||
sub: &subscriptions
|
||||
&subscriptions
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user