Isf.swift 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import Foundation
  2. // I removed the cache that the Javascript version has to help keep it simple
  3. struct Isf {
  4. static func isfLookup(
  5. isfDataInput: InsulinSensitivities,
  6. timestamp: Date? = nil
  7. ) throws -> (Decimal, ComputedInsulinSensitivities) {
  8. let now = timestamp ?? Date()
  9. let isfData = isfDataInput.computedInsulinSensitivies()
  10. // Sort sensitivities by offset
  11. let sortedSensitivities = isfData.sensitivities.sorted { $0.offset < $1.offset }
  12. // Verify first offset is 0
  13. guard let firstSensitivity = sortedSensitivities.first,
  14. firstSensitivity.offset == 0
  15. else {
  16. return (-1, isfData)
  17. }
  18. // Default to last entry
  19. guard var isfSchedule = sortedSensitivities.last else {
  20. return (-1, isfData)
  21. }
  22. var endMinutes = 1440
  23. // Find matching sensitivity for current time
  24. for (curr, next) in zip(sortedSensitivities, sortedSensitivities.dropFirst()) {
  25. if try now.isMinutesFromMidnightWithinRange(lowerBound: curr.offset, upperBound: next.offset) {
  26. endMinutes = next.offset
  27. isfSchedule = curr
  28. break
  29. }
  30. }
  31. // in the Javascript implementation they cache the last entry
  32. // which we don't do, but in the process they mutate the input
  33. // which is visible in Profile. This logic is to update our
  34. // input with the new endOffset parameter
  35. let updatedSchedule = isfData.sensitivities.map { sensitivity in
  36. if sensitivity.id == isfSchedule.id {
  37. return ComputedInsulinSensitivityEntry(
  38. sensitivity: sensitivity.sensitivity,
  39. offset: sensitivity.offset,
  40. start: sensitivity.start,
  41. endOffset: endMinutes,
  42. id: sensitivity.id
  43. )
  44. } else {
  45. return sensitivity
  46. }
  47. }
  48. return (
  49. isfSchedule.sensitivity,
  50. ComputedInsulinSensitivities(
  51. units: isfData.units,
  52. userPreferredUnits: isfData.userPreferredUnits,
  53. sensitivities: updatedSchedule
  54. )
  55. )
  56. }
  57. }