valdres 0.2.0-alpha.74 → 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.
Files changed (40) hide show
  1. package/dist/index.js +231 -138
  2. package/dist/types/src/atomFamily.d.ts +2 -3
  3. package/dist/types/src/indexConstructor.d.ts +3 -2
  4. package/dist/types/src/lib/atomFamilyAtom.d.ts +3 -3
  5. package/dist/types/src/lib/createAtomFamily.d.ts +1 -1
  6. package/dist/types/src/lib/createGlobalAtomFamily.d.ts +3 -4
  7. package/dist/types/src/lib/deleteFamilyAtom.d.ts +3 -0
  8. package/dist/types/src/lib/getState.d.ts +4 -3
  9. package/dist/types/src/lib/initAtom.d.ts +1 -1
  10. package/dist/types/src/lib/initSelector.d.ts +1 -1
  11. package/dist/types/src/lib/propagateUpdatedAtoms.d.ts +3 -2
  12. package/dist/types/src/lib/setValueInData.d.ts +2 -1
  13. package/dist/types/src/lib/stringifyFamilyArgs.d.ts +1 -0
  14. package/dist/types/src/lib/transaction.d.ts +1 -1
  15. package/dist/types/src/lib/updateStateSubscribers.d.ts +1 -1
  16. package/dist/types/src/selector.d.ts +1 -1
  17. package/dist/types/src/selectorFamily.d.ts +2 -2
  18. package/dist/types/src/types/AtomFamily.d.ts +6 -9
  19. package/dist/types/src/types/AtomFamilyAtom.d.ts +4 -3
  20. package/dist/types/src/types/AtomFamilyDefaultValue.d.ts +2 -2
  21. package/dist/types/src/types/AtomFamilyGlobalAtom.d.ts +1 -1
  22. package/dist/types/src/types/AtomFamilySelector.d.ts +3 -3
  23. package/dist/types/src/types/EqualFunc.d.ts +1 -1
  24. package/dist/types/src/types/Family.d.ts +1 -1
  25. package/dist/types/src/types/GetValue.d.ts +4 -3
  26. package/dist/types/src/types/Selector.d.ts +4 -4
  27. package/dist/types/src/types/SelectorFamily.d.ts +3 -4
  28. package/dist/types/src/types/SelectorOptions.d.ts +1 -1
  29. package/dist/types/src/types/State.d.ts +1 -1
  30. package/dist/types/src/types/Store.d.ts +4 -2
  31. package/dist/types/src/types/StoreData.d.ts +1 -1
  32. package/dist/types/src/types/SubscribeFn.d.ts +2 -2
  33. package/dist/types/src/types/TransactionInterface.d.ts +2 -0
  34. package/dist/types/src/utils/isAtomFamily.d.ts +1 -1
  35. package/dist/types/src/utils/isFamily.d.ts +1 -1
  36. package/dist/types/src/utils/isFamilyAtom.d.ts +1 -1
  37. package/dist/types/src/utils/isFamilySelector.d.ts +1 -1
  38. package/dist/types/src/utils/isFamilyState.d.ts +1 -1
  39. package/dist/types/src/utils/isSelectorFamily.d.ts +1 -1
  40. package/package.json +2 -2
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,15 +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
- }
428
425
  if (subscribtions?.size) {
429
426
  for (const subscribtion of subscribtions) {
430
427
  subscribtion.callback();
@@ -432,21 +429,53 @@ var updateSelectorSubscribers = (selector, data) => {
432
429
  }
433
430
  if (familySubscriptions?.size) {
434
431
  for (const subscribtion of familySubscriptions) {
435
- subscribtion.callback(selector.familyKey);
432
+ subscribtion.callback(...selector.familyArgs);
436
433
  }
437
434
  }
438
435
  };
439
436
 
440
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
+ };
441
447
  var recursivlyResetSelectorTree = (selectors, data, clearedSelectors) => {
442
448
  for (const selector of selectors) {
443
449
  if (!clearedSelectors.has(selector)) {
444
- clearedSelectors.add(selector);
445
- data.expiredValues.set(selector, data.values.get(selector));
446
- data.values.delete(selector);
447
- const consumers = data.stateConsumers.get(selector);
448
- if (consumers?.size) {
449
- 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
+ }
450
479
  }
451
480
  }
452
481
  }
