1use bevy::ecs::system::SystemParam;
2use bevy::prelude::{Event, EventWriter, ResMut};
3
4use crate::counter::UndoCounter;
5use crate::reserve::{RequestCommitReservationsEvent, RequestCommitReservationsFromSchedulerEvent, ReserveCounter, UndoReservedArea, UndoReserveEvent};
6
7#[cfg(feature = "callback_event")]
8pub mod callback;
9
10#[derive(Event, Clone)]
11pub(crate) struct UndoEvent<E: Event + Clone> {
12 pub inner: E,
13 pub no: usize,
14}
15
16#[derive(SystemParam)]
17pub struct UndoReserveCommitter<'w> {
18 ew: EventWriter<'w, RequestCommitReservationsEvent>,
19}
20
21impl<'w> UndoReserveCommitter<'w> {
22 #[inline(always)]
24 pub fn commit(&mut self) {
25 self.ew.send(RequestCommitReservationsEvent);
26 }
27}
28
29
30#[derive(SystemParam)]
31pub struct UndoScheduler<'w, E: Event + Clone> {
32 counter: ResMut<'w, UndoCounter>,
33 reserve: ResMut<'w, UndoReservedArea<E>>,
34 reserve_counter: ResMut<'w, ReserveCounter>,
35 undo_writer: EventWriter<'w, UndoEvent<E>>,
36 reserve_writer: EventWriter<'w, RequestCommitReservationsFromSchedulerEvent>,
37}
38
39
40impl<'w, E: Event + Clone> UndoScheduler<'w, E> {
41 #[inline(always)]
46 pub fn register(&mut self, event: E) {
47 self.counter.increment();
48 self.undo_writer.send(UndoEvent {
49 inner: event,
50 no: **self.counter,
51 });
52 }
53
54
55 #[inline]
62 pub fn reserve(&mut self, event: E) {
63 self.reserve_counter.increment();
64 self.reserve.push(UndoReserveEvent {
65 inner: event,
66 reserve_no: **self.reserve_counter,
67 });
68 }
69
70
71 #[inline]
73 pub fn register_all_reserved(&mut self) {
74 self.reserve_writer.send(RequestCommitReservationsFromSchedulerEvent);
75 }
76}
77
78
79impl<'w, E: Event + Clone + Default> UndoScheduler<'w, E> {
80 #[inline(always)]
85 pub fn register_default(&mut self) {
86 self.register(E::default());
87 }
88
89
90 #[inline(always)]
97 pub fn reserve_default(&mut self) {
98 self.reserve(E::default());
99 }
100}