UNPKG

@gouvfr-anct/mednum

Version:

✨ Permet de transformer une source de données vers le schéma des lieux de mediation numerique

34 lines (33 loc) 3.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.mergeMultipleHoursRanges = exports.mergeHoursRanges = void 0; const compareTimes = ([hoursA, minutesA], [hoursB, minutesB]) => hoursA === hoursB && minutesA === minutesB ? 0 : +hoursA * 60 + +minutesA - (+hoursB * 60 + +minutesB); const combineHoursAndMinutes = ([hours, minutes]) => `${hours}:${minutes}`; const combineTimes = (timeA, timeB) => `${timeA}-${timeB}`; const isEarlierTimeFirst = (timeA, timeB) => compareTimes(timeA, timeB) < 0; const laterStartingHour = (timeA, timeB) => isEarlierTimeFirst(timeA, timeB) ? combineHoursAndMinutes(timeB) : combineHoursAndMinutes(timeA); const earlierStartingHour = (timeA, timeB) => isEarlierTimeFirst(timeA, timeB) ? combineHoursAndMinutes(timeA) : combineHoursAndMinutes(timeB); const combineRanges = (hoursRangeA, hoursRangeB) => `${hoursRangeA},${hoursRangeB}`; const throwSplitTimeError = (hourRanges) => { throw new Error(`The hour ranges ${hourRanges?.join(',')} is invalid`); }; const isValidSplitTime = (times) => times?.length === 2; const formatSplitTime = (times) => isValidSplitTime(times) ? times : throwSplitTimeError(times); const splitTime = (hourRanges) => formatSplitTime([hourRanges?.at(0), hourRanges?.at(1)]); const rangeToStartingTime = (hoursRangeB) => splitTime(hoursRangeB.split('-').at(0)?.split(':')); const rangeToEndingTime = (hoursRangeA) => splitTime(hoursRangeA.split('-').at(1)?.split(':')); const orderByEarlierStartingHours = (hoursRangeA, hoursRangeB) => isEarlierTimeFirst(rangeToEndingTime(hoursRangeA), rangeToStartingTime(hoursRangeB)) ? [hoursRangeA, hoursRangeB] : [hoursRangeB, hoursRangeA]; const hasOverlap = (hoursRange1, hoursRange2) => !isEarlierTimeFirst(rangeToEndingTime(hoursRange1), rangeToStartingTime(hoursRange2)); const mergeHoursRanges = (hoursRangeA, hoursRangeB) => (([earlierRange, laterRange]) => hasOverlap(earlierRange, laterRange) ? combineTimes(earlierStartingHour(rangeToStartingTime(earlierRange), rangeToStartingTime(laterRange)), laterStartingHour(rangeToEndingTime(earlierRange), rangeToEndingTime(laterRange))) : combineRanges(earlierRange, laterRange))(orderByEarlierStartingHours(hoursRangeA, hoursRangeB)); exports.mergeHoursRanges = mergeHoursRanges; const isValidDecomposeMultipleRanges = (hoursRangesSplit) => hoursRangesSplit?.length === 2; const decomposeMultipleRanges = (hoursRanges) => ((hoursRangesSplit) => isValidDecomposeMultipleRanges(hoursRangesSplit) ? hoursRangesSplit : [hoursRanges, hoursRanges])(hoursRanges.split(',')); const isValidHourRange = (hourRange) => hourRange != null; const startRange = (startMerged) => ((splitStartHoursRange) => (isValidHourRange(splitStartHoursRange) ? splitStartHoursRange : startMerged))(startMerged.split(',').at(0)); const endRange = (endMerged) => ((splitEndHoursRange) => (isValidHourRange(splitEndHoursRange) ? splitEndHoursRange : endMerged))(endMerged.split(',').at(1)); const mergeMultipleHoursRanges = (hoursRanges1, hoursRanges2) => (([startHoursRange1, endHoursRange1], [startHoursRange2, endHoursRange2]) => (0, exports.mergeHoursRanges)(startRange((0, exports.mergeHoursRanges)(startHoursRange1, startHoursRange2)), endRange((0, exports.mergeHoursRanges)(endHoursRange1, endHoursRange2))))(decomposeMultipleRanges(hoursRanges1), decomposeMultipleRanges(hoursRanges2)); exports.mergeMultipleHoursRanges = mergeMultipleHoursRanges;