From 1971b2fd19f7c5e76b5fabbc14009719ba65a523 Mon Sep 17 00:00:00 2001 From: Michael Housh Date: Fri, 29 Oct 2021 08:30:01 -0400 Subject: [PATCH] Working on state. --- Sources/Models/State.swift | 67 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 Sources/Models/State.swift 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 { }