This commit is contained in:
Михаил Капелько
2023-12-28 13:33:20 +03:00
parent a1ec08f280
commit 16026a7b47
21 changed files with 26 additions and 16 deletions

View File

@@ -0,0 +1,17 @@
import BusX
import Combine
extension Cord {
public final class Button: ObservableObject {
public let press = PassthroughSubject<Void, Never>()
var subscriptions = [AnyCancellable]()
public init(_ key: String) {
Bus.send(
key,
press.eraseToAnyPublisher(),
sub: &subscriptions
)
}
}
}

View File

@@ -0,0 +1,9 @@
extension Cord {
/// Пропускаем лишь значения от UI
///
/// - Returns: Значение без префиксов "a:"/"u:"
static func onlyUIText(_ s: String) -> String? {
guard s.hasPrefix("u:") else { return nil }
return String(s.dropFirst(2))
}
}

View File

@@ -0,0 +1,21 @@
import BusX
import Combine
extension Cord {
public final class Receive<T>: ObservableObject {
@Published public var value: T
var subscriptions = [AnyCancellable]()
public init(
_ key: String,
_ defaultValue: T
) {
value = defaultValue
Bus.receive(
[key],
{ [weak self] (_, v: T) in self?.value = v },
sub: &subscriptions
)
}
}
}

View File

@@ -0,0 +1,30 @@
import BusX
import Combine
import SwiftUI
extension Cord {
public final class TextField: ObservableObject {
@Published public var value = "a:"
var subscriptions = [AnyCancellable]()
public init(
_ textApp: String,
_ textUI: String
) {
Bus.send(
textUI,
$value
.removeDuplicates()
.compactMap(onlyUIText)
.eraseToAnyPublisher(),
sub: &subscriptions
)
Bus.receive(
[textApp],
{ [weak self] (_, v: String) in self?.value = "a:\(v)" },
sub: &subscriptions
)
}
}
}

View File

@@ -0,0 +1,19 @@
import Foundation
extension Cord {
public final class TextFieldValueOwner: Formatter {
public override func string(for obj: Any?) -> String? {
guard let str = obj as? String else { return nil }
return String(str.dropFirst(2))
}
public override func getObjectValue(
_ obj: AutoreleasingUnsafeMutablePointer<AnyObject?>?,
for string: String,
errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?
) -> Bool {
obj?.pointee = "u:\(string)" as AnyObject
return true
}
}
}

View File

@@ -0,0 +1 @@
public enum Cord { }