2 个版本
0.1.1 | 2022年12月24日 |
---|---|
0.1.0 | 2022年12月22日 |
#1331 in 数据结构
8KB
90 行
cset
细粒度和可逆的结构事务。
此crate提供了一个Track宏,结构可以从中派生出来,以生成精确跟踪字段更改所需的基础设施。调用Trackable::edit()
返回一个存储编辑的Draft
,与底层结构分开,因此不会写入任何值。
当在草稿上调用.commit()
时,编辑应用于基本结构。每个替换的值都会作为ChangeSet
中的Change
返回给调用者。然后将此更改集重新应用于同一类型的结构,用更改集中的值替换字段。此操作产生一个新的ChangeSet
,允许实现撤销-重做范式。
项目状态
该项目处于早期开发阶段,API更改应予期待。
lib.rs
:
细粒度和可逆的结构事务。
此crate提供了一个Track宏,结构可以从中派生出来,以生成精确跟踪字段更改所需的基础设施。调用edit()
返回一个草稿,该草稿将编辑与底层结构分开存储,因此不会写入任何值。
当在草稿上调用apply()
时,编辑应用于基本结构。每个替换的值都会作为[Change]在一个[ChangeSet]中返回给调用者。然后将此更改集重新应用于同一类型的结构,用更改集中的值替换字段。此操作产生一个新的[ChangeSet],允许实现撤销-重做范式。
示例
use cset::Track;
#[derive(Track)]
struct Foo {
x: usize,
#[track(flatten)]
bar: Bar,
}
#[derive(Track)]
struct Bar {
y: usize,
}
let mut foo = Foo::new(10, Bar::new(42));
// Enter the non-destructive editing mode
let mut foo_draft = foo.edit();
foo_draft.set_x(42);
foo_draft.edit_bar().set_y(1024);
// Drop the draft to rollback, or apply the changes with `.apply()`
let undo_changeset = foo_draft.apply();
assert_eq!(foo, Foo::new(42, Bar::new(1024)));
let redo_changeset = foo.apply(undo_changeset);
assert_eq!(foo, Foo::new(10, Bar::new(42)));
foo.apply(redo_changeset);
assert_eq!(foo, Foo::new(42, Bar::new(1024)));
依赖项
~1.5MB
~36K SLoC