#线程安全 #响应式 #数据结构 #结构 #观察者 #合并 #观察者模式

reactivate

线程安全响应式数据结构。用❤️为🦀打造

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 并发

Download history 11/week @ 2024-05-19 8/week @ 2024-05-26 2/week @ 2024-06-02 4/week @ 2024-06-09 1/week @ 2024-06-16

1,438 每月下载次数
用于 revive

MIT 许可证

27KB
244

██████╗ ███████╗ █████╗  ██████╗████████╗██╗██╗   ██╗ █████╗ ████████╗███████╗
██╔══██╗██╔════╝██╔══██╗██╔════╝╚══██╔══╝██║██║   ██║██╔══██╗╚══██╔══╝██╔════╝
██████╔╝█████╗  ███████║██║        ██║   ██║██║   ██║███████║   ██║   █████╗  
██╔══██╗██╔══╝  ██╔══██║██║        ██║   ██║╚██╗ ██╔╝██╔══██║   ██║   ██╔══╝  
██║  ██║███████╗██║  ██║╚██████╗   ██║   ██║ ╚████╔╝ ██║  ██║   ██║   ███████╗
╚═╝  ╚═╝╚══════╝╚═╝  ╚═╝ ╚═════╝   ╚═╝   ╚═╝  ╚═══╝  ╚═╝  ╚═╝   ╚═╝   ╚══════╝
------------------------------------------------------------------------------
Thread Safe Reactive Data Structure. Made with ❤️ for 🦀

Crates.io License: MIT

🚀 安装

将其包含在您的 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

https://github.com/zahash/

🤝 为 Reactivate 贡献!

  1. 分支 (https://github.com/zahash/reactivate/fork)
  2. 创建您的功能分支 (git checkout -b feature/fooBar)
  3. 提交您的更改 (git commit -am 'Add some fooBar')
  4. 推送到分支 (git push origin feature/fooBar)
  5. 创建新的拉取请求

❤️ 展示一些爱!

如果您发现 Reactivate 有用,并且喜欢使用它,请考虑在 GitHub 上给它一个 !您的星标是对 Reactivate 持续改进的赞赏和鼓励。

依赖项