Implement minus 8 day rule
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
import { LocalDate } from 'js-joda'
|
||||
import getNfpStatus from './index'
|
||||
|
||||
export default function (previousCycles) {
|
||||
const fhms = previousCycles
|
||||
.map(cycle => {
|
||||
const status = getNfpStatus({ cycle })
|
||||
if (status.temperatureShift) {
|
||||
const day = status.temperatureShift.firstHighMeasurementDay
|
||||
const firstCycleDayDate = LocalDate.parse(cycle[0].date)
|
||||
const fhmDate = LocalDate.parse(day.date)
|
||||
return fhmDate.compareTo(firstCycleDayDate) + 1
|
||||
}
|
||||
return null
|
||||
})
|
||||
.filter(val => typeof val === 'number')
|
||||
|
||||
const preOvuLength = Math.min(...fhms) - 8
|
||||
|
||||
// pre ovu length may only be lengthened if we have more than 12 previous fhms
|
||||
// if pre ovu length is less than 5, it shortened even with fewer prev fhms
|
||||
if (preOvuLength < 5) return preOvuLength
|
||||
if (fhms.length >= 12) return preOvuLength
|
||||
|
||||
return null
|
||||
}
|
||||
@@ -1,20 +1,21 @@
|
||||
import { LocalDate } from "js-joda"
|
||||
import apply8DayRule from './minus-8-day-rule'
|
||||
|
||||
export default function(cycle, previousCycles) {
|
||||
// TODO handle no previous cycles
|
||||
let preOvuPhaseLength = 5
|
||||
|
||||
//TODO make sure it handles weird cases like fhm < 9
|
||||
const minus8DayRuleResult = apply8DayRule(previousCycles)
|
||||
if (minus8DayRuleResult) preOvuPhaseLength = minus8DayRuleResult
|
||||
|
||||
const startDate = LocalDate.parse(cycle[0].date)
|
||||
const preOvuPhaseEndDate = startDate.plusDays(preOvuPhaseLength - 1).toString()
|
||||
const maybePreOvuDays = cycle.slice(0, 5).filter(d => d.date <= preOvuPhaseEndDate)
|
||||
const preOvuEndDate = startDate.plusDays(preOvuPhaseLength - 1).toString()
|
||||
const maybePreOvuDays = cycle.slice(0, preOvuPhaseLength).filter(d => {
|
||||
return d.date <= preOvuEndDate
|
||||
})
|
||||
const preOvulatoryDays = getDaysUntilFertileMucus(maybePreOvuDays)
|
||||
let endDate
|
||||
if (preOvulatoryDays.length === maybePreOvuDays.length) {
|
||||
endDate = preOvuPhaseEndDate
|
||||
endDate = preOvuEndDate
|
||||
} else {
|
||||
endDate = preOvulatoryDays[preOvulatoryDays.length - 1].date
|
||||
}
|
||||
@@ -31,11 +32,12 @@ export default function(cycle, previousCycles) {
|
||||
}
|
||||
|
||||
function getDaysUntilFertileMucus(days) {
|
||||
const firstFertileMucusDayIndex = days.findIndex(day => day.mucus && day.mucus.value > 1)
|
||||
const firstFertileMucusDayIndex = days.findIndex(day => {
|
||||
return day.mucus && day.mucus.value > 1
|
||||
})
|
||||
|
||||
if (firstFertileMucusDayIndex > -1) {
|
||||
return days.slice(0, firstFertileMucusDayIndex)
|
||||
}
|
||||
return days
|
||||
}
|
||||
|
||||
function apply8DayRule(previousCycles) {}
|
||||
}
|
||||
Reference in New Issue
Block a user