undo

Travis Crates.io Docs

Provides undo-redo functionality with dynamic dispatch and automatic command merging.

Examples

Add this to Cargo.toml:

toml [dependencies] undo = "0.29"

And this to main.rs:

```rust use undo::{Command, Record};

[derive(Debug)]

struct Add(char);

impl Command for Add { fn apply(&mut self, s: &mut String) -> Result<(), Box> { s.push(self.0); Ok(()) }

fn undo(&mut self, s: &mut String) -> Result<(), Box<dyn Error + Send + Sync>> {
    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'))?; 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

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.