TypeScript 98.3%
CSS 0.9%
Shell 0.7%
1// Répétition espacée — SM-2 (SuperMemo-2), documenté dans docs/learning-science-strategy.md.2// Qualités : 2 = Encore (échec), 3 = Difficile, 4 = Bien, 5 = Facile.34export type CardState = {5 ef: number; // facteur de facilité6 intervalDays: number;7 reps: number;8 lapses: number;9};1011export type ReviewQuality = 2 | 3 | 4 | 5;1213export function initialCardState(): CardState {14 return { ef: 2.5, intervalDays: 0, reps: 0, lapses: 0 };15}1617export function reviewCard(state: CardState, q: ReviewQuality): CardState & { dueInDays: number } {18 let { ef, intervalDays, reps, lapses } = state;1920 // Mise à jour du facteur de facilité (formule SM-2)21 ef = ef + (0.1 - (5 - q) * (0.08 + (5 - q) * 0.02));22 if (ef < 1.3) ef = 1.3;2324 if (q < 3) {25 // Échec : la carte repart au début, revue dans la journée26 reps = 0;27 lapses += 1;28 intervalDays = 0;29 return { ef, intervalDays, reps, lapses, dueInDays: 0 };30 }3132 reps += 1;33 if (reps === 1) intervalDays = 1;34 else if (reps === 2) intervalDays = 6;35 else intervalDays = Math.round(intervalDays * ef);3637 // « Difficile » raccourcit l'intervalle ; « Facile » l'allonge légèrement38 if (q === 3) intervalDays = Math.max(1, Math.round(intervalDays * 0.8));39 if (q === 5) intervalDays = Math.round(intervalDays * 1.15);40 if (intervalDays > 365) intervalDays = 365;4142 return { ef, intervalDays, reps, lapses, dueInDays: intervalDays };43}44