Jelajahi Sumber

Merge pull request #428 from kingst/isf-mmol-settings-skipping-x.5

Add missing mmol/L/U values from ISF
Deniz Cengiz 1 tahun lalu
induk
melakukan
796ccedade
1 mengubah file dengan 30 tambahan dan 3 penghapusan
  1. 30 3
      Trio/Sources/Modules/ISFEditor/ISFEditorStateModel.swift

+ 30 - 3
Trio/Sources/Modules/ISFEditor/ISFEditorStateModel.swift

@@ -2,6 +2,16 @@ import CoreData
 import Observation
 import SwiftUI
 
+extension [Decimal] {
+    func findClosestIndex(to target: Element) -> Int? {
+        guard !isEmpty else { return nil }
+
+        return enumerated().min(by: {
+            abs($0.element - target) < abs($1.element - target)
+        })?.offset
+    }
+}
+
 extension ISFEditor {
     @Observable final class StateModel: BaseStateModel<Provider> {
         @ObservationIgnored @Injected() var determinationStorage: DeterminationStorage!
@@ -19,7 +29,16 @@ extension ISFEditor {
             var values = stride(from: 9, to: 540.01, by: 1.0).map { Decimal($0) }
 
             if units == .mmolL {
-                values = values.filter { Int(truncating: $0 as NSNumber) % 2 == 0 }
+                var mmolValues = values.filter { Int(truncating: $0 as NSNumber) % 2 == 0 }
+                // check for any missing values
+                var valuesInMmolSet = Set(mmolValues.map(\.asMmolL))
+                for value in values {
+                    let valueInMmmol = value.asMmolL
+                    if valuesInMmolSet.insert(valueInMmmol).inserted {
+                        mmolValues.append(value)
+                    }
+                }
+                values = mmolValues.sorted()
             }
 
             return values
@@ -43,8 +62,16 @@ extension ISFEditor {
 
             items = profile.sensitivities.map { value in
                 let timeIndex = timeValues.firstIndex(of: Double(value.offset * 60)) ?? 0
-                let rateIndex = rateValues.firstIndex(of: value.sensitivity) ?? 0
-                return Item(rateIndex: rateIndex, timeIndex: timeIndex)
+                var rateIndex = rateValues.firstIndex(of: value.sensitivity)
+                if rateIndex == nil {
+                    // try to look up the closest value
+                    if let min = rateValues.first, let max = rateValues.last {
+                        if value.sensitivity >= (min - 1), value.sensitivity <= (max + 1) {
+                            rateIndex = rateValues.findClosestIndex(to: value.sensitivity)
+                        }
+                    }
+                }
+                return Item(rateIndex: rateIndex ?? 0, timeIndex: timeIndex)
             }
 
             initialItems = items.map { Item(rateIndex: $0.rateIndex, timeIndex: $0.timeIndex) }