d
This commit is contained in:
14
Modules/MPAKX/MPAKX.podspec
Normal file
14
Modules/MPAKX/MPAKX.podspec
Normal 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
|
||||
21
Modules/MPAKX/Package.swift
Normal file
21
Modules/MPAKX/Package.swift
Normal 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
1
Modules/MPAKX/README.md
Normal file
@@ -0,0 +1 @@
|
||||
Сущности для уменьшения количества кода при использовании архитектуры "Мрак в Моделях"
|
||||
128
Modules/MPAKX/src/MPAK.Controller.swift
Normal file
128
Modules/MPAKX/src/MPAK.Controller.swift
Normal 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)")
|
||||
}
|
||||
}
|
||||
}
|
||||
10
Modules/MPAKX/src/MPAK.swift
Normal file
10
Modules/MPAKX/src/MPAK.swift
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user