@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
JavaScript
;
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;