pub struct Recorder<K, V = (), C = BTreeMap<K, V>, EC = C> { /* private fields */ }Expand description
Records edits applied to a collection so they can be replayed or reverted.
Implementations§
Source§impl<K, V, C, EC: Default> Recorder<K, V, C, EC>
impl<K, V, C, EC: Default> Recorder<K, V, C, EC>
Sourcepub fn new(collection: C) -> Self
pub fn new(collection: C) -> Self
Create a new recorder owning and recording a collection.
Examples found in repository?
examples/cmd_commit.rs (line 15)
14fn main() {
15 let mut recorder: Recorder<usize, char, HashMap<usize, char>> = Recorder::new(HashMap::new());
16 let mut undoredo: UndoRedo<HashMap<usize, char>, Command> = UndoRedo::new();
17
18 recorder.insert(1, 'A');
19
20 // Commit `Command::PushChar` enum variant as command metadata ("cmd") along
21 // with the recorded edit.
22 undoredo.cmd_commit(Command::PushChar, recorder.flush());
23
24 // `Command::PushChar` is now the top element of the stack of done cmd-edits.
25 assert_eq!(undoredo.done().last().unwrap().cmd, Command::PushChar);
26
27 undoredo.undo(&mut recorder);
28
29 // After undo, `Command::PushChar` is now the top element of the stack of
30 // undone cmd-edits.
31 assert_eq!(undoredo.undone().last().unwrap().cmd, Command::PushChar);
32}More examples
examples/btreeset.rs (line 10)
9fn main() {
10 let mut recorder: Recorder<char, (), BTreeSet<char>> = Recorder::new(BTreeSet::new());
11 let mut undoredo: UndoRedo<BTreeSet<char>> = UndoRedo::new();
12
13 recorder.insert('A', ());
14 undoredo.commit(recorder.flush());
15
16 recorder.insert('B', ());
17 // Inserting to a set is idempotent: repeating the same insert does nothing.
18 // It is, however, a logic error if the recorded collection is a multiset,
19 // e.g. `rstar::RTree`.
20 recorder.insert('B', ());
21 undoredo.commit(recorder.flush());
22
23 recorder.insert('C', ());
24 undoredo.commit(recorder.flush());
25
26 assert_eq!(*recorder.collection(), BTreeSet::from(['A', 'B', 'C']));
27
28 undoredo.undo(&mut recorder);
29 assert_eq!(*recorder.collection(), BTreeSet::from(['A', 'B']));
30
31 undoredo.undo(&mut recorder);
32 assert_eq!(*recorder.collection(), BTreeSet::from(['A']));
33
34 undoredo.redo(&mut recorder);
35 assert_eq!(*recorder.collection(), BTreeSet::from(['A', 'B']));
36
37 undoredo.redo(&mut recorder);
38 assert_eq!(*recorder.collection(), BTreeSet::from(['A', 'B', 'C']));
39}examples/stable_vec.rs (line 9)
8fn main() {
9 let mut recorder: Recorder<usize, char, StableVec<char>> = Recorder::new(StableVec::new());
10 let mut undoredo: UndoRedo<StableVec<char>> = UndoRedo::new();
11
12 recorder.push('A');
13 undoredo.commit(recorder.flush());
14
15 recorder.push('B');
16 recorder.push('B');
17 undoredo.commit(recorder.flush());
18
19 let key = recorder.push('X');
20 recorder.remove(&key);
21 recorder.push('C');
22 undoredo.commit(recorder.flush());
23
24 assert!(
25 recorder
26 .collection()
27 .values()
28 .copied()
29 .eq(['A', 'B', 'B', 'C'])
30 );
31
32 undoredo.undo(&mut recorder);
33 assert!(recorder.collection().values().copied().eq(['A', 'B', 'B']));
34
35 undoredo.undo(&mut recorder);
36 assert!(recorder.collection().values().copied().eq(['A']));
37
38 undoredo.redo(&mut recorder);
39 assert!(recorder.collection().values().copied().eq(['A', 'B', 'B']));
40
41 undoredo.redo(&mut recorder);
42 assert!(
43 recorder
44 .collection()
45 .values()
46 .copied()
47 .eq(['A', 'B', 'B', 'C'])
48 );
49}examples/thunderdome.rs (line 9)
8fn main() {
9 let mut recorder: Recorder<Index, char, Arena<char>> = Recorder::new(Arena::new());
10 let mut undoredo: UndoRedo<Arena<char>> = UndoRedo::new();
11
12 recorder.push('A');
13 undoredo.commit(recorder.flush());
14
15 recorder.push('B');
16 recorder.push('B');
17 undoredo.commit(recorder.flush());
18
19 let key = recorder.push('X');
20 recorder.remove(&key);
21 recorder.push('C');
22 undoredo.commit(recorder.flush());
23
24 let (_, values): (Vec<_>, Vec<char>) = recorder.collection().clone().into_iter().unzip();
25 assert!(values == vec!['A', 'B', 'B', 'C']);
26
27 undoredo.undo(&mut recorder);
28 let (_, values): (Vec<_>, Vec<char>) = recorder.collection().clone().into_iter().unzip();
29 assert!(values == vec!['A', 'B', 'B']);
30
31 undoredo.undo(&mut recorder);
32 let (_, values): (Vec<_>, Vec<char>) = recorder.collection().clone().into_iter().unzip();
33 assert!(values == vec!['A']);
34
35 undoredo.redo(&mut recorder);
36 let (_, values): (Vec<_>, Vec<char>) = recorder.collection().clone().into_iter().unzip();
37 assert!(values == vec!['A', 'B', 'B']);
38
39 undoredo.redo(&mut recorder);
40 let (_, values): (Vec<_>, Vec<char>) = recorder.collection().clone().into_iter().unzip();
41 assert!(values == vec!['A', 'B', 'B', 'C']);
42}examples/rstar.rs (line 9)
8fn main() {
9 let mut recorder: Recorder<(i32, i32), (), RTree<(i32, i32)>> = Recorder::new(RTree::new());
10 let mut undoredo: UndoRedo<RTree<(i32, i32)>> = UndoRedo::new();
11
12 recorder.insert((1, 1), ());
13 undoredo.commit(recorder.flush());
14
15 recorder.insert((2, 2), ());
16 undoredo.commit(recorder.flush());
17
18 recorder.insert((3, 3), ());
19 undoredo.commit(recorder.flush());
20
21 assert_eq!(
22 recorder.collection().iter().collect::<Vec<_>>(),
23 RTree::bulk_load(vec![(1, 1), (2, 2), (3, 3)])
24 .iter()
25 .collect::<Vec<_>>()
26 );
27
28 undoredo.undo(&mut recorder);
29 assert_eq!(
30 *recorder.collection().iter().collect::<Vec<_>>(),
31 RTree::bulk_load(vec![(1, 1), (2, 2)])
32 .iter()
33 .collect::<Vec<_>>()
34 );
35
36 undoredo.undo(&mut recorder);
37 assert_eq!(
38 *recorder.collection().iter().collect::<Vec<_>>(),
39 RTree::bulk_load(vec![(1, 1)]).iter().collect::<Vec<_>>()
40 );
41
42 undoredo.redo(&mut recorder);
43 assert_eq!(
44 *recorder.collection().iter().collect::<Vec<_>>(),
45 RTree::bulk_load(vec![(1, 1), (2, 2)])
46 .iter()
47 .collect::<Vec<_>>()
48 );
49
50 undoredo.redo(&mut recorder);
51 assert_eq!(
52 *recorder.collection().iter().collect::<Vec<_>>(),
53 RTree::bulk_load(vec![(1, 1), (2, 2), (3, 3)])
54 .iter()
55 .collect::<Vec<_>>()
56 );
57}examples/basic_usage.rs (line 11)
9fn main() {
10 // The recorder records the ongoing changes to the recorded collection.
11 let mut recorder: Recorder<usize, char, HashMap<usize, char>> = Recorder::new(HashMap::new());
12
13 // The undo-redo struct maintains the undo-redo bistack.
14 let mut undoredo: UndoRedo<HashMap<usize, char>> = UndoRedo::new();
15
16 // Push elements while recording the changes in an edit.
17 recorder.insert(1, 'A');
18 recorder.insert(2, 'B');
19 recorder.insert(3, 'C');
20
21 // Flush the recorder and commit the recorded edit of pushing 'A', 'B', 'C'
22 // into the undo-redo bistack.
23 undoredo.commit(recorder.flush());
24
25 // The pushed elements are now present in the collection.
26 assert!(*recorder.collection() == HashMap::from([(1, 'A'), (2, 'B'), (3, 'C')]));
27
28 // Now undo the action.
29 undoredo.undo(&mut recorder);
30
31 // The collection is now empty; the action of pushing elements has been undone.
32 assert!(*recorder.collection() == HashMap::from([]));
33
34 // Now redo the action.
35 undoredo.redo(&mut recorder);
36
37 // The elements are back in the collection; the action has been redone.
38 assert!(*recorder.collection() == HashMap::from([(1, 'A'), (2, 'B'), (3, 'C')]));
39
40 // Once you are done recording, you can dissolve the recorder to regain
41 // ownership and mutability over the recorded collection.
42 let (mut hashmap, ..) = recorder.dissolve();
43 assert!(hashmap == HashMap::from([(1, 'A'), (2, 'B'), (3, 'C')]));
44}Additional examples can be found in:
Sourcepub fn flush(&mut self) -> Edit<EC>
pub fn flush(&mut self) -> Edit<EC>
Flush the recorder, returning the currently recorded edit and replacing it with a new empty one.
Examples found in repository?
examples/cmd_commit.rs (line 22)
14fn main() {
15 let mut recorder: Recorder<usize, char, HashMap<usize, char>> = Recorder::new(HashMap::new());
16 let mut undoredo: UndoRedo<HashMap<usize, char>, Command> = UndoRedo::new();
17
18 recorder.insert(1, 'A');
19
20 // Commit `Command::PushChar` enum variant as command metadata ("cmd") along
21 // with the recorded edit.
22 undoredo.cmd_commit(Command::PushChar, recorder.flush());
23
24 // `Command::PushChar` is now the top element of the stack of done cmd-edits.
25 assert_eq!(undoredo.done().last().unwrap().cmd, Command::PushChar);
26
27 undoredo.undo(&mut recorder);
28
29 // After undo, `Command::PushChar` is now the top element of the stack of
30 // undone cmd-edits.
31 assert_eq!(undoredo.undone().last().unwrap().cmd, Command::PushChar);
32}More examples
examples/btreeset.rs (line 14)
9fn main() {
10 let mut recorder: Recorder<char, (), BTreeSet<char>> = Recorder::new(BTreeSet::new());
11 let mut undoredo: UndoRedo<BTreeSet<char>> = UndoRedo::new();
12
13 recorder.insert('A', ());
14 undoredo.commit(recorder.flush());
15
16 recorder.insert('B', ());
17 // Inserting to a set is idempotent: repeating the same insert does nothing.
18 // It is, however, a logic error if the recorded collection is a multiset,
19 // e.g. `rstar::RTree`.
20 recorder.insert('B', ());
21 undoredo.commit(recorder.flush());
22
23 recorder.insert('C', ());
24 undoredo.commit(recorder.flush());
25
26 assert_eq!(*recorder.collection(), BTreeSet::from(['A', 'B', 'C']));
27
28 undoredo.undo(&mut recorder);
29 assert_eq!(*recorder.collection(), BTreeSet::from(['A', 'B']));
30
31 undoredo.undo(&mut recorder);
32 assert_eq!(*recorder.collection(), BTreeSet::from(['A']));
33
34 undoredo.redo(&mut recorder);
35 assert_eq!(*recorder.collection(), BTreeSet::from(['A', 'B']));
36
37 undoredo.redo(&mut recorder);
38 assert_eq!(*recorder.collection(), BTreeSet::from(['A', 'B', 'C']));
39}examples/stable_vec.rs (line 13)
8fn main() {
9 let mut recorder: Recorder<usize, char, StableVec<char>> = Recorder::new(StableVec::new());
10 let mut undoredo: UndoRedo<StableVec<char>> = UndoRedo::new();
11
12 recorder.push('A');
13 undoredo.commit(recorder.flush());
14
15 recorder.push('B');
16 recorder.push('B');
17 undoredo.commit(recorder.flush());
18
19 let key = recorder.push('X');
20 recorder.remove(&key);
21 recorder.push('C');
22 undoredo.commit(recorder.flush());
23
24 assert!(
25 recorder
26 .collection()
27 .values()
28 .copied()
29 .eq(['A', 'B', 'B', 'C'])
30 );
31
32 undoredo.undo(&mut recorder);
33 assert!(recorder.collection().values().copied().eq(['A', 'B', 'B']));
34
35 undoredo.undo(&mut recorder);
36 assert!(recorder.collection().values().copied().eq(['A']));
37
38 undoredo.redo(&mut recorder);
39 assert!(recorder.collection().values().copied().eq(['A', 'B', 'B']));
40
41 undoredo.redo(&mut recorder);
42 assert!(
43 recorder
44 .collection()
45 .values()
46 .copied()
47 .eq(['A', 'B', 'B', 'C'])
48 );
49}examples/thunderdome.rs (line 13)
8fn main() {
9 let mut recorder: Recorder<Index, char, Arena<char>> = Recorder::new(Arena::new());
10 let mut undoredo: UndoRedo<Arena<char>> = UndoRedo::new();
11
12 recorder.push('A');
13 undoredo.commit(recorder.flush());
14
15 recorder.push('B');
16 recorder.push('B');
17 undoredo.commit(recorder.flush());
18
19 let key = recorder.push('X');
20 recorder.remove(&key);
21 recorder.push('C');
22 undoredo.commit(recorder.flush());
23
24 let (_, values): (Vec<_>, Vec<char>) = recorder.collection().clone().into_iter().unzip();
25 assert!(values == vec!['A', 'B', 'B', 'C']);
26
27 undoredo.undo(&mut recorder);
28 let (_, values): (Vec<_>, Vec<char>) = recorder.collection().clone().into_iter().unzip();
29 assert!(values == vec!['A', 'B', 'B']);
30
31 undoredo.undo(&mut recorder);
32 let (_, values): (Vec<_>, Vec<char>) = recorder.collection().clone().into_iter().unzip();
33 assert!(values == vec!['A']);
34
35 undoredo.redo(&mut recorder);
36 let (_, values): (Vec<_>, Vec<char>) = recorder.collection().clone().into_iter().unzip();
37 assert!(values == vec!['A', 'B', 'B']);
38
39 undoredo.redo(&mut recorder);
40 let (_, values): (Vec<_>, Vec<char>) = recorder.collection().clone().into_iter().unzip();
41 assert!(values == vec!['A', 'B', 'B', 'C']);
42}examples/rstar.rs (line 13)
8fn main() {
9 let mut recorder: Recorder<(i32, i32), (), RTree<(i32, i32)>> = Recorder::new(RTree::new());
10 let mut undoredo: UndoRedo<RTree<(i32, i32)>> = UndoRedo::new();
11
12 recorder.insert((1, 1), ());
13 undoredo.commit(recorder.flush());
14
15 recorder.insert((2, 2), ());
16 undoredo.commit(recorder.flush());
17
18 recorder.insert((3, 3), ());
19 undoredo.commit(recorder.flush());
20
21 assert_eq!(
22 recorder.collection().iter().collect::<Vec<_>>(),
23 RTree::bulk_load(vec![(1, 1), (2, 2), (3, 3)])
24 .iter()
25 .collect::<Vec<_>>()
26 );
27
28 undoredo.undo(&mut recorder);
29 assert_eq!(
30 *recorder.collection().iter().collect::<Vec<_>>(),
31 RTree::bulk_load(vec![(1, 1), (2, 2)])
32 .iter()
33 .collect::<Vec<_>>()
34 );
35
36 undoredo.undo(&mut recorder);
37 assert_eq!(
38 *recorder.collection().iter().collect::<Vec<_>>(),
39 RTree::bulk_load(vec![(1, 1)]).iter().collect::<Vec<_>>()
40 );
41
42 undoredo.redo(&mut recorder);
43 assert_eq!(
44 *recorder.collection().iter().collect::<Vec<_>>(),
45 RTree::bulk_load(vec![(1, 1), (2, 2)])
46 .iter()
47 .collect::<Vec<_>>()
48 );
49
50 undoredo.redo(&mut recorder);
51 assert_eq!(
52 *recorder.collection().iter().collect::<Vec<_>>(),
53 RTree::bulk_load(vec![(1, 1), (2, 2), (3, 3)])
54 .iter()
55 .collect::<Vec<_>>()
56 );
57}examples/basic_usage.rs (line 23)
9fn main() {
10 // The recorder records the ongoing changes to the recorded collection.
11 let mut recorder: Recorder<usize, char, HashMap<usize, char>> = Recorder::new(HashMap::new());
12
13 // The undo-redo struct maintains the undo-redo bistack.
14 let mut undoredo: UndoRedo<HashMap<usize, char>> = UndoRedo::new();
15
16 // Push elements while recording the changes in an edit.
17 recorder.insert(1, 'A');
18 recorder.insert(2, 'B');
19 recorder.insert(3, 'C');
20
21 // Flush the recorder and commit the recorded edit of pushing 'A', 'B', 'C'
22 // into the undo-redo bistack.
23 undoredo.commit(recorder.flush());
24
25 // The pushed elements are now present in the collection.
26 assert!(*recorder.collection() == HashMap::from([(1, 'A'), (2, 'B'), (3, 'C')]));
27
28 // Now undo the action.
29 undoredo.undo(&mut recorder);
30
31 // The collection is now empty; the action of pushing elements has been undone.
32 assert!(*recorder.collection() == HashMap::from([]));
33
34 // Now redo the action.
35 undoredo.redo(&mut recorder);
36
37 // The elements are back in the collection; the action has been redone.
38 assert!(*recorder.collection() == HashMap::from([(1, 'A'), (2, 'B'), (3, 'C')]));
39
40 // Once you are done recording, you can dissolve the recorder to regain
41 // ownership and mutability over the recorded collection.
42 let (mut hashmap, ..) = recorder.dissolve();
43 assert!(hashmap == HashMap::from([(1, 'A'), (2, 'B'), (3, 'C')]));
44}Additional examples can be found in:
Source§impl<K, V, C, EC> Recorder<K, V, C, EC>
impl<K, V, C, EC> Recorder<K, V, C, EC>
Sourcepub fn with_edit(collection: C, edit: Edit<EC>) -> Self
pub fn with_edit(collection: C, edit: Edit<EC>) -> Self
Create a new recorder owning and recording a collection to an already existing edit.
Sourcepub fn collection(&self) -> &C
pub fn collection(&self) -> &C
Returns a reference to the recorded collection.
Examples found in repository?
examples/btreeset.rs (line 26)
9fn main() {
10 let mut recorder: Recorder<char, (), BTreeSet<char>> = Recorder::new(BTreeSet::new());
11 let mut undoredo: UndoRedo<BTreeSet<char>> = UndoRedo::new();
12
13 recorder.insert('A', ());
14 undoredo.commit(recorder.flush());
15
16 recorder.insert('B', ());
17 // Inserting to a set is idempotent: repeating the same insert does nothing.
18 // It is, however, a logic error if the recorded collection is a multiset,
19 // e.g. `rstar::RTree`.
20 recorder.insert('B', ());
21 undoredo.commit(recorder.flush());
22
23 recorder.insert('C', ());
24 undoredo.commit(recorder.flush());
25
26 assert_eq!(*recorder.collection(), BTreeSet::from(['A', 'B', 'C']));
27
28 undoredo.undo(&mut recorder);
29 assert_eq!(*recorder.collection(), BTreeSet::from(['A', 'B']));
30
31 undoredo.undo(&mut recorder);
32 assert_eq!(*recorder.collection(), BTreeSet::from(['A']));
33
34 undoredo.redo(&mut recorder);
35 assert_eq!(*recorder.collection(), BTreeSet::from(['A', 'B']));
36
37 undoredo.redo(&mut recorder);
38 assert_eq!(*recorder.collection(), BTreeSet::from(['A', 'B', 'C']));
39}More examples
examples/stable_vec.rs (line 26)
8fn main() {
9 let mut recorder: Recorder<usize, char, StableVec<char>> = Recorder::new(StableVec::new());
10 let mut undoredo: UndoRedo<StableVec<char>> = UndoRedo::new();
11
12 recorder.push('A');
13 undoredo.commit(recorder.flush());
14
15 recorder.push('B');
16 recorder.push('B');
17 undoredo.commit(recorder.flush());
18
19 let key = recorder.push('X');
20 recorder.remove(&key);
21 recorder.push('C');
22 undoredo.commit(recorder.flush());
23
24 assert!(
25 recorder
26 .collection()
27 .values()
28 .copied()
29 .eq(['A', 'B', 'B', 'C'])
30 );
31
32 undoredo.undo(&mut recorder);
33 assert!(recorder.collection().values().copied().eq(['A', 'B', 'B']));
34
35 undoredo.undo(&mut recorder);
36 assert!(recorder.collection().values().copied().eq(['A']));
37
38 undoredo.redo(&mut recorder);
39 assert!(recorder.collection().values().copied().eq(['A', 'B', 'B']));
40
41 undoredo.redo(&mut recorder);
42 assert!(
43 recorder
44 .collection()
45 .values()
46 .copied()
47 .eq(['A', 'B', 'B', 'C'])
48 );
49}examples/thunderdome.rs (line 24)
8fn main() {
9 let mut recorder: Recorder<Index, char, Arena<char>> = Recorder::new(Arena::new());
10 let mut undoredo: UndoRedo<Arena<char>> = UndoRedo::new();
11
12 recorder.push('A');
13 undoredo.commit(recorder.flush());
14
15 recorder.push('B');
16 recorder.push('B');
17 undoredo.commit(recorder.flush());
18
19 let key = recorder.push('X');
20 recorder.remove(&key);
21 recorder.push('C');
22 undoredo.commit(recorder.flush());
23
24 let (_, values): (Vec<_>, Vec<char>) = recorder.collection().clone().into_iter().unzip();
25 assert!(values == vec!['A', 'B', 'B', 'C']);
26
27 undoredo.undo(&mut recorder);
28 let (_, values): (Vec<_>, Vec<char>) = recorder.collection().clone().into_iter().unzip();
29 assert!(values == vec!['A', 'B', 'B']);
30
31 undoredo.undo(&mut recorder);
32 let (_, values): (Vec<_>, Vec<char>) = recorder.collection().clone().into_iter().unzip();
33 assert!(values == vec!['A']);
34
35 undoredo.redo(&mut recorder);
36 let (_, values): (Vec<_>, Vec<char>) = recorder.collection().clone().into_iter().unzip();
37 assert!(values == vec!['A', 'B', 'B']);
38
39 undoredo.redo(&mut recorder);
40 let (_, values): (Vec<_>, Vec<char>) = recorder.collection().clone().into_iter().unzip();
41 assert!(values == vec!['A', 'B', 'B', 'C']);
42}examples/rstar.rs (line 22)
8fn main() {
9 let mut recorder: Recorder<(i32, i32), (), RTree<(i32, i32)>> = Recorder::new(RTree::new());
10 let mut undoredo: UndoRedo<RTree<(i32, i32)>> = UndoRedo::new();
11
12 recorder.insert((1, 1), ());
13 undoredo.commit(recorder.flush());
14
15 recorder.insert((2, 2), ());
16 undoredo.commit(recorder.flush());
17
18 recorder.insert((3, 3), ());
19 undoredo.commit(recorder.flush());
20
21 assert_eq!(
22 recorder.collection().iter().collect::<Vec<_>>(),
23 RTree::bulk_load(vec![(1, 1), (2, 2), (3, 3)])
24 .iter()
25 .collect::<Vec<_>>()
26 );
27
28 undoredo.undo(&mut recorder);
29 assert_eq!(
30 *recorder.collection().iter().collect::<Vec<_>>(),
31 RTree::bulk_load(vec![(1, 1), (2, 2)])
32 .iter()
33 .collect::<Vec<_>>()
34 );
35
36 undoredo.undo(&mut recorder);
37 assert_eq!(
38 *recorder.collection().iter().collect::<Vec<_>>(),
39 RTree::bulk_load(vec![(1, 1)]).iter().collect::<Vec<_>>()
40 );
41
42 undoredo.redo(&mut recorder);
43 assert_eq!(
44 *recorder.collection().iter().collect::<Vec<_>>(),
45 RTree::bulk_load(vec![(1, 1), (2, 2)])
46 .iter()
47 .collect::<Vec<_>>()
48 );
49
50 undoredo.redo(&mut recorder);
51 assert_eq!(
52 *recorder.collection().iter().collect::<Vec<_>>(),
53 RTree::bulk_load(vec![(1, 1), (2, 2), (3, 3)])
54 .iter()
55 .collect::<Vec<_>>()
56 );
57}examples/basic_usage.rs (line 26)
9fn main() {
10 // The recorder records the ongoing changes to the recorded collection.
11 let mut recorder: Recorder<usize, char, HashMap<usize, char>> = Recorder::new(HashMap::new());
12
13 // The undo-redo struct maintains the undo-redo bistack.
14 let mut undoredo: UndoRedo<HashMap<usize, char>> = UndoRedo::new();
15
16 // Push elements while recording the changes in an edit.
17 recorder.insert(1, 'A');
18 recorder.insert(2, 'B');
19 recorder.insert(3, 'C');
20
21 // Flush the recorder and commit the recorded edit of pushing 'A', 'B', 'C'
22 // into the undo-redo bistack.
23 undoredo.commit(recorder.flush());
24
25 // The pushed elements are now present in the collection.
26 assert!(*recorder.collection() == HashMap::from([(1, 'A'), (2, 'B'), (3, 'C')]));
27
28 // Now undo the action.
29 undoredo.undo(&mut recorder);
30
31 // The collection is now empty; the action of pushing elements has been undone.
32 assert!(*recorder.collection() == HashMap::from([]));
33
34 // Now redo the action.
35 undoredo.redo(&mut recorder);
36
37 // The elements are back in the collection; the action has been redone.
38 assert!(*recorder.collection() == HashMap::from([(1, 'A'), (2, 'B'), (3, 'C')]));
39
40 // Once you are done recording, you can dissolve the recorder to regain
41 // ownership and mutability over the recorded collection.
42 let (mut hashmap, ..) = recorder.dissolve();
43 assert!(hashmap == HashMap::from([(1, 'A'), (2, 'B'), (3, 'C')]));
44}examples/rstared.rs (line 34)
11fn main() {
12 // A hashmap of 2D rectangles will be the underlying collection.
13 let rect_hashmap: HashMap<i32, Rectangle<(i32, i32)>> = HashMap::new();
14 // Wrap `RTreed` around the hashmap and then `Recorder` around it.
15 let mut recorder = Recorder::<
16 i32,
17 Rectangle<(i32, i32)>,
18 RTreed<i32, Rectangle<(i32, i32)>, HashMap<i32, Rectangle<(i32, i32)>>>,
19 >::new(RTreed::new(rect_hashmap));
20 let mut undoredo: UndoRedo<
21 RTreed<i32, Rectangle<(i32, i32)>, HashMap<i32, Rectangle<(i32, i32)>>>,
22 > = UndoRedo::new();
23
24 // Insert two rectangles, recording them in the R-tree.
25 recorder.insert(1, Rectangle::from_corners((0, 0), (1, 1)));
26 undoredo.commit(recorder.flush());
27
28 recorder.insert(2, Rectangle::from_corners((1, 1), (2, 2)));
29 undoredo.commit(recorder.flush());
30
31 // Locate the two rectangles in the R-tree.
32 assert_eq!(
33 recorder
34 .collection()
35 .rtree()
36 .locate_in_envelope(&AABB::from_corners((0, 0), (2, 2)))
37 .count(),
38 2
39 );
40
41 undoredo.undo(&mut recorder);
42
43 // After undo, there is now only one rectangle.
44 assert_eq!(
45 recorder
46 .collection()
47 .rtree()
48 .locate_in_envelope(&AABB::from_corners((0, 0), (2, 2)))
49 .count(),
50 1
51 );
52
53 undoredo.undo(&mut recorder);
54
55 // After another undo, there is no rectangles anymore.
56 assert_eq!(
57 recorder
58 .collection()
59 .rtree()
60 .locate_in_envelope(&AABB::from_corners((0, 0), (2, 2)))
61 .count(),
62 0
63 );
64
65 undoredo.redo(&mut recorder);
66
67 // After redo, we are back to one rectangle.
68 assert_eq!(
69 recorder
70 .collection()
71 .rtree()
72 .locate_in_envelope(&AABB::from_corners((0, 0), (2, 2)))
73 .count(),
74 1
75 );
76
77 undoredo.redo(&mut recorder);
78
79 // After another redo, we are back to two rectangles.
80 assert_eq!(
81 recorder
82 .collection()
83 .rtree()
84 .locate_in_envelope(&AABB::from_corners((0, 0), (2, 2)))
85 .count(),
86 2
87 );
88}Sourcepub fn dissolve(self) -> (C, Edit<EC>)
pub fn dissolve(self) -> (C, Edit<EC>)
Dissolve the recorder, returning and ceding ownership of its recorded collection and edit.
Examples found in repository?
examples/basic_usage.rs (line 42)
9fn main() {
10 // The recorder records the ongoing changes to the recorded collection.
11 let mut recorder: Recorder<usize, char, HashMap<usize, char>> = Recorder::new(HashMap::new());
12
13 // The undo-redo struct maintains the undo-redo bistack.
14 let mut undoredo: UndoRedo<HashMap<usize, char>> = UndoRedo::new();
15
16 // Push elements while recording the changes in an edit.
17 recorder.insert(1, 'A');
18 recorder.insert(2, 'B');
19 recorder.insert(3, 'C');
20
21 // Flush the recorder and commit the recorded edit of pushing 'A', 'B', 'C'
22 // into the undo-redo bistack.
23 undoredo.commit(recorder.flush());
24
25 // The pushed elements are now present in the collection.
26 assert!(*recorder.collection() == HashMap::from([(1, 'A'), (2, 'B'), (3, 'C')]));
27
28 // Now undo the action.
29 undoredo.undo(&mut recorder);
30
31 // The collection is now empty; the action of pushing elements has been undone.
32 assert!(*recorder.collection() == HashMap::from([]));
33
34 // Now redo the action.
35 undoredo.redo(&mut recorder);
36
37 // The elements are back in the collection; the action has been redone.
38 assert!(*recorder.collection() == HashMap::from([(1, 'A'), (2, 'B'), (3, 'C')]));
39
40 // Once you are done recording, you can dissolve the recorder to regain
41 // ownership and mutability over the recorded collection.
42 let (mut hashmap, ..) = recorder.dissolve();
43 assert!(hashmap == HashMap::from([(1, 'A'), (2, 'B'), (3, 'C')]));
44}Trait Implementations§
Source§impl<K: Clone, V: Clone, C: Get<K, Item = V> + Insert<K>, EC: Get<K, Item = V> + Insert<K>> Insert<K> for Recorder<K, V, C, EC>
impl<K: Clone, V: Clone, C: Get<K, Item = V> + Insert<K>, EC: Get<K, Item = V> + Insert<K>> Insert<K> for Recorder<K, V, C, EC>
Auto Trait Implementations§
impl<K, V, C, EC> Freeze for Recorder<K, V, C, EC>
impl<K, V, C, EC> RefUnwindSafe for Recorder<K, V, C, EC>
impl<K, V, C, EC> Send for Recorder<K, V, C, EC>
impl<K, V, C, EC> Sync for Recorder<K, V, C, EC>
impl<K, V, C, EC> Unpin for Recorder<K, V, C, EC>
impl<K, V, C, EC> UnwindSafe for Recorder<K, V, C, EC>
Blanket Implementations§
Source§impl<K, V, C, EC> ApplyEdit<EC> for C
impl<K, V, C, EC> ApplyEdit<EC> for C
Source§fn apply_edit(&mut self, edit: &Edit<EC>)
fn apply_edit(&mut self, edit: &Edit<EC>)
Apply the changes in an edit to a collection. Read more
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more