FastRiseCondition.swift 836 B

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