redo 0.22.0

An undo-redo library with static dispatch and manual command merging.
Documentation

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.

#[derive(Debug)]
struct Add(char);

impl Command<String> for Add {
    type Error = Box<error::Error>;

    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<String, Add>> {
    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.