4 个版本
0.1.3 | 2024年6月24日 |
---|---|
0.1.2 | 2024年6月20日 |
0.1.1 | 2024年6月20日 |
0.1.0 | 2024年6月18日 |
在 GUI 中排名 #331
36KB
471 代码行
korhah
korhah
是一个最小化且可扩展的响应式事件系统。
在基本层面上,它允许用户注册回调函数并发射 任意 自定义事件,这些事件会触发那些函数。
它还可以作为对象存储,其内容可以通过注册的回调函数以及系统外部访问。
为了保持最小化,内置的 CRUD 操作通过依赖跟踪来实现信号-y 行为。
为了使其可扩展,内置的 CRUD 操作会发射可以钩入的事件。
示例用法
let mut system = korhah::System::default();
// create a simple variable in the reactive system
let a = system.create(|_, _| 0).expect("no cancelling listeners registered");
// create a signal-y variable that depends on `a`
let b = system.create(move |s, _| {
// the dependency on `a` is automatically tracked here
let a = s.read(a, |v| *v)
.expect("no cancelling listeners registered")
.expect("`a` exists");
// subsequent updates to `a` will recompute `b` according to this formula
a + 1
}).expect("no cancelling listeners registered");
// we can emit *any* 'static type we like as an event
struct CustomEvent {
n: i32,
}
// listen for our custom event being emitted in a "global" scope
// (the "global" scope being due to specifying a `None` target)
system.listen(None, move |s, e: &CustomEvent, _, _| {
// we'll update `a` to the associated event info
// (note that this should automatically update `b` too)
_ = s.update(a, |v| *v = e.n);
});
assert_eq!(Ok(Some(0)), system.read(a, |v| *v));
assert_eq!(Ok(Some(1)), system.read(b, |v| *v));
// emit our custom event
_ = system.emit(None, &CustomEvent { n: 42 });
assert_eq!(Ok(Some(42)), system.read(a, |v| *v));
assert_eq!(Ok(Some(43)), system.read(b, |v| *v));
no_std
此库与 no_std
环境兼容,仅需要 alloc
包。
(Un)Sync
此库可以在单线程和多线程环境中使用。
遵循 Cargo 特性合并的精神,默认情况下,多线程环境中的严格 Send
+ Sync
约束应用于变量类型和回调类型,并且可以通过 unsync
特性在单线程环境中放宽这些约束。
MSRV
最低支持的 Rust 版本是 1.63.0。
依赖
~1.8–2.6MB
~45K SLoC