lib0 0.2.44 → 0.2.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -203,18 +203,19 @@ See encoding.writeAny for more information.</p></dd>
203
203
  <dd><p>Decode an any-encoded value.</p></dd>
204
204
  </dl>
205
205
  </details>
206
- <details><summary><b>[lib0/cached-map]</b> An implementation of a map which has keys that expire.</summary>
207
- <pre>import * as cached-map from 'lib0/cache'</pre>
206
+ <details><summary><b>[lib0/cache]</b> An implementation of a map which has keys that expire.</summary>
207
+ <pre>import * as cache from 'lib0/cache'</pre>
208
208
  <dl>
209
- <b><code>new cached-map.Cache(timeout: number)</code></b><br>
210
- <b><code>cached-map.removeStale(cache: module:cache.Cache&lt;K, V&gt;): number</code></b><br>
211
- <b><code>cached-map.set(cache: module:cache.Cache&lt;K, V&gt;, key: K, value: V)</code></b><br>
212
- <b><code>cached-map.get(cache: module:cache.Cache&lt;K, V&gt;, key: K): V | undefined</code></b><br>
213
- <b><code>cached-map.getAsync(cache: module:cache.Cache&lt;K, V&gt;, key: K): V | Promise&lt;V&gt; | undefined</code></b><br>
209
+ <b><code>new cache.Cache(timeout: number)</code></b><br>
210
+ <b><code>cache.removeStale(cache: module:cache.Cache&lt;K, V&gt;): number</code></b><br>
211
+ <b><code>cache.set(cache: module:cache.Cache&lt;K, V&gt;, key: K, value: V)</code></b><br>
212
+ <b><code>cache.get(cache: module:cache.Cache&lt;K, V&gt;, key: K): V | undefined</code></b><br>
213
+ <b><code>cache.getAsync(cache: module:cache.Cache&lt;K, V&gt;, key: K): V | Promise&lt;V&gt; | undefined</code></b><br>
214
214
  <dd><p>Works well in conjunktion with setIfUndefined which has an async init function.
215
215
  Using getAsync &amp; setIfUndefined ensures that the init function is only called once.</p></dd>
216
- <b><code>cached-map.setIfUndefined(cache: module:cache.Cache&lt;K, V&gt;, key: K, init: function():Promise&lt;V&gt;): Promise&lt;V&gt; | V</code></b><br>
217
- <b><code>cached-map.create(timeout: number)</code></b><br>
216
+ <b><code>cache.remove(cache: module:cache.Cache&lt;K, V&gt;, key: K)</code></b><br>
217
+ <b><code>cache.setIfUndefined(cache: module:cache.Cache&lt;K, V&gt;, key: K, init: function():Promise&lt;V&gt;, removeNull: boolean): Promise&lt;V&gt; | V</code></b><br>
218
+ <b><code>cache.create(timeout: number)</code></b><br>
218
219
  </dl>
219
220
  </details>
220
221
  <details><summary><b>[lib0/component]</b> Web components.</summary>
package/cache.d.ts CHANGED
@@ -20,7 +20,8 @@ export function removeStale<K, V>(cache: Cache<K, V>): number;
20
20
  export function set<K, V>(cache: Cache<K, V>, key: K, value: V): void;
21
21
  export function get<K, V>(cache: Cache<K, V>, key: K): V | undefined;
22
22
  export function getAsync<K, V>(cache: Cache<K, V>, key: K): V | Promise<V> | undefined;
23
- export function setIfUndefined<K, V>(cache: Cache<K, V>, key: K, init: () => Promise<V>): V | Promise<V>;
23
+ export function remove<K, V>(cache: Cache<K, V>, key: K): V | undefined;
24
+ export function setIfUndefined<K, V>(cache: Cache<K, V>, key: K, init: () => Promise<V>, removeNull?: boolean): V | Promise<V>;
24
25
  export function create(timeout: number): Cache<any, any>;
25
26
  import * as list from "./list.js";
