Skip to main content

rstared/
delta.rs

1// SPDX-FileCopyrightText: 2026 rstared contributors
2//
3// SPDX-License-Identifier: MIT OR Apache-2.0
4
5use alloc::collections::BTreeMap;
6
7use crate::rstar::RTreeObject;
8use maplike::abc::Keyed;
9use maplike::iter::IntoIter;
10use maplike::ops::{Get, Insert, Remove};
11
12use crate::RTreed;
13use undoredo::{ApplyDelta, Delta};
14
15/// Half-delta for `RTreed<C>`. Alias for `BTreeMap<K, V>`.
16pub type RTreedHalfDelta<K, V> = BTreeMap<K, V>;
17
18/// Delta for `RTreed<C>`. Alias for `Delta<RTreedHalfDelta<K, V>>`.
19pub type RTreedDelta<K, V> = Delta<RTreedHalfDelta<K, V>>;
20
21impl<
22    K: Clone + PartialEq,
23    V: Clone + PartialEq + RTreeObject,
24    C: Get<K> + Keyed<Key = K, Value = V> + Insert<K> + Remove<K, Output = Option<V>>,
25    DC: IntoIter<K> + Keyed<Key = K, Value = V>,
26> ApplyDelta<DC> for RTreed<C>
27{
28    #[inline]
29    fn apply_delta(&mut self, delta: Delta<DC>) {
30        let (removed, inserted) = delta.dissolve();
31
32        for (removed_key, _removed_value) in removed.into_iter() {
33            self.remove(&removed_key);
34        }
35
36        for (inserted_key, inserted_value) in inserted.into_iter() {
37            self.insert(inserted_key, inserted_value);
38        }
39    }
40}