[][src]Crate redo

Provides undo-redo functionality with static dispatch and manual command merging.

Contents

  • Record provides a stack based undo-redo functionality.
  • History provides a tree based undo-redo functionality that allows you to jump between different branches.
  • Queue wraps a Record or History and extends them with queue functionality.
  • Checkpoint wraps a Record or History and extends them with checkpoint functionality.
  • Commands can be merged using the merge method. When two commands are merged, undoing and redoing them are done in a single step.
  • Configurable display formatting is provided through the Display structure.
  • Time stamps and time travel is provided when the chrono feature is enabled.
  • Serialization and deserialization is provided when the serde feature is enabled.

Examples

Add this to Cargo.toml:

[dependencies]
redo = "0.30"

And this to main.rs:

use redo::{Command, Record};

struct Add(char);

impl Command<String> for Add {
    type Error = &'static str;

    fn apply(&mut self, s: &mut String) -> Result<(), Self::Error> {
        s.push(self.0);
        Ok(())
    }

    fn undo(&mut self, s: &mut String) -> Result<(), Self::Error> {
        self.0 = s.pop().ok_or("`s` is empty")?;
        Ok(())
    }
}

fn main() -> Result<(), &'static str> {
    let mut record = Record::default();
    record.apply(Add('a'))?;
    record.apply(Add('b'))?;
    record.apply(Add('c'))?;
    assert_eq!(record.as_receiver(), "abc");
    record.undo().unwrap()?;
    record.undo().unwrap()?;
    record.undo().unwrap()?;
    assert_eq!(record.as_receiver(), "");
    record.redo().unwrap()?;
    record.redo().unwrap()?;
    record.redo().unwrap()?;
    assert_eq!(record.as_receiver(), "abc");
    Ok(())
}

Structs

Checkpoint

A checkpoint wrapper.

Display

Configurable display formatting of structures.

History

A history of commands.

HistoryBuilder

Builder for a History.

Queue

A command queue wrapper.

Record

A record of commands.

RecordBuilder

Builder for a record.

Enums

Merge

The result of merging two commands.

Signal

The signal sent when the record, the history, or the receiver changes.

Traits

Command

Base functionality for all commands.