16个版本 (9个重大更新)
0.10.2 | 2023年10月11日 |
---|---|
0.10.1 | 2023年7月25日 |
0.9.2 | 2023年7月24日 |
0.4.0 | 2023年3月6日 |
#1719 在 进程宏 中
每月24次下载
用于 depends
56KB
1.5K SLoC
Depends
一个用于在任意类型之间进行人性化和高性能增量计算的库。
更多信息,请参阅
动机
许多响应多个输入源更改的应用程序受益于使用依赖图作为代码结构。通过将复杂的状态分解成可测试、可组合的逻辑小块,随着时间的推移,应用程序的扩展和维护变得更加容易。此外,增量计算允许尽可能重用先前计算的结果,从而提高整体效率和性能。
Depends旨在为在Rust中构建最小运行时开销的依赖图提供最小的API表面,同时利用类型系统的编译时保证。
// Below are input nodes, which are nodes which take new values from
// outside the graph.
// It's not common to use primitives, but they make for a simple example.
let a = InputNode::new(7_i64);
let b = InputNode::new(6_i32);
// Derived nodes take their value from other nodes (either input or
// derived). Note that we can combine _any_ type of node, providing
// they're compatible with the dependencies (`TwoNumbers`) and operation
// (`Multiply`).
let c = DerivedNode::new(
TwoNumbers::init(Rc::clone(&a), Rc::clone(&b)),
Multiply,
0_i64,
);
// A visitor tracks which nodes have been visited during a resolve.
let mut visitor = HashSetVisitor::new();
// Resolve the graph!
// `resolve_root` will clear the visitor before returning, readying it
// for the next resolution.
// This can fail if there are cycles in the graph or an existing read
// reference is being held.
assert_eq!(
c.resolve_root(&mut visitor).unwrap().value().clone(),
42
);
// Nodes which have an edge to dependencies which are updated between
// resolves will recalculate their state on-demand. Others will return
// a cached value. This is known as incremental computation, and can
// vastly improve performance of complex calculations.
a.update(70).unwrap();
// Any dependent values will be updated next time the graph is resolved.
assert_eq!(
c.resolve_root(&mut visitor).unwrap().value().clone(),
420
);
有关更详细的示例,包括使用Graphviz的(反)序列化,请参阅入门指南。
当前状态
应将此crate视为一个概念验证,并持合理的怀疑态度。
在考虑此crate为生产就绪之前,我们希望提供的保证是
- 给定任何输入序列和操作的输出确定性。
- 除非输入有变化,否则图在调用
resolve
时不能产生不同的结果,除非Clean
实现不正确。 - 内部缓存逻辑的正确性。
请随意实验此crate,将其应用于您的问题,并将您有任何反馈。
依赖项
~0.4–1.1MB
~23K SLoC