diff --git a/VDS.xcodeproj/project.pbxproj b/VDS.xcodeproj/project.pbxproj index 0b92f610..c747f5ff 100644 --- a/VDS.xcodeproj/project.pbxproj +++ b/VDS.xcodeproj/project.pbxproj @@ -46,6 +46,7 @@ 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 */; }; EAF7F0952899861000B287F5 /* Checkbox.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0932899861000B287F5 /* Checkbox.swift */; }; EAF7F0962899861000B287F5 /* CheckboxModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0942899861000B287F5 /* CheckboxModel.swift */; }; EAF7F09A2899B17200B287F5 /* CATransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F0992899B17200B287F5 /* CATransaction.swift */; }; @@ -126,6 +127,7 @@ 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 = ""; }; EAF7F0932899861000B287F5 /* Checkbox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Checkbox.swift; sourceTree = ""; }; EAF7F0942899861000B287F5 /* CheckboxModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckboxModel.swift; sourceTree = ""; }; EAF7F0992899B17200B287F5 /* CATransaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CATransaction.swift; sourceTree = ""; }; @@ -205,6 +207,7 @@ EA3361DF2891D0F10071C351 /* Fonts */, EA3361AB288B25EC0071C351 /* Protocols */, EAB1D29F28A598D000DAE764 /* PropertyWrappers */, + EAB1D2E228AE842000DAE764 /* Publishers */, EAB1D2D028ABEF3100DAE764 /* Typography */, EA3361B9288B2BE30071C351 /* Utilities */, EA3361FE2891E14C0071C351 /* SupportingFiles */, @@ -296,7 +299,6 @@ children = ( EAF7F0B8289C139800B287F5 /* ColorConfiguration.swift */, EAF7F09D289AAEC000B287F5 /* Constants.swift */, - EAB1D2C628A6E76300DAE764 /* ModelHandlerPublisher.swift */, EA3361B5288B2A410071C351 /* Control.swift */, EAF7F09F289AB7EC00B287F5 /* View.swift */, ); @@ -367,6 +369,15 @@ path = Typography; sourceTree = ""; }; + EAB1D2E228AE842000DAE764 /* Publishers */ = { + isa = PBXGroup; + children = ( + EAB1D2E328AE842000DAE764 /* Publisher+Bind.swift */, + EAB1D2C628A6E76300DAE764 /* ModelHandlerPublisher.swift */, + ); + path = Publishers; + sourceTree = ""; + }; EAF7F092289985E200B287F5 /* Checkbox */ = { isa = PBXGroup; children = ( @@ -566,6 +577,7 @@ EAB1D29C28A5618900DAE764 /* RadioButtonGroup.swift in Sources */, 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 */, EA3361B6288B2A410071C351 /* Control.swift in Sources */, diff --git a/VDS/Classes/ModelHandlerPublisher.swift b/VDS/Publishers/ModelHandlerPublisher.swift similarity index 100% rename from VDS/Classes/ModelHandlerPublisher.swift rename to VDS/Publishers/ModelHandlerPublisher.swift diff --git a/VDS/Publishers/Publisher+Bind.swift b/VDS/Publishers/Publisher+Bind.swift new file mode 100644 index 00000000..33fcaa94 --- /dev/null +++ b/VDS/Publishers/Publisher+Bind.swift @@ -0,0 +1,24 @@ +// +// Publisher+Bind.swift +// VDS +// +// Created by Matt Bruce on 8/18/22. +// + +import Foundation +import Combine + +public typealias Binding = Subscriber + +public extension Publisher where Failure == Never { + func bind(subscriber: B) -> AnyCancellable + where B.Failure == Never, B.Input == Output { + + handleEvents(receiveSubscription: { subscription in + subscriber.receive(subscription: subscription) + }) + .sink { value in + _ = subscriber.receive(value) + } + } +}