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

Download history 13/week @ 2024-03-29

每月 182 次下载

MIT/Apache

77KB
1.5K SLoC

redo

已弃用:请使用 undo 包代替。

Travis Crates.io Docs

它是命令模式的实现,所有修改都通过创建应用修改的对象来完成。所有命令都知道如何撤销其应用的更改,并通过提供的数据结构,可以轻松应用、撤销和重做对目标的更改。

特性

  • 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许可证定义的,有意提交以包含在作品中的任何贡献,将如上双许可,不附加任何额外的条款或条件。

依赖

~0–10MB
~62K SLoC