feat(pure): summary with today/week counts and per-day rate

This commit is contained in:
dev
2026-06-01 15:54:43 -05:00
parent a2e23341ac
commit 5fd0f5e548
2 changed files with 84 additions and 1 deletions
+38
View File
@@ -65,3 +65,41 @@ export function pruneHistory(entries, now = Date.now()) {
const cutoff = now - THIRTY_DAYS_MS;
return entries.filter((e) => e.ts > cutoff);
}
/**
* Summarise training history.
*
* @param {{ts:number, delta:number}[]} entries
* @param {number} [now] Reference time in ms (defaults to Date.now()).
* @returns {{trainsToday:number, sevenDayAvgPerDay:number, perDay:number}}
*/
export function summary(entries, now = Date.now()) {
if (entries.length === 0) {
return { trainsToday: 0, sevenDayAvgPerDay: 0, perDay: 0 };
}
const ONE_DAY = MS_PER_DAY;
const SEVEN_DAYS = 7 * MS_PER_DAY;
const todayCutoff = now - ONE_DAY;
const weekCutoff = now - SEVEN_DAYS;
let trainsToday = 0;
let trainsWeek = 0;
let latestDelta = 0;
let latestTs = -Infinity;
for (const e of entries) {
if (e.ts >= todayCutoff) trainsToday++;
if (e.ts >= weekCutoff) trainsWeek++;
if (e.ts > latestTs) {
latestTs = e.ts;
latestDelta = e.delta;
}
}
const sevenDayAvgPerDay = trainsWeek / 7;
const perDay = latestDelta > 0 ? Math.floor(sevenDayAvgPerDay * latestDelta) : 0;
return { trainsToday, sevenDayAvgPerDay, perDay };
}