Skip to content

Instantly share code, notes, and snippets.

@adam-zethraeus
Created September 15, 2023 06:33
Show Gist options
  • Save adam-zethraeus/6631e9aff6328fc749c6d6919d2af655 to your computer and use it in GitHub Desktop.
Save adam-zethraeus/6631e9aff6328fc749c6d6919d2af655 to your computer and use it in GitHub Desktop.
Transaction Wrapper
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