UNPKG

pomeranian-durations

Version:

An immutable duration library based on the ISO-8601 format for durations.

128 lines (109 loc) 4.13 kB
"use strict"; 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;