loro_internal/delta/
map.rs1use 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 *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 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}