calculate static method

ReviewResult calculate({
  1. required int quality,
  2. required int repetitions,
  3. required double easinessFactor,
  4. required int intervalDays,
})

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,
  );
}