previewIntervals static method

Map<String, int> previewIntervals({
  1. required String algorithm,
  2. required int repetitions,
  3. required double easinessFactor,
  4. required int intervalDays,
  5. double? stability,
  6. double? difficulty,
  7. String? cardState,
  8. double? lastElapsedDays,
  9. double targetRetention = 0.9,
})

Preview the next interval for each rating without mutating state.

Implementation

static Map<String, int> previewIntervals({
  required String algorithm,
  required int repetitions,
  required double easinessFactor,
  required int intervalDays,
  double? stability,
  double? difficulty,
  String? cardState,
  double? lastElapsedDays,
  double targetRetention = 0.9,
}) {
  if (algorithm == 'fsrs') {
    final fsrs = Fsrs();
    final state = FsrsState(
      stability: stability ?? 0,
      difficulty: difficulty ?? 0,
      cardState: _parseFsrsState(cardState ?? 'new'),
      lastElapsedDays: lastElapsedDays ?? 0,
      scheduledDays: intervalDays,
    );
    final elapsed = lastElapsedDays ?? 0.0;
    return {
      'again': fsrs
          .calculate(
            state: state,
            rating: FsrsRating.again,
            elapsedDays: elapsed,
            targetRetention: targetRetention,
          )
          .intervalDays,
      'hard': fsrs
          .calculate(
            state: state,
            rating: FsrsRating.hard,
            elapsedDays: elapsed,
            targetRetention: targetRetention,
          )
          .intervalDays,
      'good': fsrs
          .calculate(
            state: state,
            rating: FsrsRating.good,
            elapsedDays: elapsed,
            targetRetention: targetRetention,
          )
          .intervalDays,
      'easy': fsrs
          .calculate(
            state: state,
            rating: FsrsRating.easy,
            elapsedDays: elapsed,
            targetRetention: targetRetention,
          )
          .intervalDays,
    };
  }
  // SM-2 preview
  int previewSm2(int q) => SpacedRepetition.calculate(
    quality: q,
    repetitions: repetitions,
    easinessFactor: easinessFactor,
    intervalDays: intervalDays,
  ).intervalDays;
  return {
    'again': previewSm2(1),
    'hard': previewSm2(3),
    'good': previewSm2(4),
    'easy': previewSm2(5),
  };
}