10个版本

0.1.43 2021年3月1日
0.1.42 2020年12月22日
0.1.41 2020年1月12日
0.1.40 2019年12月13日
0.1.2 2019年5月6日

#889数据结构

MIT/Apache

160KB
3.5K SLoC

此crate存在稳健性问题;请参阅文档和测试。


lib.rs:

v9 是一个干净、易于使用且灵活的数据引擎。

它提供了一种使用 数据导向设计 实现应用程序的方法。

#[v9::table]
struct engines {
    pub cylinder_count: u8,
    pub lines_of_code: u64,
}

use v9::prelude::Universe;
let mut universe = Universe::new();

use v9::prelude::Register;
engines::Marker::register(&mut universe);

let (v9, v11) = universe.eval(|mut engines: engines::Write| {
    (
        engines.push(engines::Row {
            cylinder_count: 9,
            lines_of_code: 5000,
        }),
        engines.push(engines::Row {
            cylinder_count: 11,
            lines_of_code: std::u64::MAX,
        }),
    )
});

#[v9::table]
struct projects {
    pub name: &'static str,
    pub engine: crate::engines::Id,
}

projects::Marker::register(&mut universe);
universe.eval(|mut projects: projects::Write| {
    projects.push(projects::Row {
        name: "TOP SECRET!",
        engine: v9,
    });
    projects.push(projects::Row {
        name: "Stinky Cheese Inc!",
        engine: v11,
    });
});

universe.eval(|projects: projects::Read| {
    assert_eq!(projects.iter().count(), 2);
});

universe.eval(|mut engines: engines::Write| {
    engines.remove(v11);
});

universe.eval(|projects: projects::Read| {
    // No dangling pointers!
    assert_eq!(projects.iter().count(), 1);
});

(另一个示例。)

设计

一个 Universe 类似于一个 HashMap<TypeId, Any>。任何类型的单个实例可以插入到宇宙中。然后可以通过运行一个 Kernel 来进行更改。一个 Kernel 是任何所有参数都实现了 Extract 的闭包,这是一个类似于 fn extract(&Universe) -> Self 的特质。

封装

此crate公开了很多不合理的东西。这是故意的!很难预见所有需求;希望你能从中得到一些有用的东西,这比满足我一时的想法而公开东西要诚实得多。

一个严肃的应用程序应该提供自己的接口来隐藏 v9

安全性

┐(ツ)┌

我的优先级是

  1. 一个漂亮的API。
  2. 必须快速运行
    • 编译时间必须快。
    • 批量操作(通过内核)必须非常快。
  3. 安全性。

防止猴子捣乱不是优先事项。话虽如此,你可能只有在寻找麻烦时才会遇到麻烦。

如果你发现了一些我们可能希望不编译的东西,并且在运行时没有以明显的方式崩溃,那么我会很关心。

依赖

~0.5–1MB
~25K SLoC