first commit
This commit is contained in:
commit
0e854110d3
49 files changed
+2292
No files matched your search
@@ -0,0 +1,3 @@
|
||||
import { PrismaClient } from "@prisma/client";
|
||||
|
||||
export const prisma = new PrismaClient();
|
||||
@@ -0,0 +1,28 @@
|
||||
// SM-2 spaced repetition algorithm (SuperMemo 2).
|
||||
// `quality` is 0-5: 0-2 = failed recall (reset), 3-5 = successful recall (grows interval).
|
||||
export interface SM2State {
|
||||
easeFactor: number;
|
||||
intervalDays: number;
|
||||
repetitions: number;
|
||||
}
|
||||
|
||||
export function sm2(state: SM2State, quality: number): SM2State {
|
||||
const q = Math.max(0, Math.min(5, quality));
|
||||
let { easeFactor, intervalDays, repetitions } = state;
|
||||
|
||||
if (q < 3) {
|
||||
return { easeFactor, intervalDays: 1, repetitions: 0 };
|
||||
}
|
||||
|
||||
repetitions += 1;
|
||||
if (repetitions === 1) intervalDays = 1;
|
||||
else if (repetitions === 2) intervalDays = 6;
|
||||
else intervalDays = Math.round(intervalDays * easeFactor);
|
||||
|
||||
easeFactor = Math.max(
|
||||
1.3,
|
||||
easeFactor + (0.1 - (5 - q) * (0.08 + (5 - q) * 0.02)),
|
||||
);
|
||||
|
||||
return { easeFactor, intervalDays, repetitions };
|
||||
}
|
||||
Reference in new issue
Block a user