@@ -454,21 +483,20 @@ var recursivlyResetSelectorTree = (selectors, data, clearedSelectors) => {
454
483
  var propagateUpdatedAtoms = (atoms, data) => {
455
484
  const clearedSelectors = new Set;
456
485
  for (const atom of atoms) {
457
- const consumers = data.stateConsumers.get(atom);
458
- if (consumers && consumers.size) {
459
- recursivlyResetSelectorTree(consumers, data, clearedSelectors);
486
+ const dependents = data.stateDependents.get(atom);
487
+ if (dependents && dependents.size) {
488
+ recursivlyResetSelectorTree(dependents, data, clearedSelectors);
460
489
  }
461
490
  if (isFamilyAtom(atom)) {
462
- const consumersFamily = data.stateConsumers.get(atom.family);
491
+ const consumersFamily = data.stateDependents.get(atom.family);
463
492
  if (consumersFamily?.size) {
464
493
  recursivlyResetSelectorTree(consumersFamily, data, clearedSelectors);
465
494
  }
466
495
  }
467
496
  }
468
- for (const selector of clearedSelectors) {
469
- updateSelectorSubscribers(selector, data);
470
- }
471
497
  for (const atom of atoms) {
498
+ if (isAtomFamily(atom))
499
+ continue;
472
500
  updateStateSubscribers(atom, data);
473
501
  }
474
502
  };
@@ -482,7 +510,7 @@ var generateStoreData = (id = generateId()) => {
482
510
  expiredValues: new WeakMap,
483
511
  subscriptions: new WeakMap,
484
512
  subscriptionsRequireEqualCheck: new WeakMap,
485
- stateConsumers: new WeakMap,
513
+ stateDependents: new WeakMap,
486
514
  stateDependencies: new WeakMap,
487
515
  scopes: {}
488
516
  };
@@ -499,6 +527,20 @@ function createStoreData(id, parent) {
499
527
  }
500
528
  }
501
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
+
502
544
  // src/lib/resetAtom.ts
503
545
  var resetAtom = (atom, data) => {
504
546
  let value = getAtomInitValue(atom, data);
@@ -652,17 +694,18 @@ var setAtoms = (pairs, data) => {
652
694
 
653
695
  // src/lib/transaction.ts
654
696
  var findDependencies = (state, data, result = new Set) => {
655
- const consumers = data.stateConsumers.get(state);
656
- if (consumers?.size) {
657
- for (const consumer of consumers) {
658
- if (!result.has(consumer)) {
659
- result.add(consumer);
660
- 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);
661
703
  }
662
704
  }
663
705
  }
664
706
  return result;
665
707
  };
708
+ var DELETE_SYMBOL = Symbol("DELETE_SYMBOL");
666
709
  var recursivlyResetTxnSelectorCache = (state, txnSubscribers, txnSelectorCache) => {
667
710
  for (const dep of txnSubscribers.get(state)) {
668
711
  txnSelectorCache.delete(dep);
@@ -671,33 +714,39 @@ var recursivlyResetTxnSelectorCache = (state, txnSubscribers, txnSelectorCache)
671
714
  }
672
715
  }
673
716
  };
674
- var captureScopedTransaction = (scopedData, parentGetFromTxnOrData) => {
717
+ var captureScopedTransaction = (scopedData, parentGetInTxnOrData) => {
675
718
  let txn;
676
719
  transaction((scopedTxn) => {
677
720
  txn = scopedTxn;
678
- }, scopedData, false, parentGetFromTxnOrData);
721
+ }, scopedData, false, parentGetInTxnOrData);
679
722
  return txn;
680
723
  };
