valdres 0.2.0-alpha.4 → 0.2.0-alpha.5

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.
Files changed (2) hide show
  1. package/dist/index.js +28 -8
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -182,7 +182,6 @@ var handleSelectorResult = (value, selector, data) => {
182
182
  value.then((resolved) => {
183
183
  data.values.set(selector, resolved);
184
184
  updateStateSubscribers(selector, data);
185
- console.log(`TODO: Should we check if other selectors are using this?`);
186
185
  });
187
186
  return value;
188
187
  } else {
@@ -446,23 +445,41 @@ var findDependencies = (state, data, result = new Set) => {
446
445
  }
447
446
  return result;
448
447
  };
448
+ var recursivlyResetTxnSelectorCache = (state, txnSubscribers, txnSelectorCache) => {
449
+ for (const dep of txnSubscribers.get(state)) {
450
+ txnSelectorCache.delete(dep);
451
+ if (txnSubscribers.get(dep)?.size) {
452
+ recursivlyResetTxnSelectorCache(dep, txnSubscribers, txnSelectorCache);
453
+ }
454
+ }
455
+ };
449
456
  var transaction = (callback, data) => {
450
457
  let txnAtomMap = new Map;
451
458
  let txnSelectorCache = new Map;
459
+ let txnSubscribers = new Map;
452
460
  let dirtySelectors = new Set;
453
461
  const txnGet = (state) => {
454
462
  if (isAtom(state)) {
455
463
  return txnAtomMap.has(state) ? txnAtomMap.get(state) : getState2(state, data);
456
- } else {
464
+ } else if (isSelector(state)) {
457
465
  if (txnSelectorCache.has(state)) {
458
466
  return txnSelectorCache.get(state);
459
- } else if (dirtySelectors.has(state)) {
460
- const res = state.get(txnGet);
461
- txnSelectorCache.set(state, res);
462
- return res;
463
- } else {
464
- return getState2(state, data);
465
467
  }
468
+ const deps = new Set;
469
+ const res = state.get((s) => {
470
+ deps.add(s);
471
+ return txnGet(s);
472
+ });
473
+ for (const dep of deps) {
474
+ if (!txnSubscribers.has(dep)) {
475
+ txnSubscribers.set(dep, new Set);
476
+ }
477
+ txnSubscribers.get(dep).add(state);
478
+ }
479
+ txnSelectorCache.set(state, res);
480
+ return res;
481
+ } else {
482
+ throw new Error("Unsupported state");
466
483
  }
467
484
  };
468
485
  const txnSet = (atom3, value) => {
@@ -476,6 +493,9 @@ var transaction = (callback, data) => {
476
493
  dirtySelectors.add(selector);
477
494
  txnSelectorCache.delete(selector);
478
495
  }
496
+ if (txnSubscribers.get(atom3)?.size) {
497
+ recursivlyResetTxnSelectorCache(atom3, txnSubscribers, txnSelectorCache);
498
+ }
479
499
  txnAtomMap.set(atom3, value);
480
500
  };
481
501
  const txnReset = (atom3) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valdres",
3
- "version": "0.2.0-alpha.4",
3
+ "version": "0.2.0-alpha.5",
4
4
  "license": "MIT",
5
5
  "author": {
6
6
  "name": "Eigil Sagafos"
@@ -34,5 +34,5 @@
34
34
  "access": "public",
35
35
  "registry": "https://registry.npmjs.org/"
36
36
  },
37
- "gitHead": "1bde879ca28be7fb3e98add8bbcd2c568f8c6911"
37
+ "gitHead": "75721256957ea160c2a82ac4ebb5a12e4c447f1f"
38
38
  }