Created
September 15, 2023 06:33
-
-
Save adam-zethraeus/6631e9aff6328fc749c6d6919d2af655 to your computer and use it in GitHub Desktop.
Transaction Wrapper
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public enum Condition { | |
case new | |
case safe | |
} | |
public enum Transacting<T> { | |
case known(T) | |
case changing(known: T, tentative: T) | |
public mutating func stage(_ value: T) { | |
switch self { | |
case .known(let t): | |
self = .changing(known: t, tentative: value) | |
case .changing(let known, _): | |
self = .changing(known: known, tentative: value) | |
} | |
} | |
public mutating func fallback() { | |
switch self { | |
case .changing(known: let known, _): | |
self = .known(known) | |
case .known: | |
break | |
} | |
} | |
public mutating func accept() { | |
switch self { | |
case .known: | |
break | |
case .changing(_, let tentative): | |
self = .known(tentative) | |
} | |
} | |
public mutating func set(_ value: T) { | |
self = .known(value) | |
} | |
public func get(_ condition: Condition) -> T { | |
switch (condition, self) { | |
case (.new, .known(let value)): | |
return value | |
case (.new, .changing(_, let tentative)): | |
return tentative | |
case (.safe, .known(let value)): | |
return value | |
case (.safe, .changing(let known, _)): | |
return known | |
} | |
} | |
} | |
extension Transacting: Codable where T: Codable {} | |
extension Transacting: Equatable where T: Equatable { | |
mutating func stage(_ value: T) { | |
switch self { | |
case .known(let t): | |
if t != value { | |
self = .changing(known: t, tentative: value) | |
} | |
case .changing(let known, _): | |
self = .changing(known: known, tentative: value) | |
} | |
} | |
} | |
extension Transacting: Hashable where T: Hashable {} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment