#事件系统 #事件 #变量 #可扩展 #响应式 #操作 #CRUD

不使用 std korhah

一个最小化且可扩展的响应式事件系统

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

MPL-2.0 许可证

36KB
471 代码行

korhah crates.io docs.rs

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