redo

Travis Appveyor Crates.io Docs

An undo-redo library with static dispatch and manual command merging. It uses the command pattern where the user modifies a receiver by applying commands on it.

```rust

[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("`String` is unexpectedly empty")?;
    Ok(())
}

}

fn main() -> Result<(), Error> { 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.into_receiver(), "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.