#![doc(html_root_url = "https://docs.rs/undo")]
#![deny(missing_docs)]
#![forbid(unsafe_code)]
#![cfg_attr(not(feature = "std"), no_std)]
#[cfg(feature = "alloc")]
extern crate alloc;
#[cfg(doctest)]
#[doc = include_str!("../README.md")]
pub struct ReadmeDocTest;
#[cfg(feature = "alloc")]
mod add;
#[cfg(feature = "alloc")]
mod entry;
#[cfg(feature = "alloc")]
mod format;
#[cfg(feature = "alloc")]
pub mod history;
#[cfg(feature = "alloc")]
pub mod record;
#[cfg(feature = "alloc")]
mod socket;
#[cfg(feature = "alloc")]
use entry::Entry;
#[cfg(feature = "alloc")]
use format::Format;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[doc(hidden)]
#[cfg(feature = "alloc")]
pub use add::Add;
#[cfg(feature = "alloc")]
pub use history::History;
#[cfg(feature = "alloc")]
pub use record::Record;
#[cfg(feature = "alloc")]
pub use socket::{Event, Slot};
pub trait Edit {
type Target;
type Output;
fn edit(&mut self, target: &mut Self::Target) -> Self::Output;
fn undo(&mut self, target: &mut Self::Target) -> Self::Output;
fn redo(&mut self, target: &mut Self::Target) -> Self::Output {
self.edit(target)
}
fn merge(&mut self, other: Self) -> Merged<Self>
where
Self: Sized,
{
Merged::No(other)
}
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
pub enum Merged<E> {
Yes,
No(E),
Annul,
}
#[cfg(feature = "alloc")]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Copy, Clone, Debug, Default, Hash, Eq, PartialEq)]
pub struct At {
pub root: usize,
pub index: usize,
}
#[cfg(feature = "alloc")]
impl At {
pub const fn new(root: usize, index: usize) -> At {
At { root, index }
}
const fn no_root(index: usize) -> At {
At::new(0, index)
}
}