Files
swift-mqtt-dewpoint/Sources/Models/State.swift
2021-10-29 08:30:01 -04:00

68 lines
1.4 KiB
Swift

import Foundation
import CoreUnitTypes
public struct State: Equatable {
@TrackedChanges
public var temperature: Temperature?
@TrackedChanges
public var humidity: RelativeHumidity?
public init(
temperature: Temperature? = nil,
humidity: RelativeHumidity? = nil,
needsProcessed: Bool = false
) {
self._temperature = .init(wrappedValue: temperature, needsProcessed: needsProcessed)
self._humidity = .init(wrappedValue: humidity, needsProcessed: needsProcessed)
}
public var needsProcessed: Bool {
$temperature.needsProcessed || $humidity.needsProcessed
}
}
@propertyWrapper
public struct TrackedChanges<Value> {
private var tracking: TrackingState
private var value: Value
public var wrappedValue: Value {
get { value }
set {
// fix
value = newValue
}
}
public init(wrappedValue: Value, needsProcessed: Bool = false) {
self.value = wrappedValue
self.tracking = needsProcessed ? .needsProcessed : .hasProcessed
}
enum TrackingState {
case hasProcessed
case needsProcessed
}
public var needsProcessed: Bool {
get { tracking == .needsProcessed }
set {
if newValue {
tracking = .needsProcessed
} else {
tracking = .hasProcessed
}
}
}
public var projectedValue: Self {
get { self }
set { self = newValue }
}
}
extension TrackedChanges: Equatable where Value: Equatable { }