21 个不稳定版本 (3 个重大更改)
0.4.2 | 2024年3月25日 |
---|---|
0.4.0 | 2024年2月29日 |
0.2.9 | 2023年10月24日 |
0.2.2 | 2023年7月31日 |
#178 in 并发
1,438 每月下载次数
用于 revive
27KB
244 行
██████╗ ███████╗ █████╗ ██████╗████████╗██╗██╗ ██╗ █████╗ ████████╗███████╗ ██╔══██╗██╔════╝██╔══██╗██╔════╝╚══██╔══╝██║██║ ██║██╔══██╗╚══██╔══╝██╔════╝ ██████╔╝█████╗ ███████║██║ ██║ ██║██║ ██║███████║ ██║ █████╗ ██╔══██╗██╔══╝ ██╔══██║██║ ██║ ██║╚██╗ ██╔╝██╔══██║ ██║ ██╔══╝ ██║ ██║███████╗██║ ██║╚██████╗ ██║ ██║ ╚████╔╝ ██║ ██║ ██║ ███████╗ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ------------------------------------------------------------------------------ Thread Safe Reactive Data Structure. Made with ❤️ for 🦀
🚀 安装
将其包含在您的 Cargo.toml
中的 [dependencies]
reactivate = { version = "*", features = ["threadsafe"] }
🧑💻 使用示例
🏗️ 构建
use reactivate::Reactive;
fn main() {
let r = Reactive::new(10);
println!("{:?}", r); // Reactive(10)
println!("{:?}", r.value()); // 10
}
🔥 派生
use reactivate::Reactive;
fn main() {
let r = Reactive::new(10);
let d = r.derive(|val| val + 5);
println!("{:?}", r); // Reactive(10)
println!("{:?}", d); // Reactive(15)
}
✨ 更新
use reactivate::Reactive;
fn main() {
let r = Reactive::new(10);
let d = r.derive(|val| val + 5);
r.update(|_| 20);
println!("{:?}", r); // Reactive(20)
println!("{:?}", d); // Reactive(25)
}
⚡ 原地更新
use reactivate::Reactive;
fn main() {
let r = Reactive::new(vec![1, 2, 3]);
let d = r.derive(|nums| nums.iter().sum::<i32>());
r.update_inplace(|nums| {
nums.push(4);
nums.push(5);
nums.push(6);
});
println!("{:?}", r); // Reactive([1, 2, 3, 4, 5, 6])
println!("{:?}", d); // Reactive(21)
}
🤝 合并和派生
use reactivate::{Merge, Reactive};
fn main() {
let a = Reactive::new(String::from("hazash"));
let b = Reactive::new(0);
let d = (&a, &b)
.merge()
.derive(|(a_val, b_val)| a_val.len() + b_val);
println!("{:?}", a); // Reactive("hazash")
println!("{:?}", b); // Reactive(0)
println!("{:?}", d); // Reactive(6)
b.update(|_| 5);
println!("{:?}", a); // Reactive("hazash")
println!("{:?}", b); // Reactive(5)
println!("{:?}", d); // Reactive(11)
a.update(|_| String::from("mouse"));
println!("{:?}", a); // Reactive("mouse")
println!("{:?}", b); // Reactive(5)
println!("{:?}", d); // Reactive(10)
}
👀 添加观察者
use reactivate::Reactive;
use std::sync::{Arc, Mutex};
fn main() {
let r: Reactive<String> = Reactive::default();
// Arc<Mutex<T>> is used to make the vector thread safe
// because Reactive as a whole must be thread safe
let changes: Arc<Mutex<Vec<String>>> = Default::default();
r.add_observer({
let changes = changes.clone();
move |val| changes.lock().unwrap().push(val.clone())
});
r.update(|_| String::from("a"));
r.update_inplace(|s| {
s.push('b');
});
println!("{:?}", r); // Reactive("ab")
println!("{:?}", changes.lock().unwrap().clone()); // ["a", "ab"]
}
🧵 使用线程(特性 = ["threadsafe"])
use reactivate::Reactive;
use std::{thread, time::Duration};
fn main() {
let r: Reactive<String> = Reactive::default();
let d = r.derive(|s| s.len());
let handle = thread::spawn({
let r = r.clone();
move || {
for _ in 0..10 {
r.update_inplace(|s| s.push('a'));
thread::sleep(Duration::from_millis(1));
}
}
});
for _ in 0..10 {
r.update_inplace(|s| s.push('b'));
thread::sleep(Duration::from_millis(1));
}
handle.join().unwrap();
println!("{:?}", r); // Reactive("babababababababababa")
println!("{:?}", d); // Reactive(20)
}
🌟 与我们联系
M. Zahash – [email protected]
在 MIT 许可证下分发。有关更多信息,请参阅 LICENSE
。
🤝 为 Reactivate 贡献!
- 分支 (https://github.com/zahash/reactivate/fork)
- 创建您的功能分支 (
git checkout -b feature/fooBar
) - 提交您的更改 (
git commit -am 'Add some fooBar'
) - 推送到分支 (
git push origin feature/fooBar
) - 创建新的拉取请求
❤️ 展示一些爱!
如果您发现 Reactivate 有用,并且喜欢使用它,请考虑在 GitHub 上给它一个 ⭐!您的星标是对 Reactivate 持续改进的赞赏和鼓励。