rura 1.5.0

Interactive TUI pipeline editor built for rapid iteration
use anyhow::Result;
use log::error;
use std::sync::mpsc::{Receiver, TryRecvError};
use std::thread::sleep;
use std::time::{Duration, SystemTime};

pub fn debouncer_task<F>(rx: Receiver<()>, duration: Duration, on_debounce: F) -> Result<()>
where
    F: Fn() -> () + Send + 'static,
{
    'outer: loop {
        if let Err(e) = rx.recv() {
            error!("Disconnected: {}", e);
            break 'outer Ok(());
        };

        let now = SystemTime::now();

        'debouncing: loop {
            sleep(Duration::from_millis(10));
            let elapsed = now.elapsed()?;

            match rx.try_recv() {
                Ok(_) => {
                    if elapsed > duration {
                        break;
                    }
                }

                Err(TryRecvError::Empty) => {
                    if elapsed > duration {
                        break 'debouncing;
                    }
                }

                Err(TryRecvError::Disconnected) => {
                    error!("Disconnected");
                    break 'outer Ok(());
                }
            }
        }

        on_debounce();
    }
}