diff --git a/VDS.xcodeproj/project.pbxproj b/VDS.xcodeproj/project.pbxproj index 2858e5f0..138a5550 100644 --- a/VDS.xcodeproj/project.pbxproj +++ b/VDS.xcodeproj/project.pbxproj @@ -45,6 +45,7 @@ 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 */; }; 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 @@ 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 = ""; }; 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 = ""; }; @@ -289,6 +291,7 @@ EAF7F0A5289B0CE000B287F5 /* Resetable.swift */, EA3361C8289054C50071C351 /* Surfaceable.swift */, EA3361B7288B2AAA0071C351 /* ViewProtocol.swift */, + EAB1D2CC28ABE76000DAE764 /* Withable.swift */, ); path = Protocols; sourceTree = ""; @@ -537,6 +540,7 @@ EA33622C2891E73B0071C351 /* FontProtocol.swift in Sources */, EAF7F11728A1475A00B287F5 /* RadioButton.swift in Sources */, EAB1D2A128A598FE00DAE764 /* UsesAutoLayout.swift in Sources */, + EAB1D2CD28ABE76100DAE764 /* Withable.swift in Sources */, EAF7F0952899861000B287F5 /* Checkbox.swift in Sources */, EA3361C9289054C50071C351 /* Surfaceable.swift in Sources */, EA3361A2288B1E840071C351 /* ToggleModel.swift in Sources */, diff --git a/VDS/Classes/Constants.swift b/VDS/Classes/Constants.swift index 1df21e1d..fe3bd6f0 100644 --- a/VDS/Classes/Constants.swift +++ b/VDS/Classes/Constants.swift @@ -11,9 +11,3 @@ public struct Constants { public static let ModelStateDebounce = 0.02 public static let PaddingOne = 10.0 } - -public func updated (_ value: T, with update: (inout T) -> Void) -> T { - var editable = value - update(&editable) - return editable -} diff --git a/VDS/Components/RadioButton/RadioButtonGroup.swift b/VDS/Components/RadioButton/RadioButtonGroup.swift index 805dd6bd..9099423c 100644 --- a/VDS/Components/RadioButton/RadioButtonGroup.swift +++ b/VDS/Components/RadioButton/RadioButtonGroup.swift @@ -28,7 +28,7 @@ public class RadioButtonGroupBase Void) -> T +} + +public extension ObjectWithable { + + @discardableResult func with(_ closure: (_ instance: Self) -> Void) -> Self { + closure(self) + return self + } +} + +extension NSObject: ObjectWithable { } + + +// MARK: - Withable for Values +public protocol Withable { + + associatedtype T + + /// Provides a closure to configure instances inline. + /// - Parameter closure: A closure with a mutable copy of `self` as the argument. + /// - Returns: Simply returns the mutated copy of the instance after called the `closure`. + @discardableResult func with(_ closure: (_ instance: inout T) -> Void) -> T +} + +public extension Withable { + + @discardableResult func with(_ closure: (_ instance: inout Self) -> Void) -> Self { + var copy = self + closure(©) + return copy + } +}