use super::{reader, Reader};
use crate::fd_monitor::FdEventSignaller;
use crate::threads::debounce::Debounce;
use crate::threads::ThreadPool;
use std::os::unix::io::RawFd;
use std::sync::Arc;
use std::time::Duration;
const IO_MAX_THREADS: usize = 16;
pub(super) type Callback = Box<dyn for<'a> FnOnce(&mut Reader<'a>) + Send>;
pub(super) struct Debouncers {
pub event_signaller: Arc<FdEventSignaller>,
pub autosuggestions: Debounce<reader::AutosuggestionResult>,
pub highlight: Debounce<reader::HighlightResult>,
pub history_pager: Debounce<Callback>,
}
impl Debouncers {
pub fn new() -> Self {
let pool = ThreadPool::new(1, IO_MAX_THREADS);
let event_signaller = Arc::new(FdEventSignaller::new());
const HIGHLIGHT_TIMEOUT: Duration = Duration::from_millis(500);
const HISTORY_PAGER_TIMEOUT: Duration = Duration::from_millis(500);
const AUTOSUGGEST_TIMEOUT: Duration = Duration::from_millis(500);
Self {
autosuggestions: Debounce::new(&pool, &event_signaller, AUTOSUGGEST_TIMEOUT),
highlight: Debounce::new(&pool, &event_signaller, HIGHLIGHT_TIMEOUT),
history_pager: Debounce::new(&pool, &event_signaller, HISTORY_PAGER_TIMEOUT),
event_signaller,
}
}
pub fn event_signaller_read_fd(&self) -> RawFd {
self.event_signaller.read_fd()
}
}