681
- 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) => {
682
730
  const txnAtomMap = new Map;
731
+ const txnAtomDeleteSet = new Set;
683
732
  const txnSelectorCache = new Map;
684
733
  const txnSubscribers = new Map;
685
734
  const dirtySelectors = new Set;
686
735
  let scopedTransactions;
687
- const getFromTxnOrData = (state) => {
736
+ const getInTxnOrData = (state) => {
688
737
  if (txnAtomMap.has(state)) {
689
738
  return txnAtomMap.get(state);
690
739
  }
691
740
  if (data.values.has(state)) {
692
741
  return data.values.get(state);
693
742
  }
694
- if (parentGetFromTxnOrData) {
695
- return parentGetFromTxnOrData(state);
743
+ if (parentGetInTxnOrData) {
744
+ return parentGetInTxnOrData(state);
696
745
  }
697
746
  };
698
747
  const txnGet = (state) => {
699
748
  if (isAtom(state)) {
700
- const value = getFromTxnOrData(state);
749
+ const value = getInTxnOrData(state);
701
750
  if (value)
702
751
  return value;
703
752
  return getState(state, data);
@@ -719,7 +768,10 @@ var transaction = (callback, data, autoCommit = true, parentGetFromTxnOrData) =>
719
768
  txnSelectorCache.set(state, res);
720
769
  return res;
721
770
  } else if (isAtomFamily(state)) {
722
- return txnGet(state.__keysSelector);
771
+ const value = getInTxnOrData(state);
772
+ if (value)
773
+ return value;
774
+ return getState(state, data);
723
775
  } else {
724
776
  throw new Error("Unsupported state");
725
777
  }
@@ -744,11 +796,10 @@ var transaction = (callback, data, autoCommit = true, parentGetFromTxnOrData) =>
744
796
  txnAtomMap.set(atom, deepFreeze(value));
745
797
  }
746
798
  if (isFamilyAtom(atom)) {
747
- const currentKeySet = txnGet(atom.family.__keysAtom);
748
- if (!currentKeySet.has(atom.familyKey)) {
749
- const newSet = new Set(currentKeySet);
750
- newSet.add(atom.familyKey);
751
- 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);
752
803
  }
753
804
  }
754
805
  return value;
@@ -758,8 +809,26 @@ var transaction = (callback, data, autoCommit = true, parentGetFromTxnOrData) =>
758
809
  txnAtomMap.set(atom, value);
759
810
  return value;
760
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
+ };
761
827
  const commit = () => {
762
828
  setAtoms(txnAtomMap, data);
829
+ if (txnAtomDeleteSet.size) {
830
+ deleteAtomFamilyAtoms(txnAtomDeleteSet, data);
831
+ }
763
832
  dirtySelectors.clear();
764
833
  if (scopedTransactions) {
765
834
  for (const scopedTxn of Object.values(scopedTransactions)) {
@@ -770,6 +839,7 @@ var transaction = (callback, data, autoCommit = true, parentGetFromTxnOrData) =>
770
839
  const result = callback({
771
840
  set: txnSet,
772
841
  get: txnGet,
842
+ del: txnDel,
773
843
  reset: txnReset,
774
844
  commit,
775
845
  scope: (scopeId, callback2) => {
@@ -779,7 +849,7 @@ var transaction = (callback, data, autoCommit = true, parentGetFromTxnOrData) =>
779
849
  scopedTransactions = {};
780
850
  }
781
851
  if (scopedTransactions[scopeId] === undefined) {
782
- scopedTransactions[scopeId] = captureScopedTransaction(scopedData, getFromTxnOrData);
852
+ scopedTransactions[scopeId] = captureScopedTransaction(scopedData, getInTxnOrData);
783
853
  }
784
854
  return callback2(scopedTransactions[scopeId]);
785
855
  } else {
@@ -811,6 +881,7 @@ function storeFromStoreData(data, detach) {
811
881
  throw new Error(InvalidStateSetError);
812
882
  };
813
883
  const reset = (atom) => resetAtom(atom, data);
884
+ const deleteFn = (atom) => deleteFamilyAtom(atom, data);
814
885
  const sub = (state, callback, deepEqualCheckBeforeCallback = true) => subscribe(state, callback, deepEqualCheckBeforeCallback, data);
815
886
  const txn = (callback) => transaction(callback, data);
816
887
  const scope = (scopeId) => {
@@ -838,6 +909,7 @@ function storeFromStoreData(data, detach) {
838
909
  sub,
839
910
  txn,
840
911
  reset,
912
+ delete: deleteFn,
841
913
  data,
842
914
  scope,
843
915
  detach
@@ -849,6 +921,7 @@ function storeFromStoreData(data, detach) {
849
921
  sub,
850
922
  txn,
851
923
  reset,
924
+ delete: deleteFn,
852
925
  data,
853
926
  scope
854
927
  };
@@ -942,13 +1015,6 @@ function atom(defaultValue, options) {
942
1015
  ...options
943
1016
  };
944
1017
  }
945
- // src/selector.ts
946
- var selector = (get, options) => {
947
- if (!options)
948
- return { equal, get };
949
- return { equal, ...options, get };
950
- };
951
-
952
1018
  // src/lib/atomFamilyAtom.ts
953
1019
  function atomFamilyAtom(defaultValue, options) {
954
1020
  if (options.global) {
@@ -1014,43 +1080,47 @@ var stableStringify = (x) => {
1014
1080
  return stableStringifyRecurse(x);
1015
1081
  };
1016
1082
 
1083
+ // src/lib/stringifyFamilyArgs.ts
1084
+ var stringifyFamilyArgs = (args) => {
1085
+ return args.length === 1 ? stableStringify(args[0]) : stableStringify(args);
1086
+ };
1087
+
1017
1088
  // src/lib/createAtomFamily.ts
1018
- var createOptions = (options = {}, family, familyKey, keyStringified) => {
1089
+ var createOptions = (options = {}, family, familyArgs, familyArgsStringified) => {
1019
1090
  if (options.name) {
1020
1091
  return {
1021
1092
  equal,
1022
1093
  ...options,
1023
- name: options?.name + "_" + keyStringified,
1094
+ name: options?.name + "_" + familyArgsStringified,
1024
1095
  family,
1025
- familyKey
1096
+ familyArgs,
1097
+ familyArgsStringified
1026
1098
  };
1027
1099
  } else {
1028
- return { equal, ...options, family, familyKey };
1100
+ return { equal, ...options, family, familyArgs, familyArgsStringified };
1029
1101
  }
1030
1102
  };
1031
- var handleDefaultValue = (defaultValue, key) => {
1103
+ var handleDefaultValue = (defaultValue, ...args) => {
1032
1104
  if (isSelectorFamily(defaultValue))
1033
- return defaultValue(key);
1105
+ return defaultValue(...args);
1034
1106
  if (typeof defaultValue === "function")
1035
- return () => defaultValue(key);
1107
+ return () => defaultValue(...args);
1036
1108
  return defaultValue;
1037
1109
  };
1038
1110
  var createAtomFamily = (defaultValue, options) => {
1039
1111
  const map = new Map;
1040
- const keysAtom = atom(new Set);
1041
- const atomFamily = Object.assign((key) => {
1042
- const keyStringified = stableStringify(key);
1043
- if (map.has(keyStringified)) {
1044
- return map.get(keyStringified);
1112
+ const atomFamily = Object.assign((...args) => {
1113
+ const argsStringified = stringifyFamilyArgs(args);
1114
+ if (map.has(argsStringified)) {
1115
+ return map.get(argsStringified);
1045
1116
  }
1046
- const familyAtom = atomFamilyAtom(handleDefaultValue(defaultValue, key), createOptions(options, atomFamily, Object.freeze(key), keyStringified));
1047
- map.set(keyStringified, familyAtom);
1117
+ const familyAtom = atomFamilyAtom(handleDefaultValue(defaultValue, ...args), createOptions(options, atomFamily, args, argsStringified));
1118
+ map.set(argsStringified, familyAtom);
1048
1119
  return familyAtom;
1049
1120
  }, {
1050
1121
  __valdresAtomFamilyMap: map,
1051
- release: (key) => map.delete(key),
1052
- __keysAtom: keysAtom,
1053
- __keysSelector: selector((get) => Array.from(get(keysAtom)))
1122
+ release: (...args) => map.delete(stringifyFamilyArgs(args)),
1123
+ equal
1054
1124
  });
1055
1125
  if (options?.name)
1056
1126
  Object.defineProperty(atomFamily, "name", {
@@ -1079,8 +1149,8 @@ function atomFamily(defaultValue, options) {
1079
1149
  return createAtomFamily(defaultValue, options);
1080
1150
  }
1081
1151
  // src/createStoreWithSelectorSet.ts
1082
- var setSelector = (selector2, values, store2) => {
1083
- 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);
1084
1154
  };
1085
1155
  var createStoreWithSelectorSet = (id) => {
1086
1156
  const data = createStoreData(id);
@@ -1095,59 +1165,82 @@ var createStoreWithSelectorSet = (id) => {
1095
1165
  store2.kind = "storeWithSelectorSet";
1096
1166
  return store2;
1097
1167
  };
1168
+ // src/selector.ts
1169
+ var selector = (get, options) => {
1170
+ if (!options)
1171
+ return { equal, get };
1172
+ return { equal, ...options, get };
1173
+ };
1174
+
1098
1175
  // src/indexConstructor.ts
1099
- var index = (family, callback) => {
1176
+ var index = (family, callback, options) => {
1100
1177
  const map = new Map;
1101
- return (term) => {
1178
+ const indexFn = (term) => {
1102
1179
  const termKey = stableStringify(term);
1103
1180
  if (map.has(termKey))
1104
1181
  return map.get(termKey);
1105
- const itemSelectorMap = new Map;
1106
- const selectorMapIndex = selector((get) => {
1107
- const ids = get(family);
1108
- ids.forEach((id) => {
1109
- if (itemSelectorMap.has(id))
1110
- return;
1111
- itemSelectorMap.set(id, selector((get2) => callback(get2(family(id)), term)));
1112
- });
1113
- return itemSelectorMap;
1114
- });
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}` });
1115
1202
  const filteredSelector = selector((get) => {
1116
- const map2 = get(selectorMapIndex);
1203
+ const set = get(termIndexSelector);
1117
1204
  const res = [];
1118
- map2.forEach((selector2, key) => {
1119
- if (get(selector2)) {
1120
- res.push(key);
1205
+ set.forEach((atom2) => {
1206
+ if (get(termIndexSelectorMap.get(atom2))) {
1207
+ res.push(atom2);
1121
1208
  }
1122
1209
  });
1123
1210
  return res;
1211
+ }, {
1212
+ name: `index:${options?.name}:${termKey}:termSelector`
1124
1213
  });
1125
1214
  map.set(termKey, filteredSelector);
1126
1215
  return filteredSelector;
1127
1216
  };
1217
+ return Object.assign(indexFn, {
1218
+ map
1219
+ });
1128
1220
  };
1129
1221
  // src/selectorFamily.ts
1130
- var createOptions2 = (options = {}, family, familyKey, keyStringified) => {
1222
+ var createOptions2 = (options = {}, family, familyArgs, familyArgsStringified) => {
1131
1223
  if (options.name) {
1132
1224
  return {
1133
1225
  equal,
1134
1226
  ...options,
1135
- name: options?.name + "_" + keyStringified,
1227
+ name: options?.name + "_" + familyArgsStringified,
1136
1228
  family,
1137
- familyKey
1229
+ familyArgs,
1230
+ familyArgsStringified
1138
1231
  };
1139
1232
  } else {
1140
- return { equal, ...options, family, familyKey };
1233
+ return { equal, ...options, family, familyArgs, familyArgsStringified };
1141
1234
  }
1142
1235
  };
1143
- var selectorFamily = (get, options) => {
1236
+ var selectorFamily = (callback, options) => {
1144
1237
  const map = new Map;
1145
- const selectorFamily2 = (key) => {
1146
- const keyStringified = stableStringify(key);
1147
- if (map.has(keyStringified))
1148
- return map.get(keyStringified);
1149
- const newSelector = selector((selectorArgs) => get(key)(selectorArgs), createOptions2(options, selectorFamily2, key, keyStringified));
1150
- map.set(keyStringified, newSelector);
1238
+ const selectorFamily2 = (...args) => {
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);
1151
1244
  return newSelector;
1152
1245
  };
1153
1246
  selectorFamily2.__valdresSelectorFamilyMap = map;
@@ -1,4 +1,3 @@
1
- import type { AtomOptions } from "./types/AtomOptions";
2
- import type { FamilyKey } from "./types/FamilyKey";
3
1
  import type { AtomFamilyDefaultValue } from "./types/AtomFamilyDefaultValue";
4
- export declare function atomFamily<Key = FamilyKey, Value = unknown>(defaultValue?: AtomFamilyDefaultValue<Key, Value>, options?: AtomOptions<Value>): import(".").AtomFamily<Key, Value>;
2
+ import type { AtomOptions } from "./types/AtomOptions";
3
+ export declare function atomFamily<Value extends any, Args extends [any, ...any[]] = [any, ...any[]]>(defaultValue?: AtomFamilyDefaultValue<Value, Args>, options?: AtomOptions<Value>): import(".").AtomFamily<Value, Args>;
@@ -1,4 +1,5 @@
1
1
  import type { AtomFamily } from "./types/AtomFamily";
2
- import type { FamilyKey } from "./types/FamilyKey";
3
2
  import type { Selector } from "./types/Selector";
4
- export declare const index: <T, K extends FamilyKey = FamilyKey, V = unknown>(family: AtomFamily<K, V>, callback: (value: V, term: T) => boolean) => ((term: T) => Selector<T[]>);
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[]>);
@@ -2,7 +2,7 @@ import type { AtomDefaultValue } from "../types/AtomDefaultValue";
2
2
  import type { AtomFamilyAtom } from "../types/AtomFamilyAtom";
3
3
  import type { AtomFamilyGlobalAtom } from "../types/AtomFamilyGlobalAtom";
4
4
  import type { AtomOptions } from "../types/AtomOptions";
5
- export declare function atomFamilyAtom<Key, Value>(defaultValue: AtomDefaultValue<Value>, options: AtomOptions<Value> & {
5
+ export declare function atomFamilyAtom<Value extends any, Args extends [any, ...any[]] = [any, ...any[]]>(defaultValue: AtomDefaultValue<Value>, options: AtomOptions<Value> & {
6
6
  global: true;
7
- }): AtomFamilyGlobalAtom<Key, Value>;
8
- export declare function atomFamilyAtom<Key, Value>(defaultValue: AtomDefaultValue<Value>, options: AtomOptions<Value>): AtomFamilyAtom<Key, Value>;
7
+ }): AtomFamilyGlobalAtom<Value, Args>;
8
+ export declare function atomFamilyAtom<Value extends any, Args extends [any, ...any[]] = [any, ...any[]]>(defaultValue: AtomDefaultValue<Value>, options: AtomOptions<Value>): AtomFamilyAtom<Value, Args>;
@@ -1,4 +1,4 @@
1
1
  import type { AtomFamily } from "../types/AtomFamily";
2
2
  import type { AtomFamilyDefaultValue } from "../types/AtomFamilyDefaultValue";
3
3
  import type { AtomOptions } from "../types/AtomOptions";
4
- export declare const createAtomFamily: <Key, Value>(defaultValue: AtomFamilyDefaultValue<Key, Value>, options?: AtomOptions<Value>) => AtomFamily<Key, Value>;
4
+ export declare const createAtomFamily: <Value extends unknown, Args extends [any, ...any[]] = [any, ...any[]]>(defaultValue: AtomFamilyDefaultValue<Value, Args>, options?: AtomOptions<Value>) => AtomFamily<Value, Args>;
@@ -1,5 +1,4 @@
1
- import type { AtomOptions } from "../types/AtomOptions";
2
- import type { FamilyKey } from "../types/FamilyKey";
3
- import type { AtomFamilyDefaultValue } from "../types/AtomFamilyDefaultValue";
4
1
  import type { AtomFamily } from "../types/AtomFamily";
5
- export declare const createGlobalAtomFamily: <Key = FamilyKey, Value = unknown>(defaultValue: AtomFamilyDefaultValue<Key, Value>, options: AtomOptions<Value>) => AtomFamily<Key, Value>;
2
+ import type { AtomFamilyDefaultValue } from "../types/AtomFamilyDefaultValue";
3
+ import type { AtomOptions } from "../types/AtomOptions";
4
+ export declare const createGlobalAtomFamily: <Value extends unknown, Args extends [any, ...any[]] = [any, ...any[]]>(defaultValue: AtomFamilyDefaultValue<Value, Args>, options: AtomOptions<Value>) => AtomFamily<Value, Args>;
@@ -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
- export declare function getState<V, K>(atom: Atom<V>, data: StoreData, circularDependencySet?: WeakSet<Selector>): V;
6
- export declare function getState<V, K>(selector: Selector<V>, data: StoreData, circularDependencySet?: WeakSet<Selector>): V;
7
- export declare function getState<V, K>(family: AtomFamily<V, K>, data: StoreData, circularDependencySet?: WeakSet<Selector>): K[];
5
+ import type { AtomFamilyAtom } from "../types/AtomFamilyAtom";
6
+ export declare function getState<Value extends any, Args extends [any, ...any[]] = [any, ...any[]]>(atom: Atom<Value>, data: StoreData, circularDependencySet?: WeakSet<Selector>): Value;
7
+ export declare function getState<Value extends any, Args extends [any, ...any[]] = [any, ...any[]]>(selector: Selector<Value>, data: StoreData, circularDependencySet?: WeakSet<Selector>): Value;
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: <V, K>(atom: Atom<V> | AtomFamilyAtom<K, V>, data: StoreData) => V;
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;
@@ -0,0 +1 @@
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,3 +1,3 @@
1
1
  import type { State } from "../types/State";
2
2
  import type { StoreData } from "../types/StoreData";
3
- export declare const updateStateSubscribers: <V>(state: State, data: StoreData) => void;
3
+ export declare const updateStateSubscribers: (state: State, data: StoreData) => void;
@@ -1,4 +1,4 @@
1
1
  import type { GetValue } from "./types/GetValue";
2
2
  import type { Selector } from "./types/Selector";
3
3
  import type { SelectorOptions } from "./types/SelectorOptions";
4
- export declare const selector: <Value, FamilyKey = undefined>(get: (get: GetValue, storeId: string) => Value, options?: SelectorOptions<Value>) => Selector<Value, FamilyKey>;
4
+ export declare const selector: <Value extends unknown, FamilyArgs extends [any, ...any[]] = [any, ...any[]]>(get: (get: GetValue, storeId: string) => Value | Promise<Value>, options?: SelectorOptions<Value>) => Selector<Value, FamilyArgs>;
@@ -1,4 +1,4 @@
1
+ import type { GetValue } from "./types/GetValue";
1
2
  import type { SelectorFamily } from "./types/SelectorFamily";
2
3
  import type { SelectorOptions } from "./types/SelectorOptions";
3
- import type { GetValue } from "./types/GetValue";
4
- export declare const selectorFamily: <Key, Value>(get: (key: Key) => (get: GetValue) => Value, options?: SelectorOptions<Value>) => SelectorFamily<Key, Value>;
4
+ export declare const selectorFamily: <Value extends unknown, Args extends [any, ...any[]] = [any, ...any[]]>(callback: (...args: Args) => (get: GetValue) => Value | Promise<Value>, options?: SelectorOptions<Value>) => SelectorFamily<Value, Args>;
@@ -1,12 +1,9 @@
1
- import type { Atom } from "./Atom";
2
1
  import type { AtomFamilyAtom } from "./AtomFamilyAtom";
3
- import type { FamilyKey } from "./FamilyKey";
4
- import type { Selector } from "./Selector";
5
- export type AtomFamily<Key = FamilyKey, Value = unknown> = {
6
- (key: Key): AtomFamilyAtom<Key, Value>;
7
- release: (key: Key) => void;
2
+ import type { EqualFunc } from "./EqualFunc";
3
+ export type AtomFamily<Value extends any, Args extends [any, ...any[]] = [any, ...any[]]> = {
4
+ (...args: Args): AtomFamilyAtom<Value, Args>;
5
+ release: (...args: Args) => void;
6
+ equal: EqualFunc<Value>;
8
7
  name?: string;
9
- __valdresAtomFamilyMap: Map<Key, AtomFamilyAtom<Key, Value>>;
10
- __keysAtom: Atom<Set<Key>>;
11
- __keysSelector: Selector<Key[]>;
8
+ __valdresAtomFamilyMap: Map<Value, AtomFamilyAtom<Value, Args>>;
12
9
  };
@@ -1,6 +1,7 @@
1
1
  import type { Atom } from "./Atom";
2
2
  import type { AtomFamily } from "./AtomFamily";
3
- export type AtomFamilyAtom<Key = unknown, Value = unknown> = Atom<Value> & {
4
- family: AtomFamily<Key, Value>;
5
- familyKey: Key;
3
+ export type AtomFamilyAtom<Value extends any, Args extends [any, ...any[]] = [any, ...any[]]> = Atom<Value> & {
4
+ family: AtomFamily<Value, Args>;
5
+ familyArgs: Args;
6
+ familyArgsStringified: string;
6
7
  };
@@ -1,5 +1,5 @@
1
1
  import type { Selector } from "./Selector";
2
2
  import type { SelectorFamily } from "./SelectorFamily";
3
- type DefaultValueCallback<Key, Value> = (arg: Key) => Value | Promise<Value>;
4
- export type AtomFamilyDefaultValue<Key, Value> = undefined | Value | DefaultValueCallback<Key, Value> | Selector<Value> | SelectorFamily<Key, Value>;
3
+ type DefaultValueCallback<Value extends any, Args extends [any, ...any[]]> = (...args: Args) => Value | Promise<Value>;
4
+ export type AtomFamilyDefaultValue<Value extends any, Args extends [any, ...any[]]> = undefined | Value | DefaultValueCallback<Value, Args> | Selector<Value, Args> | SelectorFamily<Value, Args>;
5
5
  export {};
@@ -1,3 +1,3 @@
1
1
  import type { AtomFamilyAtom } from "./AtomFamilyAtom";
2
2
  import type { GlobalAtom } from "./GlobalAtom";
3
- export type AtomFamilyGlobalAtom<Key = unknown, Value = unknown> = AtomFamilyAtom<Key, Value> & GlobalAtom<Value>;
3
+ export type AtomFamilyGlobalAtom<Value extends any, Args extends [any, ...any[]] = [any, ...any[]]> = AtomFamilyAtom<Value, Args> & GlobalAtom<Value>;
@@ -1,6 +1,6 @@
1
1
  import type { Selector } from "./Selector";
2
2
  import type { SelectorFamily } from "./SelectorFamily";
3
- export type AtomFamilySelector<Value = unknown, Key = unknown> = Selector<Value> & {
4
- family: SelectorFamily<Key, Value>;
5
- familyKey: Key;
3
+ export type AtomFamilySelector<Value extends any, Args extends [any, ...any[]] = [any, ...any[]]> = Selector<Value> & {
4
+ family: SelectorFamily<Value, Args>;
5
+ familyArgs: Args;
6
6
  };
@@ -1 +1 @@
1
- export type EqualFunc<Value = any> = (a: Value, b: Value) => boolean;
1
+ export type EqualFunc<Value extends any> = (a: Value, b: Value) => boolean;
@@ -1,3 +1,3 @@
1
1
  import type { SelectorFamily } from "./SelectorFamily";
2
2
  import type { AtomFamily } from "./AtomFamily";
3
- export type Family<Key, Value = any> = AtomFamily<Key, Value> | SelectorFamily<Key, Value>;
3
+ export type Family<Value extends any, Args extends [any, ...any[]] = [any, ...any[]]> = AtomFamily<Value, Args> | SelectorFamily<Value, Args>;
@@ -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
- <V>(atom: Atom<V>): V;
6
- <V>(selector: Selector<V>): V;
7
- <V, K>(family: AtomFamily<K, V>): K[];
6
+ <Value extends any>(atom: Atom<Value>): Value;
7
+ <Value extends any, Args extends [any, ...any[]] = [any, ...any[]]>(selector: Selector<Value, Args>): Value;
8
+ <Value extends any, Args extends [any, ...any[]]>(family: AtomFamily<Value, Args>): AtomFamilyAtom<Value, Args>[];
8
9
  };
@@ -1,11 +1,11 @@
1
1
  import type { EqualFunc } from "./EqualFunc";
2
2
  import type { GetValue } from "./GetValue";
3
3
  import type { SelectorFamily } from "./SelectorFamily";
4
- export type Selector<Value = unknown, FamilyKey = undefined> = {
5
- get: (get: GetValue, storeId: string) => Value;
4
+ export type Selector<Value extends any = any, FamilyArgs extends [any, ...any[]] = [any, ...any[]]> = {
5
+ get: (get: GetValue, storeId: string) => Value | Promise<Value>;
6
6
  equal: EqualFunc<Value>;
7
7
  name?: string;
8
- family?: SelectorFamily<FamilyKey, Value>;
9
- familyKey?: FamilyKey;
8
+ family?: SelectorFamily<Value, FamilyArgs>;
9
+ familyArgs?: FamilyArgs;
10
10
  onMount?: () => void | (() => void);
11
11
  };
@@ -1,6 +1,5 @@
1
- import type { FamilyKey } from "./FamilyKey";
2
1
  import type { Selector } from "./Selector";
3
- export type SelectorFamily<Key = FamilyKey, Value = unknown> = {
4
- (key: Key, defaultOverride?: any): Selector<Value>;
5
- __valdresSelectorFamilyMap: Map<Key, Selector<Value, Key>>;
2
+ export type SelectorFamily<Value extends any, Args extends [any, ...any[]]> = {
3
+ (...args: Args): Selector<Value, Args>;
4
+ __valdresSelectorFamilyMap: Map<Args, Selector<Value, Args>>;
6
5
  };
@@ -1,5 +1,5 @@
1
1
  import type { EqualFunc } from "./EqualFunc";
2
- export type SelectorOptions<Value> = {
2
+ export type SelectorOptions<Value extends any> = {
3
3
  name?: string;
4
4
  equal?: EqualFunc<Value>;
5
5
  };
@@ -1,4 +1,4 @@
1
1
  import type { Atom } from "./Atom";
2
2
  import type { AtomFamily } from "./AtomFamily";
3
3
  import type { Selector } from "./Selector";
4
- export type State<K = any, V = any> = Atom<V> | Selector<V> | AtomFamily<K, V>;
4
+ export type State<Value extends any = any, Args extends [any, ...any[]] = [any, ...any[]]> = Atom<Value> | Selector<Value> | AtomFamily<Value, Args>;
@@ -6,15 +6,17 @@ import type { ScopedStoreData, StoreData } from "./StoreData";
6
6
  import type { SubscribeFn } from "./SubscribeFn";
7
7
  import type { TransactionFn } from "./TransactionFn";
8
8
  type SetAtom = {
9
- <V, K>(atom: AtomFamilyAtom<K, V>, value: V): void;
10
- <V>(atom: Atom<V>, value: V): void;
9
+ <Value extends any, Args extends [any, ...any[]] = [any, ...any[]]>(atom: AtomFamilyAtom<Value, Args>, value: Value): void;
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;
@@ -3,7 +3,7 @@ import type { Family } from "./Family";
3
3
  import type { Selector } from "./Selector";
4
4
  type UnsuscribeFn = () => void;
5
5
  export type SubscribeFn = {
6
- <V, K>(state: Family<K, V>, callback: (arg: K) => void, requireDeepEqualCheckBeforeCallback?: boolean): UnsuscribeFn;
7
- <V>(state: Atom<V> | Selector<V>, callback: () => void, requireDeepEqualCheckBeforeCallback?: boolean): UnsuscribeFn;
6
+ <Value extends any, Args extends [any, ...any[]] = [any, ...any[]]>(state: Family<Value, Args>, callback: (...args: Args) => void, requireDeepEqualCheckBeforeCallback?: boolean): UnsuscribeFn;
7
+ <Value extends any>(state: Atom<Value> | Selector<Value>, callback: () => void, requireDeepEqualCheckBeforeCallback?: boolean): UnsuscribeFn;
8
8
  };
9
9
  export {};
@@ -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>;
@@ -1,2 +1,2 @@
1
1
  import type { AtomFamily } from "../types/AtomFamily";
2
- export declare const isAtomFamily: <K, V>(state: any) => state is AtomFamily<K, V>;
2
+ export declare const isAtomFamily: <Value extends unknown, Args extends [any, ...any[]] = [any, ...any[]]>(state: any) => state is AtomFamily<Value, Args>;
@@ -1 +1 @@
1
- export declare const isFamily: (state: any) => state is import("..").SelectorFamily<unknown, unknown> | import("..").AtomFamily<unknown, unknown>;
1
+ export declare const isFamily: (state: any) => state is import("..").SelectorFamily<unknown, [any, ...any[]]> | import("..").AtomFamily<unknown, [any, ...any[]]>;
@@ -1,2 +1,2 @@
1
1
  import type { AtomFamilyAtom } from "../types/AtomFamilyAtom";
2
- export declare const isFamilyAtom: <K, V>(state: any) => state is AtomFamilyAtom<K, V>;
2
+ export declare const isFamilyAtom: <Value extends unknown, Args extends [any, ...any[]] = [any, ...any[]]>(state: any) => state is AtomFamilyAtom<Value, Args>;
@@ -1,2 +1,2 @@
1
1
  import type { AtomFamilySelector } from "../types/AtomFamilySelector";
2
- export declare const isFamilySelector: <K, V>(state: any) => state is AtomFamilySelector<K, V>;
2
+ export declare const isFamilySelector: <Value extends unknown, Args extends [any, ...any[]] = [any, ...any[]]>(state: any) => state is AtomFamilySelector<Value, Args>;
@@ -1,3 +1,3 @@
1
1
  import type { AtomFamilyAtom } from "../types/AtomFamilyAtom";
2
2
  import type { AtomFamilySelector } from "../types/AtomFamilySelector";
3
- export declare const isFamilyState: <K, V>(state: any) => state is AtomFamilyAtom<K, V> | AtomFamilySelector<K, V>;
3
+ export declare const isFamilyState: <Value extends unknown, Args extends [any, ...any[]] = [any, ...any[]]>(state: any) => state is AtomFamilyAtom<Value, Args> | AtomFamilySelector<Value, Args>;
@@ -1,2 +1,2 @@
1
1
  import type { SelectorFamily } from "../types/SelectorFamily";
2
- export declare const isSelectorFamily: <K, V>(state: any) => state is SelectorFamily<K, V>;
2
+ export declare const isSelectorFamily: <Value extends unknown, Args extends [any, ...any[]] = [any, ...any[]]>(state: any) => state is SelectorFamily<Value, Args>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valdres",
3
- "version": "0.2.0-alpha.74",
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": "bff29372cef5badd771e1cc9ea59f4b3fb8a5dc3"
39
+ "gitHead": "184b86a8548d25cb8df609184718cf62de9d97c8"
40
40
  }