8个版本
0.3.5 | 2024年1月15日 |
---|---|
0.3.4 | 2024年1月12日 |
0.3.3 | 2023年12月29日 |
0.3.2 | 2022年1月31日 |
0.1.0 | 2018年10月11日 |
#207 in 异步
390 每月下载量
用于 bui-backend
10KB
58 行
async-change-tracker
使用futures实现响应式变更通知。
ChangeTracker<T>
类型封装了拥有值 T
。对 T
的更改在实现 FnOnce(&mut T)
的函数或闭包内完成。当它返回时,任何更改都会通过 futures::Stream
发送到监听器。
更详细地说,使用 ChangeTracker::new(value: T)
创建一个 ChangeTracker<T>
,这将获取类型为 T
的值的所有权。然后,您可以创建一个 futures::Stream
(使用 get_changes()
)在每次拥有值更改时发出一个类型为 (T, T)
的元组 (old_value, new_value)
。可以使用 ChangeTracker
的 modify()
方法更改值,并使用 as_ref()
方法从 AsRef
特性读取。
示例
在这个示例中,展示了 ChangeTracker
的功能。
use futures::stream::StreamExt;
// Wrap an integer `with ChangeTracker`
let mut change_tracker = async_change_tracker::ChangeTracker::new( 123 );
// Create an receiver that fires when the value changes. The channel size
// is 1, meaning at most one change can be buffered before backpressure
// is applied.
let rx = change_tracker.get_changes(1);
// In this example take a single change and check that the old and new value
// are correct.
let rx_printer = rx.take(1).for_each(|(old_value, new_value)| {
assert_eq!( old_value, 123);
assert_eq!( new_value, 124);
futures::future::ready(())
});
// Now, check and then change the value.
change_tracker.modify(|mut_ref_value| {
assert_eq!(*mut_ref_value, 123);
*mut_ref_value += 1;
});
// Wait until the stream is done. In this example, the stream ends due to
// the use of `.take(1)` prior to `for_each` above. In normal usage,
// typically the stream would finish for a different reason.
futures::executor::block_on(rx_printer);
// Finally, check that the final value is as expected.
assert!(*change_tracker.as_ref() == 124);
测试
要测试
cargo test
许可协议:MIT/Apache-2.0
依赖项
约1MB
约21K SLoC