pre-written fold functions for convenience

no_thread
pantonshire 3 years ago
parent a25eb76de0
commit 70b1b2266d

@ -0,0 +1,61 @@
//! Pre-written fold functions which can be passed to [`Debouncer::new`](crate::Debouncer::new) to
//! specify how raw events should be combined into a single debounced event.
/// A fold function which combines events of type `T` into a `Vec<T>` by pushing them.
///
/// ```
/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
/// # use treacle::{Debouncer, fold::fold_vec_push};
/// use std::{time::Duration, thread};
///
/// let (debouncer, rx) = Debouncer::new(
/// Duration::from_millis(100),
/// fold_vec_push::<u32>
/// )?;
///
/// debouncer.debounce(4);
/// debouncer.debounce(5);
///
/// thread::sleep(Duration::from_millis(150));
/// debouncer.debounce(3);
/// debouncer.debounce(2);
/// debouncer.debounce(1);
///
/// assert_eq!(rx.recv().unwrap(), vec![4, 5]);
/// assert_eq!(rx.recv().unwrap(), vec![3, 2, 1]);
/// # Ok(())
/// # }
/// ```
pub fn fold_vec_push<T>(acc: Option<Vec<T>>, e: T) -> Vec<T> {
let mut acc = acc.unwrap_or_default();
acc.push(e);
acc
}
/// A fold function which discards all raw event data. Useful when you are just interested in the
/// existence of events and not any data associated with them.
///
/// ```
/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
/// # use treacle::{Debouncer, fold::fold_unit};
/// use std::{time::Duration, thread};
///
/// let (debouncer, rx) = Debouncer::new(
/// Duration::from_millis(100),
/// fold_unit::<u32>
/// )?;
///
/// debouncer.debounce(4);
/// debouncer.debounce(5);
///
/// thread::sleep(Duration::from_millis(150));
/// debouncer.debounce(3);
/// debouncer.debounce(2);
/// debouncer.debounce(1);
///
/// assert_eq!(rx.recv().unwrap(), ());
/// assert_eq!(rx.recv().unwrap(), ());
/// # Ok(())
/// # }
/// ```
pub fn fold_unit<T>(_acc: Option<()>, _e: T) {}

@ -1,3 +1,5 @@
pub mod fold;
use std::{ use std::{
sync::{Arc, Mutex, Condvar, mpsc}, sync::{Arc, Mutex, Condvar, mpsc},
time::Duration, time::Duration,
@ -166,24 +168,6 @@ where
} }
} }
// impl<T> Debouncer<Vec<T>> {
// #[inline]
// pub fn debounce_push(&self, event_data: T) {
// self.debounce(event_data, |acc, event_data| {
// let mut acc = acc.unwrap_or_default();
// acc.push(event_data);
// acc
// });
// }
// }
// impl Debouncer<()> {
// #[inline]
// pub fn debounce_unit(&self) {
// self.debounce((), |_acc, _event_data| ());
// }
// }
impl<RawEvent, DebouncedEvent, FoldFn> Drop for Debouncer<RawEvent, DebouncedEvent, FoldFn> { impl<RawEvent, DebouncedEvent, FoldFn> Drop for Debouncer<RawEvent, DebouncedEvent, FoldFn> {
fn drop(&mut self) { fn drop(&mut self) {
self.controller.notify_shutdown(); self.controller.notify_shutdown();

Loading…
Cancel
Save