26
27
  /**
package/cache.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["cache.js"],"names":[],"mappings":"AAsCA;;GAEG;AACH;IACE;;OAEG;IACH,qBAFW,MAAM,EAYhB;IATC,gBAAsB;IACtB;;OAEG;IACH,IAFS,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAER;IACvB;;OAEG;IACH,MAFU,IAAI,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAEL;CAE3B;AAQM,uDAFK,MAAM,CAUjB;AASM,sEAcN;AA4BM,qEAGN;AAYM,uFAGN;AAUM,yGAqBN;AAKM,gCAFI,MAAM,mBAEkC;;AApKnD;;;;GAIG;AACH,qCAFgB,IAAI,CAAC,QAAQ;IAG3B;;;OAGG;IACH,iBAHW,CAAC,OACD,CAAC,GAAG,QAAQ,CAAC,CAAC,EAcxB;IAXC;;OAEG;IACH,yBAAgB;IAChB;;OAEG;IACH,yBAAgB;IAChB,gBAAiC;IACjC,oBAAc;IACd,OAAc;CAEjB"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["cache.js"],"names":[],"mappings":"AAsCA;;GAEG;AACH;IACE;;OAEG;IACH,qBAFW,MAAM,EAYhB;IATC,gBAAsB;IACtB;;OAEG;IACH,IAFS,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAER;IACvB;;OAEG;IACH,MAFU,IAAI,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAEL;CAE3B;AAQM,uDAFK,MAAM,CAUjB;AASM,sEAcN;AA4BM,qEAGN;AAYM,uFAGN;AAQM,wEAON;AAWM,sGAHI,OAAO,kBA2BjB;AAKM,gCAFI,MAAM,mBAEkC;;AAvLnD;;;;GAIG;AACH,qCAFgB,IAAI,CAAC,QAAQ;IAG3B;;;OAGG;IACH,iBAHW,CAAC,OACD,CAAC,GAAG,QAAQ,CAAC,CAAC,EAcxB;IAXC;;OAEG;IACH,yBAAgB;IAChB;;OAEG;IACH,yBAAgB;IAChB,gBAAiC;IACjC,oBAAc;IACd,OAAc;CAEjB"}
package/cache.js CHANGED
@@ -4,7 +4,7 @@
4
4
  /**
5
5
  * An implementation of a map which has keys that expire.
6
6
  *
7
- * @module cached-map
7
+ * @module cache
8
8
  */
9
9
 
10
10
  import * as list from './list.js'
@@ -141,15 +141,31 @@ export const getAsync = (cache, key) => {
141
141
  return n ? n.val : undefined
142
142
  }
143
143
 
144
+ /**
145
+ * @template K, V
146
+ *
147
+ * @param {Cache<K, V>} cache
148
+ * @param {K} key
149
+ */
150
+ export const remove = (cache, key) => {
151
+ const n = cache._map.get(key)
152
+ if (n) {
153
+ list.removeNode(cache._q, n)
154
+ cache._map.delete(key)
155
+ return n.val && !(n.val instanceof Promise) ? n.val : undefined
156
+ }
157
+ }
158
+
144
159
  /**
145
160
  * @template K, V
146
161
  *
147
162
  * @param {Cache<K, V>} cache
148
163
  * @param {K} key
149
164
  * @param {function():Promise<V>} init
165
+ * @param {boolean} removeNull Optional argument that automatically removes values that resolve to null/undefined from the cache.
150
166
  * @return {Promise<V> | V}
151
167
  */
