feat: add getOrInsert/getOrInsertComputed to SvelteMap (#18728)

Closes #18014
pull/18587/merge
Simon H 2 days ago committed by GitHub
parent edbe11ebc9
commit 74197ccbe1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,5 @@
---
'svelte': minor
---
feat: add getOrInsert/getOrInsertComputed to SvelteMap

@ -153,6 +153,28 @@ export class SvelteMap extends Map {
return super.get(key); return super.get(key);
} }
/**
* @param {K} key
* @param {V} value
* */
getOrInsert(key, value) {
if (!super.has(key)) {
this.set(key, value);
}
return /** @type {V} */ (this.get(key));
}
/**
* @param {K} key
* @param {(key: K) => V} callbackFn
*/
getOrInsertComputed(key, callbackFn) {
if (!super.has(key)) {
this.set(key, callbackFn(key));
}
return /** @type {V} */ (this.get(key));
}
/** /**
* @param {K} key * @param {K} key
* @param {V} value * @param {V} value

@ -100,6 +100,85 @@ test('map.get(...)', () => {
cleanup(); cleanup();
}); });
test('map.getOrInsert(...)', () => {
const map = new SvelteMap([
[2, 2],
[3, 3]
]);
const log: any = [];
const cleanup = effect_root(() => {
render_effect(() => {
log.push('get 1', map.getOrInsert(1, 1));
});
render_effect(() => {
log.push('get 2', map.getOrInsert(2, 2));
});
render_effect(() => {
log.push('get 3', map.getOrInsert(3, 4));
});
});
flushSync(() => {
map.delete(2);
});
flushSync(() => {
map.set(2, 2);
});
assert.deepEqual(log, ['get 1', 1, 'get 2', 2, 'get 3', 3, 'get 2', 2]);
cleanup();
});
test('map.getOrInsertComputed(...)', () => {
const map = new SvelteMap([
[2, 2],
[3, 3]
]);
const log: any = [];
const cleanup = effect_root(() => {
render_effect(() => {
log.push(
'get 1',
map.getOrInsertComputed(1, (k) => k)
);
});
render_effect(() => {
log.push(
'get 2',
map.getOrInsertComputed(2, (k) => k)
);
});
render_effect(() => {
log.push(
'get 3',
map.getOrInsertComputed(3, () => 4)
);
});
});
flushSync(() => {
map.delete(2);
});
flushSync(() => {
map.set(2, 2);
});
assert.deepEqual(log, ['get 1', 1, 'get 2', 2, 'get 3', 3, 'get 2', 2]);
cleanup();
});
test('map.has(...)', () => { test('map.has(...)', () => {
const map = new SvelteMap([ const map = new SvelteMap([
[1, 1], [1, 1],

@ -2466,6 +2466,10 @@ declare module 'svelte/reactivity' {
constructor(value?: Iterable<readonly [K, V]> | null | undefined); constructor(value?: Iterable<readonly [K, V]> | null | undefined);
getOrInsert(key: K, value: V): V;
getOrInsertComputed(key: K, callbackFn: (key: K) => V): V;
set(key: K, value: V): this; set(key: K, value: V): this;
#private; #private;
} }

Loading…
Cancel
Save