1个不稳定版本
0.1.0 | 2022年1月11日 |
---|
#1010 in 异步
140KB
2.5K SLoC
Salvia
异步Rust中的增量计算框架。
必要警告
该项目高度实验性,主要是概念验证。除非你绝对需要
async
,否则请考虑使用salsa
crate。
入门指南
salvia
允许您定义 查询(其值将被缓存的函数)和 输入(由用户直接设置的值的“函数”)。在执行时,查询记录它调用了哪些其他查询或输入,可以在这些值没有变化时避免重新计算。
salvia
受 salsa
库的启发。与之相比,这个crate从一开始就是为了在异步Rust中工作而设计的,并且必须做出一些妥协以实现这一点。
使用示例
use salvia::{query, Input, InputAccess, QueryContext, Runtime};
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, InputAccess)]
enum Team {
Blue,
Red,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
struct Score(u32);
impl Input<Score> for Team {
fn initial(&self) -> Score {
Score(0)
}
}
#[query]
async fn leader(cx: &QueryContext) -> Option<Team> {
use std::cmp::Ordering;
let red: Score = Team::Red.get(cx).await;
let blue: Score = Team::Blue.get(cx).await;
match red.cmp(&blue) {
Ordering::Less => Some(Team::Blue),
Ordering::Equal => None,
Ordering::Greater => Some(Team::Red),
}
}
#[tokio::main]
async fn main() {
let rt = Runtime::new().await;
rt.mutate(|cx| async move {
Team::Red.set(Score(1), &cx).await;
}).await;
let leader = rt.query(|cx| async move {
leader(&cx).await
}).await;
assert_eq!(leader, Some(Team::Red));
}
许可证
该项目根据您的选择在以下两项中双许可
- Apache许可证第2版 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则您提交给包括在该作品中的任何贡献都将根据上述条款双许可,没有任何额外的条款或条件。
依赖项
~5–7MB
~133K SLoC