⚡ Sangsakala Proxy 🏠 Home
Skip to content

Commit f37496e

Browse files
committed
Add .delta accessible
1 parent 9e26f80 commit f37496e

1 file changed

Lines changed: 69 additions & 0 deletions

File tree

‎JavaScript/2-delta.js‎

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
'use strict';
2+
3+
function Transaction() {}
4+
5+
Transaction.start = (data) => {
6+
console.log('start transaction');
7+
let delta = {};
8+
9+
const methods = {
10+
commit: () => {
11+
console.log('commit transaction');
12+
Object.assign(data, delta);
13+
delta = {};
14+
methods.delta = delta;
15+
},
16+
rollback: () => {
17+
console.log('rollback transaction');
18+
delta = {};
19+
methods.delta = delta;
20+
},
21+
delta
22+
};
23+
24+
return new Proxy(data, {
25+
get(target, key) {
26+
console.log('get', key);
27+
if (key === Symbol.iterator) {
28+
const changes = Object.keys(delta);
29+
const keys = Object.keys(target).concat(changes);
30+
const props = keys.filter((x, i, a) => a.indexOf(x) === i);
31+
return props[Symbol.iterator]();
32+
}
33+
return methods[key] || delta[key] || target[key];
34+
},
35+
set(target, key, val) {
36+
console.log('set', key, val);
37+
if (target[key] === val) {
38+
delete delta[key];
39+
} else {
40+
delta[key] = val;
41+
}
42+
return true;
43+
}
44+
});
45+
};
46+
47+
48+
// Usage
49+
50+
const data = { name: 'Marcus Aurelius', city: 'Rome', born: 121 };
51+
52+
const transaction = Transaction.start(data);
53+
54+
transaction.name = 'Mao Zedong';
55+
transaction.born = 1893;
56+
57+
console.dir(transaction.delta);
58+
59+
transaction.commit();
60+
61+
console.dir(transaction.delta);
62+
63+
transaction.city = 'Shaoshan';
64+
65+
console.dir(transaction.delta);
66+
67+
transaction.rollback();
68+
69+
console.dir(transaction.delta);

0 commit comments

Comments
 (0)