#change #future #reactive #notify #watch

async-change-tracker

使用futures实现响应式变更通知

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 异步

Download history 192/week @ 2024-03-11 129/week @ 2024-03-18 179/week @ 2024-03-25 168/week @ 2024-04-01 272/week @ 2024-04-08 308/week @ 2024-04-15 102/week @ 2024-04-22 130/week @ 2024-04-29 53/week @ 2024-05-06 103/week @ 2024-05-13 71/week @ 2024-05-20 185/week @ 2024-05-27 68/week @ 2024-06-03 151/week @ 2024-06-10 90/week @ 2024-06-17 73/week @ 2024-06-24

390 每月下载量
用于 bui-backend

MIT/Apache

10KB
58

async-change-tracker

Crates.io Documentation Crate License Dependency status build

使用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)。可以使用 ChangeTrackermodify() 方法更改值,并使用 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