loro_internal/delta/
map.rs

1use rustc_hash::{FxHashMap, FxHashSet};
2use serde::Serialize;
3use std::fmt::Debug;
4
5use crate::{InternalString, LoroValue};
6
7#[derive(Clone, Debug, Serialize)]
8pub struct ValuePair<T> {
9    pub old: T,
10    pub new: T,
11}
12
13impl From<(LoroValue, LoroValue)> for ValuePair<LoroValue> {
14    fn from((old, new): (LoroValue, LoroValue)) -> Self {
15        ValuePair { old, new }
16    }
17}
18
19#[derive(Clone, Debug, Serialize)]
20pub struct MapDiff<T> {
21    pub added: FxHashMap<InternalString, T>,
22    pub updated: FxHashMap<InternalString, ValuePair<T>>,
23    pub deleted: FxHashMap<InternalString, T>,
24}
25
26impl<T> MapDiff<T> {
27    pub fn new() -> Self {
28        Self::default()
29    }
30
31    pub fn insert(mut self, key: InternalString, value: T) -> Self {
32        self.deleted.remove(&key);
33        self.added.insert(key, value);
34        self
35    }
36
37    pub fn delete(mut self, key: &InternalString, value: T) -> Self {
38        self.added.remove(key);
39        self.deleted.insert(key.clone(), value);
40        self
41    }
42
43    pub fn compose(mut self, other: Self) -> Self {
44        for (k, v) in other.added.into_iter() {
45            if let Some(dv) = self.deleted.remove(&k) {
46                self.updated.insert(k, ValuePair { old: dv, new: v });
47            } else if let Some(ValuePair { old: _, new }) = self.updated.get_mut(&k) {
48                // should not happen in transaction
49                *new = v;
50            } else {
51                self.added.insert(k, v);
52            }
53        }
54
55        for (k, v) in other.deleted.into_iter() {
56            if let Some(av) = self.added.remove(&k) {
57                self.deleted.insert(k, av);
58            } else if let Some(ValuePair { old, .. }) = self.updated.remove(&k) {
59                self.deleted.insert(k, old);
60            } else {
61                // delete old value
62                self.deleted.insert(k, v);
63            }
64        }
65
66        for (k, ValuePair { old, new }) in other.updated.into_iter() {
67            if let Some(av) = self.added.get_mut(&k) {
68                *av = new;
69            } else if let Some(dv) = self.deleted.remove(&k) {
70                self.updated.insert(k, ValuePair { old: dv, new });
71            } else if let Some(ValuePair { old: _, new: n }) = self.updated.get_mut(&k) {
72                *n = new
73            } else {
74                self.updated.insert(k, ValuePair { old, new });
75            }
76        }
77        self
78    }
79}
80
81#[derive(Clone, Debug, Serialize)]
82#[allow(dead_code)]
83pub struct MapDiffRaw<T> {
84    pub(crate) added: FxHashMap<InternalString, T>,
85    pub(crate) deleted: FxHashSet<InternalString>,
86}
87
88impl<T> Default for MapDiff<T> {
89    fn default() -> Self {
90        Self {
91            added: Default::default(),
92            updated: Default::default(),
93            deleted: Default::default(),
94        }
95    }
96}