Skip to main content

undoredo/
undoredo.rs

1// SPDX-FileCopyrightText: 2025 undoredo contributors
2//
3// SPDX-License-Identifier: MIT OR Apache-2.0
4
5use std::collections::HashMap;
6
7use rstared::{AABB, primitives::Rectangle};
8use rstared::{RTreed, RTreedDelta, RTreedHalfDelta};
9use undoredo::{Recorder, UndoRedo};
10
11fn main() {
12    // A hashmap of 2D rectangles will be the underlying container.
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        RTreed<HashMap<i32, Rectangle<(i32, i32)>>>,
17        RTreedHalfDelta<i32, Rectangle<(i32, i32)>>,
18    >::new(RTreed::new(rect_hashmap));
19    let mut undoredo: UndoRedo<RTreedDelta<i32, Rectangle<(i32, i32)>>> = UndoRedo::new();
20
21    // Insert two rectangles, recording them in the R-tree.
22    recorder.insert(1, Rectangle::from_corners((0, 0), (1, 1)));
23    undoredo.commit(&mut recorder);
24
25    recorder.insert(2, Rectangle::from_corners((1, 1), (2, 2)));
26    undoredo.commit(&mut recorder);
27
28    // Locate the two rectangles in the R-tree.
29    assert_eq!(
30        recorder
31            .container()
32            .rtree()
33            .locate_in_envelope(AABB::from_corners((0, 0), (2, 2)))
34            .count(),
35        2
36    );
37
38    undoredo.undo(&mut recorder);
39
40    // After undo, there is now only one rectangle.
41    assert_eq!(
42        recorder
43            .container()
44            .rtree()
45            .locate_in_envelope(AABB::from_corners((0, 0), (2, 2)))
46            .count(),
47        1
48    );
49
50    undoredo.undo(&mut recorder);
51
52    // After another undo, there is no rectangles anymore.
53    assert_eq!(
54        recorder
55            .container()
56            .rtree()
57            .locate_in_envelope(AABB::from_corners((0, 0), (2, 2)))
58            .count(),
59        0
60    );
61
62    undoredo.redo(&mut recorder);
63
64    // After redo, we are back to one rectangle.
65    assert_eq!(
66        recorder
67            .container()
68            .rtree()
69            .locate_in_envelope(AABB::from_corners((0, 0), (2, 2)))
70            .count(),
71        1
72    );
73
74    undoredo.redo(&mut recorder);
75
76    // After another redo, we are back to two rectangles.
77    assert_eq!(
78        recorder
79            .container()
80            .rtree()
81            .locate_in_envelope(AABB::from_corners((0, 0), (2, 2)))
82            .count(),
83        2
84    );
85}
86
87#[test]
88fn test() {
89    main();
90}