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