FastRiseCondition.swift 824 B

12345678910111213141516171819202122232425262728
  1. // LoopFollow
  2. // FastRiseCondition.swift
  3. // Created by Jonas Björkert on 2025-05-15.
  4. import Foundation
  5. /// Fires when N consecutive BG deltas are ≥ `delta` mg/dL.
  6. struct FastRiseCondition: AlarmCondition {
  7. static let type: AlarmType = .fastRise
  8. init() {}
  9. func evaluate(alarm: Alarm, data: AlarmData) -> Bool {
  10. guard
  11. let rise = alarm.delta, rise > 0,
  12. let streak = alarm.monitoringWindow, streak > 0,
  13. data.bgReadings.count >= streak + 1
  14. else { return false }
  15. // grab the last (streak + 1) readings, newest last
  16. let recent = data.bgReadings.suffix(streak + 1).map(\.sgv)
  17. // every forward delta must hit the threshold
  18. return zip(recent.dropFirst(), recent).allSatisfy {
  19. Double($0 - $1) >= rise
  20. }
  21. }
  22. }