added withable

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2022-08-16 10:02:29 -05:00
parent b3483053f6
commit 017f7eadb0
6 changed files with 57 additions and 9 deletions

View File

@ -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 = "<group>"; };
EAB1D2A228A5994800DAE764 /* Debuggable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Debuggable.swift; sourceTree = "<group>"; };
EAB1D2C628A6E76300DAE764 /* ModelHandlerPublisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModelHandlerPublisher.swift; sourceTree = "<group>"; };
EAB1D2CC28ABE76000DAE764 /* Withable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Withable.swift; sourceTree = "<group>"; };
EAF7F0932899861000B287F5 /* Checkbox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Checkbox.swift; sourceTree = "<group>"; };
EAF7F0942899861000B287F5 /* CheckboxModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckboxModel.swift; sourceTree = "<group>"; };
EAF7F0992899B17200B287F5 /* CATransaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CATransaction.swift; sourceTree = "<group>"; };
@ -289,6 +291,7 @@
EAF7F0A5289B0CE000B287F5 /* Resetable.swift */,
EA3361C8289054C50071C351 /* Surfaceable.swift */,
EA3361B7288B2AAA0071C351 /* ViewProtocol.swift */,
EAB1D2CC28ABE76000DAE764 /* Withable.swift */,
);
path = Protocols;
sourceTree = "<group>";
@ -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 */,

View File

@ -11,9 +11,3 @@ public struct Constants {
public static let ModelStateDebounce = 0.02
public static let PaddingOne = 10.0
}
public func updated <T> (_ value: T, with update: (inout T) -> Void) -> T {
var editable = value
update(&editable)
return editable
}

View File

@ -28,7 +28,7 @@ public class RadioButtonGroupBase<RadioButtonGroupModelType: RadioButtonGroupMod
newHasError = false
}
let selectors = model.selectors.compactMap { existing in
return updated(existing){
return existing.with {
$0.hasError = newHasError
}
}

View File

@ -44,7 +44,7 @@ open class SelectorGroupBase<SelectorType, SelectorGroupType: SelectorGroupModel
private func updateSelectors(){
let selectors = model.selectors.compactMap { existing in
return updated(existing){
return existing.with {
$0.disabled = disabled
$0.surface = surface
}

View File

@ -7,6 +7,6 @@
import Foundation
public protocol Modelable: Surfaceable, Disabling, Initable {
public protocol Modelable: Surfaceable, Disabling, Initable, Withable {
}

View File

@ -0,0 +1,50 @@
//
// Withable.swift
// VDS
//
// Created by Matt Bruce on 8/16/22.
//
import Foundation
// MARK: - Withable for Objects
public protocol ObjectWithable: AnyObject {
associatedtype T
/// Provides a closure to configure instances inline.
/// - Parameter closure: A closure `self` as the argument.
/// - Returns: Simply returns the instance after called the `closure`.
@discardableResult func with(_ closure: (_ instance: T) -> 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(&copy)
return copy
}
}