vremel
Version:
JavaScript date utility library for Temporal API
38 lines • 2.06 kB
JavaScript
import { shortest } from "../duration/shortest.js";
import { isInstant, isInstantArray, isPlainDate, isPlainDateArray, isPlainDateTime, isPlainDateTimeArray, isPlainTime, isPlainTimeArray, isPlainYearMonth, isPlainYearMonthArray, isZonedDateTime, isZonedDateTimeArray, } from "../type-utils.js";
function minIndex(array) {
return array.indexOf(array.reduce((a, b) => Math.min(a, b)));
}
/**
* Returns an index of the closest datetime object to the given datetime object from the passed array.
* @param dateTimeToCompare the date to compare with
* @param dateTimes array of datetime objects
* @returns index of the closest datetime
*/
export function closestIndexTo(dateTimeToCompare, dateTimes) {
if (isInstant(dateTimeToCompare) && isInstantArray(dateTimes)) {
const diff = dateTimes.map((d) => dateTimeToCompare.until(d).abs());
return diff.indexOf(shortest(diff));
}
if (isZonedDateTime(dateTimeToCompare) && isZonedDateTimeArray(dateTimes)) {
return closestIndexTo(dateTimeToCompare.toInstant(), dateTimes.map((d) => d.toInstant()));
}
if (isPlainDate(dateTimeToCompare) && isPlainDateArray(dateTimes)) {
const diff = dateTimes.map((d) => dateTimeToCompare.until(d, { largestUnit: "day" }).abs().days);
return minIndex(diff);
}
if (isPlainTime(dateTimeToCompare) && isPlainTimeArray(dateTimes)) {
const diff = dateTimes.map((d) => dateTimeToCompare.until(d).abs());
return diff.indexOf(shortest(diff));
}
if (isPlainDateTime(dateTimeToCompare) && isPlainDateTimeArray(dateTimes)) {
const diff = dateTimes.map((d) => dateTimeToCompare.until(d, { largestUnit: "hour" }).abs());
return diff.indexOf(shortest(diff));
}
if (isPlainYearMonth(dateTimeToCompare) && isPlainYearMonthArray(dateTimes)) {
const diff = dateTimes.map((d) => dateTimeToCompare.until(d, { largestUnit: "month" }).abs().months);
return minIndex(diff);
}
throw new Error("Invalid arguments");
}
//# sourceMappingURL=closestIndexTo.js.map