diff --git a/rslib/src/scheduler/reviews.rs b/rslib/src/scheduler/reviews.rs index 53802fb9a..0a7f32032 100644 --- a/rslib/src/scheduler/reviews.rs +++ b/rslib/src/scheduler/reviews.rs @@ -34,11 +34,12 @@ impl Card { let new_due = (today + days_from_today) as i32; let fsrs_enabled = self.memory_state.is_some(); let new_interval = if fsrs_enabled { - self.interval.saturating_add_signed(new_due - self.due) - } else if force_reset || !matches!(self.ctype, CardType::Review | CardType::Relearn) { - days_from_today - } else { self.interval + .saturating_add_signed(new_due - self.original_or_current_due()) + } else if force_reset || !matches!(self.ctype, CardType::Review | CardType::Relearn) { + days_from_today.max(1) + } else { + self.interval.max(1) }; let ease_factor = (ease_factor * 1000.0).round() as u16; @@ -48,7 +49,7 @@ impl Card { fn schedule_as_review(&mut self, interval: u32, due: i32, ease_factor: u16) { self.original_position = self.last_position(); self.remove_from_filtered_deck_before_reschedule(); - self.interval = interval.max(1); + self.interval = interval; self.due = due; self.ctype = CardType::Review; self.queue = CardQueue::Review; diff --git a/rslib/src/scheduler/states/review.rs b/rslib/src/scheduler/states/review.rs index e7591bb25..853cdf0a6 100644 --- a/rslib/src/scheduler/states/review.rs +++ b/rslib/src/scheduler/states/review.rs @@ -83,7 +83,7 @@ impl ReviewState { } else { let (minimum, maximum) = ctx.min_and_max_review_intervals(ctx.minimum_lapse_interval); let interval = ctx.with_review_fuzz( - (self.scheduled_days as f32) * ctx.lapse_multiplier, + (self.scheduled_days as f32).max(1.0) * ctx.lapse_multiplier, minimum, maximum, ); @@ -211,7 +211,7 @@ impl ReviewState { } fn passing_nonearly_review_intervals(self, ctx: &StateContext) -> (u32, u32, u32) { - let current_interval = self.scheduled_days as f32; + let current_interval = (self.scheduled_days as f32).max(1.0); let days_late = self.days_late().max(0) as f32; // hard @@ -251,8 +251,8 @@ impl ReviewState { /// FIXME: this needs reworking in the future; it overly penalizes reviews /// done shortly before the due date. fn passing_early_review_intervals(self, ctx: &StateContext) -> (u32, u32, u32) { - let scheduled = self.scheduled_days as f32; - let elapsed = (self.scheduled_days as f32) + (self.days_late() as f32); + let scheduled = (self.scheduled_days as f32).max(1.0); + let elapsed = self.elapsed_days as f32; let hard_interval = { let factor = ctx.hard_multiplier;