pub struct Snapshot {
pub text: String,
pub cursor: usize,
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum EditKind {
Typing,
DeletingBack,
DeletingForward,
Completing,
Recalling,
Replacing,
}
#[derive(Default)]
pub struct Undo {
undoable: Vec<Snapshot>,
redoable: Vec<Snapshot>,
run: Option<(EditKind, usize)>,
}
impl Undo {
pub fn record(&mut self, kind: EditKind, before: Snapshot, cursor: usize) {
let continues = kind != EditKind::Replacing && self.run == Some((kind, before.cursor));
if !continues {
self.undoable.push(before);
}
self.redoable.clear();
self.run = Some((kind, cursor));
}
pub fn break_run(&mut self) {
self.run = None;
}
pub fn undo(&mut self, current: Snapshot) -> Option<Snapshot> {
let previous = self.undoable.pop()?;
self.redoable.push(current);
self.run = None;
Some(previous)
}
pub fn redo(&mut self, current: Snapshot) -> Option<Snapshot> {
let next = self.redoable.pop()?;
self.undoable.push(current);
self.run = None;
Some(next)
}
}