atom.io 0.24.7 → 0.25.0

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/data/dist/index.cjs +40 -62
  2. package/data/dist/index.d.ts +3 -3
  3. package/data/dist/index.js +41 -63
  4. package/data/src/join.ts +47 -64
  5. package/dist/index.cjs +26 -8
  6. package/dist/index.d.ts +37 -15
  7. package/dist/index.js +27 -9
  8. package/internal/dist/index.cjs +224 -117
  9. package/internal/dist/index.d.ts +12 -7
  10. package/internal/dist/index.js +225 -118
  11. package/internal/src/families/dispose-from-store.ts +56 -3
  12. package/internal/src/get-state/get-from-store.ts +58 -25
  13. package/internal/src/molecule/make-molecule-in-store.ts +59 -23
  14. package/internal/src/not-found-error.ts +29 -6
  15. package/internal/src/selector/create-readonly-selector.ts +7 -2
  16. package/internal/src/selector/create-writable-selector.ts +7 -5
  17. package/internal/src/selector/register-selector.ts +59 -9
  18. package/internal/src/selector/trace-selector-atoms.ts +6 -8
  19. package/internal/src/selector/update-selector-atoms.ts +3 -1
  20. package/internal/src/set-state/set-into-store.ts +48 -1
  21. package/internal/src/store/store.ts +4 -4
  22. package/internal/src/transaction/build-transaction.ts +10 -9
  23. package/internal/src/transaction/create-transaction.ts +2 -2
  24. package/internal/src/transaction/index.ts +2 -2
  25. package/package.json +6 -6
  26. package/react/dist/index.cjs +4 -1
  27. package/react/dist/index.js +5 -2
  28. package/react/src/use-o.ts +11 -3
  29. package/realtime/dist/index.cjs +0 -1
  30. package/realtime/dist/index.js +0 -1
  31. package/realtime/src/realtime-continuity.ts +0 -1
  32. package/realtime-server/dist/index.cjs +7 -7
  33. package/realtime-server/dist/index.js +7 -7
  34. package/realtime-server/src/realtime-server-stores/server-room-external-actions.ts +7 -7
  35. package/src/dispose-state.ts +32 -3
  36. package/src/get-state.ts +37 -4
  37. package/src/molecule.ts +20 -7
  38. package/src/set-state.ts +19 -2
  39. package/src/silo.ts +11 -4
  40. package/src/transaction.ts +9 -17
@@ -407,8 +407,6 @@ var abortTransaction = (store) => {
407
407
  );
408
408
  target.parent.child = null;
409
409
  };
410
-
411
- // internal/src/not-found-error.ts
412
410
  var capitalize = (str) => str[0].toUpperCase() + str.slice(1);
