#track #undo #history #transaction

cset

细粒度和可逆的结构事务

2 个版本

0.1.1 2022年12月24日
0.1.0 2022年12月22日

#1331 in 数据结构

MIT/Apache

8KB
90

drates.io docs.rs

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