Skip to main content

SnapshotStore

Struct SnapshotStore 

Source
pub struct SnapshotStore<T> { /* private fields */ }
Expand description

A snapshot-based undo/redo store using Arc<T> for structural sharing.

T should ideally use persistent data structures internally (e.g., im::HashMap) so that cloning is O(1) and snapshots share memory.

§Invariants

  1. undo_stack is never empty after the first push.
  2. undo_stack.len() <= config.max_depth (after any operation).
  3. Redo stack is cleared on every push.
  4. current() always returns the most recently pushed or restored snapshot.

Implementations§

Source§

impl<T> SnapshotStore<T>

Source

pub fn new(config: SnapshotConfig) -> Self

Create a new snapshot store with the given configuration.

Source

pub fn with_default_config() -> Self

Create a new snapshot store with default configuration.

Source

pub fn push(&mut self, state: T)

Push a new snapshot, clearing the redo stack (new branch).

The snapshot is wrapped in Arc for structural sharing. If the undo stack exceeds max_depth, the oldest snapshot is evicted.

Source

pub fn push_arc(&mut self, state: Arc<T>)

Push a pre-wrapped Arc<T> snapshot.

Use this when you already have an Arc<T> and want to avoid double-wrapping.

Source

pub fn undo(&mut self) -> Option<Arc<T>>

Undo: move the current snapshot to the redo stack and return the previous snapshot.

Returns None if there is only one snapshot (the initial state) or the store is empty.

Source

pub fn redo(&mut self) -> Option<Arc<T>>

Redo: move the most recently undone snapshot back to the undo stack.

Returns None if there is nothing to redo.

Source

pub fn current(&self) -> Option<&Arc<T>>

Get the current snapshot (the most recent on the undo stack).

Returns None if the store is empty.

Source

pub fn can_undo(&self) -> bool

Check if undo is available.

Source

pub fn can_redo(&self) -> bool

Check if redo is available.

Source

pub fn undo_depth(&self) -> usize

Number of snapshots on the undo stack (including current).

Source

pub fn redo_depth(&self) -> usize

Number of snapshots on the redo stack.

Source

pub fn total_snapshots(&self) -> usize

Total number of snapshots across both stacks.

Source

pub fn config(&self) -> &SnapshotConfig

Get the configuration.

Source

pub fn is_empty(&self) -> bool

Check if the store is empty (no snapshots at all).

Source

pub fn clear(&mut self)

Clear all snapshots.

Trait Implementations§

Source§

impl<T: Debug> Debug for SnapshotStore<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<T> Freeze for SnapshotStore<T>

§

impl<T> RefUnwindSafe for SnapshotStore<T>
where T: RefUnwindSafe,

§

impl<T> Send for SnapshotStore<T>
where T: Sync + Send,

§

impl<T> Sync for SnapshotStore<T>
where T: Sync + Send,

§

impl<T> Unpin for SnapshotStore<T>

§

impl<T> UnsafeUnpin for SnapshotStore<T>

§

impl<T> UnwindSafe for SnapshotStore<T>
where T: RefUnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more