BloodGlucose.swift 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. var direction: Direction?
  23. let date: Decimal
  24. let dateString: Date
  25. let unfiltered: Decimal?
  26. let filtered: Decimal?
  27. let noise: Int?
  28. var glucose: Int?
  29. let type: String?
  30. var isStateValid: Bool { sgv ?? 0 >= 39 && noise ?? 1 != 4 }
  31. static func == (lhs: BloodGlucose, rhs: BloodGlucose) -> Bool {
  32. lhs.dateString == rhs.dateString
  33. }
  34. func hash(into hasher: inout Hasher) {
  35. hasher.combine(dateString)
  36. }
  37. }
  38. enum GlucoseUnits: String, JSON, Equatable {
  39. case mgdL = "mg/dL"
  40. case mmolL = "mmol/L"
  41. static let exchangeRate: Decimal = 0.0555
  42. }
  43. extension Int {
  44. var asMmolL: Decimal {
  45. Decimal(self) * GlucoseUnits.exchangeRate
  46. }
  47. }
  48. extension Decimal {
  49. var asMmolL: Decimal {
  50. self * GlucoseUnits.exchangeRate
  51. }
  52. var asMgdL: Decimal {
  53. self / GlucoseUnits.exchangeRate
  54. }
  55. }
  56. extension Double {
  57. var asMmolL: Decimal {
  58. Decimal(self) * GlucoseUnits.exchangeRate
  59. }
  60. var asMgdL: Decimal {
  61. Decimal(self) / GlucoseUnits.exchangeRate
  62. }
  63. }