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日 |
#53 在 缓存
66KB
1K SLoC
Depends
一个用于在任意类型之间实现人体工程学、高效、增量计算的库。
有关更多信息,请参阅
动机
许多响应多个输入源更改的应用程序从使用依赖图作为代码结构中受益。通过将复杂状态分解为可测试、可组合的逻辑小块,随着时间的推移,扩展和维护应用程序变得更加容易。此外,增量计算允许尽可能重用先前计算的结果,从而提高整体效率和性能。
Depends旨在以最小的API表面为Rust构建具有最小运行时开销的依赖图,同时利用类型系统的编译时保证。
// 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.4MB
~28K SLoC