1个不稳定版本

0.1.0 2022年1月11日

#1010 in 异步

MIT/Apache

140KB
2.5K SLoC

Salvia

CI Security audit

异步Rust中的增量计算框架。

必要警告

该项目高度实验性,主要是概念验证。除非你绝对需要 async,否则请考虑使用 salsa crate。

入门指南

salvia 允许您定义 查询(其值将被缓存的函数)和 输入(由用户直接设置的值的“函数”)。在执行时,查询记录它调用了哪些其他查询或输入,可以在这些值没有变化时避免重新计算。

salviasalsa 库的启发。与之相比,这个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));
}

许可证

该项目根据您的选择在以下两项中双许可

贡献

除非您明确声明,否则您提交给包括在该作品中的任何贡献都将根据上述条款双许可,没有任何额外的条款或条件。

依赖项

~5–7MB
~133K SLoC