use crate::{ApplyEdit, ExtractEdit, RevertEdit};
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone, Debug, Default, PartialEq)]
pub struct Snapshot<T> {
state: T,
}
impl<T> Snapshot<T> {
#[inline]
pub fn new(state: T) -> Self {
Self { state }
}
#[inline]
pub fn dissolve(self) -> T {
self.state
}
}
impl<T: Clone> ApplyEdit<T> for Snapshot<T> {
#[inline]
fn apply_edit(self, target: &mut T) {
*target = self.state;
}
}
impl<T: Clone> RevertEdit<T> for Snapshot<T> {
#[inline]
fn revert_edit(self, target: &mut T) -> Self {
let reverse = Self::new(target.clone());
*target = self.state;
reverse
}
}
impl<T: Clone> ExtractEdit<T> for Snapshot<T> {
#[inline]
fn extract_edit(target: &mut T) -> Self {
Self::new(target.clone())
}
}