From 757139624f34b5cb2919812f716e5dd438c72b47 Mon Sep 17 00:00:00 2001 From: dev Date: Mon, 1 Jun 2026 15:36:56 -0500 Subject: [PATCH] refactor(pure): extract MS_PER_DAY constant and document computeEstimate precondition --- src/pure.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/pure.js b/src/pure.js index 7c960aa..9fd74e6 100644 --- a/src/pure.js +++ b/src/pure.js @@ -1,4 +1,5 @@ const SUFFIXES = { k: 1e3, m: 1e6, b: 1e9, t: 1e12 }; +const MS_PER_DAY = 86_400_000; export function parseTarget(input) { if (input === null || input === undefined || input === '') return null; @@ -24,6 +25,19 @@ export function parseTarget(input) { return Math.floor(num * multiplier); } +/** + * Estimate remaining work and ETA. + * + * Preconditions: `current` and `target` are expected to be non-negative + * integers. This function does not validate its inputs — callers are + * responsible for ensuring sane values. + * + * @param {number} current current stat value (non-negative integer) + * @param {number} target target stat value (non-negative integer) + * @param {number} perTrain stat gain per training session + * @param {number} perDay stat gain per day + * @returns {{remaining:number, trainsToGo:number, days:number, eta:Date|null}} + */ export function computeEstimate(current, target, perTrain, perDay) { const remaining = Math.max(0, target - current); if (remaining === 0) { @@ -32,7 +46,7 @@ export function computeEstimate(current, target, perTrain, perDay) { const trainsToGo = perTrain > 0 ? Math.ceil(remaining / perTrain) : 0; const days = perDay > 0 ? Math.ceil(remaining / perDay) : 0; - const eta = days > 0 ? new Date(Date.now() + days * 86_400_000) : null; + const eta = days > 0 ? new Date(Date.now() + days * MS_PER_DAY) : null; return { remaining, trainsToGo, days, eta }; }