valdres 0.2.0-alpha.75 → 0.2.0-alpha.76

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/dist/index.js CHANGED
@@ -92,6 +92,9 @@ var equal = (a, b) => {
92
92
  }
93
93
  };
94
94
 
95
+ // src/utils/isAtomFamily.ts
96
+ var isAtomFamily = (state) => state && Object.hasOwn(state, "__valdresAtomFamilyMap");
97
+
95
98
  // src/utils/isAtom.ts
96
99
  var isAtom = (state) => Object.hasOwn(state, "defaultValue");
97
100
 
@@ -101,32 +104,11 @@ var isFamilyState = (state) => state && Object.hasOwn(state, "family");
101
104
  // src/utils/isFamilyAtom.ts
102
105
  var isFamilyAtom = (state) => isFamilyState(state) && isAtom(state);
103
106
 
104
- // src/lib/updateStateSubscribers.ts
105
- var updateStateSubscribers = (state, data) => {
106
- const subscribtions = data.subscriptions.get(state);
107
- if (subscribtions?.size) {
108
- for (const subscribtion of subscribtions) {
109
- subscribtion.callback();
110
- }
111
- }
112
- if (isFamilyState(state)) {
113
- const familySubscriptions = data.subscriptions.get(state.family);
114
- if (familySubscriptions?.size) {
115
- for (const subscribtion of familySubscriptions) {
116
- subscribtion.callback(...state.familyKey);
117
- }
118
- }
119
- }
120
- };
121
-
122
107
  // src/utils/isPromiseLike.ts
123
108
  var isPromiseLike = (object) => {
124
109
  return object && object.then && typeof object.then === "function";
125
110
  };
126
111
 
127
- // src/utils/isAtomFamily.ts
128
- var isAtomFamily = (state) => state && Object.hasOwn(state, "__valdresAtomFamilyMap");
129
-
130
112
  // src/utils/isSelector.ts
131
113
  var isSelector = (state) => state && Object.hasOwn(state, "get");
132
114
 
@@ -193,6 +175,7 @@ var setAtom = (atom, newValue, data, skipOnSet = false) => {
193
175
  if (currentValue?.__isEmptyAtomPromise__) {
194
176
  currentValue.__resolveEmptyAtomPromise__(newValue);
195
177
  }
178
+ if (isFamilyAtom(atom)) {}
196
179
  propagateUpdatedAtoms([atom], data);
197
180
  return newValue;
198
181
  };