152
- export const setIfUndefined = (cache, key, init) => {
168
+ export const setIfUndefined = (cache, key, init, removeNull = false) => {
153
169
  const now = removeStale(cache)
154
170
  const q = cache._q
155
171
  const n = cache._map.get(key)
@@ -167,6 +183,9 @@ export const setIfUndefined = (cache, key, init) => {
167
183
  if (p === node.val) {
168
184
  node.val = v
169
185
  }
186
+ if (removeNull && v == null) {
187
+ remove(cache, key)
188
+ }
170
189
  })
171
190
  return p
172
191
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cache.test.d.ts","sourceRoot":"","sources":["cache.test.js"],"names":[],"mappings":"AAQO,8BAFI,EAAE,QAAQ,iBAuDpB"}
1
+ {"version":3,"file":"cache.test.d.ts","sourceRoot":"","sources":["cache.test.js"],"names":[],"mappings":"AAQO,8BAFI,EAAE,QAAQ,iBAiEpB"}
package/dist/cache.cjs CHANGED
@@ -139,15 +139,31 @@ const getAsync = (cache, key) => {
139
139
  return n ? n.val : undefined
140
140
  };
141
141
 
142
+ /**
143
+ * @template K, V
144
+ *
145
+ * @param {Cache<K, V>} cache
146
+ * @param {K} key
147
+ */
148
+ const remove = (cache, key) => {
149
+ const n = cache._map.get(key);
150
+ if (n) {
151
+ list.removeNode(cache._q, n);
152
+ cache._map.delete(key);
153
+ return n.val && !(n.val instanceof Promise) ? n.val : undefined
154
+ }
155
+ };
156
+
142
157
  /**
143
158
  * @template K, V
144
159
  *
145
160
  * @param {Cache<K, V>} cache
146
161
  * @param {K} key
147
162
  * @param {function():Promise<V>} init
163
+ * @param {boolean} removeNull Optional argument that automatically removes values that resolve to null/undefined from the cache.
148
164
  * @return {Promise<V> | V}
149
165
  */
150
- const setIfUndefined = (cache, key, init) => {
166
+ const setIfUndefined = (cache, key, init, removeNull = false) => {
151
167
  const now = removeStale(cache);
152
168
  const q = cache._q;
153
169
  const n = cache._map.get(key);
@@ -165,6 +181,9 @@ const setIfUndefined = (cache, key, init) => {
165
181
  if (p === node.val) {
166
182
  node.val = v;
167
183
  }
184
+ if (removeNull && v == null) {
185
+ remove(cache, key);
186
+ }
168
187
  });
169
188
  return p
170
189
  }
@@ -179,6 +198,7 @@ exports.Cache = Cache;
179
198
  exports.create = create;
180
199
  exports.get = get;
181
200
  exports.getAsync = getAsync;
201
+ exports.remove = remove;
182
202
  exports.removeStale = removeStale;
183
203
  exports.set = set;
184
204
  exports.setIfUndefined = setIfUndefined;
@@ -1 +1 @@
1
- {"version":3,"file":"cache.cjs","sources":["../cache.js"],"sourcesContent":["\n/* eslint-env browser */\n\n/**\n * An implementation of a map which has keys that expire.\n *\n * @module cached-map\n */\n\nimport * as list from './list.js'\nimport * as map from './map.js'\nimport * as time from './time.js'\n\n/**\n * @template K, V\n *\n * @implements {list.ListNode}\n */\nclass Entry {\n /**\n * @param {K} key\n * @param {V | Promise<V>} val\n */\n constructor (key, val) {\n /**\n * @type {this | null}\n */\n this.prev = null\n /**\n * @type {this | null}\n */\n this.next = null\n this.created = time.getUnixTime()\n this.val = val\n this.key = key\n }\n}\n\n/**\n * @template K, V\n */\nexport class Cache {\n /**\n * @param {number} timeout\n */\n constructor (timeout) {\n this.timeout = timeout\n /**\n * @type list.List<Entry<K, V>>\n */\n this._q = list.create()\n /**\n * @type {Map<K, Entry<K, V>>}\n */\n this._map = map.create()\n }\n}\n\n/**\n * @template K, V\n *\n * @param {Cache<K, V>} cache\n * @return {number} Returns the current timestamp\n */\nexport const removeStale = cache => {\n const now = time.getUnixTime()\n const q = cache._q\n while (q.start && now - q.start.created > cache.timeout) {\n cache._map.delete(q.start.key)\n list.popFront(q)\n }\n return now\n}\n\n/**\n * @template K, V\n *\n * @param {Cache<K, V>} cache\n * @param {K} key\n * @param {V} value\n */\nexport const set = (cache, key, value) => {\n const now = removeStale(cache)\n const q = cache._q\n const n = cache._map.get(key)\n if (n) {\n list.removeNode(q, n)\n list.pushEnd(q, n)\n n.created = now\n n.val = value\n } else {\n const node = new Entry(key, value)\n list.pushEnd(q, node)\n cache._map.set(key, node)\n }\n}\n\n/**\n * @template K, V\n *\n * @param {Cache<K, V>} cache\n * @param {K} key\n * @return {Entry<K, V> | undefined}\n */\nconst getNode = (cache, key) => {\n const now = removeStale(cache)\n const q = cache._q\n const n = cache._map.get(key)\n if (n) {\n list.removeNode(q, n)\n list.pushEnd(q, n)\n n.created = now\n return n\n }\n}\n\n/**\n * @template K, V\n *\n * @param {Cache<K, V>} cache\n * @param {K} key\n * @return {V | undefined}\n */\nexport const get = (cache, key) => {\n const n = getNode(cache, key)\n return n && !(n.val instanceof Promise) ? n.val : undefined\n}\n\n/**\n * Works well in conjunktion with setIfUndefined which has an async init function.\n * Using getAsync & setIfUndefined ensures that the init function is only called once.\n *\n * @template K, V\n *\n * @param {Cache<K, V>} cache\n * @param {K} key\n * @return {V | Promise<V> | undefined}\n */\nexport const getAsync = (cache, key) => {\n const n = getNode(cache, key)\n return n ? n.val : undefined\n}\n\n/**\n * @template K, V\n *\n * @param {Cache<K, V>} cache\n * @param {K} key\n * @param {function():Promise<V>} init\n * @return {Promise<V> | V}\n */\nexport const setIfUndefined = (cache, key, init) => {\n const now = removeStale(cache)\n const q = cache._q\n const n = cache._map.get(key)\n if (n) {\n list.removeNode(q, n)\n list.pushEnd(q, n)\n n.created = now\n return n.val\n } else {\n const p = init()\n const node = new Entry(key, p)\n list.pushEnd(q, node)\n cache._map.set(key, node)\n p.then(v => {\n if (p === node.val) {\n node.val = v\n }\n })\n return p\n }\n}\n\n/**\n * @param {number} timeout\n */\nexport const create = timeout => new Cache(timeout)\n"],"names":["time.getUnixTime","list.create","map.create","list.popFront","list.removeNode","list.pushEnd"],"mappings":"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"}
1
+ {"version":3,"file":"cache.cjs","sources":["../cache.js"],"sourcesContent":["\n/* eslint-env browser */\n\n/**\n * An implementation of a map which has keys that expire.\n *\n * @module cache\n */\n\nimport * as list from './list.js'\nimport * as map from './map.js'\nimport * as time from './time.js'\n\n/**\n * @template K, V\n *\n * @implements {list.ListNode}\n */\nclass Entry {\n /**\n * @param {K} key\n * @param {V | Promise<V>} val\n */\n constructor (key, val) {\n /**\n * @type {this | null}\n */\n this.prev = null\n /**\n * @type {this | null}\n */\n this.next = null\n this.created = time.getUnixTime()\n this.val = val\n this.key = key\n }\n}\n\n/**\n * @template K, V\n */\nexport class Cache {\n /**\n * @param {number} timeout\n */\n constructor (timeout) {\n this.timeout = timeout\n /**\n * @type list.List<Entry<K, V>>\n */\n this._q = list.create()\n /**\n * @type {Map<K, Entry<K, V>>}\n */\n this._map = map.create()\n }\n}\n\n/**\n * @template K, V\n *\n * @param {Cache<K, V>} cache\n * @return {number} Returns the current timestamp\n */\nexport const removeStale = cache => {\n const now = time.getUnixTime()\n const q = cache._q\n while (q.start && now - q.start.created > cache.timeout) {\n cache._map.delete(q.start.key)\n list.popFront(q)\n }\n return now\n}\n\n/**\n * @template K, V\n *\n * @param {Cache<K, V>} cache\n * @param {K} key\n * @param {V} value\n */\nexport const set = (cache, key, value) => {\n const now = removeStale(cache)\n const q = cache._q\n const n = cache._map.get(key)\n if (n) {\n list.removeNode(q, n)\n list.pushEnd(q, n)\n n.created = now\n n.val = value\n } else {\n const node = new Entry(key, value)\n list.pushEnd(q, node)\n cache._map.set(key, node)\n }\n}\n\n/**\n * @template K, V\n *\n * @param {Cache<K, V>} cache\n * @param {K} key\n * @return {Entry<K, V> | undefined}\n */\nconst getNode = (cache, key) => {\n const now = removeStale(cache)\n const q = cache._q\n const n = cache._map.get(key)\n if (n) {\n list.removeNode(q, n)\n list.pushEnd(q, n)\n n.created = now\n return n\n }\n}\n\n/**\n * @template K, V\n *\n * @param {Cache<K, V>} cache\n * @param {K} key\n * @return {V | undefined}\n */\nexport const get = (cache, key) => {\n const n = getNode(cache, key)\n return n && !(n.val instanceof Promise) ? n.val : undefined\n}\n\n/**\n * Works well in conjunktion with setIfUndefined which has an async init function.\n * Using getAsync & setIfUndefined ensures that the init function is only called once.\n *\n * @template K, V\n *\n * @param {Cache<K, V>} cache\n * @param {K} key\n * @return {V | Promise<V> | undefined}\n */\nexport const getAsync = (cache, key) => {\n const n = getNode(cache, key)\n return n ? n.val : undefined\n}\n\n/**\n * @template K, V\n *\n * @param {Cache<K, V>} cache\n * @param {K} key\n */\nexport const remove = (cache, key) => {\n const n = cache._map.get(key)\n if (n) {\n list.removeNode(cache._q, n)\n cache._map.delete(key)\n return n.val && !(n.val instanceof Promise) ? n.val : undefined\n }\n}\n\n/**\n * @template K, V\n *\n * @param {Cache<K, V>} cache\n * @param {K} key\n * @param {function():Promise<V>} init\n * @param {boolean} removeNull Optional argument that automatically removes values that resolve to null/undefined from the cache.\n * @return {Promise<V> | V}\n */\nexport const setIfUndefined = (cache, key, init, removeNull = false) => {\n const now = removeStale(cache)\n const q = cache._q\n const n = cache._map.get(key)\n if (n) {\n list.removeNode(q, n)\n list.pushEnd(q, n)\n n.created = now\n return n.val\n } else {\n const p = init()\n const node = new Entry(key, p)\n list.pushEnd(q, node)\n cache._map.set(key, node)\n p.then(v => {\n if (p === node.val) {\n node.val = v\n }\n if (removeNull && v == null) {\n remove(cache, key)\n }\n })\n return p\n }\n}\n\n/**\n * @param {number} timeout\n */\nexport const create = timeout => new Cache(timeout)\n"],"names":["time.getUnixTime","list.create","map.create","list.popFront","list.removeNode","list.pushEnd"],"mappings":"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"}
package/dist/cache.d.ts CHANGED
@@ -20,7 +20,8 @@ export function removeStale<K, V>(cache: Cache<K, V>): number;
20
20
  export function set<K, V>(cache: Cache<K, V>, key: K, value: V): void;
21
21
  export function get<K, V>(cache: Cache<K, V>, key: K): V | undefined;
22
22
  export function getAsync<K, V>(cache: Cache<K, V>, key: K): V | Promise<V> | undefined;
23
- export function setIfUndefined<K, V>(cache: Cache<K, V>, key: K, init: () => Promise<V>): V | Promise<V>;
23
+ export function remove<K, V>(cache: Cache<K, V>, key: K): V | undefined;
24
+ export function setIfUndefined<K, V>(cache: Cache<K, V>, key: K, init: () => Promise<V>, removeNull?: boolean): V | Promise<V>;
24
25
  export function create(timeout: number): Cache<any, any>;
25
26
  import * as list from "./list.js";
26
27
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../cache.js"],"names":[],"mappings":"AAsCA;;GAEG;AACH;IACE;;OAEG;IACH,qBAFW,MAAM,EAYhB;IATC,gBAAsB;IACtB;;OAEG;IACH,IAFS,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAER;IACvB;;OAEG;IACH,MAFU,IAAI,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAEL;CAE3B;AAQM,uDAFK,MAAM,CAUjB;AASM,sEAcN;AA4BM,qEAGN;AAYM,uFAGN;AAUM,yGAqBN;AAKM,gCAFI,MAAM,mBAEkC;;AApKnD;;;;GAIG;AACH,qCAFgB,IAAI,CAAC,QAAQ;IAG3B;;;OAGG;IACH,iBAHW,CAAC,OACD,CAAC,GAAG,QAAQ,CAAC,CAAC,EAcxB;IAXC;;OAEG;IACH,yBAAgB;IAChB;;OAEG;IACH,yBAAgB;IAChB,gBAAiC;IACjC,oBAAc;IACd,OAAc;CAEjB"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../cache.js"],"names":[],"mappings":"AAsCA;;GAEG;AACH;IACE;;OAEG;IACH,qBAFW,MAAM,EAYhB;IATC,gBAAsB;IACtB;;OAEG;IACH,IAFS,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAER;IACvB;;OAEG;IACH,MAFU,IAAI,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAEL;CAE3B;AAQM,uDAFK,MAAM,CAUjB;AASM,sEAcN;AA4BM,qEAGN;AAYM,uFAGN;AAQM,wEAON;AAWM,sGAHI,OAAO,kBA2BjB;AAKM,gCAFI,MAAM,mBAEkC;;AAvLnD;;;;GAIG;AACH,qCAFgB,IAAI,CAAC,QAAQ;IAG3B;;;OAGG;IACH,iBAHW,CAAC,OACD,CAAC,GAAG,QAAQ,CAAC,CAAC,EAcxB;IAXC;;OAEG;IACH,yBAAgB;IAChB;;OAEG;IACH,yBAAgB;IAChB,gBAAiC;IACjC,oBAAc;IACd,OAAc;CAEjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"cache.test.d.ts","sourceRoot":"","sources":["../cache.test.js"],"names":[],"mappings":"AAQO,8BAFI,EAAE,QAAQ,iBAuDpB"}
1
+ {"version":3,"file":"cache.test.d.ts","sourceRoot":"","sources":["../cache.test.js"],"names":[],"mappings":"AAQO,8BAFI,EAAE,QAAQ,iBAiEpB"}
package/dist/test.cjs CHANGED
@@ -7382,15 +7382,31 @@ const getAsync = (cache, key) => {
7382
7382
  return n ? n.val : undefined
7383
7383
  };
