18 个版本 (9 个重大更改)

0.10.2 2024年6月1日
0.9.2 2024年1月16日
0.7.0 2023年12月26日
0.4.1 2023年11月30日
0.0.1 2023年7月22日

#273 in 并发


2 crates 中使用

MIT 许可证

80KB
1.5K SLoC

CI Status Github Stars MIT License

Banner

ReArch = 重新构想的应用设计和架构方法

我们必须声明定义并提供数据优先级和描述。我们必须声明关系,而不是程序。

-- Grace Murray Hopper,《管理和未来的计算机》 (1962)


特性

具体来说,ReArch 是以下问题的创新解决方案

  • ⚡️ 状态管理
  • 🧮 增量计算
  • 🧱 基于组件的软件工程

有了这些,我们得到

  • 通过声明性代码实现响应性
  • 松散耦合和高可测试性
  • 通过功能化的依赖反转方法实现应用级别的可组合性
  • 通过副作用实现特性组合

概要

在顶层定义你的 "胶囊"(封装的状态片段)

// Capsules are simply functions that consume a CapsuleHandle.
// The CapsuleHandle lets you get the state of other capsules,
// in addition to using a large variety of side effects.

// This capsule provides the count and a way to increment that count.
fn count_manager(CapsuleHandle { register, .. }: CapsuleHandle) -> (u8, impl CData + Fn()) {
    let (count, set_count) = register(effects::state::<Cloned<_>>(0));
    let increment_count = move || set_count(count + 1);
    (count, increment_count)
}

// This capsule provides the count, plus one.
fn count_plus_one_capsule(CapsuleHandle { mut get, .. }: CapsuleHandle) -> u8 {
    let (count, _increment_count) = get(count_manager);
    count + 1
}

let container = Container::new();

let ((count, increment_count), count_plus_one) =
    container.read((count_manager, count_plus_one_capsule));
assert_eq!(count, 0);
assert_eq!(count_plus_one, 1);

increment_count();

let ((count, _), count_plus_one) =
    container.read((count_manager, count_plus_one_capsule));
assert_eq!(count, 1);
assert_eq!(count_plus_one, 2);

入门

只需运行:cargo add rearch rearch-effects

然后,为你的应用程序创建一个容器

use rearch::*;
use rearch_effects as effects;

fn main() {
  let container = Container::new();
  // Use the container.
}

查看示例,了解如何创建自己的胶囊!

文档

此外,还有一些正在进行的文档,可以帮助你了解 ReArch 背后的核心概念!

最低支持的 Rust 版本 (MSRV)

rearch 的当前 MSRV 是 1.75.0,并且可能会在任何新的 ReArch 版本/发布中更改。本存储库中其他 crates 的 MSRV 将是可预见的未来的最新稳定版本。

还值得一提的是,上面“概述”中展示的示例需要每晚构建unboxed_closuresfn_traits,这些功能位于experimental-api功能下的特性门控中。一旦unboxed_closuresfn_traits稳定,这种每晚构建的语法将成为首选语法,并且将不再受特性门控限制。(如果没有每晚构建,您必须调用略微更冗长的get.as_ref(some_capsule).clone()register.register(effect())。)

需要帮助!

尽管我已经在ReArch上做了很多工作,但总觉得还有更多的事情要做。一个人的能力是有限的!

如果您想做出贡献,以下是一些我会非常感激您提供帮助的领域!

  • 文档(尤其是行内文档!)
    • 如果您能添加代码示例/提高清晰度,那将非常感谢。
  • 新的副作用!
    • 我已经根据自己的需要创建了多个,但更多的总是好的。
    • 如果您发现自己反复使用自定义副作用,请考虑提交一个PR!很可能其他开发者也会用到它。

赞助商

您可以通过这里成为我的工作的赞助商!

依赖项

~0.6–6MB
~28K SLoC