Implementation
static ReviewResult calculate({
required int quality,
required int repetitions,
required double easinessFactor,
required int intervalDays,
}) {
assert(quality >= 0 && quality <= 5, 'Quality must be between 0 and 5');
int newRepetitions;
int newInterval;
// Update easiness factor first so it influences the interval
final q = quality.toDouble();
double newEF = easinessFactor + (0.1 - (5 - q) * (0.08 + (5 - q) * 0.02));
if (newEF < minEasinessFactor) {
newEF = minEasinessFactor;
}
if (quality < 3) {
// Failure: reset
newRepetitions = 0;
newInterval = 1;
} else {
// Success
newRepetitions = repetitions + 1;
if (newRepetitions == 1) {
newInterval = 1;
} else if (newRepetitions == 2) {
newInterval = 6;
} else {
newInterval = (intervalDays * newEF).round();
}
}
final nextReviewAt = DateTime.now().add(Duration(days: newInterval));
return ReviewResult(
repetitions: newRepetitions,
intervalDays: newInterval,
easinessFactor: newEF,
nextReviewAt: nextReviewAt,
);
}