Михаил Капелько 5 months ago
parent
commit
06c143efb4
4 changed files with 105 additions and 106 deletions
  1. +5
    -0
      src/App.swift
  2. +30
    -0
      src/Bus.Aux.swift
  3. +70
    -102
      src/Bus.swift
  4. +0
    -4
      src/MeetupId.swift

+ 5
- 0
src/App.swift View File

@@ -16,6 +16,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate
window?.rootViewController = vc
window?.backgroundColor = UIColor.white
window?.makeKeyAndVisible()
Bus.processSyncG(
MeetupId.shouldFormat, MeetupId.K.meetupIdTextUI.rawValue, MeetupId.K.meetupIdTextApp.rawValue
)

return true
}


+ 30
- 0
src/Bus.Aux.swift View File

@@ -0,0 +1,30 @@
extension Bus {
/// Пропускаем далее предоставленные ключи.
static func convertKeyValue<T>(
_ keys: Set<String>,
_ v: (key: String, value: Any)
) -> (String, T)? {
guard
keys.contains(v.key),
let value = v.value as? T
else {
return nil
}
return (v.key, value)
}

/// Обрабатываем.
static func processKeyValue<Src, Dst>(
_ v: (key: String, value: Any),
_ keyIn: String,
_ handler: @escaping ((Src) -> Dst?)
) -> Dst? {
guard
v.key == keyIn,
let vIn = v.value as? Src
else {
return nil
}
return handler(vIn)
}
}

+ 70
- 102
src/Bus.swift View File

@@ -6,119 +6,87 @@ public enum Bus { }
extension Bus {
final class Service {
static let singleton = Service()
let broadcaster = PassthroughSubject<(key: String, value: Any), Never>()
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)'")
broadcaster.send((key, value))
/**/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.broadcaster
.compactMap { v -> (String, T)? in
guard
keys.contains(v.key),
let value = v.value as? T
else {
return nil
}
return (v.key, value)
}
.receive(on: DispatchQueue.main)
.sink { v in handler(v.0, v.1) }
.store(in: &subscriptions)
}
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.broadcaster
.compactMap { v -> (String, T)? in
guard
keys.contains(v.key),
let value = v.value as? T
else {
return nil
}
return (v.key, value)
}
.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 sendOnce(_ key: String, _ value: Any) {
Service.singleton.send(key, value)
}
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.broadcaster
.compactMap {
guard
$0.key == keyIn,
let vIn = $0.value as? Src
else {
return nil
}
return handler(vIn)
}
.sink { vOut in Service.singleton.send(keyOut, vOut) }
.store(in: &subscriptions)
}
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.broadcaster
.compactMap {
guard
$0.key == keyIn,
let vIn = $0.value as? Src
else {
return nil
}
return handler(vIn)
}
.sink { vOut in Service.singleton.send(keyOut, vOut) }
.store(in: &Service.singleton.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)
}
}

+ 0
- 4
src/MeetupId.swift View File

@@ -23,10 +23,6 @@ enum MeetupId {
}
return r
}

Bus.processSyncG(
shouldFormat, K.meetupIdTextUI.rawValue, K.meetupIdTextApp.rawValue
)
}



Loading…
Cancel
Save