| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- import Foundation
- struct BloodGlucose: JSON, Identifiable, Hashable {
- enum Direction: String, JSON {
- case tripleUp = "TripleUp"
- case doubleUp = "DoubleUp"
- case singleUp = "SingleUp"
- case fortyFiveUp = "FortyFiveUp"
- case flat = "Flat"
- case fortyFiveDown = "FortyFiveDown"
- case singleDown = "SingleDown"
- case doubleDown = "DoubleDown"
- case tripleDown = "TripleDown"
- case none = "NONE"
- case notComputable = "NOT COMPUTABLE"
- case rateOutOfRange = "RATE OUT OF RANGE"
- }
- var _id = UUID().uuidString
- var id: String {
- _id
- }
- var sgv: Int?
- var direction: Direction?
- let date: Decimal
- let dateString: Date
- let unfiltered: Decimal?
- let filtered: Decimal?
- let noise: Int?
- var glucose: Int?
- let type: String?
- var activationDate: Date? = nil
- var sessionStartDate: Date? = nil
- var transmitterID: String? = nil
- var isStateValid: Bool { sgv ?? 0 >= 39 && noise ?? 1 != 4 }
- static func == (lhs: BloodGlucose, rhs: BloodGlucose) -> Bool {
- lhs.dateString == rhs.dateString
- }
- func hash(into hasher: inout Hasher) {
- hasher.combine(dateString)
- }
- }
- enum GlucoseUnits: String, JSON, Equatable {
- case mgdL = "mg/dL"
- case mmolL = "mmol/L"
- static let exchangeRate: Decimal = 0.0555
- }
- extension Int {
- var asMmolL: Decimal {
- Decimal(self) * GlucoseUnits.exchangeRate
- }
- }
- extension Decimal {
- var asMmolL: Decimal {
- self * GlucoseUnits.exchangeRate
- }
- var asMgdL: Decimal {
- self / GlucoseUnits.exchangeRate
- }
- }
- extension Double {
- var asMmolL: Decimal {
- Decimal(self) * GlucoseUnits.exchangeRate
- }
- var asMgdL: Decimal {
- Decimal(self) / GlucoseUnits.exchangeRate
- }
- }
- extension BloodGlucose: SavitzkyGolaySmoothable {
- var value: Double {
- get {
- Double(glucose ?? 0)
- }
- set {
- glucose = Int(newValue)
- sgv = Int(newValue)
- }
- }
- }
|