feat(pure): summary with today/week counts and per-day rate
This commit is contained in:
+38
@@ -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 };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user