InsulinPrecisionManager.swift 982 B

1234567891011121314151617181920212223242526272829303132333435
  1. // LoopFollow
  2. // InsulinPrecisionManager.swift
  3. import Combine
  4. import Foundation
  5. import HealthKit
  6. final class InsulinPrecisionManager: ObservableObject {
  7. static let shared = InsulinPrecisionManager()
  8. @Published private(set) var fractionDigits: Int = 3
  9. private var cancellables = Set<AnyCancellable>()
  10. private init() {
  11. fractionDigits = Self.computeDigits(from: Storage.shared.bolusIncrement.value)
  12. Storage.shared.bolusIncrement.$value
  13. .map(Self.computeDigits(from:))
  14. .removeDuplicates()
  15. .receive(on: DispatchQueue.main)
  16. .assign(to: &$fractionDigits)
  17. }
  18. private static func computeDigits(from q: HKQuantity) -> Int {
  19. let step = max(0.001, q.doubleValue(for: .internationalUnit()))
  20. if step >= 1 { return 0 }
  21. var v = step
  22. var d = 0
  23. while d < 6 && abs(round(v) - v) > 1e-10 {
  24. v *= 10; d += 1
  25. }
  26. return min(max(d, 0), 5)
  27. }
  28. }