BloodGlucose.swift 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import Foundation
  2. struct BloodGlucose: JSON, Identifiable, Hashable {
  3. enum Direction: String, JSON {
  4. case tripleUp = "TripleUp"
  5. case doubleUp = "DoubleUp"
  6. case singleUp = "SingleUp"
  7. case fortyFiveUp = "FortyFiveUp"
  8. case flat = "Flat"
  9. case fortyFiveDown = "FortyFiveDown"
  10. case singleDown = "SingleDown"
  11. case doubleDown = "DoubleDown"
  12. case tripleDown = "TripleDown"
  13. case none = "NONE"
  14. case notComputable = "NOT COMPUTABLE"
  15. case rateOutOfRange = "RATE OUT OF RANGE"
  16. }
  17. var _id = UUID().uuidString
  18. var id: String {
  19. _id
  20. }
  21. var sgv: Int?
  22. let direction: Direction?
  23. let date: Decimal
  24. let dateString: Date
  25. let filtered: Decimal?
  26. let noise: Int?
  27. var glucose: Int?
  28. let type: String?
  29. var isStateValid: Bool { sgv ?? 0 >= 39 && noise ?? 1 != 4 }
  30. static func == (lhs: BloodGlucose, rhs: BloodGlucose) -> Bool {
  31. lhs.dateString == rhs.dateString
  32. }
  33. func hash(into hasher: inout Hasher) {
  34. hasher.combine(dateString)
  35. }
  36. }
  37. enum GlucoseUnits: String, JSON, Equatable {
  38. case mgdL = "mg/dL"
  39. case mmolL = "mmol/L"
  40. static let exchangeRate: Decimal = 0.0555
  41. }
  42. extension Int {
  43. var asMmolL: Decimal {
  44. Decimal(self) * GlucoseUnits.exchangeRate
  45. }
  46. }
  47. extension Decimal {
  48. var asMmolL: Decimal {
  49. self * GlucoseUnits.exchangeRate
  50. }
  51. var asMgdL: Decimal {
  52. self / GlucoseUnits.exchangeRate
  53. }
  54. }
  55. extension Double {
  56. var asMmolL: Decimal {
  57. Decimal(self) * GlucoseUnits.exchangeRate
  58. }
  59. var asMgdL: Decimal {
  60. Decimal(self) / GlucoseUnits.exchangeRate
  61. }
  62. }