redo

Provides undo-redo functionality with static dispatch and manual command merging.
- [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
] 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
:
toml
[dependencies]
redo = "0.29"
And this to main.rs
:
```rust
extern crate redo;
use redo::{self, Command, Record};
[derive(Debug)]
struct Add(char);
impl Command for Add {
type Error = Box;
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> {
let mut record = Record::default();
record.apply(Add('a'))?;
record.apply(Add('b'))?;
record.apply(Add('c'))?;
asserteq!(record.asreceiver(), "abc");
record.undo().unwrap()?;
record.undo().unwrap()?;
record.undo().unwrap()?;
asserteq!(record.asreceiver(), "");
record.redo().unwrap()?;
record.redo().unwrap()?;
record.redo().unwrap()?;
asserteq!(record.asreceiver(), "abc");
Ok(())
}
```
License
Licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contribution
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.