@@ -226,11 +209,10 @@ var initAtom = (atom, data) => {
226
209
  const tmpVal = getAtomInitValue(atom, data);
227
210
  let value = setValueInData(atom, tmpVal, data);
228
211
  if (isFamilyAtom(atom)) {
229
- const currentKeySet = getState(atom.family.__keysAtom, data);
230
- if (!currentKeySet.has(atom.familyKey)) {
231
- const newSet = new Set(currentKeySet);
232
- newSet.add(atom.familyKey);
233
- setAtom(atom.family.__keysAtom, newSet, data);
212
+ const currentAtoms = data.values.get(atom.family) || [];
213
+ if (!currentAtoms.includes(atom)) {
214
+ data.values.set(atom.family, [...currentAtoms, atom]);
215
+ propagateUpdatedAtoms([atom.family], data);
234
216
  }
235
217
  }
236
218
  if (atom.onInit)
@@ -250,14 +232,17 @@ function getState(state, data, circularDependencySet) {
250
232
  return getState(state, data.parent, circularDependencySet);
251
233
  return initAtom(state, data);
252
234
  }
253
- if (isSelector(state))
254
- return initSelector(state, data, circularDependencySet);
235
+ if (isSelector(state)) {
236
+ initSelector(state, data, circularDependencySet);
237
+ return data.values.get(state);
238
+ }
255
239
  if (isAtomFamily(state)) {
256
240
  if ("parent" in data) {
257
- const closestData = findClosestStoreWithAtomInitialized(state.__keysAtom, data);
258
- return getState(state.__keysSelector, closestData, circularDependencySet);
241
+ const closestData = findClosestStoreWithAtomInitialized(state, data);
242
+ return getState(state, closestData, circularDependencySet);
259
243
  }
260
- return getState(state.__keysSelector, data, circularDependencySet);
244
+ data.values.set(state, []);
245
+ return data.values.get(state);
261
246
  }
262
247
  if (isSelectorFamily(state)) {
263
248
  const array = Array.from(state.__valdresSelectorFamilyMap.keys());
@@ -276,6 +261,24 @@ var findClosestStoreWithAtomInitialized = (atom, data) => {
276
261
  return findClosestStoreWithAtomInitialized(atom, data.parent);
277
262
  };
278
263
 
264
+ // src/lib/updateStateSubscribers.ts
265
+ var updateStateSubscribers = (state, data) => {
266
+ const subscribtions = data.subscriptions.get(state);
267
+ if (subscribtions?.size) {
268
+ for (const subscribtion of subscribtions) {
269
+ subscribtion.callback();
270
+ }
271
+ }
272
+ if (isFamilyState(state)) {
273
+ const familySubscriptions = data.subscriptions.get(state.family);
274
+ if (familySubscriptions?.size) {
275
+ for (const subscribtion of familySubscriptions) {
276
+ subscribtion.callback(...state.familyArgs);
277
+ }
278
+ }
279
+ }
280
+ };
281
+
279
282
  // src/errors/lib/generateSelectorTrace.ts
280
283
  var generateSelectorTrace = (selectors) => {
281
284
  const lastIndex = selectors.length - 1;
@@ -331,11 +334,11 @@ class SuspendAndWaitForResolveError extends Error {
331
334
  }
332
335
  }
333
336
  var getOrInitConsumersSet = (state, data) => {
334
- const set = data.stateConsumers.get(state);
337
+ const set = data.stateDependents.get(state);
335
338
  if (set)
336
339
  return set;
337
340
  const newSet = new Set;
338
- data.stateConsumers.set(state, newSet);
341
+ data.stateDependents.set(state, newSet);
339
342
  return newSet;
340
343
  };
341
344
  var evaluateSelector = (selector, data, circularDependencyMap = new WeakSet) => {
@@ -392,6 +395,16 @@ var handleSelectorResult = (value, selector, data) => {
392
395
  }
393
396
  };
394
397
  var initSelector = (selector, data, circularDependencySet = new WeakSet) => {
398
+ const existingValue = data.values.get(selector);
399
+ const udpatedValue = evaluate(selector, data, circularDependencySet);
400
+ if (selector.equal(existingValue, udpatedValue)) {
401
+ return false;
402
+ } else {
403
+ setValueInData(selector, udpatedValue, data);
404
+ return true;
405
+ }
406
+ };
407
+ var evaluate = (selector, data, circularDependencySet) => {
395
408
  let tmpValue;
396
409
  try {
397
410
  tmpValue = evaluateSelector(selector, data, circularDependencySet);
@@ -400,14 +413,7 @@ var initSelector = (selector, data, circularDependencySet = new WeakSet) => {
400
413
  e.track(selector);
401
414
  throw e;
402
415
  }
403
- const value = handleSelectorResult(tmpValue, selector, data);
404
- if (data.expiredValues.has(selector)) {
405
- const expiredValue = data.expiredValues.get(selector);
406
- if (selector.equal(expiredValue, value)) {
407
- return setValueInData(selector, expiredValue, data);
408
- }
409
- }
410
- return setValueInData(selector, value, data);
416
+ return handleSelectorResult(tmpValue, selector, data);
411
417
  };
412
418
 
413
419
  // src/lib/updateSelectorSubscribers.ts
@@ -416,14 +422,6 @@ var updateSelectorSubscribers = (selector, data) => {
416
422
  const familySubscriptions = selector.family && data.subscriptions.get(selector.family);
417
423
  if (!subscribtions?.size && !familySubscriptions?.size)
418
424
  return;
419
- if (subscribtions?.size && data.subscriptionsRequireEqualCheck.get(selector) || familySubscriptions?.size && selector.family && data.subscriptionsRequireEqualCheck.get(selector.family)) {
420
- try {
421
- const oldValue = data.expiredValues.get(selector);
422
- const newValue = initSelector(selector, data);
423
- if (selector.equal(newValue, oldValue))
424
- return;
425
- } catch (e) {}
426
- }
427
425
  if (subscribtions?.size) {
428
426
  for (const subscribtion of subscribtions) {
429
427
  subscribtion.callback();
@@ -431,21 +429,53 @@ var updateSelectorSubscribers = (selector, data) => {
431
429
  }
432
430
  if (familySubscriptions?.size) {
433
431
  for (const subscribtion of familySubscriptions) {
434
- subscribtion.callback(...selector.familyKey);
432
+ subscribtion.callback(...selector.familyArgs);
435
433
  }
436
434
  }
437
435
  };
438
436
 
439
437
  // src/lib/propagateUpdatedAtoms.ts
438
+ var revalidate = (selector, data) => {
439
+ try {
440
+ return initSelector(selector, data);
441
+ } catch (e) {
442
+ data.expiredValues.set(selector, data.values.get(selector));
443
+ data.values.delete(selector);
444
+ return true;
445
+ }
446
+ };
440
447
  var recursivlyResetSelectorTree = (selectors, data, clearedSelectors) => {
441
448
  for (const selector of selectors) {
442
449
  if (!clearedSelectors.has(selector)) {
443
- clearedSelectors.add(selector);
444
- data.expiredValues.set(selector, data.values.get(selector));
445
- data.values.delete(selector);
446
- const consumers = data.stateConsumers.get(selector);
447
- if (consumers?.size) {
448
- recursivlyResetSelectorTree(consumers, data, clearedSelectors);
450
+ const subscribers = data.subscriptions.get(selector);
451
+ const dependents = data.stateDependents.get(selector);
452
+ if (!dependents && !subscribers) {
453
+ data.expiredValues.set(selector, data.values.get(selector));
454
+ data.values.delete(selector);
455
+ } else if (dependents && subscribers) {
456
+ if (dependents.size === 0)
457
+ throw new Error("Should not happen");
458
+ if (subscribers.size === 0)
459
+ throw new Error("Should not happen");
460
+ const isValueUpdated = revalidate(selector, data);
461
+ if (isValueUpdated) {
462
+ recursivlyResetSelectorTree(dependents, data, clearedSelectors);
463
+ updateSelectorSubscribers(selector, data);
464
+ }
465
+ } else if (dependents) {
466
+ if (dependents.size === 0)
467
+ throw new Error("Should not happen");
468
+ const valueUpdated = revalidate(selector, data);
469
+ if (valueUpdated) {
470
+ recursivlyResetSelectorTree(dependents, data, clearedSelectors);
471
+ }
472
+ } else if (subscribers) {
473
+ if (subscribers.size === 0)
474
+ throw new Error("Should not happen");
475
+ const isValueUpdated = revalidate(selector, data);
476
+ if (isValueUpdated) {
477
+ updateSelectorSubscribers(selector, data);
478
+ }
449
479
  }
450
480
  }
451
481
  }
@@ -453,21 +483,20 @@ var recursivlyResetSelectorTree = (selectors, data, clearedSelectors) => {
453
483
  var propagateUpdatedAtoms = (atoms, data) => {
454
484
  const clearedSelectors = new Set;
455
485
  for (const atom of atoms) {
456
- const consumers = data.stateConsumers.get(atom);
457
- if (consumers && consumers.size) {
458
- recursivlyResetSelectorTree(consumers, data, clearedSelectors);
486
+ const dependents = data.stateDependents.get(atom);
487
+ if (dependents && dependents.size) {
488
+ recursivlyResetSelectorTree(dependents, data, clearedSelectors);
459
489
  }
460
490
  if (isFamilyAtom(atom)) {
461
- const consumersFamily = data.stateConsumers.get(atom.family);
491
+ const consumersFamily = data.stateDependents.get(atom.family);
462
492
  if (consumersFamily?.size) {
463
493
  recursivlyResetSelectorTree(consumersFamily, data, clearedSelectors);
464
494
  }
465
495
  }
466
496
  }
467
- for (const selector of clearedSelectors) {
468
- updateSelectorSubscribers(selector, data);
469
- }
470
497
  for (const atom of atoms) {
498
+ if (isAtomFamily(atom))
499
+ continue;
471
500
  updateStateSubscribers(atom, data);
472
501
  }
473
502
  };
@@ -481,7 +510,7 @@ var generateStoreData = (id = generateId()) => {
481
510
  expiredValues: new WeakMap,
482
511
  subscriptions: new WeakMap,
483
512
  subscriptionsRequireEqualCheck: new WeakMap,
484
- stateConsumers: new WeakMap,
513
+ stateDependents: new WeakMap,
485
514
  stateDependencies: new WeakMap,
486
515
  scopes: {}
487
516
  };
@@ -498,6 +527,20 @@ function createStoreData(id, parent) {
498
527
  }
499
528
  }
500
529
 
530
+ // src/lib/deleteFamilyAtom.ts
531
+ var deleteFamilyAtom = (atom, data) => {
532
+ const array = data.values.get(atom.family);
533
+ const index = array.indexOf(atom);
534
+ const newArray = [
535
+ ...array.slice(0, index),
536
+ ...array.slice(index + 1)
537
+ ];
538
+ data.values.delete(atom);
539
+ propagateUpdatedAtoms([atom], data);
540
+ setValueInData(atom.family, newArray, data);
541
+ propagateUpdatedAtoms([atom.family], data);
542
+ };
543
+
501
544
  // src/lib/resetAtom.ts
502
545
  var resetAtom = (atom, data) => {
503
546
  let value = getAtomInitValue(atom, data);
@@ -651,17 +694,18 @@ var setAtoms = (pairs, data) => {
651
694
 
652
695
  // src/lib/transaction.ts
653
696
  var findDependencies = (state, data, result = new Set) => {
654
- const consumers = data.stateConsumers.get(state);
655
- if (consumers?.size) {
656
- for (const consumer of consumers) {
657
- if (!result.has(consumer)) {
658
- result.add(consumer);
659
- findDependencies(consumer, data, result);
697
+ const dependents = data.stateDependents.get(state);
698
+ if (dependents?.size) {
699
+ for (const dependent of dependents) {
700
+ if (!result.has(dependent)) {
701
+ result.add(dependent);
702
+ findDependencies(dependent, data, result);
660
703
  }
661
704
  }
662
705
  }
663
706
  return result;
664
707
  };
708
+ var DELETE_SYMBOL = Symbol("DELETE_SYMBOL");
665
709
  var recursivlyResetTxnSelectorCache = (state, txnSubscribers, txnSelectorCache) => {
666
710
  for (const dep of txnSubscribers.get(state)) {
667
711
  txnSelectorCache.delete(dep);
@@ -670,33 +714,39 @@ var recursivlyResetTxnSelectorCache = (state, txnSubscribers, txnSelectorCache)
670
714
  }
671
715
  }
672
716
  };
673
- var captureScopedTransaction = (scopedData, parentGetFromTxnOrData) => {
717
+ var captureScopedTransaction = (scopedData, parentGetInTxnOrData) => {
674
718
  let txn;
675
719
  transaction((scopedTxn) => {
676
720
  txn = scopedTxn;
677
- }, scopedData, false, parentGetFromTxnOrData);
721
+ }, scopedData, false, parentGetInTxnOrData);
678
722
  return txn;
679
723
  };
680
- var transaction = (callback, data, autoCommit = true, parentGetFromTxnOrData) => {
724
+ var deleteAtomFamilyAtoms = (set, data) => {
725
+ set.forEach((atom) => {
726
+ data.values.delete(atom);
727
+ });
728
+ };
729
+ var transaction = (callback, data, autoCommit = true, parentGetInTxnOrData) => {
681
730
  const txnAtomMap = new Map;
731
+ const txnAtomDeleteSet = new Set;
682
732
  const txnSelectorCache = new Map;
683
733
  const txnSubscribers = new Map;
684
734
  const dirtySelectors = new Set;
685
735
  let scopedTransactions;
686
- const getFromTxnOrData = (state) => {
736
+ const getInTxnOrData = (state) => {
687
737
  if (txnAtomMap.has(state)) {
688
738
  return txnAtomMap.get(state);
689
739
  }
690
740
  if (data.values.has(state)) {
691
741
  return data.values.get(state);
692
742
  }
693
- if (parentGetFromTxnOrData) {
694
- return parentGetFromTxnOrData(state);
743
+ if (parentGetInTxnOrData) {
744
+ return parentGetInTxnOrData(state);
695
745
  }
696
746
  };
697
747
  const txnGet = (state) => {
698
748
  if (isAtom(state)) {
699
- const value = getFromTxnOrData(state);
749
+ const value = getInTxnOrData(state);
700
750
  if (value)
701
751
  return value;
702
752
  return getState(state, data);
@@ -718,7 +768,10 @@ var transaction = (callback, data, autoCommit = true, parentGetFromTxnOrData) =>
718
768
  txnSelectorCache.set(state, res);
719
769
  return res;
720
770
  } else if (isAtomFamily(state)) {
721
- return txnGet(state.__keysSelector);
771
+ const value = getInTxnOrData(state);
772
+ if (value)
773
+ return value;
774
+ return getState(state, data);
722
775
  } else {
723
776
  throw new Error("Unsupported state");
724
777
  }
@@ -743,11 +796,10 @@ var transaction = (callback, data, autoCommit = true, parentGetFromTxnOrData) =>
743
796
  txnAtomMap.set(atom, deepFreeze(value));
744
797
  }
745
798
  if (isFamilyAtom(atom)) {
746
- const currentKeySet = txnGet(atom.family.__keysAtom);
747
- if (!currentKeySet.has(atom.familyKey)) {
748
- const newSet = new Set(currentKeySet);
749
- newSet.add(atom.familyKey);
750
- txnSet(atom.family.__keysAtom, newSet);
799
+ const currentFamilyList = txnGet(atom.family);
800
+ if (!currentFamilyList.includes(atom)) {
801
+ const newArr = [...currentFamilyList, atom];
802
+ txnAtomMap.set(atom.family, newArr);
751
803
  }
752
804
  }
753
805
  return value;
@@ -757,8 +809,26 @@ var transaction = (callback, data, autoCommit = true, parentGetFromTxnOrData) =>
757
809
  txnAtomMap.set(atom, value);
758
810
  return value;
759
811
  };
812
+ const txnDel = (atom) => {
813
+ const array = txnGet(atom.family);
814
+ const index = array.indexOf(atom);
815
+ const newArr = [
816
+ ...array.slice(0, index),
817
+ ...array.slice(index + 1)
818
+ ];
819
+ txnAtomMap.set(atom.family, newArr);
820
+ if (data.values.has(atom)) {
821
+ txnAtomDeleteSet.add(atom);
822
+ }
823
+ if (txnAtomMap.has(atom)) {
824
+ txnAtomMap.delete(atom);
825
+ }
826
+ };
760
827
  const commit = () => {
761
828
  setAtoms(txnAtomMap, data);
829
+ if (txnAtomDeleteSet.size) {
830
+ deleteAtomFamilyAtoms(txnAtomDeleteSet, data);
831
+ }
762
832
  dirtySelectors.clear();
763
833
  if (scopedTransactions) {
764
834
  for (const scopedTxn of Object.values(scopedTransactions)) {
@@ -769,6 +839,7 @@ var transaction = (callback, data, autoCommit = true, parentGetFromTxnOrData) =>
769
839
  const result = callback({
770
840
  set: txnSet,
771
841
  get: txnGet,
842
+ del: txnDel,
772
843
  reset: txnReset,
773
844
  commit,
774
845
  scope: (scopeId, callback2) => {
@@ -778,7 +849,7 @@ var transaction = (callback, data, autoCommit = true, parentGetFromTxnOrData) =>
778
849
  scopedTransactions = {};
779
850
  }
780
851
  if (scopedTransactions[scopeId] === undefined) {
781
- scopedTransactions[scopeId] = captureScopedTransaction(scopedData, getFromTxnOrData);
852
+ scopedTransactions[scopeId] = captureScopedTransaction(scopedData, getInTxnOrData);
782
853
  }
783
854
  return callback2(scopedTransactions[scopeId]);
784
855
  } else {
@@ -810,6 +881,7 @@ function storeFromStoreData(data, detach) {
810
881
  throw new Error(InvalidStateSetError);
811
882
  };
812
883
  const reset = (atom) => resetAtom(atom, data);
884
+ const deleteFn = (atom) => deleteFamilyAtom(atom, data);
813
885
  const sub = (state, callback, deepEqualCheckBeforeCallback = true) => subscribe(state, callback, deepEqualCheckBeforeCallback, data);
814
886
  const txn = (callback) => transaction(callback, data);
815
887
  const scope = (scopeId) => {
@@ -837,6 +909,7 @@ function storeFromStoreData(data, detach) {
837
909
  sub,
838
910
  txn,
839
911
  reset,
912
+ delete: deleteFn,
840
913
  data,
841
914
  scope,
842
915
  detach
@@ -848,6 +921,7 @@ function storeFromStoreData(data, detach) {
848
921
  sub,
849
922
  txn,
850
923
  reset,
924
+ delete: deleteFn,
851
925
  data,
852
926
  scope
853
927
  };
@@ -941,13 +1015,6 @@ function atom(defaultValue, options) {
941
1015
  ...options
942
1016
  };
943
1017
  }
944
- // src/selector.ts
945
- var selector = (get, options) => {
946
- if (!options)
947
- return { equal, get };
948
- return { equal, ...options, get };
949
- };
950
-
951
1018
  // src/lib/atomFamilyAtom.ts
952
1019
  function atomFamilyAtom(defaultValue, options) {
953
1020
  if (options.global) {
@@ -1014,22 +1081,23 @@ var stableStringify = (x) => {
1014
1081
  };
1015
1082
 
1016
1083
  // src/lib/stringifyFamilyArgs.ts
1017
- var stringifyFamilyArgs = (...args) => {
1084
+ var stringifyFamilyArgs = (args) => {
1018
1085
  return args.length === 1 ? stableStringify(args[0]) : stableStringify(args);
1019
1086
  };
1020
1087
 
1021
1088
  // src/lib/createAtomFamily.ts
1022
- var createOptions = (options = {}, family, familyKey, keyStringified) => {
1089
+ var createOptions = (options = {}, family, familyArgs, familyArgsStringified) => {
1023
1090
  if (options.name) {
1024
1091
  return {
1025
1092
  equal,
1026
1093
  ...options,
1027
- name: options?.name + "_" + keyStringified,
1094
+ name: options?.name + "_" + familyArgsStringified,
1028
1095
  family,
1029
- familyKey
1096
+ familyArgs,
1097
+ familyArgsStringified
1030
1098
  };
1031
1099
  } else {
1032
- return { equal, ...options, family, familyKey };
1100
+ return { equal, ...options, family, familyArgs, familyArgsStringified };
1033
1101
  }
1034
1102
  };
1035
1103
  var handleDefaultValue = (defaultValue, ...args) => {
@@ -1041,20 +1109,18 @@ var handleDefaultValue = (defaultValue, ...args) => {
1041
1109
  };
1042
1110
  var createAtomFamily = (defaultValue, options) => {
1043
1111
  const map = new Map;
1044
- const keysAtom = atom(new Set);
1045
1112
  const atomFamily = Object.assign((...args) => {
1046
- const keyStringified = stringifyFamilyArgs(...args);
1047
- if (map.has(keyStringified)) {
1048
- return map.get(keyStringified);
1113
+ const argsStringified = stringifyFamilyArgs(args);
1114
+ if (map.has(argsStringified)) {
1115
+ return map.get(argsStringified);
1049
1116
  }
1050
- const familyAtom = atomFamilyAtom(handleDefaultValue(defaultValue, ...args), createOptions(options, atomFamily, args, keyStringified));
1051
- map.set(keyStringified, familyAtom);
1117
+ const familyAtom = atomFamilyAtom(handleDefaultValue(defaultValue, ...args), createOptions(options, atomFamily, args, argsStringified));
1118
+ map.set(argsStringified, familyAtom);
1052
1119
  return familyAtom;
1053
1120
  }, {
1054
1121
  __valdresAtomFamilyMap: map,
1055
- release: (...args) => map.delete(stringifyFamilyArgs(...args)),
1056
- __keysAtom: keysAtom,
1057
- __keysSelector: selector((get) => Array.from(get(keysAtom)))
1122
+ release: (...args) => map.delete(stringifyFamilyArgs(args)),
1123
+ equal
1058
1124
  });
1059
1125
  if (options?.name)
1060
1126
  Object.defineProperty(atomFamily, "name", {
@@ -1083,8 +1149,8 @@ function atomFamily(defaultValue, options) {
1083
1149
  return createAtomFamily(defaultValue, options);
1084
1150
  }
1085
1151
  // src/createStoreWithSelectorSet.ts
1086
- var setSelector = (selector2, values, store2) => {
1087
- return selector2.set(store2.set, store2.get, store2.reset, ...values);
1152
+ var setSelector = (selector, values, store2) => {
1153
+ return selector.set(store2.set, store2.get, store2.reset, ...values);
1088
1154
  };
1089
1155
  var createStoreWithSelectorSet = (id) => {
1090
1156
  const data = createStoreData(id);
@@ -1099,59 +1165,82 @@ var createStoreWithSelectorSet = (id) => {
1099
1165
  store2.kind = "storeWithSelectorSet";
1100
1166
  return store2;
1101
1167
  };
1168
+ // src/selector.ts
1169
+ var selector = (get, options) => {
1170
+ if (!options)
1171
+ return { equal, get };
1172
+ return { equal, ...options, get };
1173
+ };
1174
+
1102
1175
  // src/indexConstructor.ts
1103
- var index = (family, callback) => {
1176
+ var index = (family, callback, options) => {
1104
1177
  const map = new Map;
1105
- return (term) => {
1178
+ const indexFn = (term) => {
1106
1179
  const termKey = stableStringify(term);
1107
1180
  if (map.has(termKey))
1108
1181
  return map.get(termKey);
1109
- const itemSelectorMap = new Map;
1110
- const selectorMapIndex = selector((get) => {
1111
- const array = get(family);
1112
- array.forEach((args) => {
1113
- if (itemSelectorMap.has(args))
1114
- return;
1115
- itemSelectorMap.set(args, selector((get2) => callback(get2(family(...args)), term)));
1116
- });
1117
- return itemSelectorMap;
1118
- });
1182
+ const termIndexSelectorSet = new Set;
1183
+ const termIndexSelectorMap = new Map;
1184
+ const termIndexSelector = selector((get) => {
1185
+ const allFamilyAtoms = new Set(get(family));
1186
+ const deletedAtoms = termIndexSelectorSet.symmetricDifference(allFamilyAtoms);
1187
+ const addedAtoms = allFamilyAtoms.difference(termIndexSelectorSet);
1188
+ if (deletedAtoms.size || addedAtoms.size) {
1189
+ deletedAtoms.forEach((atom2) => {
1190
+ termIndexSelectorSet.delete(atom2);
1191
+ termIndexSelectorMap.delete(atom2);
1192
+ });
1193
+ addedAtoms.forEach((atom2) => {
1194
+ termIndexSelectorSet.add(atom2);
1195
+ termIndexSelectorMap.set(atom2, selector((get2) => callback(get2(atom2), term), {
1196
+ name: `index:callback:selector:${atom2.name}`
1197
+ }));
1198
+ });
1199
+ }
1200
+ return termIndexSelectorSet;
1201
+ }, { name: `index:${options?.name}:${termKey}` });
1119
1202
  const filteredSelector = selector((get) => {
1120
- const map2 = get(selectorMapIndex);
1203
+ const set = get(termIndexSelector);
1121
1204
  const res = [];
1122
- map2.forEach((selector2, key) => {
1123
- if (get(selector2)) {
1124
- res.push(key);
1205
+ set.forEach((atom2) => {
1206
+ if (get(termIndexSelectorMap.get(atom2))) {
1207
+ res.push(atom2);
1125
1208
  }
1126
1209
  });
1127
1210
  return res;
1211
+ }, {
1212
+ name: `index:${options?.name}:${termKey}:termSelector`
1128
1213
  });
1129
1214
  map.set(termKey, filteredSelector);
1130
1215
  return filteredSelector;
1131
1216
  };
1217
+ return Object.assign(indexFn, {
1218
+ map
1219
+ });
1132
1220
  };
1133
1221
  // src/selectorFamily.ts
1134
- var createOptions2 = (options = {}, family, familyKey, keyStringified) => {
1222
+ var createOptions2 = (options = {}, family, familyArgs, familyArgsStringified) => {
1135
1223
  if (options.name) {
1136
1224
  return {
1137
1225
  equal,
1138
1226
  ...options,
1139
- name: options?.name + "_" + keyStringified,
1227
+ name: options?.name + "_" + familyArgsStringified,
1140
1228
  family,
1141
- familyKey
1229
+ familyArgs,
1230
+ familyArgsStringified
1142
1231
  };
1143
1232
  } else {
1144
- return { equal, ...options, family, familyKey };
1233
+ return { equal, ...options, family, familyArgs, familyArgsStringified };
1145
1234
  }
1146
1235
  };
1147
1236
  var selectorFamily = (callback, options) => {
1148
1237
  const map = new Map;
1149
1238
  const selectorFamily2 = (...args) => {
1150
- const keyStringified = stringifyFamilyArgs(args);
1151
- if (map.has(keyStringified))
1152
- return map.get(keyStringified);
1153
- const newSelector = selector((selectorArgs) => callback(...args)(selectorArgs), createOptions2(options, selectorFamily2, args, keyStringified));
1154
- map.set(keyStringified, newSelector);
1239
+ const argsStringified = stringifyFamilyArgs(args);
1240
+ if (map.has(argsStringified))
1241
+ return map.get(argsStringified);
1242
+ const newSelector = selector((selectorArgs) => callback(...args)(selectorArgs), createOptions2(options, selectorFamily2, args, argsStringified));
1243
+ map.set(argsStringified, newSelector);
1155
1244
  return newSelector;
1156
1245
  };
1157
1246
  selectorFamily2.__valdresSelectorFamilyMap = map;
@@ -1,3 +1,5 @@
1
1
  import type { AtomFamily } from "./types/AtomFamily";
2
2
  import type { Selector } from "./types/Selector";
3
- export declare const index: <Term, Value extends unknown, FamilyArgs extends [any, ...any[]] = [any, ...any[]]>(family: AtomFamily<Value, FamilyArgs>, callback: (value: Value, term: Term) => boolean) => ((term: Term) => Selector<Term[]>);
3
+ export declare const index: <Term, Value extends unknown, FamilyArgs extends [any, ...any[]] = [any, ...any[]]>(family: AtomFamily<Value, FamilyArgs>, callback: (value: Value, term: Term) => boolean, options?: {
4
+ name?: string;
5
+ }) => ((term: Term) => Selector<Term[]>);
@@ -0,0 +1,3 @@
1
+ import type { AtomFamilyAtom } from "../types/AtomFamilyAtom";
2
+ import type { StoreData } from "../types/StoreData";
3
+ export declare const deleteFamilyAtom: <Value extends unknown, Args extends [any, ...any[]] = [any, ...any[]]>(atom: AtomFamilyAtom<Value, Args>, data: StoreData) => void;
@@ -2,6 +2,7 @@ import type { Atom } from "../types/Atom";
2
2
  import type { AtomFamily } from "../types/AtomFamily";
3
3
  import type { Selector } from "../types/Selector";
4
4
  import type { StoreData } from "../types/StoreData";
5
+ import type { AtomFamilyAtom } from "../types/AtomFamilyAtom";
5
6
  export declare function getState<Value extends any, Args extends [any, ...any[]] = [any, ...any[]]>(atom: Atom<Value>, data: StoreData, circularDependencySet?: WeakSet<Selector>): Value;
6
7
  export declare function getState<Value extends any, Args extends [any, ...any[]] = [any, ...any[]]>(selector: Selector<Value>, data: StoreData, circularDependencySet?: WeakSet<Selector>): Value;
7
- export declare function getState<Value extends any, Args extends [any, ...any[]] = [any, ...any[]]>(family: AtomFamily<Value, Args>, data: StoreData, circularDependencySet?: WeakSet<Selector>): Args[];
8
+ export declare function getState<Value extends any, Args extends [any, ...any[]] = [any, ...any[]]>(family: AtomFamily<Value, Args>, data: StoreData, circularDependencySet?: WeakSet<Selector>): AtomFamilyAtom<Value, Args>[];
@@ -2,4 +2,4 @@ import type { Atom } from "../types/Atom";
2
2
  import type { AtomFamilyAtom } from "../types/AtomFamilyAtom";
3
3
  import type { StoreData } from "../types/StoreData";
4
4
  export declare const getAtomInitValue: <V = any>(atom: Atom<V>, data: StoreData) => any;
5
- export declare const initAtom: <Value extends unknown, Args extends [any, ...any[]] = [any, ...any[]]>(atom: Atom<Value> | AtomFamilyAtom<Value, Args>, data: StoreData) => Value;
5
+ export declare const initAtom: <Value extends unknown, Args extends [any, ...any[]] = [any, ...any[]]>(atom: Atom<Value> | AtomFamilyAtom<Value, Args>, data: StoreData) => any;
@@ -1,3 +1,3 @@
1
1
  import type { StoreData } from "../types/StoreData";
2
2
  import type { Selector } from "../types/Selector";
3
- export declare const initSelector: <V>(selector: Selector<V>, data: StoreData, circularDependencySet?: WeakSet<WeakKey>) => V | Promise<V>;
3
+ export declare const initSelector: <V>(selector: Selector<V>, data: StoreData, circularDependencySet?: WeakSet<WeakKey>) => boolean;
@@ -1,4 +1,5 @@
1
1
  import type { Atom } from "../types/Atom";
2
- import type { StoreData } from "../types/StoreData";
2
+ import type { AtomFamily } from "../types/AtomFamily";
3
3
  import type { AtomFamilyAtom } from "../types/AtomFamilyAtom";
4
- export declare const propagateUpdatedAtoms: (atoms: (Atom<any> | AtomFamilyAtom<any, any>)[], data: StoreData) => void;
4
+ import type { StoreData } from "../types/StoreData";
5
+ export declare const propagateUpdatedAtoms: (atoms: (Atom<any> | AtomFamilyAtom<any, any> | AtomFamily<any, any>)[], data: StoreData) => void;
@@ -1,3 +1,4 @@
1
1
  import type { Atom } from "../types/Atom";
2
+ import type { AtomFamily } from "../types/AtomFamily";
2
3
  import type { StoreData } from "../types/StoreData";
3
- export declare const setValueInData: <Value = any>(atom: Atom<Value>, value: Value, data: StoreData) => Value;
4
+ export declare const setValueInData: <Value extends unknown>(atom: Atom<Value> | AtomFamily<any, any>, value: Value, data: StoreData) => Value;
@@ -1 +1 @@
1
- export declare const stringifyFamilyArgs: (...args: any[]) => string | number | boolean;
1
+ export declare const stringifyFamilyArgs: (args: any[]) => string | number | boolean;
@@ -4,5 +4,5 @@ import type { TransactionFn } from "../types/TransactionFn";
4
4
  type GetAtomValue = {
5
5
  <V>(atom: Atom<V>): V;
6
6
  };
7
- export declare const transaction: (callback: TransactionFn, data: StoreData, autoCommit?: boolean, parentGetFromTxnOrData?: GetAtomValue) => any;
7
+ export declare const transaction: (callback: TransactionFn, data: StoreData, autoCommit?: boolean, parentGetInTxnOrData?: GetAtomValue) => any;
8
8
  export {};
@@ -1,11 +1,9 @@
1
- import type { Atom } from "./Atom";
2
1
  import type { AtomFamilyAtom } from "./AtomFamilyAtom";
3
- import type { Selector } from "./Selector";
2
+ import type { EqualFunc } from "./EqualFunc";
4
3
  export type AtomFamily<Value extends any, Args extends [any, ...any[]] = [any, ...any[]]> = {
5
4
  (...args: Args): AtomFamilyAtom<Value, Args>;
6
5
  release: (...args: Args) => void;
6
+ equal: EqualFunc<Value>;
7
7
  name?: string;
8
8
  __valdresAtomFamilyMap: Map<Value, AtomFamilyAtom<Value, Args>>;
9
- __keysAtom: Atom<Set<Args>>;
10
- __keysSelector: Selector<Args[]>;
11
9
  };
@@ -2,5 +2,6 @@ import type { Atom } from "./Atom";
2
2
  import type { AtomFamily } from "./AtomFamily";
3
3
  export type AtomFamilyAtom<Value extends any, Args extends [any, ...any[]] = [any, ...any[]]> = Atom<Value> & {
4
4
  family: AtomFamily<Value, Args>;
5
- familyKey: Args;
5
+ familyArgs: Args;
6
+ familyArgsStringified: string;
6
7
  };
@@ -2,5 +2,5 @@ import type { Selector } from "./Selector";
2
2
  import type { SelectorFamily } from "./SelectorFamily";
3
3
  export type AtomFamilySelector<Value extends any, Args extends [any, ...any[]] = [any, ...any[]]> = Selector<Value> & {
4
4
  family: SelectorFamily<Value, Args>;
5
- familyKey: Args;
5
+ familyArgs: Args;
6
6
  };
@@ -1,8 +1,9 @@
1
1
  import type { Atom } from "./Atom";
2
2
  import type { AtomFamily } from "./AtomFamily";
3
+ import type { AtomFamilyAtom } from "./AtomFamilyAtom";
3
4
  import type { Selector } from "./Selector";
4
5
  export type GetValue = {
5
6
  <Value extends any>(atom: Atom<Value>): Value;
6
7
  <Value extends any, Args extends [any, ...any[]] = [any, ...any[]]>(selector: Selector<Value, Args>): Value;
7
- <Value extends any, Args extends [any, ...any[]]>(family: AtomFamily<Value, Args>): Args[];
8
+ <Value extends any, Args extends [any, ...any[]]>(family: AtomFamily<Value, Args>): AtomFamilyAtom<Value, Args>[];
8
9
  };
@@ -6,6 +6,6 @@ export type Selector<Value extends any = any, FamilyArgs extends [any, ...any[]]
6
6
  equal: EqualFunc<Value>;
7
7
  name?: string;
8
8
  family?: SelectorFamily<Value, FamilyArgs>;
9
- familyKey?: FamilyArgs;
9
+ familyArgs?: FamilyArgs;
10
10
  onMount?: () => void | (() => void);
11
11
  };
@@ -9,12 +9,14 @@ type SetAtom = {
9
9
  <Value extends any, Args extends [any, ...any[]] = [any, ...any[]]>(atom: AtomFamilyAtom<Value, Args>, value: Value): void;
10
10
  <Value extends any>(atom: Atom<Value>, value: Value): void;
11
11
  };
12
+ type DeleteAtom = <Value extends any, Args extends [any, ...any[]] = [any, ...any[]]>(atom: AtomFamilyAtom<Value, Args>) => void;
12
13
  export type Store<T = StoreData> = {
13
14
  data: T;
14
15
  get: GetValue;
15
16
  set: SetAtom;
16
17
  sub: SubscribeFn;
17
18
  reset: ResetAtom;
19
+ delete: DeleteAtom;
18
20
  txn: (callback: TransactionFn) => void;
19
21
  scope: (scopeId: string) => ScopedStore;
20
22
  };
@@ -4,7 +4,7 @@ export type RootStoreData = {
4
4
  expiredValues: WeakMap<WeakKey, any>;
5
5
  subscriptions: WeakMap<WeakKey, Set<any>>;
6
6
  subscriptionsRequireEqualCheck: WeakMap<WeakKey, boolean>;
7
- stateConsumers: WeakMap<WeakKey, any>;
7
+ stateDependents: WeakMap<WeakKey, any>;
8
8
  stateDependencies: WeakMap<WeakKey, any>;
9
9
  scopes: {
10
10
  [scopeId: string]: ScopedStoreData;
@@ -1,4 +1,5 @@
1
1
  import type { Atom } from "./Atom";
2
+ import type { AtomFamilyAtom } from "./AtomFamilyAtom";
2
3
  import type { GetValue } from "./GetValue";
3
4
  import type { ResetAtom } from "./ResetAtom";
4
5
  import type { SetAtom } from "./SetAtom";
@@ -10,6 +11,7 @@ export type SetAtom2 = {
10
11
  export type TransactionInterface = {
11
12
  set: SetAtom;
12
13
  get: GetValue;
14
+ del: (atom: AtomFamilyAtom<any, any>) => void;
13
15
  reset: ResetAtom;
14
16
  commit: () => void;
15
17
  scope: <Callback extends TransactionFn>(scopeId: string, callback: Callback) => ReturnType<Callback>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valdres",
3
- "version": "0.2.0-alpha.75",
3
+ "version": "0.2.0-alpha.76",
4
4
  "license": "MIT",
5
5
  "author": {
6
6
  "name": "Eigil Sagafos"
@@ -36,5 +36,5 @@
36
36
  "access": "public",
37
37
  "registry": "https://registry.npmjs.org/"
38
38
  },
39
- "gitHead": "c6757088042bf15b35010217442c65f2a5e666a7"
39
+ "gitHead": "184b86a8548d25cb8df609184718cf62de9d97c8"
40
40
  }