typed-duration
Version:
Zero-dependency typed duration library for JavaScript
172 lines (171 loc) • 6.39 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.daysFrom = exports.hoursFrom = exports.minutesFrom = exports.secondsFrom = exports.millisecondsFrom = exports.numberFrom = exports.daysOf = exports.hoursOf = exports.minutesOf = exports.millisecondsOf = exports.secondsOf = exports.valueOf = exports.valueFrom = exports.isTypedDuration = void 0;
/**
* Returns true if the argument is a typed duration object.
* Also, acts as a type guard.
*
*/
const isTypedDuration = (maybeTypedDuration) => typeof maybeTypedDuration === "object" &&
(maybeTypedDuration === null || maybeTypedDuration === void 0 ? void 0 : maybeTypedDuration.valueType) === "TYPED_DURATION";
exports.isTypedDuration = isTypedDuration;
/**
* Return the unwrapped number from any typed duration, regardless of its type
*/
const valueFrom = (time) => (0, exports.isTypedDuration)(time) ? time.value : time;
exports.valueFrom = valueFrom;
/**
*
* Return a string representation, with units. For example: `60000ms`
*/
const valueOf = (time, defaultUnit = "") => `${(0, exports.valueFrom)(time)}${(0, exports.isTypedDuration)(time) ? time.unit : defaultUnit}`;
exports.valueOf = valueOf;
const isSeconds = (maybeSeconds) => (0, exports.isTypedDuration)(maybeSeconds) && maybeSeconds.type === "SECONDS";
const isMilliseconds = (maybeMilliseconds) => (0, exports.isTypedDuration)(maybeMilliseconds) &&
maybeMilliseconds.type === "MILLISECONDS";
const isMinutes = (maybeMinutes) => (0, exports.isTypedDuration)(maybeMinutes) && maybeMinutes.type === "MINUTES";
const isHours = (maybeHours) => (0, exports.isTypedDuration)(maybeHours) && maybeHours.type === "HOURS";
const isDays = (maybeDays) => (0, exports.isTypedDuration)(maybeDays) && maybeDays.type === "DAYS";
const isNumber = (maybeNumber) => typeof maybeNumber === "number";
const newSeconds = (time) => ({
type: "SECONDS",
value: time,
valueType: "TYPED_DURATION",
unit: "s",
});
function secondsOf(time) {
return isSeconds(time)
? time
: isNumber(time)
? newSeconds(time)
: isMilliseconds(time)
? secondsOf(time.value / 1000)
: isMinutes(time)
? secondsOf(time.value * 60)
: isHours(time)
? secondsOf(minutesOf(time))
: isDays(time)
? secondsOf(minutesOf(hoursOf(time)))
: time;
}
exports.secondsOf = secondsOf;
const newMilliseconds = (time) => ({
type: "MILLISECONDS",
value: time,
valueType: "TYPED_DURATION",
unit: "ms",
});
function millisecondsOf(time) {
return isMilliseconds(time)
? time
: isNumber(time)
? newMilliseconds(time)
: isSeconds(time)
? millisecondsOf(time.value * 1000)
: isMinutes(time)
? millisecondsOf(secondsOf(time))
: isHours(time)
? millisecondsOf(secondsOf(minutesOf(time)))
: isDays(time)
? millisecondsOf(secondsOf(minutesOf(hoursOf(time))))
: time;
}
exports.millisecondsOf = millisecondsOf;
const newMinutes = (time) => ({
type: "MINUTES",
value: time,
valueType: "TYPED_DURATION",
unit: "m",
});
function minutesOf(time) {
return isMinutes(time)
? time
: isNumber(time)
? newMinutes(time)
: isMilliseconds(time)
? minutesOf(secondsOf(time))
: isSeconds(time)
? newMinutes(time.value / 60)
: isHours(time)
? newMinutes(time.value * 60)
: isDays(time)
? minutesOf(hoursOf(time))
: time;
}
exports.minutesOf = minutesOf;
const newHours = (time) => ({
type: "HOURS",
value: time,
valueType: "TYPED_DURATION",
unit: "h",
});
function hoursOf(time) {
return isHours(time)
? time
: isNumber(time)
? newHours(time)
: isMilliseconds(time)
? hoursOf(minutesOf(secondsOf(time)))
: isSeconds(time)
? hoursOf(minutesOf(time))
: isMinutes(time)
? hoursOf(time.value / 60)
: isDays(time)
? hoursOf(time.value * 24)
: time;
}
exports.hoursOf = hoursOf;
const newDays = (time) => ({
type: "DAYS",
value: time,
valueType: "TYPED_DURATION",
unit: "d",
});
function daysOf(time) {
return isDays(time)
? time
: isNumber(time)
? newDays(time)
: isMilliseconds(time)
? daysOf(hoursOf(minutesOf(secondsOf(time))))
: isSeconds(time)
? daysOf(hoursOf(minutesOf(time)))
: isMinutes(time)
? daysOf(hoursOf(time))
: isHours(time)
? daysOf(time.value / 24)
: time;
}
exports.daysOf = daysOf;
const numberFrom = (time) => (0, exports.isTypedDuration)(time) ? time.value : time;
exports.numberFrom = numberFrom;
const millisecondsFrom = (time) => isNumber(time)
? time
: isMilliseconds(time)
? (0, exports.numberFrom)(time)
: (0, exports.millisecondsFrom)(millisecondsOf(time));
exports.millisecondsFrom = millisecondsFrom;
const secondsFrom = (time) => isNumber(time)
? time
: isSeconds(time)
? (0, exports.numberFrom)(time)
: (0, exports.secondsFrom)(secondsOf(time));
exports.secondsFrom = secondsFrom;
const minutesFrom = (time) => isNumber(time)
? time
: isMinutes(time)
? (0, exports.numberFrom)(time)
: (0, exports.minutesFrom)(minutesOf(time));
exports.minutesFrom = minutesFrom;
const hoursFrom = (time) => isNumber(time)
? time
: isHours(time)
? (0, exports.numberFrom)(time)
: (0, exports.hoursFrom)(hoursOf(time));
exports.hoursFrom = hoursFrom;
const daysFrom = (time) => isNumber(time)
? time
: isDays(time)
? (0, exports.numberFrom)(time)
: (0, exports.daysFrom)(daysOf(time));
exports.daysFrom = daysFrom;