An undo-redo library with static dispatch and manual command merging.
It uses the [command pattern] where the user modifies the receiver by applying commands on it. Since each command knows how to undo and redo the changes it applies to the receiver, the state of the receiver can be rolled forwards or backwards by calling undo or redo in the correct order.
The [Record] and [History] provides functionality to store and keep track of the applied commands, and makes it easy to undo and redo changes. The Record provides a stack based undo-redo functionality, while the History provides a tree based undo-redo functionality where you can jump between different branches.
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.
Add this to Cargo.toml
:
toml
[dependencies]
redo = "0.25"
And this to main.rs
:
```rust extern crate redo;
use redo::{self, Command, Record};
struct Add(char);
impl Command
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<(), redo::Error
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(())
} ```
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.