diff --git a/rslib/src/deckconfig/update.rs b/rslib/src/deckconfig/update.rs index 4647e05e3..ed2be846f 100644 --- a/rslib/src/deckconfig/update.rs +++ b/rslib/src/deckconfig/update.rs @@ -204,7 +204,7 @@ impl Collection { .map(|c| c.inner.fsrs_enabled) .unwrap_or_default(); let current_weights = current_config.map(|c| &c.inner.fsrs_weights); - if current_fsrs_on && (!previous_fsrs_on || previous_weights != current_weights) { + if current_fsrs_on != previous_fsrs_on || previous_weights != current_weights { decks_needing_memory_recompute .entry(current_config_id) .or_default() @@ -216,15 +216,16 @@ impl Collection { } if !decks_needing_memory_recompute.is_empty() { - let input: Vec<(Weights, Vec)> = decks_needing_memory_recompute + let input: Vec<(Option, Vec)> = decks_needing_memory_recompute .into_iter() .map(|(conf_id, search)| { - let weights = configs_after_update - .get(&conf_id) - .or_not_found(conf_id)? - .inner - .fsrs_weights - .clone(); + let weights = configs_after_update.get(&conf_id).and_then(|c| { + if c.inner.fsrs_enabled { + Some(c.inner.fsrs_weights.clone()) + } else { + None + } + }); Ok((weights, search)) }) .collect::>()?; diff --git a/rslib/src/scheduler/fsrs/memory_state.rs b/rslib/src/scheduler/fsrs/memory_state.rs index fc8dfac66..bfca1e7ce 100644 --- a/rslib/src/scheduler/fsrs/memory_state.rs +++ b/rslib/src/scheduler/fsrs/memory_state.rs @@ -21,9 +21,11 @@ impl Collection { /// For each provided set of weights, locate cards with the provided search, /// and update their memory state. /// Should be called inside a transaction. + /// If Weights are None, it means the user disabled FSRS, and the existing + /// memory state should be removed. pub(crate) fn update_memory_state( &mut self, - entries: Vec<(Weights, Vec)>, + entries: Vec<(Option, Vec)>, ) -> Result<()> { let timing = self.timing_today()?; let usn = self.usn()?; @@ -32,15 +34,19 @@ impl Collection { .and(SearchNode::State(StateKind::New).negated()); let revlog = self.revlog_for_srs(search)?; let items = fsrs_items_for_memory_state(revlog, timing.next_day_at); - let fsrs = FSRS::new(Some(&weights))?; + let fsrs = FSRS::new(weights.as_deref())?; let mut progress = self.new_progress_handler::(); progress.update(false, |s| s.total_cards = items.len() as u32)?; for (idx, (card_id, item)) in items.into_iter().enumerate() { progress.update(true, |state| state.current_cards = idx as u32 + 1)?; - let state = fsrs.memory_state(item); let mut card = self.storage.get_card(card_id)?.or_not_found(card_id)?; let original = card.clone(); - card.memory_state = Some(state.into()); + if weights.is_some() { + let state = fsrs.memory_state(item); + card.memory_state = Some(state.into()); + } else { + card.memory_state = None; + } self.update_card_inner(&mut card, original, usn)?; } }