-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path5-2p-set.js
More file actions
65 lines (52 loc) · 1.24 KB
/
5-2p-set.js
File metadata and controls
65 lines (52 loc) · 1.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
'use strict';
class TwoPhaseSet {
#added;
#removed;
constructor({ added = [], removed = [] } = {}) {
this.#added = new Set(added);
this.#removed = new Set(removed);
}
add(item) {
this.#added.add(item);
}
remove(item) {
if (this.#added.has(item)) {
this.#removed.add(item);
}
}
merge({ added, removed } = {}) {
for (const item of added) this.#added.add(item);
for (const item of removed) this.#removed.add(item);
}
get value() {
const keep = (item) => !this.#removed.has(item);
return Array.from(this.#added).filter(keep);
}
get added() {
return this.#added;
}
get removed() {
return this.#removed;
}
}
// Usage
console.log('Replica 0');
const set0 = new TwoPhaseSet();
set0.add('a');
set0.add('b');
set0.remove('a');
console.log({ id0: set0.value });
console.log('Replica 1');
const set1 = new TwoPhaseSet();
set1.add('b');
set1.add('c');
set1.remove('b');
console.log({ id1: set1.value });
console.log('Sync');
set0.merge(set1);
set1.merge(set0);
console.log({ id0: { added: set0.added, removed: set0.removed } });
console.log({ id1: { added: set1.added, removed: set1.removed } });
console.log('Get value');
console.log({ id0: set0.value });
console.log({ id1: set1.value });