pomeranian-durations
Version:
An immutable duration library based on the ISO-8601 format for durations.
128 lines (109 loc) • 4.13 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.floorYears = exports.floorMonths = exports.floorWeeks = exports.floorDays = exports.floorHours = exports.floorMinutes = exports.floorSeconds = exports.floor = void 0;
var _transformations = require("./transformations");
var _constants = require("./constants");
var _validate = require("./validate");
/**
* Helpers to floor an ISO8601 duration to a particular granularity.
* @name default
*/
var ALL_UNITS = [_constants.UNIT_NAMES.seconds, _constants.UNIT_NAMES.minutes, _constants.UNIT_NAMES.hours, _constants.UNIT_NAMES.days, _constants.UNIT_NAMES.weeks, _constants.UNIT_NAMES.months, _constants.UNIT_NAMES.years];
var createFloorFnFor = function createFloorFnFor(unit) {
return function (isoString) {
if ((0, _validate.isInvalid)(isoString)) {
return _constants.INVALID_DURATION;
}
var fragments = (0, _transformations.toFragments)(isoString);
var unitsToBeNullified = ALL_UNITS.slice(0, ALL_UNITS.indexOf(unit));
var flooredFragments = unitsToBeNullified.reduce(function (acc, currentUnit) {
acc[currentUnit] = 0; // eslint-disable-line no-param-reassign
return acc;
}, fragments);
flooredFragments[unit] = Math.floor(fragments[unit]);
return (0, _transformations.toIso)(flooredFragments);
};
};
/**
* Floor a duration by a given granularity.
* @param granularity {string} - ISO8601 duration
* @param isoString {string} - ISO8601 duration
* @example
* floor('PT2s', 'PT5S') // => 'PT4S'
* @example
* floor('PT3s', 'PT5S') // => 'PT3S'
* @example
* floor('PT4s', 'PT5S') // => 'PT4S'
*/
var floor = function floor(granularity, isoString) {
var durationAsFragments = (0, _transformations.toFragments)(isoString);
var granularityAsFragments = (0, _transformations.toFragments)(granularity);
var flooredFragments = ALL_UNITS.reduce(function (acc, currentUnit) {
if (!durationAsFragments[currentUnit] || !granularityAsFragments[currentUnit]) {
return acc;
}
acc[currentUnit] = durationAsFragments[currentUnit] - // eslint-disable-line no-param-reassign
durationAsFragments[currentUnit] % granularityAsFragments[currentUnit];
return acc;
}, {});
return (0, _transformations.toIso)(flooredFragments);
};
/**
* Floor a given ISO duration to the current second.
* @param isoDuration {string} - ISO8601 duration
* @example
* floorSeconds('PT1.1S') // => 'PT1S'
*/
exports.floor = floor;
var floorSeconds = createFloorFnFor(_constants.UNIT_NAMES.seconds);
/**
* Floor a given ISO duration to the current minute.
* @param isoDuration {string} - ISO8601 duration
* @example
* floorMinutes('PT1.1M') // => 'PT1M'
*/
exports.floorSeconds = floorSeconds;
var floorMinutes = createFloorFnFor(_constants.UNIT_NAMES.minutes);
/**
* Floor a given ISO duration to the current hour.
* @param isoDuration {string} - ISO8601 duration
* @example
* floorHours('PT1.1H') // => 'PT1H'
*/
exports.floorMinutes = floorMinutes;
var floorHours = createFloorFnFor(_constants.UNIT_NAMES.hours);
/**
* Floor a given ISO duration to the current day.
* @param isoDuration {string} - ISO8601 duration
* @example
* floorDays('P1.1D') // => 'P1D'
*/
exports.floorHours = floorHours;
var floorDays = createFloorFnFor(_constants.UNIT_NAMES.days);
/**
* Floor a given ISO duration to the current week.
* @param isoDuration {string} - ISO8601 duration
* @example
* floorWeeks('P1.1W') // => 'P1W'
*/
exports.floorDays = floorDays;
var floorWeeks = createFloorFnFor(_constants.UNIT_NAMES.weeks);
/**
* Floor a given ISO duration to the current month.
* @param isoDuration {string} - ISO8601 duration
* @example
* floorMonths('P1.1M') // => 'P1M'
*/
exports.floorWeeks = floorWeeks;
var floorMonths = createFloorFnFor(_constants.UNIT_NAMES.months);
/**
* Floor a given ISO duration to the current year.
* @param isoDuration {string} - ISO8601 duration
* @example
* floorYears('P1.1Y') // => 'P1Y'
*/
exports.floorMonths = floorMonths;
var floorYears = createFloorFnFor(_constants.UNIT_NAMES.years);
exports.floorYears = floorYears;