An undo-redo library with dynamic dispatch and automatic command merging. It uses the command pattern where the user modifies a receiver by applying commands on it.
```rust
struct Add(char);
impl Command
fn undo(&mut self, s: &mut String) -> Result<(), Box<Error>> {
self.0 = s.pop().ok_or("`String` is unexpectedly empty")?;
Ok(())
}
}
fn main() -> Result<(), Box
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.into_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.