pub struct History<R> { /* fields omitted */ }
A history of commands.
Unlike Record which maintains a linear undo history, History maintains an undo tree
containing every edit made to the receiver. By switching between different branches in the
tree, the user can get to any previous state of the receiver.
#[derive(Debug)]
struct Add(char);
impl Command<String> for Add {
fn apply(&mut self, s: &mut String) -> undo::Result {
s.push(self.0);
Ok(())
}
fn undo(&mut self, s: &mut String) -> undo::Result {
self.0 = s.pop().ok_or("`s` is empty")?;
Ok(())
}
}
fn main() -> undo::Result {
let mut history = History::default();
history.apply(Add('a'))?;
history.apply(Add('b'))?;
history.apply(Add('c'))?;
let abc = history.root();
assert_eq!(history.as_receiver(), "abc");
history.go_to(abc, 1).unwrap()?;
assert_eq!(history.as_receiver(), "a");
history.apply(Add('f'))?;
history.apply(Add('g'))?;
assert_eq!(history.as_receiver(), "afg");
history.go_to(abc, 3).unwrap()?;
assert_eq!(history.as_receiver(), "abc");
Ok(())
}
Returns a builder for a history.
Reserves capacity for at least additional
more commands.
Panics if the new capacity overflows usize.
Returns the capacity of the history.
Returns the number of commands in the current branch of the history.
Returns true
if the current branch of the history is empty.
Returns the limit of the history.
Sets the limit of the history and returns the new limit.
If this limit is reached it will start popping of commands at the beginning
of the history when new commands are applied. No limit is set by
default which means it may grow indefinitely.
If limit < len
the first commands will be removed until len == limit
.
However, if the current active command is going to be removed, the limit is instead
adjusted to len - active
so the active command is not removed.
Panics if limit
is 0
.
Sets how the signal should be handled when the state changes.
Returns true
if the history can undo.
Returns true
if the history can redo.
Marks the receiver as currently being in a saved or unsaved state.
Returns true
if the receiver is in a saved state, false
otherwise.
Revert the changes done to the receiver since the saved state.
Returns the current branch.
Returns the position of the current command.
Removes all commands from the history without undoing them.
Pushes the command to the top of the history and executes its apply
method.
If an error occur when executing apply
the error is returned and the command is removed.
Calls the undo
method for the active command and sets the previous one as the new active one.
If an error occur when executing undo
the error is returned and the command is removed.
Calls the redo
method for the active command and sets the next one as the
new active one.
If an error occur when executing redo
the error is returned and the command is removed.
Repeatedly calls undo
or redo
until the command in branch
at cursor
is reached.
If an error occur when executing undo
or redo
the error is returned and the command is removed.
Applies each command in the iterator.
If an error occur when executing apply
the error is returned and the command is removed.
The remaining commands in the iterator are discarded.
Returns a reference to the receiver
.
Returns a mutable reference to the receiver
.
This method should only be used when doing changes that should not be able to be undone.
Consumes the history, returning the receiver
.
Returns the "default value" for a type. Read more
Formats the value using the given formatter. Read more
🔬 This is a nightly-only experimental API. (try_from
)
The type returned in the event of a conversion error.
🔬 This is a nightly-only experimental API. (try_from
)
Immutably borrows from an owned value. Read more
🔬 This is a nightly-only experimental API. (get_type_id
)
this method will likely be replaced by an associated static
🔬 This is a nightly-only experimental API. (try_from
)
The type returned in the event of a conversion error.
🔬 This is a nightly-only experimental API. (try_from
)
Mutably borrows from an owned value. Read more