10个版本

0.3.0 2023年5月30日
0.2.0 2022年7月1日
0.1.8 2022年4月28日
0.1.7 2021年9月28日
0.1.4 2021年7月28日

#314并发

Download history 24/week @ 2024-03-09 4/week @ 2024-03-16 12/week @ 2024-03-30

每月 66 次下载
用于 percy-preview-app

MIT/Apache

14KB
112

app-world Actions状态 docs

管理前端应用程序状态的框架无关方法。

概述

app-world 是一个简单的线程安全状态管理库,旨在在管理大量应用程序状态的多平台前端应用程序中使用。

使用 app-world,你有一个单一的 World,其中包含你的应用程序 State 以及你的应用程序的 Resource

Resource 用于与外部世界交互,例如写入本地文件存储或进行API请求。

修改应用程序状态的唯一方式是通过发送一个 Msg(忽略基于 UnsafeCell 的内部可变性)。

这意味着所有状态修改都可以在一个地方处理,这使得推理应用程序的行为变得容易,并减少了代码重复的可能性。

跨平台应用程序

app-world 没有任何平台相关代码,使其适合编写可以在网络、移动和桌面上运行的跨平台应用程序逻辑。

例如,app-world 可以用于管理在 iOSAndroid 和网络浏览器上运行的Rust核心应用程序的状态。

线程安全

你无法直接获取World的写入保护。向World写入的唯一方式是通过 AppWorld::msg

多个线程可以同时从 AppWorld 读取,但每次只有一个 AppWorld::msg 会被处理。

这意味着您可以在多线程应用程序中安全地使用 app-world,而不用担心死锁。

游戏

多个线程可以同时从 AppWorld 读取,但每次只有一个 AppWorld::msg 会被处理。

这使得 app-world 对于那些需要高性能并希望许多线程能够同时操作世界的游戏来说并不合适。

在这种情况下,考虑使用许多现有的实体组件系统库之一。

示例用法

use app_world::AppWorldWrapper;

struct MyAppWorld {
    state: MyAppState,
    resources: MyAppResources,
}

struct MyAppState {
    count: u32
}

struct MyAppResources {
    api_client: Arc<dyn SomeApiClient>
}

enum Msg {
    IncrementCount(u8)
}

type MyAppStateWrapper = AppWorldWrapper<MyAppState>;

impl AppWorld for MyAppWorld {
    type Msg = Msg;

    fn msg(&mut self, message: Msg) {
        match msg {
            Msg::IncrementCount(increment) => {
                self.count += 1;
            }
        }
    }
}

fn main () {
    let world = AppWorldWrapper::new(MyAppWorld::new());
    let world_clone = world.clone();

    assert_eq!(world.read().count, 0);
    world.msg(Msg::IncrementCount);
    world_clone.msg(Msg::IncrementCount);
    assert_eq!(world.read().count, 2);
}

灵感来源

  • Elm 架构,用于视图和应用状态的解耦。

  • specs,用于 World StateResource 名称。

无运行时依赖

特性