7384
7384
 
7385
+ /**
7386
+ * @template K, V
7387
+ *
7388
+ * @param {Cache<K, V>} cache
7389
+ * @param {K} key
7390
+ */
7391
+ const remove = (cache, key) => {
7392
+ const n = cache._map.get(key);
7393
+ if (n) {
7394
+ removeNode(cache._q, n);
7395
+ cache._map.delete(key);
7396
+ return n.val && !(n.val instanceof Promise) ? n.val : undefined
7397
+ }
7398
+ };
7399
+
7385
7400
  /**
7386
7401
  * @template K, V
7387
7402
  *
7388
7403
  * @param {Cache<K, V>} cache
7389
7404
  * @param {K} key
7390
7405
  * @param {function():Promise<V>} init
7406
+ * @param {boolean} removeNull Optional argument that automatically removes values that resolve to null/undefined from the cache.
7391
7407
  * @return {Promise<V> | V}
7392
7408
  */
7393
- const setIfUndefined = (cache, key, init) => {
7409
+ const setIfUndefined = (cache, key, init, removeNull = false) => {
7394
7410
  const now = removeStale(cache);
7395
7411
  const q = cache._q;
7396
7412
  const n = cache._map.get(key);
@@ -7408,6 +7424,9 @@ const setIfUndefined = (cache, key, init) => {
7408
7424
  if (p === node.val) {
7409
7425
  node.val = v;
7410
7426
  }
7427
+ if (removeNull && v == null) {
7428
+ remove(cache, key);
7429
+ }
7411
7430
  });
7412
7431
  return p
7413
7432
  }
@@ -7474,6 +7493,16 @@ const testCache = async tc => {
7474
7493
  await xp;
7475
7494
  // we override the Entry.val property in cache when p resolves. However, we must prevent that when the value is overriden before p is resolved.
7476
7495
  assert(get(c, 'a') === 'y');
7496
+
7497
+ // test that we can remove properties
7498
+ remove(c, 'a');
7499
+ remove(c, 'does not exist'); // remove a non-existent property to achieve full test-coverage
7500
+ assert(get(c, 'a') === undefined);
7501
+
7502
+ // test that the optional property in setifUndefined works
7503
+ const yp = setIfUndefined(c, 'a', () => resolveWith(null), true);
7504
+ assert(await yp === null);
7505
+ assert(get(c, 'a') === undefined);
7477
7506
  };
7478
7507
 
7479
7508
  var cache = /*#__PURE__*/Object.freeze({