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日 |
#586 in 进程宏
每月下载 33 次
在 2 个crate中使用了(通过 depends_derives)
48KB
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.3–1.2MB
~24K SLoC