use std::collections::VecDeque;
use futures::channel::mpsc::{self, UnboundedReceiver, UnboundedSender};
pub struct History {
pub entries: VecDeque<String>,
pub max_size: usize,
pub sender: UnboundedSender<String>,
receiver: UnboundedReceiver<String>,
current_position: Option<usize>,
}
impl Default for History {
fn default() -> Self {
let (sender, receiver) = mpsc::unbounded();
Self {
entries: Default::default(),
max_size: 1000,
sender,
receiver,
current_position: Default::default(),
}
}
}
impl History {
pub async fn update(&mut self) {
while let Ok(Some(line)) = self.receiver.try_next() {
if self.entries.front() == Some(&line) || line.is_empty() {
continue;
}
self.entries.push_front(line);
self.current_position = None;
if self.entries.len() > self.max_size {
self.entries.pop_back();
}
}
}
pub fn search_next(&mut self, _current: &str) -> Option<&str> {
if let Some(index) = &mut self.current_position {
if *index < self.entries.len() - 1 {
*index += 1;
}
Some(&self.entries[*index])
} else if !self.entries.is_empty() {
self.current_position = Some(0);
Some(&self.entries[0])
} else {
None
}
}
pub fn search_previous(&mut self, _current: &str) -> Option<&str> {
if let Some(index) = &mut self.current_position {
if *index == 0 {
self.current_position = None;
return Some("");
}
*index -= 1;
Some(&self.entries[*index])
} else {
None
}
}
}