From e9f9ee29e395a75a1ca7d7687b732f81238133d6 Mon Sep 17 00:00:00 2001 From: qkzk Date: Sat, 8 Oct 2022 14:37:15 +0200 Subject: history of visited directories --- src/visited.rs | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/visited.rs (limited to 'src/visited.rs') diff --git a/src/visited.rs b/src/visited.rs new file mode 100644 index 0000000..c9b27bf --- /dev/null +++ b/src/visited.rs @@ -0,0 +1,73 @@ +use std::path::PathBuf; + +#[derive(Clone, Debug)] +pub struct History { + pub visited: Vec, + pub index: usize, +} + +impl Default for History { + fn default() -> Self { + Self { + visited: vec![], + index: 0, + } + } +} + +impl History { + pub fn push(&mut self, path: &PathBuf) { + if !self.visited.contains(path) { + self.visited.push(path.to_owned()); + self.index = self.len() - 1 + } + } + + pub fn pop(&mut self) -> Option { + self.visited.pop() + } + + pub fn is_empty(&self) -> bool { + self.visited.is_empty() + } + + pub fn len(&self) -> usize { + self.visited.len() + } + + pub fn next(&mut self) { + if self.is_empty() { + self.index = 0 + } else if self.index > 0 { + self.index -= 1; + } else { + self.index = self.len() - 1 + } + } + + pub fn prev(&mut self) { + if self.is_empty() { + self.index = 0; + } else { + self.index = (self.index + 1) % self.len() + } + } + + pub fn selected(&self) -> Option { + if self.index < self.len() { + Some(self.visited[self.index].clone()) + } else { + None + } + } + + pub fn drop_queue(&mut self) { + let final_length = self.len() - self.index; + self.visited.truncate(final_length); + if self.is_empty() { + self.index = 0 + } else { + self.index = self.len() - 1 + } + } +} -- cgit v1.2.3