Anki/rslib/src/scheduler/queue/main.rs
2022-09-24 11:12:58 +10:00

48 lines
1.6 KiB
Rust

// Copyright: Ankitects Pty Ltd and contributors
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
use super::CardQueues;
use crate::prelude::*;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) struct MainQueueEntry {
pub id: CardId,
pub mtime: TimestampSecs,
pub kind: MainQueueEntryKind,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) enum MainQueueEntryKind {
New,
Review,
InterdayLearning,
}
impl CardQueues {
/// Remove the head of the main queue, and update counts.
pub(super) fn pop_main(&mut self) -> Option<MainQueueEntry> {
self.main.pop_front().map(|head| {
match head.kind {
MainQueueEntryKind::New => self.counts.new -= 1,
MainQueueEntryKind::Review => self.counts.review -= 1,
MainQueueEntryKind::InterdayLearning => {
// the bug causing learning counts to go below zero should
// hopefully be fixed at this point, but ensure we don't wrap
// if it isn't
self.counts.learning = self.counts.learning.saturating_sub(1)
}
};
head
})
}
/// Add an undone entry to the top of the main queue.
pub(super) fn push_main(&mut self, entry: MainQueueEntry) {
match entry.kind {
MainQueueEntryKind::New => self.counts.new += 1,
MainQueueEntryKind::Review => self.counts.review += 1,
MainQueueEntryKind::InterdayLearning => self.counts.learning += 1,
};
self.main.push_front(entry);
}
}