This commit is contained in:
Михаил Капелько
2023-12-28 14:13:38 +03:00
parent 853686f441
commit 24bc62145f
8 changed files with 184 additions and 2 deletions

View File

@@ -0,0 +1,14 @@
Pod::Spec.new do |s|
s.name = 'MPAKX'
s.version = '2023.12.15'
s.license = 'IVCS'
s.summary = 'IVCS'
s.homepage = 'IVCS'
s.author = 'IVCS'
s.source = { :git => 'https://fake.com/FAKE.git', :tag => s.version }
s.source_files = 'src/*.swift'
s.swift_version = '5.2'
s.ios.deployment_target = '14.0'
end

View File

@@ -0,0 +1,21 @@
// swift-tools-version: 5.9
import PackageDescription
let package = Package(
name: "MPAKX",
platforms: [.iOS(.v14)],
products: [
.library(
name: "MPAKX",
type: .dynamic,
targets: ["MPAKX"]
),
],
targets: [
.target(
name: "MPAKX",
path: "src"
),
]
)

1
Modules/MPAKX/README.md Normal file
View File

@@ -0,0 +1 @@
Сущности для уменьшения количества кода при использовании архитектуры "Мрак в Моделях"

View File

@@ -0,0 +1,128 @@
import Combine
import Foundation
public protocol MPAKControllerProtocol: AnyObject {
associatedtype Model
func pipe<T>(
dbg: String?,
sub: UnsafeMutablePointer<[AnyCancellable]>?,
_ node: AnyPublisher<T, Never>,
_ reaction: @escaping (inout Model) -> Void,
_ reversion: ((inout Model) -> Void)?
)
func pipeValue<T>(
dbg: String?,
sub: UnsafeMutablePointer<[AnyCancellable]>?,
_ node: AnyPublisher<T, Never>,
_ reaction: @escaping (inout Model, T) -> Void,
_ reversion: ((inout Model, T) -> Void)?
)
}
extension MPAK {
open class Controller<Model>: MPAKControllerProtocol {
public let m: CurrentValueSubject<Model, Never>
public var subscriptions = [AnyCancellable]()
private var debugClassName: String?
private var debugLog: ((String) -> Void)?
private var model: Model
public init(
_ model: Model,
debugClassName: String? = nil,
debugLog: ((String) -> Void)? = nil
) {
m = .init(model)
self.model = model
self.debugClassName = debugClassName
self.debugLog = debugLog
}
public func pipe<T>(
dbg: String? = nil,
sub: UnsafeMutablePointer<[AnyCancellable]>? = nil,
_ node: AnyPublisher<T, Never>,
_ reaction: @escaping (inout Model) -> Void,
_ reversion: ((inout Model) -> Void)? = nil
) {
let subscription = node
.sink { [weak self] _ in
assert(Thread.isMainThread)
guard let self = self else { return }
self.dbgLog(dbg)
reaction(&self.model)
let modelCopy = self.model
if let rev = reversion {
rev(&self.model)
}
self.m.send(modelCopy)
}
if let sub = sub {
sub.pointee.append(subscription)
} else {
subscriptions.append(subscription)
}
}
public func pipeOptional<T>(
dbg: String? = nil,
_ node: AnyPublisher<T?, Never>,
_ reaction: @escaping (inout Model, T?) -> Void,
_ reversion: ((inout Model, T?) -> Void)? = nil
) {
node
.sink { [weak self] value in
assert(Thread.isMainThread)
guard let self = self else { return }
self.dbgLog(dbg)
reaction(&self.model, value)
let modelCopy = self.model
if let rev = reversion {
rev(&self.model, value)
}
self.m.send(modelCopy)
}
.store(in: &subscriptions)
}
public func pipeValue<T>(
dbg: String? = nil,
sub: UnsafeMutablePointer<[AnyCancellable]>? = nil,
_ node: AnyPublisher<T, Never>,
_ reaction: @escaping (inout Model, T) -> Void,
_ reversion: ((inout Model, T) -> Void)? = nil
) {
let subscription = node
.sink { [weak self] value in
assert(Thread.isMainThread)
guard let self = self else { return }
self.dbgLog(dbg)
reaction(&self.model, value)
let modelCopy = self.model
if let rev = reversion {
rev(&self.model, value)
}
self.m.send(modelCopy)
}
if let sub = sub {
sub.pointee.append(subscription)
} else {
subscriptions.append(subscription)
}
}
private func dbgLog(_ text: String?) {
guard
let className = debugClassName,
let log = debugLog,
let text = text
else {
return
}
log("\(className).\(text)")
}
}
}

View File

@@ -0,0 +1,10 @@
public enum MPAK {
public struct Recent<T> {
public var isRecent = false
public var value: T
public init(_ value: T) {
self.value = value
}
}
}

View File

@@ -12,5 +12,6 @@ s.swift_version = '5.2'
s.ios.deployment_target = '14.0'
s.dependency 'BusX'
s.dependency 'CordX'
s.dependency 'MPAKX'
end