bevy-undo2 0.1.0

This crate makes it easy to use the undo-operation on bevy
Documentation
use std::collections::VecDeque;
use std::fmt::Debug;
use std::ops::Deref;
use bevy::prelude::{Event, Resource};


#[derive(Event, Clone)]
pub(crate) struct RequestCommitReservationsFromSchedulerEvent;


#[derive(Event, Clone)]
pub(crate) struct RequestCommitReservationsEvent;


#[derive(Event, Clone)]
pub(crate) struct UndoReserveEvent<E: Event + Clone> {
    pub inner: E,
    pub reserve_no: usize,
}


#[derive(Resource, Debug, Default, Ord, PartialOrd, Eq, PartialEq, Copy, Clone)]
#[repr(transparent)]
pub(crate) struct ReserveCounter(usize);


impl Deref for ReserveCounter {
    type Target = usize;

    #[inline]
    fn deref(&self) -> &Self::Target {
        &self.0
    }
}


impl ReserveCounter {
    #[inline(always)]
    pub fn increment(&mut self) {
        self.0 += 1;
    }


    #[inline(always)]
    pub fn reset(&mut self) {
        self.0 = 0;
    }
}


#[derive(Resource)]
pub(crate) struct UndoReservedArea<E: Event + Clone>(pub(crate) VecDeque<UndoReserveEvent<E>>);


impl<E: Event + Clone> UndoReservedArea<E> {
    #[inline]
    pub fn push(&mut self, event: UndoReserveEvent<E>) {
        self.0.push_back(event);
    }


    #[inline]
    pub fn pop(&mut self) -> Option<UndoReserveEvent<E>> {
        self.0.pop_front()
    }
}


impl<E: Event + Clone> Default for UndoReservedArea<E> {
    #[inline(always)]
    fn default() -> Self {
        Self(VecDeque::new())
    }
}