diff --git a/VDS.xcodeproj/project.pbxproj b/VDS.xcodeproj/project.pbxproj index 4008e563..cc818765 100644 --- a/VDS.xcodeproj/project.pbxproj +++ b/VDS.xcodeproj/project.pbxproj @@ -59,7 +59,6 @@ EAB1D29E28A5619500DAE764 /* RadioButtonGroupModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D29D28A5619500DAE764 /* RadioButtonGroupModel.swift */; }; EAB1D2A128A598FE00DAE764 /* UsesAutoLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2A028A598FE00DAE764 /* UsesAutoLayout.swift */; }; EAB1D2A328A5994800DAE764 /* Debuggable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2A228A5994800DAE764 /* Debuggable.swift */; }; - EAB1D2C728A6E76300DAE764 /* ModelHandlerPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2C628A6E76300DAE764 /* ModelHandlerPublisher.swift */; }; EAB1D2CD28ABE76100DAE764 /* Withable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2CC28ABE76000DAE764 /* Withable.swift */; }; EAB1D2CF28ABEF2B00DAE764 /* Typography.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2CE28ABEF2B00DAE764 /* Typography.swift */; }; EAB1D2E628AE842000DAE764 /* Publisher+Bind.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2E328AE842000DAE764 /* Publisher+Bind.swift */; }; @@ -157,7 +156,6 @@ EAB1D29D28A5619500DAE764 /* RadioButtonGroupModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButtonGroupModel.swift; sourceTree = ""; }; EAB1D2A028A598FE00DAE764 /* UsesAutoLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UsesAutoLayout.swift; sourceTree = ""; }; EAB1D2A228A5994800DAE764 /* Debuggable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Debuggable.swift; sourceTree = ""; }; - EAB1D2C628A6E76300DAE764 /* ModelHandlerPublisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModelHandlerPublisher.swift; sourceTree = ""; }; EAB1D2CC28ABE76000DAE764 /* Withable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Withable.swift; sourceTree = ""; }; EAB1D2CE28ABEF2B00DAE764 /* Typography.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Typography.swift; sourceTree = ""; }; EAB1D2E328AE842000DAE764 /* Publisher+Bind.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Publisher+Bind.swift"; sourceTree = ""; }; @@ -434,7 +432,6 @@ isa = PBXGroup; children = ( EAB1D2E328AE842000DAE764 /* Publisher+Bind.swift */, - EAB1D2C628A6E76300DAE764 /* ModelHandlerPublisher.swift */, EA89200128AECF2A006B9984 /* UIButton+Publisher.swift */, EAB1D2E928AE84AA00DAE764 /* UIControlPublisher.swift */, EA89200328AECF4B006B9984 /* UITextField+Publisher.swift */, @@ -646,7 +643,6 @@ EA336171288B19200071C351 /* VDS.docc in Sources */, EAF7F0962899861000B287F5 /* CheckboxModel.swift in Sources */, EAB1D2E628AE842000DAE764 /* Publisher+Bind.swift in Sources */, - EAB1D2C728A6E76300DAE764 /* ModelHandlerPublisher.swift in Sources */, EA3361AA288B25E40071C351 /* Disabling.swift in Sources */, EA89200828B526E0006B9984 /* CheckboxGroupModel.swift in Sources */, EA3361B6288B2A410071C351 /* Control.swift in Sources */, diff --git a/VDS/Protocols/ModelHandlerable.swift b/VDS/Protocols/ModelHandlerable.swift index acb61aa5..82046c0c 100644 --- a/VDS/Protocols/ModelHandlerable.swift +++ b/VDS/Protocols/ModelHandlerable.swift @@ -33,12 +33,17 @@ extension ModelHandlerable { } public func setupUpdateView() { - modelPublisher - .debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main) + handlerPublisher() .subscribe(on: RunLoop.main) .sink { [weak self] viewModel in self?.updateView(viewModel: viewModel) } .store(in: &subscribers) } + + public func handlerPublisher() -> AnyPublisher { + modelPublisher + .debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main) + .eraseToAnyPublisher() + } } diff --git a/VDS/Publishers/ModelHandlerPublisher.swift b/VDS/Publishers/ModelHandlerPublisher.swift deleted file mode 100644 index 8ea20a35..00000000 --- a/VDS/Publishers/ModelHandlerPublisher.swift +++ /dev/null @@ -1,70 +0,0 @@ -// -// ModelHanlderPublisher.swift -// VDS -// -// Created by Matt Bruce on 8/12/22. -// - -import Foundation -import Combine - -extension Publishers { - public struct ModelHandlerPublisher: Publisher { - - public typealias Output = ModelHandlerType.ModelType - public typealias Failure = Never - - private let modelHandler: ModelHandlerType - - public init(modelHandler: ModelHandlerType) { self.modelHandler = modelHandler } - - public func receive(subscriber: S) where S : Subscriber, Never == S.Failure, ModelHandlerType.ModelType == S.Input { - let subscription = ModelHandlerSubscription(subscriber: subscriber, modelHandler: modelHandler) - subscriber.receive(subscription: subscription) - } - } - - public class ModelHandlerSubscription: Subscription where S.Input == ModelHandlerType.ModelType, S.Failure == Never { - - private var subscriber: S? - private var modelHandler: ModelHandlerType? - public var subscribers = Set() - public init(subscriber: S, modelHandler: ModelHandlerType) { - self.subscriber = subscriber - self.modelHandler = modelHandler - subscribe() - } - - public func request(_ demand: Subscribers.Demand) { } - - public func cancel() { - subscriber = nil - modelHandler = nil - } - - private func subscribe() { - guard let publisher = modelHandler?.modelPublisher else { return } - - publisher - .debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main) - .sink { [weak self] viewModel in - _ = self?.subscriber?.receive(viewModel) - } - .store(in: &subscribers) - } - } -} - -extension ModelHandlerable { - public func handlerPublisher() -> AnyPublisher { - return Publishers.ModelHandlerPublisher(modelHandler: self).eraseToAnyPublisher() - } - - public func createBinding(with subject: CurrentValueSubject, storeIn subscriptions: inout Set) { - handlerPublisher() - .sink { (value) in - subject.send(value) - } - .store(in: &subscriptions) - } -}