72 个版本 (37 个破坏性更新)
0.41.1 | 2021 年 12 月 9 日 |
---|---|
0.41.0 | 2020 年 8 月 16 日 |
0.40.0 | 2020 年 2 月 16 日 |
0.39.0 | 2019 年 11 月 15 日 |
0.2.1 | 2017 年 2 月 15 日 |
#17 在 #undo-redo 中
每月 182 次下载
77KB
1.5K SLoC
redo
已弃用:请使用 undo 包代替。
它是命令模式的实现,所有修改都通过创建应用修改的对象来完成。所有命令都知道如何撤销其应用的更改,并通过提供的数据结构,可以轻松应用、撤销和重做对目标的更改。
特性
- Command 提供了所有命令的基础功能。
- Record 提供基本的线性撤销-重做功能。
- History 提供非线性撤销-重做功能,允许您在不同的分支之间跳转。
- Queue 包装一个记录或历史,并扩展了队列功能。
- Checkpoint 包装一个记录或历史,并扩展了检查点功能。
- 可以通过在命令上实现 merge 方法将命令合并成一个单一命令。这允许使用较小的命令来构建更复杂的操作,或者将较小的增量更改合并到可以一次性撤销和重做的较大更改中。
- 可以将目标标记为已保存到磁盘,数据结构可以跟踪保存状态并在状态变化时通知。
- 用户可以配置跟踪更改的数量,以便仅存储最近的
N
个更改。 - 使用显示结构配置可配置的显示格式。
- 默认情况下,库可以作为
no_std
使用。
Cargo 功能标志
chrono
:启用时间戳和时间旅行。serde
:启用序列化和反序列化。colored
:在可视化显示结构时启用彩色输出。
示例
use redo::{Command, Record};
struct Add(char);
impl Command for Add {
type Target = String;
type Error = &'static str;
fn apply(&mut self, s: &mut String) -> redo::Result<Add> {
s.push(self.0);
Ok(())
}
fn undo(&mut self, s: &mut String) -> redo::Result<Add> {
self.0 = s.pop().ok_or("s is empty")?;
Ok(())
}
}
fn main() -> redo::Result<Add> {
let mut record = Record::default();
record.apply(Add('a'))?;
record.apply(Add('b'))?;
record.apply(Add('c'))?;
assert_eq!(record.target(), "abc");
record.undo()?;
record.undo()?;
record.undo()?;
assert_eq!(record.target(), "");
record.redo()?;
record.redo()?;
record.redo()?;
assert_eq!(record.target(), "abc");
Ok(())
}
许可证
根据以下任一许可证授权
- Apache许可证版本2.0,(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则您根据Apache-2.0许可证定义的,有意提交以包含在作品中的任何贡献,将如上双许可,不附加任何额外的条款或条件。
依赖
~0–10MB
~62K SLoC