A undo/redo library.
It uses the Command Pattern where the user
implements the UndoCmd
trait for each command and then the commands can be used with the
UndoStack
.
toml
[dependencies]
undo = "0.2.0"
```rust extern crate undo;
use std::rc::Rc; use std::cell::RefCell; use undo::{UndoCmd, UndoStack};
/// Pops an element from a vector.
struct PopCmd {
vec: Rc
impl UndoCmd for PopCmd { fn redo(&mut self) { self.e = self.vec.borrow_mut().pop(); }
fn undo(&mut self) {
self.vec.borrow_mut().push(self.e.unwrap());
self.e = None;
}
}
fn main() {
// We need to use Rc
let cmd = PopCmd { vec: vec.clone(), e: None };
undo_stack.push(cmd.clone());
undo_stack.push(cmd.clone());
undo_stack.push(cmd.clone());
assert_eq!(vec.borrow().len(), 7);
undo_stack.undo(); // on_dirty is going to be called here.
undo_stack.undo();
undo_stack.undo();
assert_eq!(vec.borrow().len(), 10);
} ```