summaryrefslogtreecommitdiffstats
path: root/src/visited.rs
diff options
context:
space:
mode:
authorqkzk <qu3nt1n@gmail.com>2022-10-08 14:37:15 +0200
committerqkzk <qu3nt1n@gmail.com>2022-10-08 14:37:15 +0200
commite9f9ee29e395a75a1ca7d7687b732f81238133d6 (patch)
tree1562f11e0e70799464ce8b1ec94d49ae39b27a97 /src/visited.rs
parent93dd91026277bee2ae47fc5297f583d35a15c062 (diff)
history of visited directories
Diffstat (limited to 'src/visited.rs')
-rw-r--r--src/visited.rs73
1 files changed, 73 insertions, 0 deletions
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<PathBuf>,
+ 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<PathBuf> {
+ 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<PathBuf> {
+ 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
+ }
+ }
+}