fix: no data duplication in reactive Set/Map (#11200)

* fix: get rid of data duplication in reactive map

* fix: get rid of data duplication in reactive set
pull/11201/head
Azarattum 1 year ago committed by GitHub
parent 1510c13113
commit e7301af1e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -28,7 +28,6 @@ export class ReactiveMap extends Map {
for (var [key, v] of value) { for (var [key, v] of value) {
sources.set(key, source(v)); sources.set(key, source(v));
super.set(key, v);
} }
this.#size.v = sources.size; this.#size.v = sources.size;
@ -62,7 +61,8 @@ export class ReactiveMap extends Map {
forEach(callbackfn, this_arg) { forEach(callbackfn, this_arg) {
get(this.#version); get(this.#version);
return super.forEach(callbackfn, this_arg); var bound_callbackfn = callbackfn.bind(this_arg);
this.#sources.forEach((s, key) => bound_callbackfn(s.v, key, this));
} }
/** @param {K} key */ /** @param {K} key */
@ -96,7 +96,7 @@ export class ReactiveMap extends Map {
set(s, value); set(s, value);
} }
return super.set(key, value); return this;
} }
/** @param {K} key */ /** @param {K} key */
@ -105,13 +105,14 @@ export class ReactiveMap extends Map {
var s = sources.get(key); var s = sources.get(key);
if (s !== undefined) { if (s !== undefined) {
sources.delete(key); var removed = sources.delete(key);
set(this.#size, sources.size); set(this.#size, sources.size);
set(s, /** @type {V} */ (UNINITIALIZED)); set(s, /** @type {V} */ (UNINITIALIZED));
this.#increment_version(); this.#increment_version();
return removed;
} }
return super.delete(key); return false;
} }
clear() { clear() {
@ -126,7 +127,6 @@ export class ReactiveMap extends Map {
} }
sources.clear(); sources.clear();
super.clear();
} }
keys() { keys() {

@ -124,6 +124,40 @@ test('map.has(...)', () => {
cleanup(); cleanup();
}); });
test('map.forEach(...)', () => {
const map = new ReactiveMap([
[1, 1],
[2, 2],
[3, 3]
]);
const log: any = [];
const this_arg = {};
map.forEach(function (this: unknown, ...args) {
log.push([...args, this]);
}, this_arg);
assert.deepEqual(log, [
[1, 1, map, this_arg],
[2, 2, map, this_arg],
[3, 3, map, this_arg]
]);
});
test('map.delete(...)', () => {
const map = new ReactiveMap([
[1, 1],
[2, 2],
[3, 3]
]);
assert.equal(map.delete(3), true);
assert.equal(map.delete(3), false);
assert.deepEqual(Array.from(map.values()), [1, 2]);
});
test('map handling of undefined values', () => { test('map handling of undefined values', () => {
const map = new ReactiveMap(); const map = new ReactiveMap();

@ -31,7 +31,6 @@ export class ReactiveSet extends Set {
for (var element of value) { for (var element of value) {
sources.set(element, source(true)); sources.set(element, source(true));
super.add(element);
} }
this.#size.v = sources.size; this.#size.v = sources.size;
@ -97,7 +96,7 @@ export class ReactiveSet extends Set {
this.#increment_version(); this.#increment_version();
} }
return super.add(value); return this;
} }
/** @param {T} value */ /** @param {T} value */
@ -106,13 +105,14 @@ export class ReactiveSet extends Set {
var s = sources.get(value); var s = sources.get(value);
if (s !== undefined) { if (s !== undefined) {
sources.delete(value); var removed = sources.delete(value);
set(this.#size, sources.size); set(this.#size, sources.size);
set(s, false); set(s, false);
this.#increment_version(); this.#increment_version();
return removed;
} }
return super.delete(value); return false;
} }
clear() { clear() {
@ -127,7 +127,6 @@ export class ReactiveSet extends Set {
} }
sources.clear(); sources.clear();
super.clear();
} }
keys() { keys() {

@ -77,3 +77,12 @@ test('set.has(...)', () => {
cleanup(); cleanup();
}); });
test('set.delete(...)', () => {
const set = new ReactiveSet([1, 2, 3]);
assert.equal(set.delete(3), true);
assert.equal(set.delete(3), false);
assert.deepEqual(Array.from(set.values()), [1, 2]);
});

Loading…
Cancel
Save