413
411
  function prettyPrintTokenType(token) {
414
412
  switch (token.type) {
@@ -427,10 +425,19 @@ function prettyPrintTokenType(token) {
427
425
  }
428
426
  }
429
427
  var NotFoundError = class extends Error {
430
- constructor(token, store) {
431
- super(
432
- `${prettyPrintTokenType(token)} "${token.key}" not found in store "${store.config.name}".`
433
- );
428
+ constructor(...params) {
429
+ const token = params[0];
430
+ const store = params.length === 2 ? params[1] : params[2];
431
+ if (params.length === 2) {
432
+ super(
433
+ `${prettyPrintTokenType(token)} "${token.key}" not found in store "${store.config.name}".`
434
+ );
435
+ } else {
436
+ const key = params[1];
437
+ super(
438
+ `${prettyPrintTokenType(token)} "${token.key}" member ${json.stringifyJson(key)} not found in store "${store.config.name}".`
439
+ );
440
+ }
434
441
  }
435
442
  };
436
443
 
@@ -690,41 +697,6 @@ var setAtomOrSelector = (state, value, store) => {
690
697
  break;
691
698
  }
692
699
  };
693
-
694
- // internal/src/set-state/set-into-store.ts
695
- function setIntoStore(token, value, store) {
696
- const rejectionTime = openOperation(token, store);
697
- if (rejectionTime) {
698
- const unsubscribe = store.on.operationClose.subscribe(
699
- `waiting to set "${token.key}" at T-${rejectionTime}`,
700
- () => {
701
- unsubscribe();
702
- store.logger.info(
703
- `\u{1F7E2}`,
704
- token.type,
705
- token.key,
706
- `resuming deferred setState from T-${rejectionTime}`
707
- );
708
- setIntoStore(token, value, store);
709
- }
710
- );
711
- return;
712
- }
713
- const state = withdraw(token, store);
714
- setAtomOrSelector(state, value, store);
715
- closeOperation(store);
716
- }
717
-
718
- // internal/src/ingest-updates/ingest-atom-update.ts
719
- function ingestAtomUpdate(applying, atomUpdate, store) {
720
- const { key, newValue, oldValue } = atomUpdate;
721
- const value = applying === `newValue` ? newValue : oldValue;
722
- const token = { key, type: `atom` };
723
- if (atomUpdate.family) {
724
- Object.assign(token, { family: atomUpdate.family });
725
- }
726
- setIntoStore(token, value, store);
727
- }
728
700
  function createRegularAtomFamily(options, store) {
729
701
  const subject = new Subject();
730
702
  const atomFamily = Object.assign(
@@ -766,17 +738,31 @@ function createAtomFamily(options, store) {
766
738
  }
767
739
 
768
740
  // internal/src/get-state/get-from-store.ts
769
- function getFromStore(token, store) {
770
- if (token.type === `molecule`) {
771
- try {
772
- const molecule = withdraw(token, store);
773
- return molecule.instance;
774
- } catch (_) {
775
- return void 0;
741
+ function getFromStore(...params) {
742
+ let token;
743
+ let store;
744
+ if (params.length === 2) {
745
+ token = params[0];
746
+ store = params[1];
747
+ } else {
748
+ const family = params[0];
749
+ const key = params[1];
750
+ store = params[2];
751
+ const maybeToken = family.type === `molecule_family` ? seekInStore(family, key, store) : store.config.lifespan === `immortal` ? seekInStore(family, key, store) : findInStore(family, key, store);
752
+ if (!maybeToken) {
753
+ throw new NotFoundError(family, key, store);
776
754
  }
755
+ token = maybeToken;
756
+ }
757
+ switch (token.type) {
758
+ case `atom`:
759
+ case `mutable_atom`:
760
+ case `selector`:
761
+ case `readonly_selector`:
762
+ return readOrComputeValue(withdraw(token, store), store);
763
+ case `molecule`:
764
+ return withdraw(token, store).instance;
777
765
  }
778
- const state = withdraw(token, store);
779
- return readOrComputeValue(state, store);
780
766
  }
781
767
 
782
768
  // internal/src/keys.ts
@@ -792,21 +778,18 @@ var getSelectorDependencyKeys = (key, store) => {
792
778
  };
793
779
 
794
780
  // internal/src/selector/trace-selector-atoms.ts
795
- var traceSelectorAtoms = (selectorKey, directDependencyKey, store) => {
781
+ var traceSelectorAtoms = (directDependencyKey, covered, store) => {
796
782
  const rootKeys = [];
797
783
  const indirectDependencyKeys = getSelectorDependencyKeys(
798
784
  directDependencyKey,
799
785
  store
800
786
  );
801
- let depth = 0;
802
787
  while (indirectDependencyKeys.length > 0) {
803
788
  const indirectDependencyKey = indirectDependencyKeys.shift();
804
- ++depth;
805
- if (depth > 99999) {
806
- throw new Error(
807
- `Maximum selector dependency depth exceeded (> 99999) in selector "${selectorKey}". This is likely due to a circular dependency.`
808
- );
789
+ if (covered.has(indirectDependencyKey)) {
790
+ continue;
809
791
  }
792
+ covered.add(indirectDependencyKey);
810
793
  if (!isAtomKey(indirectDependencyKey, store)) {
811
794
  indirectDependencyKeys.push(
812
795
  ...getSelectorDependencyKeys(indirectDependencyKey, store)
@@ -820,13 +803,14 @@ var traceSelectorAtoms = (selectorKey, directDependencyKey, store) => {
820
803
  var traceAllSelectorAtoms = (selector, store) => {
821
804
  const selectorKey = selector.key;
822
805
  const directDependencyKeys = getSelectorDependencyKeys(selectorKey, store);
806
+ const covered = /* @__PURE__ */ new Set();
823
807
  return directDependencyKeys.flatMap(
824
- (depKey) => isAtomKey(depKey, store) ? depKey : traceSelectorAtoms(selectorKey, depKey, store)
808
+ (depKey) => isAtomKey(depKey, store) ? depKey : traceSelectorAtoms(depKey, covered, store)
825
809
  );
826
810
  };
827
811
 
828
812
  // internal/src/selector/update-selector-atoms.ts
829
- var updateSelectorAtoms = (selectorKey, dependency, store) => {
813
+ var updateSelectorAtoms = (selectorKey, dependency, covered, store) => {
830
814
  const target = newest(store);
831
815
  if (dependency.type === `atom` || dependency.type === `mutable_atom`) {
832
816
  target.selectorAtoms.set({
@@ -840,7 +824,7 @@ var updateSelectorAtoms = (selectorKey, dependency, store) => {
840
824
  `discovers root atom "${dependency.key}"`
841
825
  );
842
826
  } else {
843
- const rootKeys = traceSelectorAtoms(selectorKey, dependency.key, store);
827
+ const rootKeys = traceSelectorAtoms(dependency.key, covered, store);
844
828
  store.logger.info(
845
829
  `\u{1F50D}`,
846
830
  `selector`,
@@ -854,12 +838,21 @@ var updateSelectorAtoms = (selectorKey, dependency, store) => {
854
838
  });
855
839
  }
856
840
  }
841
+ covered.add(dependency.key);
857
842
  };
858
843
 
859
844
  // internal/src/selector/register-selector.ts
860
- var registerSelector = (selectorKey, store) => ({
861
- get: (dependency) => {
845
+ var registerSelector = (selectorKey, covered, store) => ({
846
+ get: (dependency, key) => {
862
847
  const target = newest(store);
848
+ if (key) {
849
+ switch (dependency.type) {
850
+ case `molecule_family`:
851
+ return getFromStore(dependency, key, store);
852
+ case `atom_family`:
853
+ dependency = seekInStore(dependency, key, store);
854
+ }
855
+ }
863
856
  if (dependency.type === `molecule`) {
864
857
  return getFromStore(dependency, store);
865
858
  }
@@ -882,13 +875,28 @@ var registerSelector = (selectorKey, store) => ({
882
875
  source: dependency.key
883
876
  }
884
877
  );
885
- updateSelectorAtoms(selectorKey, dependency, store);
878
+ updateSelectorAtoms(selectorKey, dependency, covered, store);
886
879
  return dependencyValue;
887
880
  },
888
- set: (WritableToken, newValue) => {
881
+ set: (...params) => {
882
+ let token;
883
+ let value;
884
+ if (params.length === 2) {
885
+ token = params[0];
886
+ value = params[1];
887
+ } else {
888
+ const family = params[0];
889
+ const key = params[1];
890
+ value = params[2];
891
+ const maybeToken = store.config.lifespan === `ephemeral` ? findInStore(family, key, store) : seekInStore(family, key, store);
892
+ if (!maybeToken) {
893
+ throw new NotFoundError(family, key, store);
894
+ }
895
+ token = maybeToken;
896
+ }
889
897
  const target = newest(store);
890
- const state = withdraw(WritableToken, target);
891
- setAtomOrSelector(state, newValue, target);
898
+ const state = withdraw(token, target);
899
+ setAtomOrSelector(state, value, target);
892
900
  },
893
901
  find: (token, key) => findInStore(token, key, store),
894
902
  seek: (token, key) => seekInStore(token, key, store),
@@ -899,10 +907,16 @@ var registerSelector = (selectorKey, store) => ({
899
907
  var createReadonlySelector = (options, family, store) => {
900
908
  const target = newest(store);
901
909
  const subject = new Subject();
902
- const { get, find, seek, json } = registerSelector(options.key, target);
910
+ const covered = /* @__PURE__ */ new Set();
911
+ const { get, find, seek, json } = registerSelector(
912
+ options.key,
913
+ covered,
914
+ target
915
+ );
903
916
  const getSelf = () => {
904
917
  const value = options.get({ get, find, seek, json });
905
918
  cacheValue(options.key, value, subject, newest(store));
919
+ covered.clear();
906
920
  return value;
907
921
  };
908
922
  const readonlySelector = __spreadValues(__spreadProps(__spreadValues({}, options), {
@@ -934,12 +948,14 @@ var createReadonlySelector = (options, family, store) => {
934
948
  var createWritableSelector = (options, family, store) => {
935
949
  const target = newest(store);
936
950
  const subject = new Subject();
937
- const transactors = registerSelector(options.key, target);
938
- const { find, get, seek, json } = transactors;
939
- const readonlyTransactors = { find, get, seek, json };
951
+ const covered = /* @__PURE__ */ new Set();
952
+ const toolkit = registerSelector(options.key, covered, target);
953
+ const { find, get, seek, json } = toolkit;
954
+ const getterToolkit = { find, get, seek, json };
940
955
  const getSelf = (innerTarget = newest(store)) => {
941
- const value = options.get(readonlyTransactors);
956
+ const value = options.get(getterToolkit);
942
957
  cacheValue(options.key, value, subject, innerTarget);
958
+ covered.clear();
943
959
  return value;
944
960
  };
945
961
  const setSelf = (next) => {
@@ -961,7 +977,7 @@ var createWritableSelector = (options, family, store) => {
961
977
  if (isRootStore(innerTarget)) {
962
978
  subject.next({ newValue, oldValue });
963
979
  }
964
- options.set(transactors, newValue);
980
+ options.set(toolkit, newValue);
965
981
  };
966
982
  const mySelector = __spreadValues(__spreadProps(__spreadValues({}, options), {
967
983
  subject,
@@ -1215,23 +1231,6 @@ function disposeMolecule(token, store) {
1215
1231
  }
1216
1232
  }
1217
1233
 
1218
- // internal/src/families/dispose-from-store.ts
1219
- function disposeFromStore(token, store = IMPLICIT.STORE) {
1220
- switch (token.type) {
1221
- case `atom`:
1222
- case `mutable_atom`:
1223
- disposeAtom(token, store);
1224
- break;
1225
- case `selector`:
1226
- case `readonly_selector`:
1227
- disposeSelector(token, store);
1228
- break;
1229
- case `molecule`:
1230
- disposeMolecule(token, store);
1231
- break;
1232
- }
1233
- }
1234
-
1235
1234
  // internal/src/families/init-family-member.ts
1236
1235
  function initFamilyMemberInStore(token, key, store) {
1237
1236
  const familyKey = token.key;
@@ -1305,6 +1304,91 @@ function findInStore(token, key, store) {
1305
1304
  return state;
1306
1305
  }
1307
1306
 
1307
+ // internal/src/families/dispose-from-store.ts
1308
+ function disposeFromStore(...params) {
1309
+ let token;
1310
+ let store;
1311
+ if (params.length === 2) {
1312
+ token = params[0];
1313
+ store = params[1];
1314
+ } else {
1315
+ const family = params[0];
1316
+ const key = params[1];
1317
+ store = params[2];
1318
+ const maybeToken = family.type === `molecule_family` ? seekInStore(family, key, store) : store.config.lifespan === `immortal` ? seekInStore(family, key, store) : findInStore(family, key, store);
1319
+ if (!maybeToken) {
1320
+ throw new NotFoundError(family, key, store);
1321
+ }
1322
+ token = maybeToken;
1323
+ }
1324
+ switch (token.type) {
1325
+ case `atom`:
1326
+ case `mutable_atom`:
1327
+ disposeAtom(token, store);
1328
+ break;
1329
+ case `selector`:
1330
+ case `readonly_selector`:
1331
+ disposeSelector(token, store);
1332
+ break;
1333
+ case `molecule`:
1334
+ disposeMolecule(token, store);
1335
+ break;
1336
+ }
1337
+ }
1338
+
1339
+ // internal/src/set-state/set-into-store.ts
1340
+ function setIntoStore(...params) {
1341
+ let token;
1342
+ let value;
1343
+ let store;
1344
+ if (params.length === 3) {
1345
+ token = params[0];
1346
+ value = params[1];
1347
+ store = params[2];
1348
+ } else {
1349
+ const family = params[0];
1350
+ const key = params[1];
1351
+ value = params[2];
1352
+ store = params[3];
1353
+ const maybeToken = store.config.lifespan === `ephemeral` ? findInStore(family, key, store) : seekInStore(family, key, store);
1354
+ if (!maybeToken) {
1355
+ throw new NotFoundError(family, key, store);
1356
+ }
1357
+ token = maybeToken;
1358
+ }
1359
+ const rejectionTime = openOperation(token, store);
1360
+ if (rejectionTime) {
1361
+ const unsubscribe = store.on.operationClose.subscribe(
1362
+ `waiting to set "${token.key}" at T-${rejectionTime}`,
1363
+ () => {
1364
+ unsubscribe();
1365
+ store.logger.info(
1366
+ `\u{1F7E2}`,
1367
+ token.type,
1368
+ token.key,
1369
+ `resuming deferred setState from T-${rejectionTime}`
1370
+ );
1371
+ setIntoStore(token, value, store);
1372
+ }
1373
+ );
1374
+ return;
1375
+ }
1376
+ const state = withdraw(token, store);
1377
+ setAtomOrSelector(state, value, store);
1378
+ closeOperation(store);
1379
+ }
1380
+
1381
+ // internal/src/ingest-updates/ingest-atom-update.ts
1382
+ function ingestAtomUpdate(applying, atomUpdate, store) {
1383
+ const { key, newValue, oldValue } = atomUpdate;
1384
+ const value = applying === `newValue` ? newValue : oldValue;
1385
+ const token = { key, type: `atom` };
1386
+ if (atomUpdate.family) {
1387
+ Object.assign(token, { family: atomUpdate.family });
1388
+ }
1389
+ setIntoStore(token, value, store);
1390
+ }
1391
+
1308
1392
  // internal/src/molecule/create-molecule-family.ts
1309
1393
  function createMoleculeFamily(options, store) {
1310
1394
  var _a;
@@ -1366,30 +1450,34 @@ var Molecule = class {
1366
1450
  };
1367
1451
 
1368
1452
  // internal/src/molecule/make-molecule-in-store.ts
1453
+ function capitalize2(string) {
1454
+ return string[0].toUpperCase() + string.slice(1);
1455
+ }
1369
1456
  function makeMoleculeInStore(store, context, familyToken, key, ...params) {
1370
1457
  const target = newest(store);
1371
- target.moleculeInProgress = key;
1458
+ const stringKey = json.stringifyJson(key);
1459
+ target.moleculeInProgress = stringKey;
1372
1460
  const contextArray = Array.isArray(context) ? context : [context];
1373
1461
  const owners = contextArray.map((ctx) => {
1374
1462
  if (ctx instanceof Molecule) {
1375
1463
  return ctx;
1376
1464
  }
1377
- const stringKey = json.stringifyJson(ctx.key);
1378
- const molecule2 = store.molecules.get(stringKey);
1465
+ const ctxStringKey = json.stringifyJson(ctx.key);
1466
+ const molecule2 = store.molecules.get(ctxStringKey);
1379
1467
  if (!molecule2) {
1380
1468
  throw new Error(
1381
- `Molecule ${stringKey} not found in store "${store.config.name}"`
1469
+ `Molecule ${ctxStringKey} not found in store "${store.config.name}"`
1382
1470
  );
1383
1471
  }
1384
1472
  return molecule2;
1385
1473
  });
1386
1474
  const molecule = new Molecule(owners, key, familyToken);
1387
- target.molecules.set(json.stringifyJson(key), molecule);
1475
+ target.molecules.set(stringKey, molecule);
1388
1476
  for (const owner of owners) {
1389
1477
  owner.below.set(molecule.stringKey, molecule);
1390
1478
  }
1391
- const transactors = {
1392
- get: (t) => getFromStore(t, newest(store)),
1479
+ const toolkit = {
1480
+ get: (t) => getFromStore(t, void 0, newest(store)),
1393
1481
  set: (t, newValue) => {
1394
1482
  setIntoStore(t, newValue, newest(store));
1395
1483
  },
@@ -1401,11 +1489,36 @@ function makeMoleculeInStore(store, context, familyToken, key, ...params) {
1401
1489
  disposeFromStore(t, newest(store));
1402
1490
  },
1403
1491
  env: () => getEnvironmentData(newest(store)),
1404
- bond: (f) => growMoleculeInStore(
1405
- molecule,
1406
- withdraw(f, store),
1407
- newest(store)
1408
- ),
1492
+ bond: (token2, maybeRole) => {
1493
+ if (token2.type === `join`) {
1494
+ const { as: role } = maybeRole;
1495
+ const join = data.getJoin(token2, store);
1496
+ join.molecules.set(stringKey, molecule);
1497
+ molecule.joins.set(token2.key, join);
1498
+ const unsubFromFamily = family.subject.subscribe(
1499
+ `join:${token2.key}-${stringKey}`,
1500
+ (event) => {
1501
+ if (event.type === `molecule_disposal` && json.stringifyJson(event.token.key) === stringKey) {
1502
+ unsubFromFamily();
1503
+ join.molecules.delete(stringKey);
1504
+ }
1505
+ }
1506
+ );
1507
+ if (role === null) {
1508
+ return;
1509
+ }
1510
+ const otherRole = token2.a === role ? token2.b : token2.a;
1511
+ const relations = data.findRelations(token2, key);
1512
+ const relatedKeys = relations[`${otherRole}KeysOf${capitalize2(role)}`];
1513
+ const relatedEntries = relations[`${otherRole}EntriesOf${capitalize2(role)}`];
1514
+ let tokens = { relatedKeys };
1515
+ if (relatedEntries) {
1516
+ tokens = Object.assign(tokens, { relatedEntries });
1517
+ }
1518
+ return tokens;
1519
+ }
1520
+ return growMoleculeInStore(molecule, withdraw(token2, store), newest(store));
1521
+ },
1409
1522
  claim: (below, options) => {
1410
1523
  const { exclusive } = options;
1411
1524
  const belowMolecule = newest(store).molecules.get(json.stringifyJson(below.key));
@@ -1423,12 +1536,6 @@ function makeMoleculeInStore(store, context, familyToken, key, ...params) {
1423
1536
  }
1424
1537
  }
1425
1538
  },
1426
- join: (joinToken) => {
1427
- const join = data.getJoin(joinToken, store);
1428
- join.molecules.set(json.stringifyJson(key), molecule);
1429
- molecule.joins.set(joinToken.key, join);
1430
- return joinToken;
1431
- },
1432
1539
  spawn: (f, k, ...p) => makeMoleculeInStore(
1433
1540
  newest(store),
1434
1541
  [molecule],
@@ -1439,7 +1546,7 @@ function makeMoleculeInStore(store, context, familyToken, key, ...params) {
1439
1546
  };
1440
1547
  const family = withdraw(familyToken, store);
1441
1548
  const Constructor = family.new;
1442
- molecule.instance = new Constructor(transactors, key, ...params);
1549
+ molecule.instance = new Constructor(toolkit, key, ...params);
1443
1550
  const token = {
1444
1551
  type: `molecule`,
1445
1552
  key,
@@ -1740,18 +1847,18 @@ var buildTransaction = (key, params, store, id) => {
1740
1847
  params,
1741
1848
  output: void 0
1742
1849
  },
1743
- transactors: {
1744
- get: (token) => getFromStore(token, child),
1745
- set: (token, value) => {
1746
- setIntoStore(token, value, child);
1850
+ toolkit: {
1851
+ get: (...ps) => getFromStore(...ps, child),
1852
+ set: (...ps) => {
1853
+ setIntoStore(...ps, child);
1747
1854
  },
1748
1855
  run: (token, identifier = arbitrary()) => actUponStore(token, identifier, child),
1749
1856
  find: (token, k) => findInStore(token, k, child),
1750
1857
  seek: (token, k) => seekInStore(token, k, child),
1751
1858
  json: (token) => getJsonToken(token, child),
1752
1859
  make: (context, family, k, ...args) => makeMoleculeInStore(child, context, family, k, ...args),
1753
- dispose: (token) => {
1754
- disposeFromStore(token, child);
1860
+ dispose: (...ps) => {
1861
+ disposeFromStore(...ps, child);
1755
1862
  },
1756
1863
  env: () => getEnvironmentData(child)
1757
1864
  }
@@ -1779,8 +1886,8 @@ function createTransaction(options, store) {
1779
1886
  const childStore = buildTransaction(options.key, params, store, id);
1780
1887
  try {
1781
1888
  const target2 = newest(store);
1782
- const { transactors } = childStore.transactionMeta;
1783
- const output = options.do(transactors, ...params);
1889
+ const { toolkit } = childStore.transactionMeta;
1890
+ const output = options.do(toolkit, ...params);
1784
1891
  applyTransaction(output, target2);
1785
1892
  return output;
1786
1893
  } catch (thrown) {
@@ -1896,6 +2003,7 @@ var Store = class {
1896
2003
  for (const logger of this.loggers) logger.warn(...messages);
1897
2004
  }
1898
2005
  };
2006
+ this.config = __spreadValues(__spreadValues({}, store == null ? void 0 : store.config), config);
1899
2007
  if (store !== null) {
1900
2008
  this.valueMap = new Map(store == null ? void 0 : store.valueMap);
1901
2009
  this.operation = __spreadValues({}, store == null ? void 0 : store.operation);
@@ -1907,7 +2015,6 @@ var Store = class {
1907
2015
  )
1908
2016
  };
1909
2017
  }
1910
- this.config = __spreadValues(__spreadValues({}, store == null ? void 0 : store.config), config);
1911
2018
  for (const [, family] of store.families) {
1912
2019
  family.install(this);
1913
2020
  }
@@ -1,5 +1,5 @@
1
1
  import * as atom_io from 'atom.io';
2
- import { Func, TransactionToken, TransactionUpdate, TransactionOptions, TransactorsWithRunAndEnv, RegularAtomToken, MutableAtomToken, AtomToken, WritableSelectorToken, ReadonlySelectorToken, SelectorToken, WritableToken, MoleculeToken, MoleculeFamily, MoleculeFamilyToken, ReadableToken, TimelineManageable, Flat, StateUpdate, TokenType, FamilyMetadata, StateCreation, StateDisposal, MoleculeConstructor, MoleculeCreation, MoleculeDisposal, TimelineUpdate, TimelineOptions, TimelineToken, WritableSelectorFamily, MutableAtomFamily, RegularAtomFamily, ReadonlySelectorFamily, AtomIOLogger, Logger, AtomFamily, ReadableFamily, SelectorFamily, WritableFamily, RegularAtomFamilyToken, MutableAtomFamilyToken, AtomFamilyToken, ReadonlySelectorFamilyToken, WritableSelectorFamilyToken, SelectorFamilyToken, ReadableFamilyToken, WritableFamilyToken, MutableAtomOptions, MutableAtomFamilyOptions, RegularAtomOptions, RegularAtomFamilyOptions, ReadonlySelectorFamilyOptions, WritableSelectorFamilyOptions, MoleculeKey, KeyedStateUpdate, MoleculeFamilyOptions, MK, MoleculeParams, ReadonlySelectorOptions, WritableSelectorOptions, Transactors, UpdateHandler, TransactionUpdateHandler } from 'atom.io';
2
+ import { Func, TransactionToken, TransactionUpdate, TransactionOptions, ActorToolkit, RegularAtomToken, MutableAtomToken, AtomToken, WritableSelectorToken, ReadonlySelectorToken, SelectorToken, WritableToken, MoleculeToken, MoleculeFamily, MoleculeFamilyToken, ReadableToken, TimelineManageable, Flat, StateUpdate, TokenType, FamilyMetadata, StateCreation, StateDisposal, MoleculeConstructor, MoleculeCreation, MoleculeDisposal, TimelineUpdate, TimelineOptions, TimelineToken, WritableSelectorFamily, MutableAtomFamily, RegularAtomFamily, ReadonlySelectorFamily, AtomIOLogger, Logger, AtomFamily, ReadableFamily, SelectorFamily, WritableFamily, RegularAtomFamilyToken, MutableAtomFamilyToken, AtomFamilyToken, ReadonlySelectorFamilyToken, WritableSelectorFamilyToken, SelectorFamilyToken, ReadableFamilyToken, WritableFamilyToken, MutableAtomOptions, MutableAtomFamilyOptions, RegularAtomOptions, RegularAtomFamilyOptions, ReadonlySelectorFamilyOptions, WritableSelectorFamilyOptions, MoleculeKey, KeyedStateUpdate, MoleculeFamilyOptions, MK, MoleculeParams, ReadonlySelectorOptions, WritableSelectorOptions, SetterToolkit, UpdateHandler, TransactionUpdateHandler } from 'atom.io';
3
3
  import { Json, JsonInterface } from 'atom.io/json';
4
4
  import { Join } from 'atom.io/data';
5
5
 
@@ -134,7 +134,7 @@ type TransactionPhase = (typeof TRANSACTION_PHASES)[number];
134
134
  type TransactionProgress<F extends Func> = {
135
135
  phase: `applying` | `building`;
136
136
  update: TransactionUpdate<F>;
137
- transactors: TransactorsWithRunAndEnv;
137
+ toolkit: ActorToolkit;
138
138
  };
139
139
  type TransactionEpoch = {
140
140
  epoch: Map<string, number>;
@@ -397,7 +397,9 @@ declare function createRegularAtomFamily<T, K extends Json.Serializable>(options
397
397
  declare function createSelectorFamily<T, K extends Json.Serializable>(options: WritableSelectorFamilyOptions<T, K>, store: Store): WritableSelectorFamily<T, K>;
398
398
  declare function createSelectorFamily<T, K extends Json.Serializable>(options: ReadonlySelectorFamilyOptions<T, K>, store: Store): ReadonlySelectorFamily<T, K>;
399
399
 
400
- declare function disposeFromStore(token: MoleculeToken<any> | ReadableToken<any>, store?: Store): void;
400
+ declare function disposeFromStore(token: MoleculeToken<any> | ReadableToken<any>, store: Store): void;
401
+ declare function disposeFromStore<K extends Json.Serializable>(token: ReadableFamilyToken<any, K>, key: K, store: Store): void;
402
+ declare function disposeFromStore<M extends MoleculeConstructor>(token: MoleculeFamilyToken<M>, key: MoleculeKey<M>, store: Store): void;
401
403
 
402
404
  declare function findInStore<T extends Transceiver<any>, J extends Json.Serializable, K extends Json.Serializable, Key extends K>(token: MutableAtomFamilyToken<T, J, K>, key: Key, store: Store): MutableAtomToken<T, J>;
403
405
  declare function findInStore<T, K extends Json.Serializable, Key extends K>(token: RegularAtomFamilyToken<T, K>, key: Key, store: Store): RegularAtomToken<T>;
@@ -434,7 +436,8 @@ declare function getEnvironmentData(store: Store): EnvironmentData;
434
436
 
435
437
  declare function getFromStore<T>(token: ReadableToken<T>, store: Store): T;
436
438
  declare function getFromStore<M extends MoleculeConstructor>(token: MoleculeToken<M>, store: Store): InstanceType<M> | undefined;
437
- declare function getFromStore<T, M extends MoleculeConstructor, Token extends MoleculeToken<M> | ReadableToken<T>>(token: Token, store: Store): InstanceType<M> | T | undefined;
439
+ declare function getFromStore<T, K extends Json.Serializable>(token: ReadableFamilyToken<T, K>, key: K, store: Store): T;
440
+ declare function getFromStore<M extends MoleculeConstructor>(token: MoleculeFamilyToken<M>, key: MoleculeKey<M>, store: Store): InstanceType<M>;
438
441
 
439
442
  declare const readOrComputeValue: <T>(state: ReadableState<T>, target: Store) => T;
440
443
 
@@ -510,6 +513,7 @@ declare function makeMoleculeInStore<M extends MoleculeConstructor>(store: Store
510
513
  type AtomIOToken = MoleculeFamilyToken<any> | MoleculeToken<any> | ReadableFamilyToken<any, any> | ReadableToken<any> | TimelineToken<any> | TransactionToken<any>;
511
514
  declare class NotFoundError extends Error {
512
515
  constructor(token: AtomIOToken, store: Store);
516
+ constructor(familyToken: AtomIOToken, key: Json.Serializable, store: Store);
513
517
  }
514
518
 
515
519
  declare const createReadonlySelector: <T>(options: ReadonlySelectorOptions<T>, family: FamilyMetadata | undefined, store: Store) => ReadonlySelectorToken<T>;
@@ -523,12 +527,12 @@ declare function disposeSelector(selectorToken: ReadonlySelectorToken<unknown> |
523
527
 
524
528
  declare const getSelectorDependencyKeys: (key: string, store: Store) => (AtomKey<unknown> | ReadonlySelectorKey<unknown> | SelectorKey<unknown>)[];
525
529
 
526
- declare const registerSelector: (selectorKey: string, store: Store) => Transactors;
530
+ declare const registerSelector: (selectorKey: string, covered: Set<string>, store: Store) => SetterToolkit;
527
531
 
528
- declare const traceSelectorAtoms: (selectorKey: string, directDependencyKey: StateKey<unknown>, store: Store) => AtomKey<unknown>[];
532
+ declare const traceSelectorAtoms: (directDependencyKey: StateKey<unknown>, covered: Set<string>, store: Store) => AtomKey<unknown>[];
529
533
  declare const traceAllSelectorAtoms: (selector: Selector<any>, store: Store) => AtomKey<unknown>[];
530
534
 
531
- declare const updateSelectorAtoms: (selectorKey: string, dependency: ReadonlySelectorToken<unknown> | WritableToken<unknown>, store: Store) => void;
535
+ declare const updateSelectorAtoms: (selectorKey: string, dependency: ReadonlySelectorToken<unknown> | WritableToken<unknown>, covered: Set<string>, store: Store) => void;
532
536
 
533
537
  type Modify<T> = (thing: T) => T;
534
538
  declare const become: <T>(nextVersionOfThing: Modify<T> | T) => (originalThing: T) => T;
@@ -536,6 +540,7 @@ declare const become: <T>(nextVersionOfThing: Modify<T> | T) => (originalThing:
536
540
  declare const setAtomOrSelector: <T>(state: WritableState<T>, value: T | ((oldValue: T) => T), store: Store) => void;
537
541
 
538
542
  declare function setIntoStore<T, New extends T>(token: WritableToken<T>, value: New | ((oldValue: T) => New), store: Store): void;
543
+ declare function setIntoStore<T, K extends Json.Serializable, New extends T>(token: WritableFamilyToken<T, K>, key: K, value: New | ((oldValue: T) => New), store: Store): void;
539
544
 
540
545
  declare const subscribeToRootAtoms: <T>(selector: Selector<T>, store: Store) => (() => void)[];
541
546