diff --git a/Cargo.toml b/Cargo.toml index f615df0..aba71fa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,13 +1,2 @@ -[package] -name = "treacle" -version = "0.1.0" -edition = "2021" -authors = ["Tom Panton "] -license = "MIT" -repository = "https://github.com/pantonshire/treacle" -homepage = "https://github.com/pantonshire/treacle" -description = "Event debouncer" -readme = "README.md" -keywords = ["debounce", "debouncer"] - -[dependencies] +[workspace] +members = ["treacle"] diff --git a/treacle/Cargo.toml b/treacle/Cargo.toml new file mode 100644 index 0000000..f615df0 --- /dev/null +++ b/treacle/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "treacle" +version = "0.1.0" +edition = "2021" +authors = ["Tom Panton "] +license = "MIT" +repository = "https://github.com/pantonshire/treacle" +homepage = "https://github.com/pantonshire/treacle" +description = "Event debouncer" +readme = "README.md" +keywords = ["debounce", "debouncer"] + +[dependencies] diff --git a/treacle/README.md b/treacle/README.md new file mode 100644 index 0000000..76c13e9 --- /dev/null +++ b/treacle/README.md @@ -0,0 +1,47 @@ +# `treacle` +A generic event debouncer for Rust, for grouping events which occur close together in time into a +single event. + +For example, you may have some +[templates](https://www.arewewebyet.org/topics/templating/) +which you want to reload whenever a template file changes. However, if many small changes are made +to the template files in quick succession, it would be wasteful to reload the templates for every +change; instead, a debouncer could be used to group the changes that occur at a similar time into +a single change, so the templates are only reloaded once. + +A new debouncer can be created with the +`debouncer` +function, which returns the debouncer in two halves: a tx (send) half and rx (receive) half. The +tx sends raw un-debounced events to the debouncer, and the rx receives the debounced events from +the debouncer. Both halves can be cloned to allow for multiple senders and receivers. + +```rust +use std::{thread, time::Duration}; + +// Create a new debouncer which takes raw events of type `u32` and outputs +// debounced events of type `Vec`. +let (tx, rx) = treacle::debouncer::, _>( + // Group events which occur in the same 500ms window. + Duration::from_millis(500), + // Combine raw events by pushing them to a vector. + |acc, raw_event| { + let mut events_vector = acc.unwrap_or_default(); + events_vector.push(raw_event); + events_vector + }); + +thread::spawn(move || { + // Send two raw events in quick succession. + tx.send(10).unwrap(); + tx.send(20).unwrap(); + + // Wait, then send more raw events. + thread::sleep(Duration::from_millis(500)); + tx.send(30).unwrap(); + tx.send(40).unwrap(); + tx.send(50).unwrap(); +}); + +assert_eq!(rx.recv().unwrap(), &[10, 20]); +assert_eq!(rx.recv().unwrap(), &[30, 40, 50]); +``` diff --git a/examples/vector.rs b/treacle/examples/vector.rs similarity index 100% rename from examples/vector.rs rename to treacle/examples/vector.rs diff --git a/src/fold.rs b/treacle/src/fold.rs similarity index 100% rename from src/fold.rs rename to treacle/src/fold.rs diff --git a/src/lib.rs b/treacle/src/lib.rs similarity index 100% rename from src/lib.rs rename to treacle/src/lib.rs