From 33393f498accb3827650f36501d7b48f91dfd959 Mon Sep 17 00:00:00 2001 From: Julia Friesel Date: Thu, 28 Jun 2018 15:16:21 +0200 Subject: [PATCH] Extract getLastMensesStart --- lib/get-cycle-day-number.js | 37 ++++++------------------------------ lib/get-last-menses-start.js | 34 +++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 31 deletions(-) create mode 100644 lib/get-last-menses-start.js diff --git a/lib/get-cycle-day-number.js b/lib/get-cycle-day-number.js index d1b056a..164eb9c 100644 --- a/lib/get-cycle-day-number.js +++ b/lib/get-cycle-day-number.js @@ -1,6 +1,5 @@ import * as joda from 'js-joda' - -const LocalDate = joda.LocalDate +import getLastMensesStart from './get-last-menses-start' export default function config(opts = {}) { let bleedingDaysSortedByDate @@ -12,37 +11,13 @@ export default function config(opts = {}) { } const maxBreakInBleeding = opts.maxBreakInBleeding || 1 - return function getCycleDayNumber(targetDateString) { - const targetDate = LocalDate.parse(targetDateString) - const withWrappedDates = bleedingDaysSortedByDate - .filter(day => !day.bleeding.exclude) - .map(day => { - day.wrappedDate = LocalDate.parse(day.date) - return day - }) - - const firstBleedingDayBeforeTargetDayIndex = withWrappedDates.findIndex(day => { - return ( - day.wrappedDate.isEqual(targetDate) || - day.wrappedDate.isBefore(targetDate) - ) - }) - - if (firstBleedingDayBeforeTargetDayIndex < 0) return null - const previousBleedingDays = withWrappedDates.slice(firstBleedingDayBeforeTargetDayIndex) - - const lastPeriodStart = previousBleedingDays.find((day, i) => { - return thereIsNoPreviousBleedingDayWithinTheThreshold(day, previousBleedingDays.slice(i + 1), maxBreakInBleeding) - }) - - const diffInDays = lastPeriodStart.wrappedDate.until(targetDate, joda.ChronoUnit.DAYS) + return function(targetDateString) { + const lastMensesStart = getLastMensesStart(targetDateString, bleedingDaysSortedByDate, maxBreakInBleeding) + if (!lastMensesStart) return null + const targetDate = joda.LocalDate.parse(targetDateString) + const diffInDays = lastMensesStart.wrappedDate.until(targetDate, joda.ChronoUnit.DAYS) // cycle starts at day 1 return diffInDays + 1 } -} - -function thereIsNoPreviousBleedingDayWithinTheThreshold(bleedingDay, earlierCycleDays, allowedBleedingBreak) { - const periodThreshold = bleedingDay.wrappedDate.minusDays(allowedBleedingBreak + 1) - return !earlierCycleDays.some(({ wrappedDate }) => wrappedDate.equals(periodThreshold) || wrappedDate.isAfter(periodThreshold)) } \ No newline at end of file diff --git a/lib/get-last-menses-start.js b/lib/get-last-menses-start.js new file mode 100644 index 0000000..7fb321f --- /dev/null +++ b/lib/get-last-menses-start.js @@ -0,0 +1,34 @@ +import * as joda from 'js-joda' + +const LocalDate = joda.LocalDate + +export default function getLastMensesStart(targetDateString, bleedingDaysSortedByDate, maxBreakInBleeding) { + const targetDate = LocalDate.parse(targetDateString) + const withWrappedDates = bleedingDaysSortedByDate + .filter(day => !day.bleeding.exclude) + .map(day => { + day.wrappedDate = LocalDate.parse(day.date) + return day + }) + + const firstBleedingDayBeforeTargetDayIndex = withWrappedDates.findIndex(day => { + return ( + day.wrappedDate.isEqual(targetDate) || + day.wrappedDate.isBefore(targetDate) + ) + }) + + if (firstBleedingDayBeforeTargetDayIndex < 0) return null + const previousBleedingDays = withWrappedDates.slice(firstBleedingDayBeforeTargetDayIndex) + + const lastPeriodStart = previousBleedingDays.find((day, i) => { + return thereIsNoPreviousBleedingDayWithinTheThreshold(day, previousBleedingDays.slice(i + 1), maxBreakInBleeding) + }) + + return lastPeriodStart +} + +function thereIsNoPreviousBleedingDayWithinTheThreshold(bleedingDay, earlierCycleDays, allowedBleedingBreak) { + const periodThreshold = bleedingDay.wrappedDate.minusDays(allowedBleedingBreak + 1) + return !earlierCycleDays.some(({ wrappedDate }) => wrappedDate.equals(periodThreshold) || wrappedDate.isAfter(periodThreshold)) +} \ No newline at end of file