6 个版本 (破坏性更新)

0.6.0 2023年3月27日
0.5.0 2023年3月21日
0.4.0 2023年3月18日
0.3.0 2023年3月13日
0.1.0 2023年2月7日

缓存 中排名 209

Download history 5/week @ 2024-03-11 24/week @ 2024-04-01 115/week @ 2024-04-29

每月下载量 87

GPL-3.0 许可证 GPL-3.0

15KB
241 代码行

Yéter — KISS 增量计算框架

Yeter 是一个用于缓存纯函数输出的 crate,仅在需要时才重新计算。它与 salsa 类似,但使用动态方法而不是静态定义。

因此(并且由于在它上面投入的努力比 salsa 少得多),它可能性能较差,对于任何不需要动态定义的严肃项目,可能更应首选 salsa。

概述

Yéter 是围绕纯函数构建的,这些函数被称为 查询,以及我们称之为 数据库 的缓存。

要创建一个空数据库,您可以使用 Database::new

let mut db = yeter::Database::new();

您可以使用 query! 宏定义查询。请注意,此宏仅定义查询的名称和类型,允许您动态重新定义其行为。

// Parameters : name, input type, output type
query!(sum, Vec<usize>, usize);

您可以使用 Database::register 函数让数据库了解查询。

// sum::Query is a type defined by the query! macro
db.register::<sum::Query>(|_db, list| {
    list.iter().sum()
});

然后可以使用 Database::run 执行查询,或者更好的方法是使用 query! 宏生成的函数。

let result = sum::query(db, vec![1, 2, 3]);
assert_eq!(*result, 6);

查询每次调用的结果都会缓存。只有在查询被重新定义或它依赖的查询自上次重新计算以来已被重新计算时,才会重新计算。

注意事项

  • 假设查询是纯函数,并且仅依赖于其输入和数据库。任何文件系统或网络访问都会破坏此假设,并可能导致 Yeter 无法正确工作。
  • 在 salsa 中所谓的 "输入" 只是一个具有 () 输入且不依赖其他查询的查询。而不是调用 set_* 方法,每次设置新值时都重新定义查询。

依赖关系

~1.5MB
~38K SLoC