// Copyright: Ankitects Pty Ltd and contributors // License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import type { GraphsResponse } from "@generated/anki/stats_pb"; import * as tr from "@generated/ftl"; import { localizedNumber } from "@tslib/i18n"; import { RevlogRange } from "./graph-helpers"; interface TrueRetentionData { youngPassed: number; youngFailed: number; maturePassed: number; matureFailed: number; } function calculateRetention(passed: number, failed: number): string { const total = passed + failed; if (total === 0) { return "0%"; } return localizedNumber((passed / total) * 100, 1) + "%"; } enum Scope { Young, Mature, Total, } function createStatsRow(period: string, data: TrueRetentionData, scope: Scope): string { let pass: number, fail: number, retention: string; switch (scope) { case Scope.Young: pass = data.youngPassed; fail = data.youngFailed; retention = calculateRetention(data.youngPassed, data.youngFailed); break; case Scope.Mature: pass = data.maturePassed; fail = data.matureFailed; retention = calculateRetention(data.maturePassed, data.matureFailed); break; case Scope.Total: pass = data.youngPassed + data.maturePassed; fail = data.youngFailed + data.matureFailed; retention = calculateRetention(pass, fail); break; } return `
${scopeRange(scope)} | ${tr.statisticsTrueRetentionPass()} | ${tr.statisticsTrueRetentionFail()} | ${tr.statisticsTrueRetentionRetention()} |