Expand description
Provides undo-redo functionality with dynamic dispatch and automatic 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 provides batch queue functionality.
- Checkpoint wraps a Record or History and provides checkpoint functionality.
- Commands can be merged using the merge! macro or the merge method. When two commands are merged, undoing and redoing them are done in a single step.
- Configurable display formatting is provided when the
display
feature is enabled. - Time stamps and time travel is provided when the
chrono
feature is enabled.
Examples
Add this to Cargo.toml
:
[dependencies]
undo = "0.30"
And this to main.rs
:
use undo::{Command, Record};
#[derive(Debug)]
struct Add(char);
impl Command<String> for Add {
fn apply(&mut self, s: &mut String) -> undo::Result {
s.push(self.0);
Ok(())
}
fn undo(&mut self, s: &mut String) -> undo::Result {
self.0 = s.pop().ok_or("`s` is empty")?;
Ok(())
}
}
fn main() -> undo::Result {
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(())
}
Macros
Macro for merging commands.
Structs
A checkpoint wrapper.
A history of commands.
Builder for a History.
The result of merging commands.
A command queue wrapper.
A record of commands.
Builder for a record.
Enums
Says if the command should merge with another command.
The signal sent when the record, the history, or the receiver changes.
Traits
Base functionality for all commands.
Type Definitions
A specialized Result type for undo-redo operations.