1 个不稳定版本

0.1.0 2023 年 8 月 29 日

#4#tx

MIT 许可证

35KB
423 行代码(不包括注释)

糖浆

糖浆是一个用于 Rust 的通用事件去抖动器,可以将时间上接近的事件组合成单个事件。

例如,您可能有一些模板,您希望每次模板文件更改时都重新加载这些模板。然而,如果模板文件在短时间内发生许多小更改,为每次更改重新加载模板将是浪费的;相反,可以使用去抖动器将时间上类似的变化组合成单个变化,因此模板只需要重新加载一次。

可以使用 debouncer 函数创建一个新的去抖动器,该函数返回去抖动器的两部分:tx(发送)部分和rx(接收)部分。tx 向去抖动器发送原始未去抖动的事件,rx 从去抖动器接收去抖动的事件。两部分都可以被克隆,以便允许多个发送者和接收者。

use std::{thread, time::Duration};

// Create a new debouncer which takes raw events of type `u32` and outputs
// debounced events of type `Vec<u32>`.
let (tx, rx) = treacle::debouncer::<u32, Vec<u32>, _>(
    // 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]);

无运行时依赖