diff --git a/Sources/Models/State.swift b/Sources/Models/State.swift new file mode 100644 index 0000000..574b38b --- /dev/null +++ b/Sources/Models/State.swift @@ -0,0 +1,67 @@ +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 { + + 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 { }