10 个版本 (5 个重大更改)
新增 0.6.0 | 2024 年 8 月 7 日 |
---|---|
0.5.3 | 2024 年 8 月 4 日 |
0.5.2 | 2024 年 6 月 1 日 |
0.5.1 | 2024 年 4 月 30 日 |
0.1.0 | 2023 年 12 月 26 日 |
#289 在 缓存
每月 235 次下载
用于 rearch-tokio
120KB
2K SLoC
ReArch = 重新构想的应用程序设计和架构方法
我们必须声明定义并提供数据优先级和描述。我们必须声明关系,而不是过程。
-- 格雷斯·霍珀,管理和未来的计算机 (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 版本/发布中更改。本仓库中其他软件包的 MSRV 将是可预见的未来的最新稳定版本。
还值得一提的是,上面“概述”中展示的示例需要每晚构建unboxed_closures
和fn_traits
,这属于experimental-api
功能下的特性门控。一旦unboxed_closures
和fn_traits
稳定下来,这种每晚构建的语法将成为首选语法,并且将不再受特性门控限制。(如果没有每晚构建,您必须使用稍微冗长一点的get.as_ref(some_capsule).clone()
和register.register(effect())
。)
需要帮助!
尽管我已经在ReArch上做了很多工作,但总觉得还有很多事情要做。一个人能做的事情是有限的!
如果您想贡献力量,以下是一些我非常希望得到帮助的领域!
- 文档(尤其是行内注释!)
- 如果您能添加代码示例/提高清晰度,将非常感谢。
- 新的副作用!
- 我已经根据需要创建了多个,但能有更多会更好。
- 如果您发现自己反复使用自定义副作用,请考虑提交一个PR!其他开发者可能也会用到。
赞助者
您可以通过这里成为我的工作赞助者!
依赖关系
~0.7–6MB
~29K SLoC