use core::ops::{Deref, DerefMut};
use daft::{Diffable, Leaf};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct IdLeaf<T> {
before: T,
after: T,
}
impl<T> IdLeaf<T> {
pub(crate) fn new(before: T, after: T) -> Self {
IdLeaf { before, after }
}
#[inline]
pub fn before(&self) -> &T {
&self.before
}
#[inline]
pub fn after(&self) -> &T {
&self.after
}
#[inline]
pub fn into_leaf(self) -> Leaf<T> {
Leaf { before: self.before, after: self.after }
}
#[inline]
pub fn as_ref(&self) -> IdLeaf<&T> {
IdLeaf { before: &self.before, after: &self.after }
}
#[inline]
pub fn as_mut(&mut self) -> IdLeaf<&mut T> {
IdLeaf { before: &mut self.before, after: &mut self.after }
}
#[inline]
pub fn as_deref(&self) -> IdLeaf<&T::Target>
where
T: Deref,
{
IdLeaf { before: &*self.before, after: &*self.after }
}
#[inline]
pub fn as_deref_mut(&mut self) -> IdLeaf<&mut T::Target>
where
T: DerefMut,
{
IdLeaf { before: &mut *self.before, after: &mut *self.after }
}
#[inline]
pub fn is_unchanged(&self) -> bool
where
T: Eq,
{
self.before == self.after
}
#[inline]
pub fn is_modified(&self) -> bool
where
T: Eq,
{
self.before != self.after
}
}
impl<'daft, T: ?Sized + Diffable> IdLeaf<&'daft T> {
#[inline]
pub fn diff_pair(self) -> T::Diff<'daft> {
self.before.diff(self.after)
}
}
impl<T> IdLeaf<&T> {
#[inline]
pub fn cloned(self) -> IdLeaf<T>
where
T: Clone,
{
IdLeaf { before: self.before.clone(), after: self.after.clone() }
}
#[inline]
pub fn copied(self) -> IdLeaf<T>
where
T: Copy,
{
IdLeaf { before: *self.before, after: *self.after }
}
}