undoredo 0.8.21

Delta-based undo-redo decorator for collections such as HashMap, BTreeMap, StableVec, thunderdome::Arena, rstar::RTree. No need to implement commands.
Documentation
// SPDX-FileCopyrightText: 2025 undoredo contributors
//
// SPDX-License-Identifier: MIT OR Apache-2.0

use std::collections::BTreeMap;

use rstar::RTree;
use undoredo::{Recorder, UndoRedo};

fn main() {
    let mut recorder: Recorder<RTree<(i32, i32)>, BTreeMap<(i32, i32), ()>> =
        Recorder::new(RTree::new());
    let mut undoredo: UndoRedo<BTreeMap<(i32, i32), ()>> = UndoRedo::new();

    recorder.insert((1, 1), ());
    undoredo.commit(recorder.flush_delta());

    recorder.insert((2, 2), ());
    undoredo.commit(recorder.flush_delta());

    recorder.insert((3, 3), ());
    undoredo.commit(recorder.flush_delta());

    assert_eq!(
        recorder.collection().iter().collect::<Vec<_>>(),
        RTree::bulk_load(vec![(1, 1), (2, 2), (3, 3)])
            .iter()
            .collect::<Vec<_>>()
    );

    undoredo.undo(&mut recorder);
    assert_eq!(
        *recorder.collection().iter().collect::<Vec<_>>(),
        RTree::bulk_load(vec![(1, 1), (2, 2)])
            .iter()
            .collect::<Vec<_>>()
    );

    undoredo.undo(&mut recorder);
    assert_eq!(
        *recorder.collection().iter().collect::<Vec<_>>(),
        RTree::bulk_load(vec![(1, 1)]).iter().collect::<Vec<_>>()
    );

    undoredo.redo(&mut recorder);
    assert_eq!(
        *recorder.collection().iter().collect::<Vec<_>>(),
        RTree::bulk_load(vec![(1, 1), (2, 2)])
            .iter()
            .collect::<Vec<_>>()
    );

    undoredo.redo(&mut recorder);
    assert_eq!(
        *recorder.collection().iter().collect::<Vec<_>>(),
        RTree::bulk_load(vec![(1, 1), (2, 2), (3, 3)])
            .iter()
            .collect::<Vec<_>>()
    );
}

#[test]
fn test() {
    main();
}