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