atom.io 0.15.1 → 0.15.2

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 (38) hide show
  1. package/data/dist/index.cjs +4 -10
  2. package/data/dist/index.cjs.map +1 -1
  3. package/data/dist/index.d.ts +9 -9
  4. package/data/dist/index.js +4 -10
  5. package/data/dist/index.js.map +1 -1
  6. package/data/src/join.ts +13 -19
  7. package/dist/{chunk-S7R5MU6A.js → chunk-K22LR3V6.js} +3 -2
  8. package/dist/chunk-K22LR3V6.js.map +1 -0
  9. package/dist/index.cjs +2 -1
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.d.ts +6 -1
  12. package/dist/index.js +1 -1
  13. package/internal/dist/index.cjs +110 -92
  14. package/internal/dist/index.cjs.map +1 -1
  15. package/internal/dist/index.d.ts +7 -4
  16. package/internal/dist/index.js +110 -92
  17. package/internal/dist/index.js.map +1 -1
  18. package/internal/src/caching.ts +9 -7
  19. package/internal/src/index.ts +5 -0
  20. package/internal/src/mutable/tracker.ts +35 -17
  21. package/internal/src/read-or-compute-value.ts +8 -12
  22. package/internal/src/set-state/copy-mutable-in-transaction.ts +4 -4
  23. package/internal/src/set-state/set-atom-or-selector.ts +7 -4
  24. package/internal/src/transaction/apply-transaction.ts +1 -0
  25. package/package.json +4 -4
  26. package/react-devtools/dist/index.d.ts +2 -0
  27. package/realtime-react/dist/index.cjs.map +1 -1
  28. package/realtime-react/dist/index.d.ts +1 -1
  29. package/realtime-react/dist/index.js.map +1 -1
  30. package/realtime-react/src/use-pull-mutable-family-member.ts +1 -1
  31. package/src/index.ts +5 -0
  32. package/src/set-state.ts +3 -1
  33. package/transceivers/set-rtx/dist/index.cjs +8 -5
  34. package/transceivers/set-rtx/dist/index.cjs.map +1 -1
  35. package/transceivers/set-rtx/dist/index.js +8 -5
  36. package/transceivers/set-rtx/dist/index.js.map +1 -1
  37. package/transceivers/set-rtx/src/set-rtx.ts +8 -5
  38. package/dist/chunk-S7R5MU6A.js.map +0 -1
@@ -303,22 +303,16 @@ var Join = class {
303
303
  this.core = { findRelatedKeysState };
304
304
  const getRelatedKeys = ({ get }, key) => get(findRelatedKeysState(key));
305
305
  const addRelation = (transactors, a2, b2) => {
306
- const aKeys = getRelatedKeys(transactors, a2);
307
- const bKeys = getRelatedKeys(transactors, b2);
308
- transactors.set(findRelatedKeysState(a2), aKeys.add(b2));
309
- transactors.set(findRelatedKeysState(b2), bKeys.add(a2));
306
+ const aKeysState = findRelatedKeysState(a2);
307
+ const bKeysState = findRelatedKeysState(b2);
308
+ transactors.set(aKeysState, (aKeys) => aKeys.add(b2));
309
+ transactors.set(bKeysState, (bKeys) => bKeys.add(a2));
310
310
  };
311
311
  const deleteRelation = (transactors, a2, b2) => {
312
312
  const aKeys = getRelatedKeys(transactors, a2);
313
313
  aKeys.delete(b2);
314
- if (aKeys.size === 0) {
315
- atom_io.dispose(findRelatedKeysState(a2));
316
- }
317
314
  const bKeys = getRelatedKeys(transactors, b2);
318
315
  bKeys.delete(a2);
319
- if (bKeys.size === 0) {
320
- atom_io.dispose(findRelatedKeysState(b2));
321
- }
322
316
  };
323
317
  const replaceRelationsSafely = (transactors, a2, bs) => {
324
318
  const aRelations = getRelatedKeys(transactors, a2);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dict.ts","../src/join.ts","../../../rel8/junction/src/junction.ts","../src/struct.ts","../src/struct-family.ts","../src/until.ts"],"names":["IMPLICIT","a","b","createSelector","capitalize","createRegularAtomFamily","createSelectorFamily"],"mappings":";AAEA,SAAS,UAAU,sBAAsB;AAGlC,SAAS,KACf,WAIA,OAIA,QAAe,SAAS,OAC2C;AACnE,SAAO;AAAA,IACN;AAAA,MACC,KAAK,GAAG,UAAU,GAAG;AAAA,MACrB,KAAK,CAAC,EAAE,IAAI,MAAM;AACjB,cAAM,OAAO,IAAI,KAAK;AACtB,eAAO,KAAK,OAAO,CAAC,KAAK,QAAQ;AAChC,cAAI,GAAG,IAAI,IAAI,UAAU,GAAG,CAAC;AAC7B,iBAAO;AAAA,QACR,GAAG,CAAC,CAAQ;AAAA,MACb;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;;;ACrBA,SAAS,SAAS,UAAU,gBAAgB;AAE5C;AAAA,EACC,YAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAGP,SAAS,cAAc;;;ACgChB,IAAM,WAAN,MAIL;AAAA,EA0FM,YACN,MACA,QACC;AAzFF,SAAgB,YAAY,oBAAI,IAAyB;AACzD,SAAgB,WAAW,oBAAI,IAAqB;AAGpD,SAAO,iBAAiB,CAAC,GAAW,MAAsB,GAAG,CAAC,IAAI,CAAC;AAhEpE;AAsJE,SAAK,IAAI,KAAK,QAAQ,CAAC;AACvB,SAAK,IAAI,KAAK,QAAQ,CAAC;AAEvB,SAAK,cAAc,KAAK;AACxB,QAAI,EAAC,iCAAQ,gBAAe;AAC3B,WAAK,YAAY,IAAI,KAAI,UAAK,cAAL,mBAAgB,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE;AACzE,WAAK,WAAW,IAAI,IAAI,KAAK,QAAQ;AAAA,IACtC;AACA,SAAK,aAAY,sCAAQ,cAAR,YAAqB;AACtC,QAAI,iCAAQ,gBAAgB;AAC3B,WAAK,iBAAiB,OAAO;AAAA,IAC9B;AACA,QAAI,iCAAQ,eAAe;AAC1B,YAAM,gBAAgB,OAAO;AAC7B,WAAK,MAAM,CAAC,GAAG,MAAM,cAAc,IAAI,GAAG,CAAC;AAC3C,WAAK,cAAc,CAAC,GAAG,MAAM;AAC5B,sBAAc,YAAY,GAAG,CAAC;AAAA,MAC/B;AACA,WAAK,iBAAiB,CAAC,GAAG,MAAM;AAC/B,sBAAc,eAAe,GAAG,CAAC;AAAA,MAClC;AACA,WAAK,yBAAyB,CAAC,GAAG,OAAO;AACxC,sBAAc,uBAAuB,GAAG,EAAE;AAAA,MAC3C;AACA,WAAK,2BAA2B,CAAC,GAAG,OAAO;AAC1C,sBAAc,yBAAyB,GAAG,EAAE;AAAA,MAC7C;AACA,WAAK,iBAAiB,CAAC,QAAQ,cAAc,eAAe,GAAG;AAC/D,UAAI,cAAc,YAAY;AAC7B,aAAK,qBAAqB,CAAC,eAAe;AACzC,iBAAO,cAAc,WAAW,UAAU;AAAA,QAC3C;AACA,aAAK,aAAa,CAAC,YAAY,YAAY;AAC1C,wBAAc,WAAW,YAAY,OAAc;AAAA,QACpD;AACA,aAAK,gBAAgB,CAAC,eAAe;AACpC,wBAAc,cAAc,UAAU;AAAA,QACvC;AAAA,MACD;AACA,iBAAW,CAAC,GAAG,EAAE,MAAK,UAAK,cAAL,YAAkB,CAAC,GAAG;AAC3C,mBAAW,KAAK;AAAI,eAAK,YAAY,GAAG,CAAC;AAAA,MAC1C;AACA,iBAAW,CAAC,YAAY,OAAO,MAAK,UAAK,aAAL,YAAiB,CAAC,GAAG;AACxD,aAAK,WAAW,YAAY,OAAO;AAAA,MACpC;AAAA,IACD;AAAA,EACD;AAAA,EAlIO,eAAe,KAAsC;AAC3D,WAAO,KAAK,UAAU,IAAI,GAAG;AAAA,EAC9B;AAAA,EACU,YAAY,GAAW,GAAiB;AACjD,QAAI,aAAa,KAAK,UAAU,IAAI,CAAC;AACrC,QAAI,aAAa,KAAK,UAAU,IAAI,CAAC;AACrC,QAAI,YAAY;AACf,iBAAW,IAAI,CAAC;AAAA,IACjB,OAAO;AACN,mBAAa,oBAAI,IAAI,CAAC,CAAC,CAAC;AACxB,WAAK,UAAU,IAAI,GAAG,UAAU;AAAA,IACjC;AACA,QAAI,YAAY;AACf,iBAAW,IAAI,CAAC;AAAA,IACjB,OAAO;AACN,mBAAa,oBAAI,IAAI,CAAC,CAAC,CAAC;AACxB,WAAK,UAAU,IAAI,GAAG,UAAU;AAAA,IACjC;AAAA,EACD;AAAA,EACU,eAAe,GAAW,GAAiB;AACpD,UAAM,aAAa,KAAK,UAAU,IAAI,CAAC;AACvC,QAAI,YAAY;AACf,iBAAW,OAAO,CAAC;AACnB,UAAI,WAAW,SAAS,GAAG;AAC1B,aAAK,UAAU,OAAO,CAAC;AAAA,MACxB;AACA,YAAM,aAAa,KAAK,UAAU,IAAI,CAAC;AACvC,UAAI,YAAY;AACf,mBAAW,OAAO,CAAC;AACnB,YAAI,WAAW,SAAS,GAAG;AAC1B,eAAK,UAAU,OAAO,CAAC;AAAA,QACxB;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEU,yBAAyB,GAAW,IAAoB;AACjE,SAAK,UAAU,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;AACjC,eAAW,KAAK,IAAI;AACnB,YAAM,aAAa,oBAAI,IAAI,CAAC,CAAC,CAAC;AAC9B,WAAK,UAAU,IAAI,GAAG,UAAU;AAAA,IACjC;AAAA,EACD;AAAA,EACU,uBAAuB,GAAW,IAAoB;AAC/D,UAAM,iBAAiB,KAAK,UAAU,IAAI,CAAC;AAC3C,QAAI,gBAAgB;AACnB,iBAAW,KAAK,gBAAgB;AAC/B,cAAM,aAAa,KAAK,UAAU,IAAI,CAAC;AACvC,YAAI,YAAY;AACf,cAAI,WAAW,SAAS,GAAG;AAC1B,iBAAK,UAAU,OAAO,CAAC;AAAA,UACxB,OAAO;AACN,uBAAW,OAAO,CAAC;AAAA,UACpB;AACA,eAAK,SAAS,OAAO,KAAK,eAAe,GAAG,CAAC,CAAC;AAAA,QAC/C;AAAA,MACD;AAAA,IACD;AACA,SAAK,UAAU,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;AACjC,eAAW,KAAK,IAAI;AACnB,UAAI,aAAa,KAAK,UAAU,IAAI,CAAC;AACrC,UAAI,YAAY;AACf,mBAAW,IAAI,CAAC;AAAA,MACjB,OAAO;AACN,qBAAa,oBAAI,IAAI,CAAC,CAAC,CAAC;AACxB,aAAK,UAAU,IAAI,GAAG,UAAU;AAAA,MACjC;AAAA,IACD;AAAA,EACD;AAAA,EAEU,mBAAmB,YAAyC;AACrE,WAAO,KAAK,SAAS,IAAI,UAAU;AAAA,EACpC;AAAA,EACU,WAAW,YAAoB,SAAwB;AAChE,SAAK,SAAS,IAAI,YAAY,OAAO;AAAA,EACtC;AAAA,EACU,cAAc,YAA0B;AACjD,SAAK,SAAS,OAAO,UAAU;AAAA,EAChC;AAAA,EAqDO,SAA8C;AACpD,WAAO;AAAA,MACN,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;AAAA,MACxB,aAAa,KAAK;AAAA,MAClB,WAAW,CAAC,GAAG,KAAK,UAAU,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAAA,MACpE,UAAU,CAAC,GAAG,KAAK,SAAS,QAAQ,CAAC;AAAA,IACtC;AAAA,EACD;AAAA,EAUO,IACN,MACG,MAGI;AA3NT;AA4NE,UAAM,IACL,OAAO,KAAK,CAAC,MAAM,WAChB,KAAK,CAAC,IACL,EAAE,KAAK,CAAmB;AAC/B,UAAM,YACL,UAAK,CAAC,MAAN,YAAW,OAAO,KAAK,CAAC,MAAM,YAAW,SAAa,KAAK,CAAC;AAC7D,QAAI,OAAO,MAAM,WAAW,IAAI,EAAE,KAAK,CAAC;AACxC,YAAQ,KAAK,aAAa;AAAA,MAEzB,KAAK,OAAO;AACX,cAAM,QAAQ,KAAK,cAAc,CAAC;AAClC,YAAI,SAAS,UAAU;AAAG,eAAK,OAAO,OAAO,CAAC;AAAA,MAC/C;AAAA,MACA,KAAK,OAAO;AACX,cAAM,QAAQ,KAAK,cAAc,CAAC;AAClC,YAAI,SAAS,UAAU;AAAG,eAAK,OAAO,OAAO,CAAC;AAAA,MAC/C;AAAA,IACD;AACA,QAAI,SAAS;AACZ,YAAM,aAAa,KAAK,eAAe,GAAG,CAAC;AAC3C,WAAK,WAAW,YAAY,OAAO;AAAA,IACpC;AACA,SAAK,YAAY,GAAG,CAAC;AACrB,WAAO;AAAA,EACR;AAAA,EAUO,OACN,GAKA,GACO;AAEP,QAAI,OAAO,MAAM,WAAW,IAAK,EAAE,KAAK,CAAC;AAEzC,UAAM,IAAI,OAAO,MAAM,WAAW,IAAK,EAAE,KAAK,CAAC;AAE/C,QAAI,MAAM,UAAa,OAAO,MAAM,UAAU;AAC7C,YAAM,aAAa,KAAK,eAAe,CAAC;AACxC,UAAI,YAAY;AACf,mBAAWC,MAAK,YAAY;AAC3B,eAAK,OAAOA,IAAG,CAAC;AAAA,QACjB;AAAA,MACD;AAAA,IACD;AACA,QAAI,OAAO,MAAM,YAAY,MAAM,QAAW;AAC7C,YAAM,aAAa,KAAK,eAAe,CAAC;AACxC,UAAI,YAAY;AACf,mBAAWC,MAAK,YAAY;AAC3B,eAAK,OAAO,GAAGA,EAAC;AAAA,QACjB;AAAA,MACD;AAAA,IACD;AACA,QAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;AACnD,WAAK,eAAe,GAAG,CAAC;AACxB,YAAM,aAAa,KAAK,eAAe,GAAG,CAAC;AAC3C,WAAK,cAAc,UAAU;AAAA,IAC9B;AACA,WAAO;AAAA,EACR;AAAA,EAEO,cAAc,KAAiC;AACrD,UAAM,YAAY,KAAK,eAAe,GAAG;AACzC,QAAI,WAAW;AACd,UAAI,UAAU,OAAO,GAAG;AACvB,gBAAQ;AAAA,UACP,GAAG,UAAU,IAAI,qCAAqC,GAAG,OAAO;AAAA,YAC/D,GAAG;AAAA,UACJ,EACE,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EACnB,KAAK,IAAI,CAAC;AAAA,QACb;AAAA,MACD;AACA,iBAAW,YAAY,WAAW;AACjC,eAAO;AAAA,MACR;AAAA,IACD;AAAA,EACD;AAAA,EAEO,iBACN,GACA,WACA,QACO;AACP,UAAM,aAAa,CAAC,MAAM,QAAQ,SAAS;AAC3C,UAAM,KAAK,aAAa,OAAO,KAAK,SAAS,IAAI;AACjD,QAAI,iCAAQ,UAAU;AACrB,WAAK,yBAAyB,GAAG,EAAE;AAAA,IACpC,OAAO;AACN,WAAK,uBAAuB,GAAG,EAAE;AAAA,IAClC;AACA,QAAI,YAAY;AACf,iBAAW,KAAK,IAAI;AACnB,cAAM,aAAa,KAAK,eAAe,GAAG,CAAC;AAC3C,cAAM,UAAU,UAAU,CAAC;AAC3B,aAAK,WAAW,YAAY,OAAO;AAAA,MACpC;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA,EAEO,WAAW,GAAW,GAAgC;AAC5D,UAAM,aAAa,KAAK,eAAe,GAAG,CAAC;AAC3C,WAAO,KAAK,mBAAmB,UAAU;AAAA,EAC1C;AAAA,EAEO,mBACN,OACsB;AACtB,UAAM,IAAyB,MAAc,KAAK,CAAC;AACnD,UAAM,IAAyB,MAAc,KAAK,CAAC;AACnD,QAAI,MAAM,UAAa,MAAM,QAAW;AACvC,YAAM,aAAa,KAAK,eAAe,CAAC;AACxC,UAAI,YAAY;AACf,eAAO,CAAC,GAAG,UAAU,EAAE,IAAI,CAACA,OAAM;AAxVtC;AAyVK,iBAAO,CAACA,KAAG,UAAK,WAAW,GAAGA,EAAC,MAApB,YAA0B,IAAgB;AAAA,QACtD,CAAC;AAAA,MACF;AAAA,IACD;AACA,QAAI,MAAM,UAAa,MAAM,QAAW;AACvC,YAAM,aAAa,KAAK,eAAe,CAAC;AACxC,UAAI,YAAY;AACf,eAAO,CAAC,GAAG,UAAU,EAAE,IAAI,CAACD,OAAM;AAhWtC;AAiWK,iBAAO,CAACA,KAAG,UAAK,WAAWA,IAAG,CAAC,MAApB,YAA0B,IAAgB;AAAA,QACtD,CAAC;AAAA,MACF;AAAA,IACD;AACA,WAAO,CAAC;AAAA,EACT;AAAA,EAEO,IAAI,GAAW,GAAqB;AAxW5C;AAyWE,QAAI,GAAG;AACN,YAAM,OAAO,KAAK,eAAe,CAAC;AAClC,cAAO,kCAAM,IAAI,OAAV,YAAgB;AAAA,IACxB;AACA,WAAO,KAAK,UAAU,IAAI,CAAC;AAAA,EAC5B;AACD;;;ADhVA,IAAM,cAA2B,EAAE,KAAK,UAAU,KAAK,SAAS;AAEhE,SAAS,WAA6B,QAA0B;AAC/D,SAAQ,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AACjD;AAiFO,IAAM,OAAN,MAKL;AAAA,EAmBM,YACN,SACA,gBACA,QAAeD,UAAS,OACvB;AAtBF,SAAQ,cAA2B;AAuBlC,UAAM,IAAW,QAAQ,QAAQ,CAAC;AAClC,UAAM,IAAW,QAAQ,QAAQ,CAAC;AAClC,UAAM,uBAAuB;AAAA,MAK5B;AAAA,QACC,KAAK,GAAG,QAAQ,GAAG;AAAA,QACnB,SAAS,MAAM,IAAI,OAAO;AAAA,QAC1B,SAAS;AAAA,QACT,UAAU,CAAC,SAAS,OAAO,SAAS,IAAI;AAAA,QACxC,QAAQ,CAAC,QAAQ,IAAI,OAAO;AAAA,MAC7B;AAAA,MACA;AAAA,IACD;AACA,SAAK,OAAO,EAAE,qBAAqB;AACnC,UAAM,iBAAwD,CAC7D,EAAE,IAAI,GACN,QACI,IAAI,qBAAqB,GAAG,CAAC;AAClC,UAAM,cAAqD,CAC1D,aACAC,IACAC,OACI;AACJ,YAAM,QAAQ,eAAe,aAAaD,EAAC;AAC3C,YAAM,QAAQ,eAAe,aAAaC,EAAC;AAC3C,kBAAY,IAAI,qBAAqBD,EAAC,GAAG,MAAM,IAAIC,EAAC,CAAC;AACrD,kBAAY,IAAI,qBAAqBA,EAAC,GAAG,MAAM,IAAID,EAAC,CAAC;AAAA,IACtD;AACA,UAAM,iBAAwD,CAC7D,aACAA,IACAC,OACI;AACJ,YAAM,QAAQ,eAAe,aAAaD,EAAC;AAC3C,YAAM,OAAOC,EAAC;AACd,UAAI,MAAM,SAAS,GAAG;AACrB,gBAAQ,qBAAqBD,EAAC,CAAC;AAAA,MAChC;AACA,YAAM,QAAQ,eAAe,aAAaC,EAAC;AAC3C,YAAM,OAAOD,EAAC;AACd,UAAI,MAAM,SAAS,GAAG;AACrB,gBAAQ,qBAAqBC,EAAC,CAAC;AAAA,MAChC;AAAA,IACD;AACA,UAAM,yBAAmE,CACxE,aACAD,IACA,OACI;AACJ,YAAM,aAAa,eAAe,aAAaA,EAAC;AAChD,iBAAWC,MAAK,YAAY;AAC3B,cAAM,QAAQ,eAAe,aAAaA,EAAC;AAC3C,YAAI,OAAO;AACV,gBAAM,OAAOD,EAAC;AACd,cAAI,MAAM,SAAS,GAAG;AACrB,oBAAQ,qBAAqBC,EAAC,CAAC;AAAA,UAChC;AAAA,QACD;AAAA,MACD;AACA,kBAAY,IAAI,qBAAqBD,EAAC,GAAG,IAAI,OAAO,EAAE,CAAC;AACvD,iBAAWC,MAAK,IAAI;AACnB,cAAM,QAAQ,eAAe,aAAaA,EAAC;AAC3C,cAAM,IAAID,EAAC;AAAA,MACZ;AAAA,IACD;AACA,UAAM,2BAAqE,CAC1E,aACAA,IACA,OACI;AACJ,kBAAY,IAAI,qBAAqBA,EAAC,GAAG,IAAI,OAAO,EAAE,CAAC;AACvD,iBAAWC,MAAK,IAAI;AACnB,cAAM,QAAQ,eAAe,aAAaA,EAAC;AAC3C,cAAM,IAAID,EAAC;AAAA,MACZ;AAAA,IACD;AACA,UAAM,MAAgD,CACrD,aACAA,IACAC,OACI;AACJ,YAAM,QAAQ,eAAe,aAAaD,EAAC;AAC3C,aAAOC,KAAI,MAAM,IAAIA,EAAC,IAAI,MAAM,OAAO;AAAA,IACxC;AACA,UAAM,iCAAiE;AAAA,MACtE,gBAAgB,CAAC,QAAQ,eAAe,KAAK,aAAa,GAAG;AAAA,MAC7D,aAAa,CAACD,IAAGC,OAAM,YAAY,KAAK,aAAaD,IAAGC,EAAC;AAAA,MACzD,gBAAgB,CAACD,IAAGC,OAAM,eAAe,KAAK,aAAaD,IAAGC,EAAC;AAAA,MAC/D,wBAAwB,CAACD,IAAG,OAC3B,uBAAuB,KAAK,aAAaA,IAAG,EAAE;AAAA,MAC/C,0BAA0B,CAACA,IAAG,OAC7B,yBAAyB,KAAK,aAAaA,IAAG,EAAE;AAAA,MACjD,KAAK,CAACA,IAAGC,OAAM,IAAI,KAAK,aAAaD,IAAGC,EAAC;AAAA,IAC1C;AACA,QAAI;AACJ,QAAI;AACJ,QAAI,gBAAgB;AACnB,yBAAmB;AAAA,QAClB;AAAA,UACC,KAAK,GAAG,QAAQ,GAAG;AAAA,UACnB,SAAS;AAAA,QACV;AAAA,QACA;AAAA,MACD;AACA,YAAM,aAAoD,CAAC,EAAE,IAAI,GAAG,QACnE,IAAI,iBAAiB,GAAG,CAAC;AAC1B,YAAM,aAA6D,CAClE,aACA,KACA,YACI,YAAY,IAAI,iBAAiB,GAAG,GAAG,OAAO;AACnD,YAAM,gBAA8C,CAAC,GAAG,QACvD,QAAQ,iBAAiB,GAAG,CAAC;AAC9B,YAAM,wCAAwC;AAAA,QAC7C,YAAY,CAAC,eAAuB;AACnC,gBAAM,UAAU,WAAW,KAAK,aAAa,UAAU;AACvD,iBAAO;AAAA,QACR;AAAA,QACA,YAAY,CAAC,YAAoB,YAAqB;AACrD,qBAAW,KAAK,aAAa,YAAY,OAAO;AAAA,QACjD;AAAA,QACA,eAAe,CAAC,eAAuB;AACtC,wBAAc,KAAK,aAAa,UAAU;AAAA,QAC3C;AAAA,MACD;AACA,sBAAgB,OAAO;AAAA,QACtB;AAAA,QACA;AAAA,MACD;AAAA,IACD,OAAO;AACN,sBACC;AAAA,IACF;AACA,UAAM,YAAY,IAAI,SAAgC,SAAS;AAAA,MAC9D;AAAA,MACA,gBAAgB,IAAI,SAAS,KAAK,KAAK,EAAE,KAAK,GAAG;AAAA,IAClD,CAAC;AAED,UAAM,6BAA6B,MAClC;AAAA,MACC;AAAA,QACC,KAAK,GAAG,QAAQ,GAAG;AAAA,QACnB,KACC,CAAC,QACD,CAAC,EAAE,IAAI,MAAM;AACZ,gBAAM,cAAc,IAAI,qBAAqB,GAAG,CAAC;AACjD,qBAAW,cAAc,aAAa;AACrC,mBAAO;AAAA,UACR;AACA,iBAAO;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,IACD;AACD,UAAM,4BAA4B,MAAM;AACvC,aAAO;AAAA,QACN;AAAA,UACC,KAAK,GAAG,QAAQ,GAAG;AAAA,UACnB,KACC,CAAC,QACD,CAAC,EAAE,IAAI,MAAM;AACZ,kBAAM,aAAa,cAAc,sBAAsB,KAAK;AAC5D,kBAAM,OAAO,IAAI,WAAW,GAAG,CAAC;AAChC,mBAAO,KAAK;AAAA,UACb;AAAA,QACF;AAAA,QACA;AAAA,MACD;AAAA,IACD;AACA,UAAM,+BAA+B,MACpC;AAAA,MACC;AAAA,QACC,KAAK,GAAG,QAAQ,GAAG;AAAA,QACnB,KACC,CAAC,QACD,CAAC,EAAE,IAAI,MAAM;AACZ,gBAAM,cAAc,IAAI,qBAAqB,GAAG,CAAC;AACjD,qBAAW,cAAc,aAAa;AACrC,kBAAM,aAAa,UAAU,eAAe,KAAK,UAAU;AAC3D,mBAAO,CAAC,YAAY,IAAI,iBAAiB,UAAU,CAAC,CAAC;AAAA,UACtD;AACA,iBAAO;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,IACD;AACD,UAAM,8BAA8B,MACnC;AAAA,MACC;AAAA,QACC,KAAK,GAAG,QAAQ,GAAG;AAAA,QACnB,KACC,CAAC,QACD,CAAC,EAAE,IAAI,MAAM;AACZ,gBAAM,aAAa,cAAc,sBAAsB,KAAK;AAC5D,gBAAM,OAAO,IAAI,WAAW,GAAG,CAAC;AAChC,iBAAO,KAAK,QAAQ,IAAI,CAAC,eAAe;AACvC,kBAAM,aAAa,UAAU,eAAe,KAAK,UAAU;AAC3D,mBAAO,CAAC,YAAY,IAAI,iBAAiB,UAAU,CAAC,CAAC;AAAA,UACtD,CAAC;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,IACD;AAED,YAAQ,QAAQ,aAAa;AAAA,MAC5B,KAAK,OAAO;AACX,cAAM,4BAA4B,2BAA2B;AAC7D,cAAM,YAAY,GAAG,CAAC,QAAQ,WAAW,CAAC,CAAC;AAC3C,cAAM,YAAY,GAAG,CAAC,QAAQ,WAAW,CAAC,CAAC;AAC3C,cAAM,gBAAgB;AAAA,UACrB,CAAC,SAAS,GAAG;AAAA,UACb,CAAC,SAAS,GAAG;AAAA,QACd;AACA,YAAI;AACJ,YAAI,gBAAgB;AACnB,gBAAM,8BAA8B,6BAA6B;AACjE,gBAAM,mBAAmB,GAAG,CAAC,UAAU,WAAW,CAAC,CAAC;AACpD,gBAAM,mBAAmB,GAAG,CAAC,UAAU,WAAW,CAAC,CAAC;AACpD,gBAAM,uBAAuB;AAAA,YAC5B,CAAC,gBAAgB,GAAG;AAAA,YACpB,CAAC,gBAAgB,GAAG;AAAA,UACrB;AACA,sBAAY,OAAO,OAAO,eAAe,oBAAoB;AAAA,QAC9D,OAAO;AACN,sBAAY;AAAA,QACb;AACA,aAAK,YAAY;AACjB,aAAK,YAAY;AACjB;AAAA,MACD;AAAA,MACA,KAAK,OAAO;AACX,cAAM,4BAA4B,2BAA2B;AAC7D,cAAM,+BAA+B,0BAA0B;AAC/D,cAAM,YAAY,GAAG,CAAC,QAAQ,WAAW,CAAC,CAAC;AAC3C,cAAM,YAAY,GAAG,CAAC,SAAS,WAAW,CAAC,CAAC;AAC5C,cAAM,gBAAgB;AAAA,UACrB,CAAC,SAAS,GAAG;AAAA,UACb,CAAC,SAAS,GAAG;AAAA,QACd;AACA,YAAI;AACJ,YAAI,gBAAgB;AACnB,gBAAM,8BAA8B,6BAA6B;AACjE,gBAAM,kCAAkC,4BAA4B;AACpE,gBAAM,mBAAmB,GAAG,CAAC,UAAU,WAAW,CAAC,CAAC;AACpD,gBAAM,mBAAmB,GAAG,CAAC,YAAY,WAAW,CAAC,CAAC;AACtD,gBAAM,uBAAuB;AAAA,YAC5B,CAAC,gBAAgB,GAAG;AAAA,YACpB,CAAC,gBAAgB,GAAG;AAAA,UACrB;AACA,sBAAY,OAAO,OAAO,eAAe,oBAAoB;AAAA,QAC9D,OAAO;AACN,sBAAY;AAAA,QACb;AACA,aAAK,YAAY;AACjB,aAAK,YAAY;AACjB;AAAA,MACD;AAAA,MACA,SAAS;AACR,cAAM,+BAA+B,0BAA0B;AAC/D,cAAM,YAAY,GAAG,CAAC,SAAS,WAAW,CAAC,CAAC;AAC5C,cAAM,YAAY,GAAG,CAAC,SAAS,WAAW,CAAC,CAAC;AAC5C,cAAM,gBAAgB;AAAA,UACrB,CAAC,SAAS,GAAG;AAAA,UACb,CAAC,SAAS,GAAG;AAAA,QACd;AACA,YAAI;AACJ,YAAI,gBAAgB;AACnB,gBAAM,kCAAkC,4BAA4B;AACpE,gBAAM,mBAAmB,GAAG,CAAC,YAAY,WAAW,CAAC,CAAC;AACtD,gBAAM,mBAAmB,GAAG,CAAC,YAAY,WAAW,CAAC,CAAC;AACtD,gBAAM,uBAAuB;AAAA,YAC5B,CAAC,gBAAgB,GAAG;AAAA,YACpB,CAAC,gBAAgB,GAAG;AAAA,UACrB;AACA,sBAAY,OAAO,OAAO,eAAe,oBAAoB;AAAA,QAC9D,OAAO;AACN,sBAAY;AAAA,QACb;AACA,aAAK,YAAY;AACjB,aAAK,YAAY;AAAA,MAClB;AAAA,IACD;AAAA,EACD;AAAA,EA1SO,SACN,aACA,KACO;AACP,SAAK,cAAc;AACnB,QAAI,IAAI;AACR,SAAK,cAAc;AAAA,EACpB;AAoSD;AAgDO,SAAS,KAMf,SACA,gBACA,QAAeF,UAAS,OACmB;AAC3C,SAAO,IAAI,KAAK,SAAS,gBAAgB,KAAK;AAC/C;;;AExeA,SAAS,YAAAA,iBAAgB;AAEzB,SAAS,mBAAmB,kBAAAG,uBAAsB;AAElD,IAAMC,cAAa,CAAC,QAAgB,IAAI,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAE/D,SAAS,OAIf,SAIA,QAAeJ,UAAS,OAQvB;AACD,QAAM,QAIF,OAAO,KAAK,QAAQ,OAAO,EAAE,OAAO,CAAC,KAAK,QAAQ;AACrD,UAAM,WAAW,QAAQ,MAAMI,YAAW,GAAG,IAAI;AACjD,QAAI,QAAQ,IAAI;AAAA,MACf;AAAA,QACC,KAAK,GAAG,QAAQ,GAAG,IAAI,GAAG;AAAA,QAC1B,SAAS,QAAQ,QAAQ,GAAG;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,WAAO;AAAA,EACR,GAAG,CAAC,CAAQ;AACZ,QAAM,cAAcD;AAAA,IACnB;AAAA,MACC,KAAK,QAAQ;AAAA,MACb,KAAK,CAAC,EAAE,IAAI,MAAM;AACjB,eAAO,OAAO,KAAK,QAAQ,OAAO,EAAE,OAAO,CAAC,KAAK,QAAQ;AACxD,cAAI,GAAG,IAAI,IAAI,MAAM,QAAQ,MAAMC,YAAW,GAAG,IAAI,OAAO,CAAC;AAC7D,iBAAO;AAAA,QACR,GAAG,CAAC,CAAQ;AAAA,MACb;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACA,SAAO,CAAC,OAAO,WAAW;AAC3B;;;ACtDA;AAAA,EACC,YAAAJ;AAAA,EACA,2BAAAK;AAAA,EACA,wBAAAC;AAAA,OACM;AAEP,IAAMF,cAAa,CAAC,QAAgB,IAAI,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AACtE,IAAM,aAAa,CAAC,QAAgB,WACnC,SAASA,YAAW,MAAM,IAAIA,YAAW,MAAM,IAAI;AAE7C,SAAS,aAGd,SAUA;AACD,QAAM,QAIF,OAAO,KAAK,QAAQ,OAAO,EAAE,OAAO,CAAC,KAAK,WAAW;AACxD,UAAM,iBAAiB,WAAW,QAAQ,KAAK,MAAM;AACrD,QAAI,cAAc,IAAIC;AAAA,MACrB;AAAA,QACC,KAAK,GAAG,QAAQ,GAAG,IAAI,MAAM;AAAA,QAC7B,SAAU,QAAQ,QAAgB,MAAM;AAAA,MACzC;AAAA,MACAL,UAAS;AAAA,IACV;AACA,WAAO;AAAA,EACR,GAAG,CAAC,CAAQ;AACZ,QAAM,kBAAkBM;AAAA,IACvB;AAAA,MACC,KAAK,QAAQ;AAAA,MACb,KACC,CAAC,OACD,CAAC,EAAE,IAAI,MAAM;AACZ,eAAO,OAAO,KAAK,QAAQ,OAAO,EAAE,OAAO,CAAC,KAAK,WAAW;AAC3D,cAAI,MAAM,IAAI;AAAA,YACZ,MAAc,WAAW,QAAQ,KAAK,MAAM,CAAC,EAAE,EAAE;AAAA,UACnD;AACA,iBAAO;AAAA,QACR,GAAG,CAAC,CAAQ;AAAA,MACb;AAAA,IACF;AAAA,IACAN,UAAS;AAAA,EACV;AACA,SAAO,CAAC,OAAO,eAAe;AAC/B;;;AChDO,SAAS,MAAS,UAAuB,UAAgB;AAC/D,MAAI,oBAAoB,SAAS;AAChC,WAAO;AAAA,EACR;AACA,SAAO;AACR","sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, createSelector } from \"atom.io/internal\"\nimport type { Json, Stringified } from \"atom.io/json\"\n\nexport function dict<State, Key extends Json.Serializable>(\n\tfindState:\n\t\t| AtomIO.AtomFamily<State, Key>\n\t\t| AtomIO.ReadonlySelectorFamily<State, Key>\n\t\t| AtomIO.SelectorFamily<State, Key>,\n\tindex:\n\t\t| AtomIO.AtomToken<Key[]>\n\t\t| AtomIO.ReadonlySelectorToken<Key[]>\n\t\t| AtomIO.SelectorToken<Key[]>,\n\tstore: Store = IMPLICIT.STORE,\n): AtomIO.ReadonlySelectorToken<{ [K in Stringified<Key>]: State }> {\n\treturn createSelector(\n\t\t{\n\t\t\tkey: `${findState.key}Dict`,\n\t\t\tget: ({ get }) => {\n\t\t\t\tconst keys = get(index)\n\t\t\t\treturn keys.reduce((acc, key) => {\n\t\t\t\t\tacc[key] = get(findState(key))\n\t\t\t\t\treturn acc\n\t\t\t\t}, {} as any)\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t\tstore,\n\t)\n}\n","/* eslint-disable @typescript-eslint/ban-types */\nimport type {\n\tAtomFamily,\n\tMutableAtomFamily,\n\tRead,\n\tSelectorFamily,\n\tTransactors,\n\tWrite,\n} from \"atom.io\"\nimport { dispose, getState, setState } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tcreateMutableAtomFamily,\n\tcreateRegularAtomFamily,\n\tcreateSelectorFamily,\n\tgetJsonFamily,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { SetRTXJson } from \"atom.io/transceivers/set-rtx\"\nimport { SetRTX } from \"atom.io/transceivers/set-rtx\"\n\nimport type {\n\tBaseExternalStoreConfiguration,\n\tExternalStoreConfiguration,\n\tJunctionEntries,\n\tJunctionSchema,\n} from \"~/packages/rel8/junction/src\"\nimport { Junction } from \"~/packages/rel8/junction/src\"\nimport type * as Rel8 from \"~/packages/rel8/types/src\"\n\nconst TRANSACTORS: Transactors = { get: getState, set: setState }\n\nfunction capitalize<S extends string>(string: S): Capitalize<S> {\n\treturn (string[0].toUpperCase() + string.slice(1)) as Capitalize<S>\n}\n\nexport interface JoinOptions<\n\tASide extends string,\n\tBSide extends string,\n\tCardinality extends Rel8.Cardinality,\n\tContent extends Json.Object | null,\n> extends Json.Object,\n\t\tJunctionSchema<ASide, BSide>,\n\t\tPartial<JunctionEntries<Content>> {\n\treadonly key: string\n\treadonly cardinality: Cardinality\n}\n\nexport type JoinState<\n\tASide extends string,\n\tBSide extends string,\n\tCardinality extends Rel8.Cardinality,\n\tContent extends Json.Object | null,\n> = Cardinality extends `1:1`\n\t? (Content extends Json.Object\n\t\t\t? {\n\t\t\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t\t\t? `${AB}EntryOf${Capitalize<BSide>}`\n\t\t\t\t\t\t: `${AB}EntryOf${Capitalize<ASide>}`]: SelectorFamily<\n\t\t\t\t\t\t[string, Content] | null,\n\t\t\t\t\t\tstring\n\t\t\t\t\t>\n\t\t\t }\n\t\t\t: {}) & {\n\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t? `${AB}KeyOf${Capitalize<BSide>}`\n\t\t\t\t: `${AB}KeyOf${Capitalize<ASide>}`]: SelectorFamily<\n\t\t\t\tstring | null,\n\t\t\t\tstring\n\t\t\t>\n\t }\n\t: Cardinality extends `1:n`\n\t ? (Content extends Json.Object\n\t\t\t\t? {\n\t\t\t\t\t\treadonly [A in ASide as `${A}EntryOf${Capitalize<BSide>}`]: SelectorFamily<\n\t\t\t\t\t\t\t[string, Content] | null,\n\t\t\t\t\t\t\tstring\n\t\t\t\t\t\t>\n\t\t\t\t } & {\n\t\t\t\t\t\treadonly [B in BSide as `${B}EntriesOf${Capitalize<ASide>}`]: SelectorFamily<\n\t\t\t\t\t\t\t[string, Content][],\n\t\t\t\t\t\t\tstring\n\t\t\t\t\t\t>\n\t\t\t\t }\n\t\t\t\t: {}) & {\n\t\t\t\treadonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: SelectorFamily<\n\t\t\t\t\tstring | null,\n\t\t\t\t\tstring\n\t\t\t\t>\n\t\t } & {\n\t\t\t\treadonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: SelectorFamily<\n\t\t\t\t\tstring[],\n\t\t\t\t\tstring\n\t\t\t\t>\n\t\t }\n\t : Cardinality extends `n:n`\n\t\t ? (Content extends Json.Object\n\t\t\t\t\t? {\n\t\t\t\t\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t\t\t\t\t? `${AB}EntriesOf${Capitalize<BSide>}`\n\t\t\t\t\t\t\t\t: `${AB}EntriesOf${Capitalize<ASide>}`]: SelectorFamily<\n\t\t\t\t\t\t\t\t[string, Content][],\n\t\t\t\t\t\t\t\tstring\n\t\t\t\t\t\t\t>\n\t\t\t\t\t }\n\t\t\t\t\t: {}) & {\n\t\t\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t\t\t? `${AB}KeysOf${Capitalize<BSide>}`\n\t\t\t\t\t\t: `${AB}KeysOf${Capitalize<ASide>}`]: SelectorFamily<\n\t\t\t\t\t\tstring[],\n\t\t\t\t\t\tstring\n\t\t\t\t\t>\n\t\t\t }\n\t\t : never\n\nexport class Join<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Cardinality extends `1:1` | `1:n` | `n:n`,\n\tconst Content extends Json.Object | null = null,\n> {\n\tprivate transactors: Transactors = TRANSACTORS\n\tpublic relations: Junction<ASide, BSide, Content>\n\tpublic findState: JoinState<ASide, BSide, Cardinality, Content>\n\tpublic core: {\n\t\tfindRelatedKeysState: MutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>\n\t}\n\tpublic transact(\n\t\ttransactors: Transactors,\n\t\trun: (join: Join<ASide, BSide, Cardinality, Content>) => void,\n\t): void {\n\t\tthis.transactors = transactors\n\t\trun(this)\n\t\tthis.transactors = TRANSACTORS\n\t}\n\tpublic constructor(\n\t\toptions: JoinOptions<ASide, BSide, Cardinality, Content>,\n\t\tdefaultContent: Content | undefined,\n\t\tstore: Store = IMPLICIT.STORE,\n\t) {\n\t\tconst a: ASide = options.between[0]\n\t\tconst b: BSide = options.between[1]\n\t\tconst findRelatedKeysState = createMutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>(\n\t\t\t{\n\t\t\t\tkey: `${options.key}/relatedKeys`,\n\t\t\t\tdefault: () => new SetRTX(),\n\t\t\t\tmutable: true,\n\t\t\t\tfromJson: (json) => SetRTX.fromJSON(json),\n\t\t\t\ttoJson: (set) => set.toJSON(),\n\t\t\t},\n\t\t\tstore,\n\t\t)\n\t\tthis.core = { findRelatedKeysState }\n\t\tconst getRelatedKeys: Read<(key: string) => SetRTX<string>> = (\n\t\t\t{ get },\n\t\t\tkey,\n\t\t) => get(findRelatedKeysState(key))\n\t\tconst addRelation: Write<(a: string, b: string) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tb,\n\t\t) => {\n\t\t\tconst aKeys = getRelatedKeys(transactors, a)\n\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\ttransactors.set(findRelatedKeysState(a), aKeys.add(b))\n\t\t\ttransactors.set(findRelatedKeysState(b), bKeys.add(a))\n\t\t}\n\t\tconst deleteRelation: Write<(a: string, b: string) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tb,\n\t\t) => {\n\t\t\tconst aKeys = getRelatedKeys(transactors, a)\n\t\t\taKeys.delete(b)\n\t\t\tif (aKeys.size === 0) {\n\t\t\t\tdispose(findRelatedKeysState(a))\n\t\t\t}\n\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\tbKeys.delete(a)\n\t\t\tif (bKeys.size === 0) {\n\t\t\t\tdispose(findRelatedKeysState(b))\n\t\t\t}\n\t\t}\n\t\tconst replaceRelationsSafely: Write<(a: string, bs: string[]) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tbs,\n\t\t) => {\n\t\t\tconst aRelations = getRelatedKeys(transactors, a)\n\t\t\tfor (const b of aRelations) {\n\t\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\t\tif (bKeys) {\n\t\t\t\t\tbKeys.delete(a)\n\t\t\t\t\tif (bKeys.size === 0) {\n\t\t\t\t\t\tdispose(findRelatedKeysState(b))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttransactors.set(findRelatedKeysState(a), new SetRTX(bs))\n\t\t\tfor (const b of bs) {\n\t\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\t\tbKeys.add(a)\n\t\t\t}\n\t\t}\n\t\tconst replaceRelationsUnsafely: Write<(a: string, bs: string[]) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tbs,\n\t\t) => {\n\t\t\ttransactors.set(findRelatedKeysState(a), new SetRTX(bs))\n\t\t\tfor (const b of bs) {\n\t\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\t\tbKeys.add(a)\n\t\t\t}\n\t\t}\n\t\tconst has: Read<(a: string, b?: string) => boolean> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tb,\n\t\t) => {\n\t\t\tconst aKeys = getRelatedKeys(transactors, a)\n\t\t\treturn b ? aKeys.has(b) : aKeys.size > 0\n\t\t}\n\t\tconst baseExternalStoreConfiguration: BaseExternalStoreConfiguration = {\n\t\t\tgetRelatedKeys: (key) => getRelatedKeys(this.transactors, key),\n\t\t\taddRelation: (a, b) => addRelation(this.transactors, a, b),\n\t\t\tdeleteRelation: (a, b) => deleteRelation(this.transactors, a, b),\n\t\t\treplaceRelationsSafely: (a, bs) =>\n\t\t\t\treplaceRelationsSafely(this.transactors, a, bs),\n\t\t\treplaceRelationsUnsafely: (a, bs) =>\n\t\t\t\treplaceRelationsUnsafely(this.transactors, a, bs),\n\t\t\thas: (a, b) => has(this.transactors, a, b),\n\t\t}\n\t\tlet externalStore: ExternalStoreConfiguration<Content>\n\t\tlet findContentState: AtomFamily<Content, string>\n\t\tif (defaultContent) {\n\t\t\tfindContentState = createRegularAtomFamily<Content, string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/content`,\n\t\t\t\t\tdefault: defaultContent,\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tconst getContent: Read<(key: string) => Content | null> = ({ get }, key) =>\n\t\t\t\tget(findContentState(key))\n\t\t\tconst setContent: Write<(key: string, content: Content) => void> = (\n\t\t\t\ttransactors,\n\t\t\t\tkey,\n\t\t\t\tcontent,\n\t\t\t) => transactors.set(findContentState(key), content)\n\t\t\tconst deleteContent: Write<(key: string) => void> = (_, key) =>\n\t\t\t\tdispose(findContentState(key))\n\t\t\tconst externalStoreWithContentConfiguration = {\n\t\t\t\tgetContent: (contentKey: string) => {\n\t\t\t\t\tconst content = getContent(this.transactors, contentKey)\n\t\t\t\t\treturn content\n\t\t\t\t},\n\t\t\t\tsetContent: (contentKey: string, content: Content) => {\n\t\t\t\t\tsetContent(this.transactors, contentKey, content)\n\t\t\t\t},\n\t\t\t\tdeleteContent: (contentKey: string) => {\n\t\t\t\t\tdeleteContent(this.transactors, contentKey)\n\t\t\t\t},\n\t\t\t}\n\t\t\texternalStore = Object.assign(\n\t\t\t\tbaseExternalStoreConfiguration,\n\t\t\t\texternalStoreWithContentConfiguration,\n\t\t\t) as ExternalStoreConfiguration<Content>\n\t\t} else {\n\t\t\texternalStore =\n\t\t\t\tbaseExternalStoreConfiguration as ExternalStoreConfiguration<Content>\n\t\t}\n\t\tconst relations = new Junction<ASide, BSide, Content>(options, {\n\t\t\texternalStore,\n\t\t\tmakeContentKey: (...args) => args.sort().join(`:`),\n\t\t})\n\n\t\tconst createSingleKeyStateFamily = () =>\n\t\t\tcreateSelectorFamily<string | null, string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/singleRelatedKey`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst relatedKeys = get(findRelatedKeysState(key))\n\t\t\t\t\t\t\tfor (const relatedKey of relatedKeys) {\n\t\t\t\t\t\t\t\treturn relatedKey\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\tconst getMultipleKeyStateFamily = () => {\n\t\t\treturn createSelectorFamily<string[], string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/multipleRelatedKeys`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst jsonFamily = getJsonFamily(findRelatedKeysState, store)\n\t\t\t\t\t\t\tconst json = get(jsonFamily(key))\n\t\t\t\t\t\t\treturn json.members\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\t}\n\t\tconst createSingleEntryStateFamily = () =>\n\t\t\tcreateSelectorFamily<[string, Content] | null, string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/singleRelatedEntry`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst relatedKeys = get(findRelatedKeysState(key))\n\t\t\t\t\t\t\tfor (const relatedKey of relatedKeys) {\n\t\t\t\t\t\t\t\tconst contentKey = relations.makeContentKey(key, relatedKey)\n\t\t\t\t\t\t\t\treturn [relatedKey, get(findContentState(contentKey))]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\tconst getMultipleEntryStateFamily = () =>\n\t\t\tcreateSelectorFamily<[string, Content][], string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/multipleRelatedEntries`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst jsonFamily = getJsonFamily(findRelatedKeysState, store)\n\t\t\t\t\t\t\tconst json = get(jsonFamily(key))\n\t\t\t\t\t\t\treturn json.members.map((relatedKey) => {\n\t\t\t\t\t\t\t\tconst contentKey = relations.makeContentKey(key, relatedKey)\n\t\t\t\t\t\t\t\treturn [relatedKey, get(findContentState(contentKey))]\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\n\t\tswitch (options.cardinality) {\n\t\t\tcase `1:1`: {\n\t\t\t\tconst findSingleRelatedKeyState = createSingleKeyStateFamily()\n\t\t\t\tconst stateKeyA = `${a}KeyOf${capitalize(b)}` as const\n\t\t\t\tconst stateKeyB = `${b}KeyOf${capitalize(a)}` as const\n\t\t\t\tconst findStateBase = {\n\t\t\t\t\t[stateKeyA]: findSingleRelatedKeyState,\n\t\t\t\t\t[stateKeyB]: findSingleRelatedKeyState,\n\t\t\t\t} as JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tlet findState: JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tif (defaultContent) {\n\t\t\t\t\tconst findSingleRelatedEntryState = createSingleEntryStateFamily()\n\t\t\t\t\tconst entriesStateKeyA = `${a}EntryOf${capitalize(b)}` as const\n\t\t\t\t\tconst entriesStateKeyB = `${b}EntryOf${capitalize(a)}` as const\n\t\t\t\t\tconst findStateWithContent = {\n\t\t\t\t\t\t[entriesStateKeyA]: findSingleRelatedEntryState,\n\t\t\t\t\t\t[entriesStateKeyB]: findSingleRelatedEntryState,\n\t\t\t\t\t}\n\t\t\t\t\tfindState = Object.assign(findStateBase, findStateWithContent)\n\t\t\t\t} else {\n\t\t\t\t\tfindState = findStateBase\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.findState = findState\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase `1:n`: {\n\t\t\t\tconst findSingleRelatedKeyState = createSingleKeyStateFamily()\n\t\t\t\tconst findMultipleRelatedKeysState = getMultipleKeyStateFamily()\n\t\t\t\tconst stateKeyA = `${a}KeyOf${capitalize(b)}` as const\n\t\t\t\tconst stateKeyB = `${b}KeysOf${capitalize(a)}` as const\n\t\t\t\tconst findStateBase = {\n\t\t\t\t\t[stateKeyA]: findSingleRelatedKeyState,\n\t\t\t\t\t[stateKeyB]: findMultipleRelatedKeysState,\n\t\t\t\t} as JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tlet findState: JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tif (defaultContent) {\n\t\t\t\t\tconst findSingleRelatedEntryState = createSingleEntryStateFamily()\n\t\t\t\t\tconst findMultipleRelatedEntriesState = getMultipleEntryStateFamily()\n\t\t\t\t\tconst entriesStateKeyA = `${a}EntryOf${capitalize(b)}` as const\n\t\t\t\t\tconst entriesStateKeyB = `${b}EntriesOf${capitalize(a)}` as const\n\t\t\t\t\tconst findStateWithContent = {\n\t\t\t\t\t\t[entriesStateKeyA]: findSingleRelatedEntryState,\n\t\t\t\t\t\t[entriesStateKeyB]: findMultipleRelatedEntriesState,\n\t\t\t\t\t}\n\t\t\t\t\tfindState = Object.assign(findStateBase, findStateWithContent)\n\t\t\t\t} else {\n\t\t\t\t\tfindState = findStateBase\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.findState = findState\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst findMultipleRelatedKeysState = getMultipleKeyStateFamily()\n\t\t\t\tconst stateKeyA = `${a}KeysOf${capitalize(b)}` as const\n\t\t\t\tconst stateKeyB = `${b}KeysOf${capitalize(a)}` as const\n\t\t\t\tconst findStateBase = {\n\t\t\t\t\t[stateKeyA]: findMultipleRelatedKeysState,\n\t\t\t\t\t[stateKeyB]: findMultipleRelatedKeysState,\n\t\t\t\t} as JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tlet findState: JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tif (defaultContent) {\n\t\t\t\t\tconst findMultipleRelatedEntriesState = getMultipleEntryStateFamily()\n\t\t\t\t\tconst entriesStateKeyA = `${a}EntriesOf${capitalize(b)}` as const\n\t\t\t\t\tconst entriesStateKeyB = `${b}EntriesOf${capitalize(a)}` as const\n\t\t\t\t\tconst findStateWithContent = {\n\t\t\t\t\t\t[entriesStateKeyA]: findMultipleRelatedEntriesState,\n\t\t\t\t\t\t[entriesStateKeyB]: findMultipleRelatedEntriesState,\n\t\t\t\t\t}\n\t\t\t\t\tfindState = Object.assign(findStateBase, findStateWithContent)\n\t\t\t\t} else {\n\t\t\t\t\tfindState = findStateBase\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.findState = findState\n\t\t\t}\n\t\t}\n\t}\n}\nexport function join<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Cardinality extends `1:1` | `1:n` | `n:n`,\n>(\n\toptions: JoinOptions<ASide, BSide, Cardinality, null>,\n\tdefaultContent?: undefined,\n\tstore?: Store,\n): {\n\treadonly relations: Junction<ASide, BSide, null>\n\treadonly findState: JoinState<ASide, BSide, Cardinality, null>\n\treadonly transact: (\n\t\ttransactors: Transactors,\n\t\trun: (join: Join<ASide, BSide, Cardinality, null>) => void,\n\t) => void\n\treadonly core: {\n\t\treadonly findRelatedKeysState: MutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>\n\t}\n}\nexport function join<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Cardinality extends `1:1` | `1:n` | `n:n`,\n\tconst Content extends Json.Object,\n>(\n\toptions: JoinOptions<ASide, BSide, Cardinality, Content>,\n\tdefaultContent: Content,\n\tstore?: Store,\n): {\n\treadonly relations: Junction<ASide, BSide, Content>\n\treadonly findState: JoinState<ASide, BSide, Cardinality, Content>\n\treadonly transact: (\n\t\ttransactors: Transactors,\n\t\trun: (join: Join<ASide, BSide, Cardinality, Content>) => void,\n\t) => void\n\treadonly core: {\n\t\treadonly findRelatedKeysState: MutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>\n\t}\n}\nexport function join<\n\tASide extends string,\n\tBSide extends string,\n\tCardinality extends `1:1` | `1:n` | `n:n`,\n\tContent extends Json.Object,\n>(\n\toptions: JoinOptions<ASide, BSide, Cardinality, Content>,\n\tdefaultContent: Content | undefined,\n\tstore: Store = IMPLICIT.STORE,\n): Join<ASide, BSide, Cardinality, Content> {\n\treturn new Join(options, defaultContent, store)\n}\n","import type { Cardinality, Json, Refinement } from \"rel8\"\n\nexport interface JunctionEntries<Content extends Json.Object | null>\n\textends Json.Object {\n\treadonly relations: [string, string[]][]\n\treadonly contents: [string, Content][]\n}\nexport interface JunctionSchema<ASide extends string, BSide extends string>\n\textends Json.Object {\n\treadonly between: [a: ASide, b: BSide]\n\treadonly cardinality: Cardinality\n}\n\nexport type BaseExternalStoreConfiguration = {\n\taddRelation: (a: string, b: string) => void\n\tdeleteRelation: (a: string, b: string) => void\n\treplaceRelationsSafely: (a: string, bs: string[]) => void\n\treplaceRelationsUnsafely: (a: string, bs: string[]) => void\n\tgetRelatedKeys: (key: string) => Set<string> | undefined\n\thas: (a: string, b?: string) => boolean\n}\n\nexport type ExternalStoreWithContentConfiguration<Content extends Json.Object> =\n\t{\n\t\tgetContent: (contentKey: string) => Content | undefined\n\t\tsetContent: (contentKey: string, content: Content) => void\n\t\tdeleteContent: (contentKey: string) => void\n\t}\n\nexport type Empty<Obj extends object> = {\n\t[Key in keyof Obj]?: undefined\n}\n\nexport type ExternalStoreConfiguration<Content extends Json.Object | null> =\n\tContent extends Json.Object\n\t\t? BaseExternalStoreConfiguration &\n\t\t\t\tExternalStoreWithContentConfiguration<Content>\n\t\t: BaseExternalStoreConfiguration &\n\t\t\t\tEmpty<ExternalStoreWithContentConfiguration<Json.Object>>\n\nexport type JunctionAdvancedConfiguration<Content extends Json.Object | null> = {\n\texternalStore?: ExternalStoreConfiguration<Content>\n\tisContent?: Refinement<unknown, Content>\n\tmakeContentKey?: (a: string, b: string) => string\n}\n\nexport type JunctionJSON<\n\tASide extends string,\n\tBSide extends string,\n\tContent extends Json.Object | null,\n> = JunctionEntries<Content> & JunctionSchema<ASide, BSide>\n\nexport class Junction<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Content extends Json.Object | null = null,\n> {\n\tpublic readonly a: ASide\n\tpublic readonly b: BSide\n\tpublic readonly cardinality: Cardinality\n\tpublic readonly relations = new Map<string, Set<string>>()\n\tpublic readonly contents = new Map<string, Content>()\n\n\tpublic isContent: Refinement<unknown, Content> | null\n\tpublic makeContentKey = (a: string, b: string): string => `${a}:${b}`\n\n\tpublic getRelatedKeys(key: string): Set<string> | undefined {\n\t\treturn this.relations.get(key)\n\t}\n\tprotected addRelation(a: string, b: string): void {\n\t\tlet aRelations = this.relations.get(a)\n\t\tlet bRelations = this.relations.get(b)\n\t\tif (aRelations) {\n\t\t\taRelations.add(b)\n\t\t} else {\n\t\t\taRelations = new Set([b])\n\t\t\tthis.relations.set(a, aRelations)\n\t\t}\n\t\tif (bRelations) {\n\t\t\tbRelations.add(a)\n\t\t} else {\n\t\t\tbRelations = new Set([a])\n\t\t\tthis.relations.set(b, bRelations)\n\t\t}\n\t}\n\tprotected deleteRelation(a: string, b: string): void {\n\t\tconst aRelations = this.relations.get(a)\n\t\tif (aRelations) {\n\t\t\taRelations.delete(b)\n\t\t\tif (aRelations.size === 0) {\n\t\t\t\tthis.relations.delete(a)\n\t\t\t}\n\t\t\tconst bRelations = this.relations.get(b)\n\t\t\tif (bRelations) {\n\t\t\t\tbRelations.delete(a)\n\t\t\t\tif (bRelations.size === 0) {\n\t\t\t\t\tthis.relations.delete(b)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected replaceRelationsUnsafely(a: string, bs: string[]): void {\n\t\tthis.relations.set(a, new Set(bs))\n\t\tfor (const b of bs) {\n\t\t\tconst bRelations = new Set([a])\n\t\t\tthis.relations.set(b, bRelations)\n\t\t}\n\t}\n\tprotected replaceRelationsSafely(a: string, bs: string[]): void {\n\t\tconst aRelationsPrev = this.relations.get(a)\n\t\tif (aRelationsPrev) {\n\t\t\tfor (const b of aRelationsPrev) {\n\t\t\t\tconst bRelations = this.relations.get(b)\n\t\t\t\tif (bRelations) {\n\t\t\t\t\tif (bRelations.size === 1) {\n\t\t\t\t\t\tthis.relations.delete(b)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbRelations.delete(a)\n\t\t\t\t\t}\n\t\t\t\t\tthis.contents.delete(this.makeContentKey(a, b))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.relations.set(a, new Set(bs))\n\t\tfor (const b of bs) {\n\t\t\tlet bRelations = this.relations.get(b)\n\t\t\tif (bRelations) {\n\t\t\t\tbRelations.add(a)\n\t\t\t} else {\n\t\t\t\tbRelations = new Set([a])\n\t\t\t\tthis.relations.set(b, bRelations)\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected getContentInternal(contentKey: string): Content | undefined {\n\t\treturn this.contents.get(contentKey)\n\t}\n\tprotected setContent(contentKey: string, content: Content): void {\n\t\tthis.contents.set(contentKey, content)\n\t}\n\tprotected deleteContent(contentKey: string): void {\n\t\tthis.contents.delete(contentKey)\n\t}\n\n\tpublic constructor(\n\t\tdata: JunctionSchema<ASide, BSide> & Partial<JunctionEntries<Content>>,\n\t\tconfig?: JunctionAdvancedConfiguration<Content>,\n\t) {\n\t\tthis.a = data.between[0]\n\t\tthis.b = data.between[1]\n\n\t\tthis.cardinality = data.cardinality\n\t\tif (!config?.externalStore) {\n\t\t\tthis.relations = new Map(data.relations?.map(([a, b]) => [a, new Set(b)]))\n\t\t\tthis.contents = new Map(data.contents)\n\t\t}\n\t\tthis.isContent = config?.isContent ?? null\n\t\tif (config?.makeContentKey) {\n\t\t\tthis.makeContentKey = config.makeContentKey\n\t\t}\n\t\tif (config?.externalStore) {\n\t\t\tconst externalStore = config.externalStore\n\t\t\tthis.has = (a, b) => externalStore.has(a, b)\n\t\t\tthis.addRelation = (a, b) => {\n\t\t\t\texternalStore.addRelation(a, b)\n\t\t\t}\n\t\t\tthis.deleteRelation = (a, b) => {\n\t\t\t\texternalStore.deleteRelation(a, b)\n\t\t\t}\n\t\t\tthis.replaceRelationsSafely = (a, bs) => {\n\t\t\t\texternalStore.replaceRelationsSafely(a, bs)\n\t\t\t}\n\t\t\tthis.replaceRelationsUnsafely = (a, bs) => {\n\t\t\t\texternalStore.replaceRelationsUnsafely(a, bs)\n\t\t\t}\n\t\t\tthis.getRelatedKeys = (key) => externalStore.getRelatedKeys(key)\n\t\t\tif (externalStore.getContent) {\n\t\t\t\tthis.getContentInternal = (contentKey) => {\n\t\t\t\t\treturn externalStore.getContent(contentKey) as any\n\t\t\t\t}\n\t\t\t\tthis.setContent = (contentKey, content) => {\n\t\t\t\t\texternalStore.setContent(contentKey, content as any)\n\t\t\t\t}\n\t\t\t\tthis.deleteContent = (contentKey) => {\n\t\t\t\t\texternalStore.deleteContent(contentKey)\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const [x, ys] of data.relations ?? []) {\n\t\t\t\tfor (const y of ys) this.addRelation(x, y)\n\t\t\t}\n\t\t\tfor (const [contentKey, content] of data.contents ?? []) {\n\t\t\t\tthis.setContent(contentKey, content)\n\t\t\t}\n\t\t}\n\t}\n\tpublic toJSON(): JunctionJSON<ASide, BSide, Content> {\n\t\treturn {\n\t\t\tbetween: [this.a, this.b],\n\t\t\tcardinality: this.cardinality,\n\t\t\trelations: [...this.relations.entries()].map(([a, b]) => [a, [...b]]),\n\t\t\tcontents: [...this.contents.entries()],\n\t\t}\n\t}\n\n\tpublic set(\n\t\ta: string,\n\t\t...rest: Content extends null ? [b: string] : [b: string, content: Content]\n\t): this\n\tpublic set(\n\t\trelation: { [Key in ASide | BSide]: string },\n\t\t...rest: Content extends null ? [] | [b?: undefined] : [content: Content]\n\t): this\n\tpublic set(\n\t\ta: string | { [Key in ASide | BSide]: string },\n\t\t...rest: Content extends null\n\t\t\t? [] | [b?: string | undefined]\n\t\t\t: [b: string, content: Content] | [content: Content]\n\t): this {\n\t\tconst b: string =\n\t\t\ttypeof rest[0] === `string`\n\t\t\t\t? rest[0]\n\t\t\t\t: (a[this.b as keyof typeof a] as string)\n\t\tconst content: Content | undefined =\n\t\t\trest[1] ?? typeof rest[0] === `string` ? undefined : (rest[0] as Content)\n\t\ta = typeof a === `string` ? a : a[this.a]\n\t\tswitch (this.cardinality) {\n\t\t\t// biome-ignore lint/suspicious/noFallthroughSwitchClause: perfect here\n\t\t\tcase `1:1`: {\n\t\t\t\tconst bPrev = this.getRelatedKey(a)\n\t\t\t\tif (bPrev && bPrev !== b) this.delete(bPrev, a)\n\t\t\t}\n\t\t\tcase `1:n`: {\n\t\t\t\tconst aPrev = this.getRelatedKey(b)\n\t\t\t\tif (aPrev && aPrev !== a) this.delete(aPrev, b)\n\t\t\t}\n\t\t}\n\t\tif (content) {\n\t\t\tconst contentKey = this.makeContentKey(a, b)\n\t\t\tthis.setContent(contentKey, content)\n\t\t}\n\t\tthis.addRelation(a, b)\n\t\treturn this\n\t}\n\n\tpublic delete(a: string, b?: string): this\n\tpublic delete(\n\t\trelation:\n\t\t\t| Record<ASide | BSide, string>\n\t\t\t| Record<ASide, string>\n\t\t\t| Record<BSide, string>,\n\t\tb?: undefined,\n\t): this\n\tpublic delete(\n\t\tx:\n\t\t\t| Record<ASide | BSide, string>\n\t\t\t| Record<ASide, string>\n\t\t\t| Record<BSide, string>\n\t\t\t| string,\n\t\tb?: string | undefined,\n\t): this {\n\t\t// @ts-expect-error we deduce that this.b may index x\n\t\tb = typeof b === `string` ? b : (x[this.b] as string | undefined)\n\t\t// @ts-expect-error we deduce that this.a may index x\n\t\tconst a = typeof x === `string` ? x : (x[this.a] as string | undefined)\n\n\t\tif (a === undefined && typeof b === `string`) {\n\t\t\tconst bRelations = this.getRelatedKeys(b)\n\t\t\tif (bRelations) {\n\t\t\t\tfor (const a of bRelations) {\n\t\t\t\t\tthis.delete(a, b)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (typeof a === `string` && b === undefined) {\n\t\t\tconst aRelations = this.getRelatedKeys(a)\n\t\t\tif (aRelations) {\n\t\t\t\tfor (const b of aRelations) {\n\t\t\t\t\tthis.delete(a, b)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (typeof a === `string` && typeof b === `string`) {\n\t\t\tthis.deleteRelation(a, b)\n\t\t\tconst contentKey = this.makeContentKey(a, b)\n\t\t\tthis.deleteContent(contentKey)\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic getRelatedKey(key: string): string | undefined {\n\t\tconst relations = this.getRelatedKeys(key)\n\t\tif (relations) {\n\t\t\tif (relations.size > 1) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`${relations.size} related keys were found for key \"${key}\": (${[\n\t\t\t\t\t\t...relations,\n\t\t\t\t\t]\n\t\t\t\t\t\t.map((k) => `\"${k}\"`)\n\t\t\t\t\t\t.join(`, `)}). Only one related key was expected.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tfor (const relation of relations) {\n\t\t\t\treturn relation\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic replaceRelations(\n\t\ta: string,\n\t\trelations: Content extends null ? string[] : Record<string, Content>,\n\t\tconfig?: { reckless: boolean },\n\t): this {\n\t\tconst hasContent = !Array.isArray(relations)\n\t\tconst bs = hasContent ? Object.keys(relations) : relations\n\t\tif (config?.reckless) {\n\t\t\tthis.replaceRelationsUnsafely(a, bs)\n\t\t} else {\n\t\t\tthis.replaceRelationsSafely(a, bs)\n\t\t}\n\t\tif (hasContent) {\n\t\t\tfor (const b of bs) {\n\t\t\t\tconst contentKey = this.makeContentKey(a, b)\n\t\t\t\tconst content = relations[b] as Content\n\t\t\t\tthis.setContent(contentKey, content)\n\t\t\t}\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic getContent(a: string, b: string): Content | undefined {\n\t\tconst contentKey = this.makeContentKey(a, b)\n\t\treturn this.getContentInternal(contentKey)\n\t}\n\n\tpublic getRelationEntries(\n\t\tinput: Record<ASide, string> | Record<BSide, string>,\n\t): [string, Content][] {\n\t\tconst a: string | undefined = (input as any)[this.a]\n\t\tconst b: string | undefined = (input as any)[this.b]\n\t\tif (a !== undefined && b === undefined) {\n\t\t\tconst aRelations = this.getRelatedKeys(a)\n\t\t\tif (aRelations) {\n\t\t\t\treturn [...aRelations].map((b) => {\n\t\t\t\t\treturn [b, this.getContent(a, b) ?? (null as Content)]\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tif (a === undefined && b !== undefined) {\n\t\t\tconst bRelations = this.getRelatedKeys(b)\n\t\t\tif (bRelations) {\n\t\t\t\treturn [...bRelations].map((a) => {\n\t\t\t\t\treturn [a, this.getContent(a, b) ?? (null as Content)]\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\treturn []\n\t}\n\n\tpublic has(a: string, b?: string): boolean {\n\t\tif (b) {\n\t\t\tconst setA = this.getRelatedKeys(a)\n\t\t\treturn setA?.has(b) ?? false\n\t\t}\n\t\treturn this.relations.has(a)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { IMPLICIT } from \"atom.io/internal\"\n\nimport { createRegularAtom, createSelector } from \"atom.io/internal\"\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\n\nexport function struct<\n\tStruct extends { [key: string]: unknown },\n\tKey extends string,\n>(\n\toptions: {\n\t\tkey: Key\n\t\tdefault: Struct\n\t},\n\tstore: Store = IMPLICIT.STORE,\n): [\n\t{\n\t\t[K in keyof Struct as `${Key}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomToken<Struct[K]>\n\t},\n\tAtomIO.ReadonlySelectorToken<Struct>,\n] {\n\tconst atoms: {\n\t\t[K in keyof Struct as `${Key}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomToken<Struct[K]>\n\t} = Object.keys(options.default).reduce((acc, key) => {\n\t\tconst atomName = options.key + capitalize(key) + `State`\n\t\tacc[atomName] = createRegularAtom(\n\t\t\t{\n\t\t\t\tkey: `${options.key}.${key}`,\n\t\t\t\tdefault: options.default[key],\n\t\t\t},\n\t\t\tundefined,\n\t\t\tstore,\n\t\t)\n\t\treturn acc\n\t}, {} as any)\n\tconst structState = createSelector(\n\t\t{\n\t\t\tkey: options.key,\n\t\t\tget: ({ get }) => {\n\t\t\t\treturn Object.keys(options.default).reduce((acc, key) => {\n\t\t\t\t\tacc[key] = get(atoms[options.key + capitalize(key) + `State`])\n\t\t\t\t\treturn acc\n\t\t\t\t}, {} as any)\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t\tstore,\n\t)\n\treturn [atoms, structState]\n}\n","import type * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tcreateRegularAtomFamily,\n\tcreateSelectorFamily,\n} from \"atom.io/internal\"\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\nconst nameFamily = (topKey: string, subKey: string) =>\n\t`find` + capitalize(topKey) + capitalize(subKey) + `State`\n\nexport function structFamily<\n\tStruct extends object,\n\tKey extends string,\n>(options: {\n\tkey: Key\n\tdefault: Struct\n}): [\n\t{\n\t\t[K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomFamily<Struct[K], string>\n\t},\n\tAtomIO.ReadonlySelectorFamily<Struct>,\n] {\n\tconst atoms: {\n\t\t[K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomFamily<Struct[K], string>\n\t} = Object.keys(options.default).reduce((acc, subKey) => {\n\t\tconst atomFamilyName = nameFamily(options.key, subKey)\n\t\tacc[atomFamilyName] = createRegularAtomFamily(\n\t\t\t{\n\t\t\t\tkey: `${options.key}.${subKey}`,\n\t\t\t\tdefault: (options.default as any)[subKey],\n\t\t\t},\n\t\t\tIMPLICIT.STORE,\n\t\t)\n\t\treturn acc\n\t}, {} as any)\n\tconst findStructState = createSelectorFamily(\n\t\t{\n\t\t\tkey: options.key,\n\t\t\tget:\n\t\t\t\t(id) =>\n\t\t\t\t({ get }) => {\n\t\t\t\t\treturn Object.keys(options.default).reduce((acc, subKey) => {\n\t\t\t\t\t\tacc[subKey] = get(\n\t\t\t\t\t\t\t(atoms as any)[nameFamily(options.key, subKey)](id),\n\t\t\t\t\t\t)\n\t\t\t\t\t\treturn acc\n\t\t\t\t\t}, {} as any)\n\t\t\t\t},\n\t\t},\n\t\tIMPLICIT.STORE,\n\t)\n\treturn [atoms, findStructState]\n}\n","export type Loadable<T> = Promise<T> | T\nexport type Fated<T, E extends Error = Error> = Loadable<E | T>\n\n/**\n * Utility for handling loadable values\n * @param loadable Loadable value\n * @param fallback Fallback value until Loadable is resolved\n * @returns Fallback value if your loadable is a promise, otherwise the loadable's resolved value\n */\nexport function until<T>(loadable: Loadable<T>, fallback: T): T {\n\tif (loadable instanceof Promise) {\n\t\treturn fallback\n\t}\n\treturn loadable\n}\n"]}
1
+ {"version":3,"sources":["../src/dict.ts","../src/join.ts","../../../rel8/junction/src/junction.ts","../src/struct.ts","../src/struct-family.ts","../src/until.ts"],"names":["IMPLICIT","a","b","createSelector","capitalize","createRegularAtomFamily","createSelectorFamily"],"mappings":"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","sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, createSelector } from \"atom.io/internal\"\nimport type { Json, Stringified } from \"atom.io/json\"\n\nexport function dict<State, Key extends Json.Serializable>(\n\tfindState:\n\t\t| AtomIO.AtomFamily<State, Key>\n\t\t| AtomIO.ReadonlySelectorFamily<State, Key>\n\t\t| AtomIO.SelectorFamily<State, Key>,\n\tindex:\n\t\t| AtomIO.AtomToken<Key[]>\n\t\t| AtomIO.ReadonlySelectorToken<Key[]>\n\t\t| AtomIO.SelectorToken<Key[]>,\n\tstore: Store = IMPLICIT.STORE,\n): AtomIO.ReadonlySelectorToken<{ [K in Stringified<Key>]: State }> {\n\treturn createSelector(\n\t\t{\n\t\t\tkey: `${findState.key}Dict`,\n\t\t\tget: ({ get }) => {\n\t\t\t\tconst keys = get(index)\n\t\t\t\treturn keys.reduce((acc, key) => {\n\t\t\t\t\tacc[key] = get(findState(key))\n\t\t\t\t\treturn acc\n\t\t\t\t}, {} as any)\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t\tstore,\n\t)\n}\n","/* eslint-disable @typescript-eslint/ban-types */\nimport type {\n\tAtomFamily,\n\tMutableAtomFamily,\n\tRead,\n\tReadonlySelectorFamily,\n\tTransactors,\n\tWrite,\n} from \"atom.io\"\nimport { dispose, getState, setState } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tcreateMutableAtomFamily,\n\tcreateRegularAtomFamily,\n\tcreateSelectorFamily,\n\tgetJsonFamily,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { SetRTXJson } from \"atom.io/transceivers/set-rtx\"\nimport { SetRTX } from \"atom.io/transceivers/set-rtx\"\n\nimport type {\n\tBaseExternalStoreConfiguration,\n\tExternalStoreConfiguration,\n\tJunctionEntries,\n\tJunctionSchema,\n} from \"~/packages/rel8/junction/src\"\nimport { Junction } from \"~/packages/rel8/junction/src\"\nimport type * as Rel8 from \"~/packages/rel8/types/src\"\n\nconst TRANSACTORS: Transactors = { get: getState, set: setState }\n\nfunction capitalize<S extends string>(string: S): Capitalize<S> {\n\treturn (string[0].toUpperCase() + string.slice(1)) as Capitalize<S>\n}\n\nexport interface JoinOptions<\n\tASide extends string,\n\tBSide extends string,\n\tCardinality extends Rel8.Cardinality,\n\tContent extends Json.Object | null,\n> extends Json.Object,\n\t\tJunctionSchema<ASide, BSide>,\n\t\tPartial<JunctionEntries<Content>> {\n\treadonly key: string\n\treadonly cardinality: Cardinality\n}\n\nexport type JoinState<\n\tASide extends string,\n\tBSide extends string,\n\tCardinality extends Rel8.Cardinality,\n\tContent extends Json.Object | null,\n> = Cardinality extends `1:1`\n\t? (Content extends Json.Object\n\t\t\t? {\n\t\t\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t\t\t? `${AB}EntryOf${Capitalize<BSide>}`\n\t\t\t\t\t\t: `${AB}EntryOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\t\t[string, Content] | null,\n\t\t\t\t\t\tstring\n\t\t\t\t\t>\n\t\t\t }\n\t\t\t: {}) & {\n\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t? `${AB}KeyOf${Capitalize<BSide>}`\n\t\t\t\t: `${AB}KeyOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<\n\t\t\t\tstring | null,\n\t\t\t\tstring\n\t\t\t>\n\t }\n\t: Cardinality extends `1:n`\n\t ? (Content extends Json.Object\n\t\t\t\t? {\n\t\t\t\t\t\treadonly [A in ASide as `${A}EntryOf${Capitalize<BSide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\t\t\t[string, Content] | null,\n\t\t\t\t\t\t\tstring\n\t\t\t\t\t\t>\n\t\t\t\t } & {\n\t\t\t\t\t\treadonly [B in BSide as `${B}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\t\t\t[string, Content][],\n\t\t\t\t\t\t\tstring\n\t\t\t\t\t\t>\n\t\t\t\t }\n\t\t\t\t: {}) & {\n\t\t\t\treadonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\tstring | null,\n\t\t\t\t\tstring\n\t\t\t\t>\n\t\t } & {\n\t\t\t\treadonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\tstring[],\n\t\t\t\t\tstring\n\t\t\t\t>\n\t\t }\n\t : Cardinality extends `n:n`\n\t\t ? (Content extends Json.Object\n\t\t\t\t\t? {\n\t\t\t\t\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t\t\t\t\t? `${AB}EntriesOf${Capitalize<BSide>}`\n\t\t\t\t\t\t\t\t: `${AB}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\t\t\t\t[string, Content][],\n\t\t\t\t\t\t\t\tstring\n\t\t\t\t\t\t\t>\n\t\t\t\t\t }\n\t\t\t\t\t: {}) & {\n\t\t\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t\t\t? `${AB}KeysOf${Capitalize<BSide>}`\n\t\t\t\t\t\t: `${AB}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\t\tstring[],\n\t\t\t\t\t\tstring\n\t\t\t\t\t>\n\t\t\t }\n\t\t : never\n\nexport class Join<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Cardinality extends `1:1` | `1:n` | `n:n`,\n\tconst Content extends Json.Object | null = null,\n> {\n\tprivate transactors: Transactors = TRANSACTORS\n\tpublic relations: Junction<ASide, BSide, Content>\n\tpublic findState: JoinState<ASide, BSide, Cardinality, Content>\n\tpublic core: {\n\t\tfindRelatedKeysState: MutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>\n\t}\n\tpublic transact(\n\t\ttransactors: Transactors,\n\t\trun: (join: Join<ASide, BSide, Cardinality, Content>) => void,\n\t): void {\n\t\tthis.transactors = transactors\n\t\trun(this)\n\t\tthis.transactors = TRANSACTORS\n\t}\n\tpublic constructor(\n\t\toptions: JoinOptions<ASide, BSide, Cardinality, Content>,\n\t\tdefaultContent: Content | undefined,\n\t\tstore: Store = IMPLICIT.STORE,\n\t) {\n\t\tconst a: ASide = options.between[0]\n\t\tconst b: BSide = options.between[1]\n\t\tconst findRelatedKeysState = createMutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>(\n\t\t\t{\n\t\t\t\tkey: `${options.key}/relatedKeys`,\n\t\t\t\tdefault: () => new SetRTX(),\n\t\t\t\tmutable: true,\n\t\t\t\tfromJson: (json) => SetRTX.fromJSON(json),\n\t\t\t\ttoJson: (set) => set.toJSON(),\n\t\t\t},\n\t\t\tstore,\n\t\t)\n\t\tthis.core = { findRelatedKeysState }\n\t\tconst getRelatedKeys: Read<(key: string) => SetRTX<string>> = (\n\t\t\t{ get },\n\t\t\tkey,\n\t\t) => get(findRelatedKeysState(key))\n\t\tconst addRelation: Write<(a: string, b: string) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tb,\n\t\t) => {\n\t\t\tconst aKeysState = findRelatedKeysState(a)\n\t\t\tconst bKeysState = findRelatedKeysState(b)\n\t\t\ttransactors.set(aKeysState, (aKeys) => aKeys.add(b))\n\t\t\ttransactors.set(bKeysState, (bKeys) => bKeys.add(a))\n\t\t}\n\t\tconst deleteRelation: Write<(a: string, b: string) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tb,\n\t\t) => {\n\t\t\tconst aKeys = getRelatedKeys(transactors, a)\n\t\t\taKeys.delete(b)\n\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\tbKeys.delete(a)\n\t\t}\n\t\tconst replaceRelationsSafely: Write<(a: string, bs: string[]) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tbs,\n\t\t) => {\n\t\t\tconst aRelations = getRelatedKeys(transactors, a)\n\t\t\tfor (const b of aRelations) {\n\t\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\t\tif (bKeys) {\n\t\t\t\t\tbKeys.delete(a)\n\t\t\t\t\tif (bKeys.size === 0) {\n\t\t\t\t\t\tdispose(findRelatedKeysState(b))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttransactors.set(findRelatedKeysState(a), new SetRTX(bs))\n\t\t\tfor (const b of bs) {\n\t\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\t\tbKeys.add(a)\n\t\t\t}\n\t\t}\n\t\tconst replaceRelationsUnsafely: Write<(a: string, bs: string[]) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tbs,\n\t\t) => {\n\t\t\ttransactors.set(findRelatedKeysState(a), new SetRTX(bs))\n\t\t\tfor (const b of bs) {\n\t\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\t\tbKeys.add(a)\n\t\t\t}\n\t\t}\n\t\tconst has: Read<(a: string, b?: string) => boolean> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tb,\n\t\t) => {\n\t\t\tconst aKeys = getRelatedKeys(transactors, a)\n\t\t\treturn b ? aKeys.has(b) : aKeys.size > 0\n\t\t}\n\t\tconst baseExternalStoreConfiguration: BaseExternalStoreConfiguration = {\n\t\t\tgetRelatedKeys: (key) => getRelatedKeys(this.transactors, key),\n\t\t\taddRelation: (a, b) => addRelation(this.transactors, a, b),\n\t\t\tdeleteRelation: (a, b) => deleteRelation(this.transactors, a, b),\n\t\t\treplaceRelationsSafely: (a, bs) =>\n\t\t\t\treplaceRelationsSafely(this.transactors, a, bs),\n\t\t\treplaceRelationsUnsafely: (a, bs) =>\n\t\t\t\treplaceRelationsUnsafely(this.transactors, a, bs),\n\t\t\thas: (a, b) => has(this.transactors, a, b),\n\t\t}\n\t\tlet externalStore: ExternalStoreConfiguration<Content>\n\t\tlet findContentState: AtomFamily<Content, string>\n\t\tif (defaultContent) {\n\t\t\tfindContentState = createRegularAtomFamily<Content, string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/content`,\n\t\t\t\t\tdefault: defaultContent,\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tconst getContent: Read<(key: string) => Content | null> = ({ get }, key) =>\n\t\t\t\tget(findContentState(key))\n\t\t\tconst setContent: Write<(key: string, content: Content) => void> = (\n\t\t\t\ttransactors,\n\t\t\t\tkey,\n\t\t\t\tcontent,\n\t\t\t) => transactors.set(findContentState(key), content)\n\t\t\tconst deleteContent: Write<(key: string) => void> = (_, key) =>\n\t\t\t\tdispose(findContentState(key))\n\t\t\tconst externalStoreWithContentConfiguration = {\n\t\t\t\tgetContent: (contentKey: string) => {\n\t\t\t\t\tconst content = getContent(this.transactors, contentKey)\n\t\t\t\t\treturn content\n\t\t\t\t},\n\t\t\t\tsetContent: (contentKey: string, content: Content) => {\n\t\t\t\t\tsetContent(this.transactors, contentKey, content)\n\t\t\t\t},\n\t\t\t\tdeleteContent: (contentKey: string) => {\n\t\t\t\t\tdeleteContent(this.transactors, contentKey)\n\t\t\t\t},\n\t\t\t}\n\t\t\texternalStore = Object.assign(\n\t\t\t\tbaseExternalStoreConfiguration,\n\t\t\t\texternalStoreWithContentConfiguration,\n\t\t\t) as ExternalStoreConfiguration<Content>\n\t\t} else {\n\t\t\texternalStore =\n\t\t\t\tbaseExternalStoreConfiguration as ExternalStoreConfiguration<Content>\n\t\t}\n\t\tconst relations = new Junction<ASide, BSide, Content>(options, {\n\t\t\texternalStore,\n\t\t\tmakeContentKey: (...args) => args.sort().join(`:`),\n\t\t})\n\n\t\tconst createSingleKeyStateFamily = () =>\n\t\t\tcreateSelectorFamily<string | null, string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/singleRelatedKey`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst relatedKeys = get(findRelatedKeysState(key))\n\t\t\t\t\t\t\tfor (const relatedKey of relatedKeys) {\n\t\t\t\t\t\t\t\treturn relatedKey\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\tconst getMultipleKeyStateFamily = () => {\n\t\t\treturn createSelectorFamily<string[], string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/multipleRelatedKeys`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst jsonFamily = getJsonFamily(findRelatedKeysState, store)\n\t\t\t\t\t\t\tconst json = get(jsonFamily(key))\n\t\t\t\t\t\t\treturn json.members\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\t}\n\t\tconst createSingleEntryStateFamily = () =>\n\t\t\tcreateSelectorFamily<[string, Content] | null, string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/singleRelatedEntry`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst relatedKeys = get(findRelatedKeysState(key))\n\t\t\t\t\t\t\tfor (const relatedKey of relatedKeys) {\n\t\t\t\t\t\t\t\tconst contentKey = relations.makeContentKey(key, relatedKey)\n\t\t\t\t\t\t\t\treturn [relatedKey, get(findContentState(contentKey))]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\tconst getMultipleEntryStateFamily = () =>\n\t\t\tcreateSelectorFamily<[string, Content][], string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/multipleRelatedEntries`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst jsonFamily = getJsonFamily(findRelatedKeysState, store)\n\t\t\t\t\t\t\tconst json = get(jsonFamily(key))\n\t\t\t\t\t\t\treturn json.members.map((relatedKey) => {\n\t\t\t\t\t\t\t\tconst contentKey = relations.makeContentKey(key, relatedKey)\n\t\t\t\t\t\t\t\treturn [relatedKey, get(findContentState(contentKey))]\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\n\t\tswitch (options.cardinality) {\n\t\t\tcase `1:1`: {\n\t\t\t\tconst findSingleRelatedKeyState = createSingleKeyStateFamily()\n\t\t\t\tconst stateKeyA = `${a}KeyOf${capitalize(b)}` as const\n\t\t\t\tconst stateKeyB = `${b}KeyOf${capitalize(a)}` as const\n\t\t\t\tconst findStateBase = {\n\t\t\t\t\t[stateKeyA]: findSingleRelatedKeyState,\n\t\t\t\t\t[stateKeyB]: findSingleRelatedKeyState,\n\t\t\t\t} as JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tlet findState: JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tif (defaultContent) {\n\t\t\t\t\tconst findSingleRelatedEntryState = createSingleEntryStateFamily()\n\t\t\t\t\tconst entriesStateKeyA = `${a}EntryOf${capitalize(b)}` as const\n\t\t\t\t\tconst entriesStateKeyB = `${b}EntryOf${capitalize(a)}` as const\n\t\t\t\t\tconst findStateWithContent = {\n\t\t\t\t\t\t[entriesStateKeyA]: findSingleRelatedEntryState,\n\t\t\t\t\t\t[entriesStateKeyB]: findSingleRelatedEntryState,\n\t\t\t\t\t}\n\t\t\t\t\tfindState = Object.assign(findStateBase, findStateWithContent)\n\t\t\t\t} else {\n\t\t\t\t\tfindState = findStateBase\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.findState = findState\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase `1:n`: {\n\t\t\t\tconst findSingleRelatedKeyState = createSingleKeyStateFamily()\n\t\t\t\tconst findMultipleRelatedKeysState = getMultipleKeyStateFamily()\n\t\t\t\tconst stateKeyA = `${a}KeyOf${capitalize(b)}` as const\n\t\t\t\tconst stateKeyB = `${b}KeysOf${capitalize(a)}` as const\n\t\t\t\tconst findStateBase = {\n\t\t\t\t\t[stateKeyA]: findSingleRelatedKeyState,\n\t\t\t\t\t[stateKeyB]: findMultipleRelatedKeysState,\n\t\t\t\t} as JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tlet findState: JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tif (defaultContent) {\n\t\t\t\t\tconst findSingleRelatedEntryState = createSingleEntryStateFamily()\n\t\t\t\t\tconst findMultipleRelatedEntriesState = getMultipleEntryStateFamily()\n\t\t\t\t\tconst entriesStateKeyA = `${a}EntryOf${capitalize(b)}` as const\n\t\t\t\t\tconst entriesStateKeyB = `${b}EntriesOf${capitalize(a)}` as const\n\t\t\t\t\tconst findStateWithContent = {\n\t\t\t\t\t\t[entriesStateKeyA]: findSingleRelatedEntryState,\n\t\t\t\t\t\t[entriesStateKeyB]: findMultipleRelatedEntriesState,\n\t\t\t\t\t}\n\t\t\t\t\tfindState = Object.assign(findStateBase, findStateWithContent)\n\t\t\t\t} else {\n\t\t\t\t\tfindState = findStateBase\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.findState = findState\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst findMultipleRelatedKeysState = getMultipleKeyStateFamily()\n\t\t\t\tconst stateKeyA = `${a}KeysOf${capitalize(b)}` as const\n\t\t\t\tconst stateKeyB = `${b}KeysOf${capitalize(a)}` as const\n\t\t\t\tconst findStateBase = {\n\t\t\t\t\t[stateKeyA]: findMultipleRelatedKeysState,\n\t\t\t\t\t[stateKeyB]: findMultipleRelatedKeysState,\n\t\t\t\t} as JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tlet findState: JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tif (defaultContent) {\n\t\t\t\t\tconst findMultipleRelatedEntriesState = getMultipleEntryStateFamily()\n\t\t\t\t\tconst entriesStateKeyA = `${a}EntriesOf${capitalize(b)}` as const\n\t\t\t\t\tconst entriesStateKeyB = `${b}EntriesOf${capitalize(a)}` as const\n\t\t\t\t\tconst findStateWithContent = {\n\t\t\t\t\t\t[entriesStateKeyA]: findMultipleRelatedEntriesState,\n\t\t\t\t\t\t[entriesStateKeyB]: findMultipleRelatedEntriesState,\n\t\t\t\t\t}\n\t\t\t\t\tfindState = Object.assign(findStateBase, findStateWithContent)\n\t\t\t\t} else {\n\t\t\t\t\tfindState = findStateBase\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.findState = findState\n\t\t\t}\n\t\t}\n\t}\n}\nexport function join<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Cardinality extends `1:1` | `1:n` | `n:n`,\n>(\n\toptions: JoinOptions<ASide, BSide, Cardinality, null>,\n\tdefaultContent?: undefined,\n\tstore?: Store,\n): {\n\treadonly relations: Junction<ASide, BSide, null>\n\treadonly findState: JoinState<ASide, BSide, Cardinality, null>\n\treadonly transact: (\n\t\ttransactors: Transactors,\n\t\trun: (join: Join<ASide, BSide, Cardinality, null>) => void,\n\t) => void\n\treadonly core: {\n\t\treadonly findRelatedKeysState: MutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>\n\t}\n}\nexport function join<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Cardinality extends `1:1` | `1:n` | `n:n`,\n\tconst Content extends Json.Object,\n>(\n\toptions: JoinOptions<ASide, BSide, Cardinality, Content>,\n\tdefaultContent: Content,\n\tstore?: Store,\n): {\n\treadonly relations: Junction<ASide, BSide, Content>\n\treadonly findState: JoinState<ASide, BSide, Cardinality, Content>\n\treadonly transact: (\n\t\ttransactors: Transactors,\n\t\trun: (join: Join<ASide, BSide, Cardinality, Content>) => void,\n\t) => void\n\treadonly core: {\n\t\treadonly findRelatedKeysState: MutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>\n\t}\n}\nexport function join<\n\tASide extends string,\n\tBSide extends string,\n\tCardinality extends `1:1` | `1:n` | `n:n`,\n\tContent extends Json.Object,\n>(\n\toptions: JoinOptions<ASide, BSide, Cardinality, Content>,\n\tdefaultContent: Content | undefined,\n\tstore: Store = IMPLICIT.STORE,\n): Join<ASide, BSide, Cardinality, Content> {\n\treturn new Join(options, defaultContent, store)\n}\n","import type { Cardinality, Json, Refinement } from \"rel8\"\n\nexport interface JunctionEntries<Content extends Json.Object | null>\n\textends Json.Object {\n\treadonly relations: [string, string[]][]\n\treadonly contents: [string, Content][]\n}\nexport interface JunctionSchema<ASide extends string, BSide extends string>\n\textends Json.Object {\n\treadonly between: [a: ASide, b: BSide]\n\treadonly cardinality: Cardinality\n}\n\nexport type BaseExternalStoreConfiguration = {\n\taddRelation: (a: string, b: string) => void\n\tdeleteRelation: (a: string, b: string) => void\n\treplaceRelationsSafely: (a: string, bs: string[]) => void\n\treplaceRelationsUnsafely: (a: string, bs: string[]) => void\n\tgetRelatedKeys: (key: string) => Set<string> | undefined\n\thas: (a: string, b?: string) => boolean\n}\n\nexport type ExternalStoreWithContentConfiguration<Content extends Json.Object> =\n\t{\n\t\tgetContent: (contentKey: string) => Content | undefined\n\t\tsetContent: (contentKey: string, content: Content) => void\n\t\tdeleteContent: (contentKey: string) => void\n\t}\n\nexport type Empty<Obj extends object> = {\n\t[Key in keyof Obj]?: undefined\n}\n\nexport type ExternalStoreConfiguration<Content extends Json.Object | null> =\n\tContent extends Json.Object\n\t\t? BaseExternalStoreConfiguration &\n\t\t\t\tExternalStoreWithContentConfiguration<Content>\n\t\t: BaseExternalStoreConfiguration &\n\t\t\t\tEmpty<ExternalStoreWithContentConfiguration<Json.Object>>\n\nexport type JunctionAdvancedConfiguration<Content extends Json.Object | null> = {\n\texternalStore?: ExternalStoreConfiguration<Content>\n\tisContent?: Refinement<unknown, Content>\n\tmakeContentKey?: (a: string, b: string) => string\n}\n\nexport type JunctionJSON<\n\tASide extends string,\n\tBSide extends string,\n\tContent extends Json.Object | null,\n> = JunctionEntries<Content> & JunctionSchema<ASide, BSide>\n\nexport class Junction<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Content extends Json.Object | null = null,\n> {\n\tpublic readonly a: ASide\n\tpublic readonly b: BSide\n\tpublic readonly cardinality: Cardinality\n\tpublic readonly relations = new Map<string, Set<string>>()\n\tpublic readonly contents = new Map<string, Content>()\n\n\tpublic isContent: Refinement<unknown, Content> | null\n\tpublic makeContentKey = (a: string, b: string): string => `${a}:${b}`\n\n\tpublic getRelatedKeys(key: string): Set<string> | undefined {\n\t\treturn this.relations.get(key)\n\t}\n\tprotected addRelation(a: string, b: string): void {\n\t\tlet aRelations = this.relations.get(a)\n\t\tlet bRelations = this.relations.get(b)\n\t\tif (aRelations) {\n\t\t\taRelations.add(b)\n\t\t} else {\n\t\t\taRelations = new Set([b])\n\t\t\tthis.relations.set(a, aRelations)\n\t\t}\n\t\tif (bRelations) {\n\t\t\tbRelations.add(a)\n\t\t} else {\n\t\t\tbRelations = new Set([a])\n\t\t\tthis.relations.set(b, bRelations)\n\t\t}\n\t}\n\tprotected deleteRelation(a: string, b: string): void {\n\t\tconst aRelations = this.relations.get(a)\n\t\tif (aRelations) {\n\t\t\taRelations.delete(b)\n\t\t\tif (aRelations.size === 0) {\n\t\t\t\tthis.relations.delete(a)\n\t\t\t}\n\t\t\tconst bRelations = this.relations.get(b)\n\t\t\tif (bRelations) {\n\t\t\t\tbRelations.delete(a)\n\t\t\t\tif (bRelations.size === 0) {\n\t\t\t\t\tthis.relations.delete(b)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected replaceRelationsUnsafely(a: string, bs: string[]): void {\n\t\tthis.relations.set(a, new Set(bs))\n\t\tfor (const b of bs) {\n\t\t\tconst bRelations = new Set([a])\n\t\t\tthis.relations.set(b, bRelations)\n\t\t}\n\t}\n\tprotected replaceRelationsSafely(a: string, bs: string[]): void {\n\t\tconst aRelationsPrev = this.relations.get(a)\n\t\tif (aRelationsPrev) {\n\t\t\tfor (const b of aRelationsPrev) {\n\t\t\t\tconst bRelations = this.relations.get(b)\n\t\t\t\tif (bRelations) {\n\t\t\t\t\tif (bRelations.size === 1) {\n\t\t\t\t\t\tthis.relations.delete(b)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbRelations.delete(a)\n\t\t\t\t\t}\n\t\t\t\t\tthis.contents.delete(this.makeContentKey(a, b))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.relations.set(a, new Set(bs))\n\t\tfor (const b of bs) {\n\t\t\tlet bRelations = this.relations.get(b)\n\t\t\tif (bRelations) {\n\t\t\t\tbRelations.add(a)\n\t\t\t} else {\n\t\t\t\tbRelations = new Set([a])\n\t\t\t\tthis.relations.set(b, bRelations)\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected getContentInternal(contentKey: string): Content | undefined {\n\t\treturn this.contents.get(contentKey)\n\t}\n\tprotected setContent(contentKey: string, content: Content): void {\n\t\tthis.contents.set(contentKey, content)\n\t}\n\tprotected deleteContent(contentKey: string): void {\n\t\tthis.contents.delete(contentKey)\n\t}\n\n\tpublic constructor(\n\t\tdata: JunctionSchema<ASide, BSide> & Partial<JunctionEntries<Content>>,\n\t\tconfig?: JunctionAdvancedConfiguration<Content>,\n\t) {\n\t\tthis.a = data.between[0]\n\t\tthis.b = data.between[1]\n\n\t\tthis.cardinality = data.cardinality\n\t\tif (!config?.externalStore) {\n\t\t\tthis.relations = new Map(data.relations?.map(([a, b]) => [a, new Set(b)]))\n\t\t\tthis.contents = new Map(data.contents)\n\t\t}\n\t\tthis.isContent = config?.isContent ?? null\n\t\tif (config?.makeContentKey) {\n\t\t\tthis.makeContentKey = config.makeContentKey\n\t\t}\n\t\tif (config?.externalStore) {\n\t\t\tconst externalStore = config.externalStore\n\t\t\tthis.has = (a, b) => externalStore.has(a, b)\n\t\t\tthis.addRelation = (a, b) => {\n\t\t\t\texternalStore.addRelation(a, b)\n\t\t\t}\n\t\t\tthis.deleteRelation = (a, b) => {\n\t\t\t\texternalStore.deleteRelation(a, b)\n\t\t\t}\n\t\t\tthis.replaceRelationsSafely = (a, bs) => {\n\t\t\t\texternalStore.replaceRelationsSafely(a, bs)\n\t\t\t}\n\t\t\tthis.replaceRelationsUnsafely = (a, bs) => {\n\t\t\t\texternalStore.replaceRelationsUnsafely(a, bs)\n\t\t\t}\n\t\t\tthis.getRelatedKeys = (key) => externalStore.getRelatedKeys(key)\n\t\t\tif (externalStore.getContent) {\n\t\t\t\tthis.getContentInternal = (contentKey) => {\n\t\t\t\t\treturn externalStore.getContent(contentKey) as any\n\t\t\t\t}\n\t\t\t\tthis.setContent = (contentKey, content) => {\n\t\t\t\t\texternalStore.setContent(contentKey, content as any)\n\t\t\t\t}\n\t\t\t\tthis.deleteContent = (contentKey) => {\n\t\t\t\t\texternalStore.deleteContent(contentKey)\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const [x, ys] of data.relations ?? []) {\n\t\t\t\tfor (const y of ys) this.addRelation(x, y)\n\t\t\t}\n\t\t\tfor (const [contentKey, content] of data.contents ?? []) {\n\t\t\t\tthis.setContent(contentKey, content)\n\t\t\t}\n\t\t}\n\t}\n\tpublic toJSON(): JunctionJSON<ASide, BSide, Content> {\n\t\treturn {\n\t\t\tbetween: [this.a, this.b],\n\t\t\tcardinality: this.cardinality,\n\t\t\trelations: [...this.relations.entries()].map(([a, b]) => [a, [...b]]),\n\t\t\tcontents: [...this.contents.entries()],\n\t\t}\n\t}\n\n\tpublic set(\n\t\ta: string,\n\t\t...rest: Content extends null ? [b: string] : [b: string, content: Content]\n\t): this\n\tpublic set(\n\t\trelation: { [Key in ASide | BSide]: string },\n\t\t...rest: Content extends null ? [] | [b?: undefined] : [content: Content]\n\t): this\n\tpublic set(\n\t\ta: string | { [Key in ASide | BSide]: string },\n\t\t...rest: Content extends null\n\t\t\t? [] | [b?: string | undefined]\n\t\t\t: [b: string, content: Content] | [content: Content]\n\t): this {\n\t\tconst b: string =\n\t\t\ttypeof rest[0] === `string`\n\t\t\t\t? rest[0]\n\t\t\t\t: (a[this.b as keyof typeof a] as string)\n\t\tconst content: Content | undefined =\n\t\t\trest[1] ?? typeof rest[0] === `string` ? undefined : (rest[0] as Content)\n\t\ta = typeof a === `string` ? a : a[this.a]\n\t\tswitch (this.cardinality) {\n\t\t\t// biome-ignore lint/suspicious/noFallthroughSwitchClause: perfect here\n\t\t\tcase `1:1`: {\n\t\t\t\tconst bPrev = this.getRelatedKey(a)\n\t\t\t\tif (bPrev && bPrev !== b) this.delete(bPrev, a)\n\t\t\t}\n\t\t\tcase `1:n`: {\n\t\t\t\tconst aPrev = this.getRelatedKey(b)\n\t\t\t\tif (aPrev && aPrev !== a) this.delete(aPrev, b)\n\t\t\t}\n\t\t}\n\t\tif (content) {\n\t\t\tconst contentKey = this.makeContentKey(a, b)\n\t\t\tthis.setContent(contentKey, content)\n\t\t}\n\t\tthis.addRelation(a, b)\n\t\treturn this\n\t}\n\n\tpublic delete(a: string, b?: string): this\n\tpublic delete(\n\t\trelation:\n\t\t\t| Record<ASide | BSide, string>\n\t\t\t| Record<ASide, string>\n\t\t\t| Record<BSide, string>,\n\t\tb?: undefined,\n\t): this\n\tpublic delete(\n\t\tx:\n\t\t\t| Record<ASide | BSide, string>\n\t\t\t| Record<ASide, string>\n\t\t\t| Record<BSide, string>\n\t\t\t| string,\n\t\tb?: string | undefined,\n\t): this {\n\t\t// @ts-expect-error we deduce that this.b may index x\n\t\tb = typeof b === `string` ? b : (x[this.b] as string | undefined)\n\t\t// @ts-expect-error we deduce that this.a may index x\n\t\tconst a = typeof x === `string` ? x : (x[this.a] as string | undefined)\n\n\t\tif (a === undefined && typeof b === `string`) {\n\t\t\tconst bRelations = this.getRelatedKeys(b)\n\t\t\tif (bRelations) {\n\t\t\t\tfor (const a of bRelations) {\n\t\t\t\t\tthis.delete(a, b)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (typeof a === `string` && b === undefined) {\n\t\t\tconst aRelations = this.getRelatedKeys(a)\n\t\t\tif (aRelations) {\n\t\t\t\tfor (const b of aRelations) {\n\t\t\t\t\tthis.delete(a, b)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (typeof a === `string` && typeof b === `string`) {\n\t\t\tthis.deleteRelation(a, b)\n\t\t\tconst contentKey = this.makeContentKey(a, b)\n\t\t\tthis.deleteContent(contentKey)\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic getRelatedKey(key: string): string | undefined {\n\t\tconst relations = this.getRelatedKeys(key)\n\t\tif (relations) {\n\t\t\tif (relations.size > 1) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`${relations.size} related keys were found for key \"${key}\": (${[\n\t\t\t\t\t\t...relations,\n\t\t\t\t\t]\n\t\t\t\t\t\t.map((k) => `\"${k}\"`)\n\t\t\t\t\t\t.join(`, `)}). Only one related key was expected.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tfor (const relation of relations) {\n\t\t\t\treturn relation\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic replaceRelations(\n\t\ta: string,\n\t\trelations: Content extends null ? string[] : Record<string, Content>,\n\t\tconfig?: { reckless: boolean },\n\t): this {\n\t\tconst hasContent = !Array.isArray(relations)\n\t\tconst bs = hasContent ? Object.keys(relations) : relations\n\t\tif (config?.reckless) {\n\t\t\tthis.replaceRelationsUnsafely(a, bs)\n\t\t} else {\n\t\t\tthis.replaceRelationsSafely(a, bs)\n\t\t}\n\t\tif (hasContent) {\n\t\t\tfor (const b of bs) {\n\t\t\t\tconst contentKey = this.makeContentKey(a, b)\n\t\t\t\tconst content = relations[b] as Content\n\t\t\t\tthis.setContent(contentKey, content)\n\t\t\t}\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic getContent(a: string, b: string): Content | undefined {\n\t\tconst contentKey = this.makeContentKey(a, b)\n\t\treturn this.getContentInternal(contentKey)\n\t}\n\n\tpublic getRelationEntries(\n\t\tinput: Record<ASide, string> | Record<BSide, string>,\n\t): [string, Content][] {\n\t\tconst a: string | undefined = (input as any)[this.a]\n\t\tconst b: string | undefined = (input as any)[this.b]\n\t\tif (a !== undefined && b === undefined) {\n\t\t\tconst aRelations = this.getRelatedKeys(a)\n\t\t\tif (aRelations) {\n\t\t\t\treturn [...aRelations].map((b) => {\n\t\t\t\t\treturn [b, this.getContent(a, b) ?? (null as Content)]\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tif (a === undefined && b !== undefined) {\n\t\t\tconst bRelations = this.getRelatedKeys(b)\n\t\t\tif (bRelations) {\n\t\t\t\treturn [...bRelations].map((a) => {\n\t\t\t\t\treturn [a, this.getContent(a, b) ?? (null as Content)]\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\treturn []\n\t}\n\n\tpublic has(a: string, b?: string): boolean {\n\t\tif (b) {\n\t\t\tconst setA = this.getRelatedKeys(a)\n\t\t\treturn setA?.has(b) ?? false\n\t\t}\n\t\treturn this.relations.has(a)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { IMPLICIT } from \"atom.io/internal\"\n\nimport { createRegularAtom, createSelector } from \"atom.io/internal\"\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\n\nexport function struct<\n\tStruct extends { [key: string]: unknown },\n\tKey extends string,\n>(\n\toptions: {\n\t\tkey: Key\n\t\tdefault: Struct\n\t},\n\tstore: Store = IMPLICIT.STORE,\n): [\n\t{\n\t\t[K in keyof Struct as `${Key}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomToken<Struct[K]>\n\t},\n\tAtomIO.ReadonlySelectorToken<Struct>,\n] {\n\tconst atoms: {\n\t\t[K in keyof Struct as `${Key}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomToken<Struct[K]>\n\t} = Object.keys(options.default).reduce((acc, key) => {\n\t\tconst atomName = options.key + capitalize(key) + `State`\n\t\tacc[atomName] = createRegularAtom(\n\t\t\t{\n\t\t\t\tkey: `${options.key}.${key}`,\n\t\t\t\tdefault: options.default[key],\n\t\t\t},\n\t\t\tundefined,\n\t\t\tstore,\n\t\t)\n\t\treturn acc\n\t}, {} as any)\n\tconst structState = createSelector(\n\t\t{\n\t\t\tkey: options.key,\n\t\t\tget: ({ get }) => {\n\t\t\t\treturn Object.keys(options.default).reduce((acc, key) => {\n\t\t\t\t\tacc[key] = get(atoms[options.key + capitalize(key) + `State`])\n\t\t\t\t\treturn acc\n\t\t\t\t}, {} as any)\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t\tstore,\n\t)\n\treturn [atoms, structState]\n}\n","import type * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tcreateRegularAtomFamily,\n\tcreateSelectorFamily,\n} from \"atom.io/internal\"\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\nconst nameFamily = (topKey: string, subKey: string) =>\n\t`find` + capitalize(topKey) + capitalize(subKey) + `State`\n\nexport function structFamily<\n\tStruct extends object,\n\tKey extends string,\n>(options: {\n\tkey: Key\n\tdefault: Struct\n}): [\n\t{\n\t\t[K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomFamily<Struct[K], string>\n\t},\n\tAtomIO.ReadonlySelectorFamily<Struct>,\n] {\n\tconst atoms: {\n\t\t[K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomFamily<Struct[K], string>\n\t} = Object.keys(options.default).reduce((acc, subKey) => {\n\t\tconst atomFamilyName = nameFamily(options.key, subKey)\n\t\tacc[atomFamilyName] = createRegularAtomFamily(\n\t\t\t{\n\t\t\t\tkey: `${options.key}.${subKey}`,\n\t\t\t\tdefault: (options.default as any)[subKey],\n\t\t\t},\n\t\t\tIMPLICIT.STORE,\n\t\t)\n\t\treturn acc\n\t}, {} as any)\n\tconst findStructState = createSelectorFamily(\n\t\t{\n\t\t\tkey: options.key,\n\t\t\tget:\n\t\t\t\t(id) =>\n\t\t\t\t({ get }) => {\n\t\t\t\t\treturn Object.keys(options.default).reduce((acc, subKey) => {\n\t\t\t\t\t\tacc[subKey] = get(\n\t\t\t\t\t\t\t(atoms as any)[nameFamily(options.key, subKey)](id),\n\t\t\t\t\t\t)\n\t\t\t\t\t\treturn acc\n\t\t\t\t\t}, {} as any)\n\t\t\t\t},\n\t\t},\n\t\tIMPLICIT.STORE,\n\t)\n\treturn [atoms, findStructState]\n}\n","export type Loadable<T> = Promise<T> | T\nexport type Fated<T, E extends Error = Error> = Loadable<E | T>\n\n/**\n * Utility for handling loadable values\n * @param loadable Loadable value\n * @param fallback Fallback value until Loadable is resolved\n * @returns Fallback value if your loadable is a promise, otherwise the loadable's resolved value\n */\nexport function until<T>(loadable: Loadable<T>, fallback: T): T {\n\tif (loadable instanceof Promise) {\n\t\treturn fallback\n\t}\n\treturn loadable\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import * as AtomIO from 'atom.io';
2
- import { SelectorFamily, MutableAtomFamily, Transactors } from 'atom.io';
2
+ import { ReadonlySelectorFamily, MutableAtomFamily, Transactors } from 'atom.io';
3
3
  import { Store } from 'atom.io/internal';
4
4
  import { Json, Stringified } from 'atom.io/json';
5
5
  import { SetRTX, SetRTXJson } from 'atom.io/transceivers/set-rtx';
@@ -87,33 +87,33 @@ interface JoinOptions<ASide extends string, BSide extends string, Cardinality ex
87
87
  readonly cardinality: Cardinality;
88
88
  }
89
89
  type JoinState<ASide extends string, BSide extends string, Cardinality extends Cardinality, Content extends Json.Object | null> = Cardinality extends `1:1` ? (Content extends Json.Object ? {
90
- readonly [AB in ASide | BSide as AB extends ASide ? `${AB}EntryOf${Capitalize<BSide>}` : `${AB}EntryOf${Capitalize<ASide>}`]: SelectorFamily<[
90
+ readonly [AB in ASide | BSide as AB extends ASide ? `${AB}EntryOf${Capitalize<BSide>}` : `${AB}EntryOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<[
91
91
  string,
92
92
  Content
93
93
  ] | null, string>;
94
94
  } : {}) & {
95
- readonly [AB in ASide | BSide as AB extends ASide ? `${AB}KeyOf${Capitalize<BSide>}` : `${AB}KeyOf${Capitalize<ASide>}`]: SelectorFamily<string | null, string>;
95
+ readonly [AB in ASide | BSide as AB extends ASide ? `${AB}KeyOf${Capitalize<BSide>}` : `${AB}KeyOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<string | null, string>;
96
96
  } : Cardinality extends `1:n` ? (Content extends Json.Object ? {
97
- readonly [A in ASide as `${A}EntryOf${Capitalize<BSide>}`]: SelectorFamily<[
97
+ readonly [A in ASide as `${A}EntryOf${Capitalize<BSide>}`]: ReadonlySelectorFamily<[
98
98
  string,
99
99
  Content
100
100
  ] | null, string>;
101
101
  } & {
102
- readonly [B in BSide as `${B}EntriesOf${Capitalize<ASide>}`]: SelectorFamily<[
102
+ readonly [B in BSide as `${B}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<[
103
103
  string,
104
104
  Content
105
105
  ][], string>;
106
106
  } : {}) & {
107
- readonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: SelectorFamily<string | null, string>;
107
+ readonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: ReadonlySelectorFamily<string | null, string>;
108
108
  } & {
109
- readonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: SelectorFamily<string[], string>;
109
+ readonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<string[], string>;
110
110
  } : Cardinality extends `n:n` ? (Content extends Json.Object ? {
111
- readonly [AB in ASide | BSide as AB extends ASide ? `${AB}EntriesOf${Capitalize<BSide>}` : `${AB}EntriesOf${Capitalize<ASide>}`]: SelectorFamily<[
111
+ readonly [AB in ASide | BSide as AB extends ASide ? `${AB}EntriesOf${Capitalize<BSide>}` : `${AB}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<[
112
112
  string,
113
113
  Content
114
114
  ][], string>;
115
115
  } : {}) & {
116
- readonly [AB in ASide | BSide as AB extends ASide ? `${AB}KeysOf${Capitalize<BSide>}` : `${AB}KeysOf${Capitalize<ASide>}`]: SelectorFamily<string[], string>;
116
+ readonly [AB in ASide | BSide as AB extends ASide ? `${AB}KeysOf${Capitalize<BSide>}` : `${AB}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<string[], string>;
117
117
  } : never;
118
118
  declare class Join<const ASide extends string, const BSide extends string, const Cardinality extends `1:1` | `1:n` | `n:n`, const Content extends Json.Object | null = null> {
119
119
  private transactors;
@@ -42,22 +42,16 @@ var Join = class {
42
42
  this.core = { findRelatedKeysState };
43
43
  const getRelatedKeys = ({ get }, key) => get(findRelatedKeysState(key));
44
44
  const addRelation = (transactors, a2, b2) => {
45
- const aKeys = getRelatedKeys(transactors, a2);
46
- const bKeys = getRelatedKeys(transactors, b2);
47
- transactors.set(findRelatedKeysState(a2), aKeys.add(b2));
48
- transactors.set(findRelatedKeysState(b2), bKeys.add(a2));
45
+ const aKeysState = findRelatedKeysState(a2);
46
+ const bKeysState = findRelatedKeysState(b2);
47
+ transactors.set(aKeysState, (aKeys) => aKeys.add(b2));
48
+ transactors.set(bKeysState, (bKeys) => bKeys.add(a2));
49
49
  };
50
50
  const deleteRelation = (transactors, a2, b2) => {
51
51
  const aKeys = getRelatedKeys(transactors, a2);
52
52
  aKeys.delete(b2);
53
- if (aKeys.size === 0) {
54
- dispose(findRelatedKeysState(a2));
55
- }
56
53
  const bKeys = getRelatedKeys(transactors, b2);
57
54
  bKeys.delete(a2);
58
- if (bKeys.size === 0) {
59
- dispose(findRelatedKeysState(b2));
60
- }
61
55
  };
62
56
  const replaceRelationsSafely = (transactors, a2, bs) => {
63
57
  const aRelations = getRelatedKeys(transactors, a2);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dict.ts","../src/join.ts","../src/struct.ts","../src/struct-family.ts","../src/until.ts"],"names":["IMPLICIT","a","b","createSelector","capitalize","createRegularAtomFamily","createSelectorFamily"],"mappings":"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","sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, createSelector } from \"atom.io/internal\"\nimport type { Json, Stringified } from \"atom.io/json\"\n\nexport function dict<State, Key extends Json.Serializable>(\n\tfindState:\n\t\t| AtomIO.AtomFamily<State, Key>\n\t\t| AtomIO.ReadonlySelectorFamily<State, Key>\n\t\t| AtomIO.SelectorFamily<State, Key>,\n\tindex:\n\t\t| AtomIO.AtomToken<Key[]>\n\t\t| AtomIO.ReadonlySelectorToken<Key[]>\n\t\t| AtomIO.SelectorToken<Key[]>,\n\tstore: Store = IMPLICIT.STORE,\n): AtomIO.ReadonlySelectorToken<{ [K in Stringified<Key>]: State }> {\n\treturn createSelector(\n\t\t{\n\t\t\tkey: `${findState.key}Dict`,\n\t\t\tget: ({ get }) => {\n\t\t\t\tconst keys = get(index)\n\t\t\t\treturn keys.reduce((acc, key) => {\n\t\t\t\t\tacc[key] = get(findState(key))\n\t\t\t\t\treturn acc\n\t\t\t\t}, {} as any)\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t\tstore,\n\t)\n}\n","/* eslint-disable @typescript-eslint/ban-types */\nimport type {\n\tAtomFamily,\n\tMutableAtomFamily,\n\tRead,\n\tSelectorFamily,\n\tTransactors,\n\tWrite,\n} from \"atom.io\"\nimport { dispose, getState, setState } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tcreateMutableAtomFamily,\n\tcreateRegularAtomFamily,\n\tcreateSelectorFamily,\n\tgetJsonFamily,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { SetRTXJson } from \"atom.io/transceivers/set-rtx\"\nimport { SetRTX } from \"atom.io/transceivers/set-rtx\"\n\nimport type {\n\tBaseExternalStoreConfiguration,\n\tExternalStoreConfiguration,\n\tJunctionEntries,\n\tJunctionSchema,\n} from \"~/packages/rel8/junction/src\"\nimport { Junction } from \"~/packages/rel8/junction/src\"\nimport type * as Rel8 from \"~/packages/rel8/types/src\"\n\nconst TRANSACTORS: Transactors = { get: getState, set: setState }\n\nfunction capitalize<S extends string>(string: S): Capitalize<S> {\n\treturn (string[0].toUpperCase() + string.slice(1)) as Capitalize<S>\n}\n\nexport interface JoinOptions<\n\tASide extends string,\n\tBSide extends string,\n\tCardinality extends Rel8.Cardinality,\n\tContent extends Json.Object | null,\n> extends Json.Object,\n\t\tJunctionSchema<ASide, BSide>,\n\t\tPartial<JunctionEntries<Content>> {\n\treadonly key: string\n\treadonly cardinality: Cardinality\n}\n\nexport type JoinState<\n\tASide extends string,\n\tBSide extends string,\n\tCardinality extends Rel8.Cardinality,\n\tContent extends Json.Object | null,\n> = Cardinality extends `1:1`\n\t? (Content extends Json.Object\n\t\t\t? {\n\t\t\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t\t\t? `${AB}EntryOf${Capitalize<BSide>}`\n\t\t\t\t\t\t: `${AB}EntryOf${Capitalize<ASide>}`]: SelectorFamily<\n\t\t\t\t\t\t[string, Content] | null,\n\t\t\t\t\t\tstring\n\t\t\t\t\t>\n\t\t\t }\n\t\t\t: {}) & {\n\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t? `${AB}KeyOf${Capitalize<BSide>}`\n\t\t\t\t: `${AB}KeyOf${Capitalize<ASide>}`]: SelectorFamily<\n\t\t\t\tstring | null,\n\t\t\t\tstring\n\t\t\t>\n\t }\n\t: Cardinality extends `1:n`\n\t ? (Content extends Json.Object\n\t\t\t\t? {\n\t\t\t\t\t\treadonly [A in ASide as `${A}EntryOf${Capitalize<BSide>}`]: SelectorFamily<\n\t\t\t\t\t\t\t[string, Content] | null,\n\t\t\t\t\t\t\tstring\n\t\t\t\t\t\t>\n\t\t\t\t } & {\n\t\t\t\t\t\treadonly [B in BSide as `${B}EntriesOf${Capitalize<ASide>}`]: SelectorFamily<\n\t\t\t\t\t\t\t[string, Content][],\n\t\t\t\t\t\t\tstring\n\t\t\t\t\t\t>\n\t\t\t\t }\n\t\t\t\t: {}) & {\n\t\t\t\treadonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: SelectorFamily<\n\t\t\t\t\tstring | null,\n\t\t\t\t\tstring\n\t\t\t\t>\n\t\t } & {\n\t\t\t\treadonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: SelectorFamily<\n\t\t\t\t\tstring[],\n\t\t\t\t\tstring\n\t\t\t\t>\n\t\t }\n\t : Cardinality extends `n:n`\n\t\t ? (Content extends Json.Object\n\t\t\t\t\t? {\n\t\t\t\t\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t\t\t\t\t? `${AB}EntriesOf${Capitalize<BSide>}`\n\t\t\t\t\t\t\t\t: `${AB}EntriesOf${Capitalize<ASide>}`]: SelectorFamily<\n\t\t\t\t\t\t\t\t[string, Content][],\n\t\t\t\t\t\t\t\tstring\n\t\t\t\t\t\t\t>\n\t\t\t\t\t }\n\t\t\t\t\t: {}) & {\n\t\t\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t\t\t? `${AB}KeysOf${Capitalize<BSide>}`\n\t\t\t\t\t\t: `${AB}KeysOf${Capitalize<ASide>}`]: SelectorFamily<\n\t\t\t\t\t\tstring[],\n\t\t\t\t\t\tstring\n\t\t\t\t\t>\n\t\t\t }\n\t\t : never\n\nexport class Join<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Cardinality extends `1:1` | `1:n` | `n:n`,\n\tconst Content extends Json.Object | null = null,\n> {\n\tprivate transactors: Transactors = TRANSACTORS\n\tpublic relations: Junction<ASide, BSide, Content>\n\tpublic findState: JoinState<ASide, BSide, Cardinality, Content>\n\tpublic core: {\n\t\tfindRelatedKeysState: MutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>\n\t}\n\tpublic transact(\n\t\ttransactors: Transactors,\n\t\trun: (join: Join<ASide, BSide, Cardinality, Content>) => void,\n\t): void {\n\t\tthis.transactors = transactors\n\t\trun(this)\n\t\tthis.transactors = TRANSACTORS\n\t}\n\tpublic constructor(\n\t\toptions: JoinOptions<ASide, BSide, Cardinality, Content>,\n\t\tdefaultContent: Content | undefined,\n\t\tstore: Store = IMPLICIT.STORE,\n\t) {\n\t\tconst a: ASide = options.between[0]\n\t\tconst b: BSide = options.between[1]\n\t\tconst findRelatedKeysState = createMutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>(\n\t\t\t{\n\t\t\t\tkey: `${options.key}/relatedKeys`,\n\t\t\t\tdefault: () => new SetRTX(),\n\t\t\t\tmutable: true,\n\t\t\t\tfromJson: (json) => SetRTX.fromJSON(json),\n\t\t\t\ttoJson: (set) => set.toJSON(),\n\t\t\t},\n\t\t\tstore,\n\t\t)\n\t\tthis.core = { findRelatedKeysState }\n\t\tconst getRelatedKeys: Read<(key: string) => SetRTX<string>> = (\n\t\t\t{ get },\n\t\t\tkey,\n\t\t) => get(findRelatedKeysState(key))\n\t\tconst addRelation: Write<(a: string, b: string) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tb,\n\t\t) => {\n\t\t\tconst aKeys = getRelatedKeys(transactors, a)\n\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\ttransactors.set(findRelatedKeysState(a), aKeys.add(b))\n\t\t\ttransactors.set(findRelatedKeysState(b), bKeys.add(a))\n\t\t}\n\t\tconst deleteRelation: Write<(a: string, b: string) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tb,\n\t\t) => {\n\t\t\tconst aKeys = getRelatedKeys(transactors, a)\n\t\t\taKeys.delete(b)\n\t\t\tif (aKeys.size === 0) {\n\t\t\t\tdispose(findRelatedKeysState(a))\n\t\t\t}\n\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\tbKeys.delete(a)\n\t\t\tif (bKeys.size === 0) {\n\t\t\t\tdispose(findRelatedKeysState(b))\n\t\t\t}\n\t\t}\n\t\tconst replaceRelationsSafely: Write<(a: string, bs: string[]) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tbs,\n\t\t) => {\n\t\t\tconst aRelations = getRelatedKeys(transactors, a)\n\t\t\tfor (const b of aRelations) {\n\t\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\t\tif (bKeys) {\n\t\t\t\t\tbKeys.delete(a)\n\t\t\t\t\tif (bKeys.size === 0) {\n\t\t\t\t\t\tdispose(findRelatedKeysState(b))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttransactors.set(findRelatedKeysState(a), new SetRTX(bs))\n\t\t\tfor (const b of bs) {\n\t\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\t\tbKeys.add(a)\n\t\t\t}\n\t\t}\n\t\tconst replaceRelationsUnsafely: Write<(a: string, bs: string[]) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tbs,\n\t\t) => {\n\t\t\ttransactors.set(findRelatedKeysState(a), new SetRTX(bs))\n\t\t\tfor (const b of bs) {\n\t\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\t\tbKeys.add(a)\n\t\t\t}\n\t\t}\n\t\tconst has: Read<(a: string, b?: string) => boolean> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tb,\n\t\t) => {\n\t\t\tconst aKeys = getRelatedKeys(transactors, a)\n\t\t\treturn b ? aKeys.has(b) : aKeys.size > 0\n\t\t}\n\t\tconst baseExternalStoreConfiguration: BaseExternalStoreConfiguration = {\n\t\t\tgetRelatedKeys: (key) => getRelatedKeys(this.transactors, key),\n\t\t\taddRelation: (a, b) => addRelation(this.transactors, a, b),\n\t\t\tdeleteRelation: (a, b) => deleteRelation(this.transactors, a, b),\n\t\t\treplaceRelationsSafely: (a, bs) =>\n\t\t\t\treplaceRelationsSafely(this.transactors, a, bs),\n\t\t\treplaceRelationsUnsafely: (a, bs) =>\n\t\t\t\treplaceRelationsUnsafely(this.transactors, a, bs),\n\t\t\thas: (a, b) => has(this.transactors, a, b),\n\t\t}\n\t\tlet externalStore: ExternalStoreConfiguration<Content>\n\t\tlet findContentState: AtomFamily<Content, string>\n\t\tif (defaultContent) {\n\t\t\tfindContentState = createRegularAtomFamily<Content, string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/content`,\n\t\t\t\t\tdefault: defaultContent,\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tconst getContent: Read<(key: string) => Content | null> = ({ get }, key) =>\n\t\t\t\tget(findContentState(key))\n\t\t\tconst setContent: Write<(key: string, content: Content) => void> = (\n\t\t\t\ttransactors,\n\t\t\t\tkey,\n\t\t\t\tcontent,\n\t\t\t) => transactors.set(findContentState(key), content)\n\t\t\tconst deleteContent: Write<(key: string) => void> = (_, key) =>\n\t\t\t\tdispose(findContentState(key))\n\t\t\tconst externalStoreWithContentConfiguration = {\n\t\t\t\tgetContent: (contentKey: string) => {\n\t\t\t\t\tconst content = getContent(this.transactors, contentKey)\n\t\t\t\t\treturn content\n\t\t\t\t},\n\t\t\t\tsetContent: (contentKey: string, content: Content) => {\n\t\t\t\t\tsetContent(this.transactors, contentKey, content)\n\t\t\t\t},\n\t\t\t\tdeleteContent: (contentKey: string) => {\n\t\t\t\t\tdeleteContent(this.transactors, contentKey)\n\t\t\t\t},\n\t\t\t}\n\t\t\texternalStore = Object.assign(\n\t\t\t\tbaseExternalStoreConfiguration,\n\t\t\t\texternalStoreWithContentConfiguration,\n\t\t\t) as ExternalStoreConfiguration<Content>\n\t\t} else {\n\t\t\texternalStore =\n\t\t\t\tbaseExternalStoreConfiguration as ExternalStoreConfiguration<Content>\n\t\t}\n\t\tconst relations = new Junction<ASide, BSide, Content>(options, {\n\t\t\texternalStore,\n\t\t\tmakeContentKey: (...args) => args.sort().join(`:`),\n\t\t})\n\n\t\tconst createSingleKeyStateFamily = () =>\n\t\t\tcreateSelectorFamily<string | null, string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/singleRelatedKey`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst relatedKeys = get(findRelatedKeysState(key))\n\t\t\t\t\t\t\tfor (const relatedKey of relatedKeys) {\n\t\t\t\t\t\t\t\treturn relatedKey\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\tconst getMultipleKeyStateFamily = () => {\n\t\t\treturn createSelectorFamily<string[], string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/multipleRelatedKeys`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst jsonFamily = getJsonFamily(findRelatedKeysState, store)\n\t\t\t\t\t\t\tconst json = get(jsonFamily(key))\n\t\t\t\t\t\t\treturn json.members\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\t}\n\t\tconst createSingleEntryStateFamily = () =>\n\t\t\tcreateSelectorFamily<[string, Content] | null, string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/singleRelatedEntry`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst relatedKeys = get(findRelatedKeysState(key))\n\t\t\t\t\t\t\tfor (const relatedKey of relatedKeys) {\n\t\t\t\t\t\t\t\tconst contentKey = relations.makeContentKey(key, relatedKey)\n\t\t\t\t\t\t\t\treturn [relatedKey, get(findContentState(contentKey))]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\tconst getMultipleEntryStateFamily = () =>\n\t\t\tcreateSelectorFamily<[string, Content][], string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/multipleRelatedEntries`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst jsonFamily = getJsonFamily(findRelatedKeysState, store)\n\t\t\t\t\t\t\tconst json = get(jsonFamily(key))\n\t\t\t\t\t\t\treturn json.members.map((relatedKey) => {\n\t\t\t\t\t\t\t\tconst contentKey = relations.makeContentKey(key, relatedKey)\n\t\t\t\t\t\t\t\treturn [relatedKey, get(findContentState(contentKey))]\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\n\t\tswitch (options.cardinality) {\n\t\t\tcase `1:1`: {\n\t\t\t\tconst findSingleRelatedKeyState = createSingleKeyStateFamily()\n\t\t\t\tconst stateKeyA = `${a}KeyOf${capitalize(b)}` as const\n\t\t\t\tconst stateKeyB = `${b}KeyOf${capitalize(a)}` as const\n\t\t\t\tconst findStateBase = {\n\t\t\t\t\t[stateKeyA]: findSingleRelatedKeyState,\n\t\t\t\t\t[stateKeyB]: findSingleRelatedKeyState,\n\t\t\t\t} as JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tlet findState: JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tif (defaultContent) {\n\t\t\t\t\tconst findSingleRelatedEntryState = createSingleEntryStateFamily()\n\t\t\t\t\tconst entriesStateKeyA = `${a}EntryOf${capitalize(b)}` as const\n\t\t\t\t\tconst entriesStateKeyB = `${b}EntryOf${capitalize(a)}` as const\n\t\t\t\t\tconst findStateWithContent = {\n\t\t\t\t\t\t[entriesStateKeyA]: findSingleRelatedEntryState,\n\t\t\t\t\t\t[entriesStateKeyB]: findSingleRelatedEntryState,\n\t\t\t\t\t}\n\t\t\t\t\tfindState = Object.assign(findStateBase, findStateWithContent)\n\t\t\t\t} else {\n\t\t\t\t\tfindState = findStateBase\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.findState = findState\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase `1:n`: {\n\t\t\t\tconst findSingleRelatedKeyState = createSingleKeyStateFamily()\n\t\t\t\tconst findMultipleRelatedKeysState = getMultipleKeyStateFamily()\n\t\t\t\tconst stateKeyA = `${a}KeyOf${capitalize(b)}` as const\n\t\t\t\tconst stateKeyB = `${b}KeysOf${capitalize(a)}` as const\n\t\t\t\tconst findStateBase = {\n\t\t\t\t\t[stateKeyA]: findSingleRelatedKeyState,\n\t\t\t\t\t[stateKeyB]: findMultipleRelatedKeysState,\n\t\t\t\t} as JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tlet findState: JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tif (defaultContent) {\n\t\t\t\t\tconst findSingleRelatedEntryState = createSingleEntryStateFamily()\n\t\t\t\t\tconst findMultipleRelatedEntriesState = getMultipleEntryStateFamily()\n\t\t\t\t\tconst entriesStateKeyA = `${a}EntryOf${capitalize(b)}` as const\n\t\t\t\t\tconst entriesStateKeyB = `${b}EntriesOf${capitalize(a)}` as const\n\t\t\t\t\tconst findStateWithContent = {\n\t\t\t\t\t\t[entriesStateKeyA]: findSingleRelatedEntryState,\n\t\t\t\t\t\t[entriesStateKeyB]: findMultipleRelatedEntriesState,\n\t\t\t\t\t}\n\t\t\t\t\tfindState = Object.assign(findStateBase, findStateWithContent)\n\t\t\t\t} else {\n\t\t\t\t\tfindState = findStateBase\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.findState = findState\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst findMultipleRelatedKeysState = getMultipleKeyStateFamily()\n\t\t\t\tconst stateKeyA = `${a}KeysOf${capitalize(b)}` as const\n\t\t\t\tconst stateKeyB = `${b}KeysOf${capitalize(a)}` as const\n\t\t\t\tconst findStateBase = {\n\t\t\t\t\t[stateKeyA]: findMultipleRelatedKeysState,\n\t\t\t\t\t[stateKeyB]: findMultipleRelatedKeysState,\n\t\t\t\t} as JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tlet findState: JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tif (defaultContent) {\n\t\t\t\t\tconst findMultipleRelatedEntriesState = getMultipleEntryStateFamily()\n\t\t\t\t\tconst entriesStateKeyA = `${a}EntriesOf${capitalize(b)}` as const\n\t\t\t\t\tconst entriesStateKeyB = `${b}EntriesOf${capitalize(a)}` as const\n\t\t\t\t\tconst findStateWithContent = {\n\t\t\t\t\t\t[entriesStateKeyA]: findMultipleRelatedEntriesState,\n\t\t\t\t\t\t[entriesStateKeyB]: findMultipleRelatedEntriesState,\n\t\t\t\t\t}\n\t\t\t\t\tfindState = Object.assign(findStateBase, findStateWithContent)\n\t\t\t\t} else {\n\t\t\t\t\tfindState = findStateBase\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.findState = findState\n\t\t\t}\n\t\t}\n\t}\n}\nexport function join<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Cardinality extends `1:1` | `1:n` | `n:n`,\n>(\n\toptions: JoinOptions<ASide, BSide, Cardinality, null>,\n\tdefaultContent?: undefined,\n\tstore?: Store,\n): {\n\treadonly relations: Junction<ASide, BSide, null>\n\treadonly findState: JoinState<ASide, BSide, Cardinality, null>\n\treadonly transact: (\n\t\ttransactors: Transactors,\n\t\trun: (join: Join<ASide, BSide, Cardinality, null>) => void,\n\t) => void\n\treadonly core: {\n\t\treadonly findRelatedKeysState: MutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>\n\t}\n}\nexport function join<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Cardinality extends `1:1` | `1:n` | `n:n`,\n\tconst Content extends Json.Object,\n>(\n\toptions: JoinOptions<ASide, BSide, Cardinality, Content>,\n\tdefaultContent: Content,\n\tstore?: Store,\n): {\n\treadonly relations: Junction<ASide, BSide, Content>\n\treadonly findState: JoinState<ASide, BSide, Cardinality, Content>\n\treadonly transact: (\n\t\ttransactors: Transactors,\n\t\trun: (join: Join<ASide, BSide, Cardinality, Content>) => void,\n\t) => void\n\treadonly core: {\n\t\treadonly findRelatedKeysState: MutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>\n\t}\n}\nexport function join<\n\tASide extends string,\n\tBSide extends string,\n\tCardinality extends `1:1` | `1:n` | `n:n`,\n\tContent extends Json.Object,\n>(\n\toptions: JoinOptions<ASide, BSide, Cardinality, Content>,\n\tdefaultContent: Content | undefined,\n\tstore: Store = IMPLICIT.STORE,\n): Join<ASide, BSide, Cardinality, Content> {\n\treturn new Join(options, defaultContent, store)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { IMPLICIT } from \"atom.io/internal\"\n\nimport { createRegularAtom, createSelector } from \"atom.io/internal\"\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\n\nexport function struct<\n\tStruct extends { [key: string]: unknown },\n\tKey extends string,\n>(\n\toptions: {\n\t\tkey: Key\n\t\tdefault: Struct\n\t},\n\tstore: Store = IMPLICIT.STORE,\n): [\n\t{\n\t\t[K in keyof Struct as `${Key}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomToken<Struct[K]>\n\t},\n\tAtomIO.ReadonlySelectorToken<Struct>,\n] {\n\tconst atoms: {\n\t\t[K in keyof Struct as `${Key}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomToken<Struct[K]>\n\t} = Object.keys(options.default).reduce((acc, key) => {\n\t\tconst atomName = options.key + capitalize(key) + `State`\n\t\tacc[atomName] = createRegularAtom(\n\t\t\t{\n\t\t\t\tkey: `${options.key}.${key}`,\n\t\t\t\tdefault: options.default[key],\n\t\t\t},\n\t\t\tundefined,\n\t\t\tstore,\n\t\t)\n\t\treturn acc\n\t}, {} as any)\n\tconst structState = createSelector(\n\t\t{\n\t\t\tkey: options.key,\n\t\t\tget: ({ get }) => {\n\t\t\t\treturn Object.keys(options.default).reduce((acc, key) => {\n\t\t\t\t\tacc[key] = get(atoms[options.key + capitalize(key) + `State`])\n\t\t\t\t\treturn acc\n\t\t\t\t}, {} as any)\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t\tstore,\n\t)\n\treturn [atoms, structState]\n}\n","import type * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tcreateRegularAtomFamily,\n\tcreateSelectorFamily,\n} from \"atom.io/internal\"\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\nconst nameFamily = (topKey: string, subKey: string) =>\n\t`find` + capitalize(topKey) + capitalize(subKey) + `State`\n\nexport function structFamily<\n\tStruct extends object,\n\tKey extends string,\n>(options: {\n\tkey: Key\n\tdefault: Struct\n}): [\n\t{\n\t\t[K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomFamily<Struct[K], string>\n\t},\n\tAtomIO.ReadonlySelectorFamily<Struct>,\n] {\n\tconst atoms: {\n\t\t[K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomFamily<Struct[K], string>\n\t} = Object.keys(options.default).reduce((acc, subKey) => {\n\t\tconst atomFamilyName = nameFamily(options.key, subKey)\n\t\tacc[atomFamilyName] = createRegularAtomFamily(\n\t\t\t{\n\t\t\t\tkey: `${options.key}.${subKey}`,\n\t\t\t\tdefault: (options.default as any)[subKey],\n\t\t\t},\n\t\t\tIMPLICIT.STORE,\n\t\t)\n\t\treturn acc\n\t}, {} as any)\n\tconst findStructState = createSelectorFamily(\n\t\t{\n\t\t\tkey: options.key,\n\t\t\tget:\n\t\t\t\t(id) =>\n\t\t\t\t({ get }) => {\n\t\t\t\t\treturn Object.keys(options.default).reduce((acc, subKey) => {\n\t\t\t\t\t\tacc[subKey] = get(\n\t\t\t\t\t\t\t(atoms as any)[nameFamily(options.key, subKey)](id),\n\t\t\t\t\t\t)\n\t\t\t\t\t\treturn acc\n\t\t\t\t\t}, {} as any)\n\t\t\t\t},\n\t\t},\n\t\tIMPLICIT.STORE,\n\t)\n\treturn [atoms, findStructState]\n}\n","export type Loadable<T> = Promise<T> | T\nexport type Fated<T, E extends Error = Error> = Loadable<E | T>\n\n/**\n * Utility for handling loadable values\n * @param loadable Loadable value\n * @param fallback Fallback value until Loadable is resolved\n * @returns Fallback value if your loadable is a promise, otherwise the loadable's resolved value\n */\nexport function until<T>(loadable: Loadable<T>, fallback: T): T {\n\tif (loadable instanceof Promise) {\n\t\treturn fallback\n\t}\n\treturn loadable\n}\n"]}
1
+ {"version":3,"sources":["../src/dict.ts","../src/join.ts","../src/struct.ts","../src/struct-family.ts","../src/until.ts"],"names":["IMPLICIT","a","b","createSelector","capitalize","createRegularAtomFamily","createSelectorFamily"],"mappings":"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","sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, createSelector } from \"atom.io/internal\"\nimport type { Json, Stringified } from \"atom.io/json\"\n\nexport function dict<State, Key extends Json.Serializable>(\n\tfindState:\n\t\t| AtomIO.AtomFamily<State, Key>\n\t\t| AtomIO.ReadonlySelectorFamily<State, Key>\n\t\t| AtomIO.SelectorFamily<State, Key>,\n\tindex:\n\t\t| AtomIO.AtomToken<Key[]>\n\t\t| AtomIO.ReadonlySelectorToken<Key[]>\n\t\t| AtomIO.SelectorToken<Key[]>,\n\tstore: Store = IMPLICIT.STORE,\n): AtomIO.ReadonlySelectorToken<{ [K in Stringified<Key>]: State }> {\n\treturn createSelector(\n\t\t{\n\t\t\tkey: `${findState.key}Dict`,\n\t\t\tget: ({ get }) => {\n\t\t\t\tconst keys = get(index)\n\t\t\t\treturn keys.reduce((acc, key) => {\n\t\t\t\t\tacc[key] = get(findState(key))\n\t\t\t\t\treturn acc\n\t\t\t\t}, {} as any)\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t\tstore,\n\t)\n}\n","/* eslint-disable @typescript-eslint/ban-types */\nimport type {\n\tAtomFamily,\n\tMutableAtomFamily,\n\tRead,\n\tReadonlySelectorFamily,\n\tTransactors,\n\tWrite,\n} from \"atom.io\"\nimport { dispose, getState, setState } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tcreateMutableAtomFamily,\n\tcreateRegularAtomFamily,\n\tcreateSelectorFamily,\n\tgetJsonFamily,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { SetRTXJson } from \"atom.io/transceivers/set-rtx\"\nimport { SetRTX } from \"atom.io/transceivers/set-rtx\"\n\nimport type {\n\tBaseExternalStoreConfiguration,\n\tExternalStoreConfiguration,\n\tJunctionEntries,\n\tJunctionSchema,\n} from \"~/packages/rel8/junction/src\"\nimport { Junction } from \"~/packages/rel8/junction/src\"\nimport type * as Rel8 from \"~/packages/rel8/types/src\"\n\nconst TRANSACTORS: Transactors = { get: getState, set: setState }\n\nfunction capitalize<S extends string>(string: S): Capitalize<S> {\n\treturn (string[0].toUpperCase() + string.slice(1)) as Capitalize<S>\n}\n\nexport interface JoinOptions<\n\tASide extends string,\n\tBSide extends string,\n\tCardinality extends Rel8.Cardinality,\n\tContent extends Json.Object | null,\n> extends Json.Object,\n\t\tJunctionSchema<ASide, BSide>,\n\t\tPartial<JunctionEntries<Content>> {\n\treadonly key: string\n\treadonly cardinality: Cardinality\n}\n\nexport type JoinState<\n\tASide extends string,\n\tBSide extends string,\n\tCardinality extends Rel8.Cardinality,\n\tContent extends Json.Object | null,\n> = Cardinality extends `1:1`\n\t? (Content extends Json.Object\n\t\t\t? {\n\t\t\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t\t\t? `${AB}EntryOf${Capitalize<BSide>}`\n\t\t\t\t\t\t: `${AB}EntryOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\t\t[string, Content] | null,\n\t\t\t\t\t\tstring\n\t\t\t\t\t>\n\t\t\t }\n\t\t\t: {}) & {\n\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t? `${AB}KeyOf${Capitalize<BSide>}`\n\t\t\t\t: `${AB}KeyOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<\n\t\t\t\tstring | null,\n\t\t\t\tstring\n\t\t\t>\n\t }\n\t: Cardinality extends `1:n`\n\t ? (Content extends Json.Object\n\t\t\t\t? {\n\t\t\t\t\t\treadonly [A in ASide as `${A}EntryOf${Capitalize<BSide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\t\t\t[string, Content] | null,\n\t\t\t\t\t\t\tstring\n\t\t\t\t\t\t>\n\t\t\t\t } & {\n\t\t\t\t\t\treadonly [B in BSide as `${B}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\t\t\t[string, Content][],\n\t\t\t\t\t\t\tstring\n\t\t\t\t\t\t>\n\t\t\t\t }\n\t\t\t\t: {}) & {\n\t\t\t\treadonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\tstring | null,\n\t\t\t\t\tstring\n\t\t\t\t>\n\t\t } & {\n\t\t\t\treadonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\tstring[],\n\t\t\t\t\tstring\n\t\t\t\t>\n\t\t }\n\t : Cardinality extends `n:n`\n\t\t ? (Content extends Json.Object\n\t\t\t\t\t? {\n\t\t\t\t\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t\t\t\t\t? `${AB}EntriesOf${Capitalize<BSide>}`\n\t\t\t\t\t\t\t\t: `${AB}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\t\t\t\t[string, Content][],\n\t\t\t\t\t\t\t\tstring\n\t\t\t\t\t\t\t>\n\t\t\t\t\t }\n\t\t\t\t\t: {}) & {\n\t\t\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t\t\t? `${AB}KeysOf${Capitalize<BSide>}`\n\t\t\t\t\t\t: `${AB}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\t\tstring[],\n\t\t\t\t\t\tstring\n\t\t\t\t\t>\n\t\t\t }\n\t\t : never\n\nexport class Join<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Cardinality extends `1:1` | `1:n` | `n:n`,\n\tconst Content extends Json.Object | null = null,\n> {\n\tprivate transactors: Transactors = TRANSACTORS\n\tpublic relations: Junction<ASide, BSide, Content>\n\tpublic findState: JoinState<ASide, BSide, Cardinality, Content>\n\tpublic core: {\n\t\tfindRelatedKeysState: MutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>\n\t}\n\tpublic transact(\n\t\ttransactors: Transactors,\n\t\trun: (join: Join<ASide, BSide, Cardinality, Content>) => void,\n\t): void {\n\t\tthis.transactors = transactors\n\t\trun(this)\n\t\tthis.transactors = TRANSACTORS\n\t}\n\tpublic constructor(\n\t\toptions: JoinOptions<ASide, BSide, Cardinality, Content>,\n\t\tdefaultContent: Content | undefined,\n\t\tstore: Store = IMPLICIT.STORE,\n\t) {\n\t\tconst a: ASide = options.between[0]\n\t\tconst b: BSide = options.between[1]\n\t\tconst findRelatedKeysState = createMutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>(\n\t\t\t{\n\t\t\t\tkey: `${options.key}/relatedKeys`,\n\t\t\t\tdefault: () => new SetRTX(),\n\t\t\t\tmutable: true,\n\t\t\t\tfromJson: (json) => SetRTX.fromJSON(json),\n\t\t\t\ttoJson: (set) => set.toJSON(),\n\t\t\t},\n\t\t\tstore,\n\t\t)\n\t\tthis.core = { findRelatedKeysState }\n\t\tconst getRelatedKeys: Read<(key: string) => SetRTX<string>> = (\n\t\t\t{ get },\n\t\t\tkey,\n\t\t) => get(findRelatedKeysState(key))\n\t\tconst addRelation: Write<(a: string, b: string) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tb,\n\t\t) => {\n\t\t\tconst aKeysState = findRelatedKeysState(a)\n\t\t\tconst bKeysState = findRelatedKeysState(b)\n\t\t\ttransactors.set(aKeysState, (aKeys) => aKeys.add(b))\n\t\t\ttransactors.set(bKeysState, (bKeys) => bKeys.add(a))\n\t\t}\n\t\tconst deleteRelation: Write<(a: string, b: string) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tb,\n\t\t) => {\n\t\t\tconst aKeys = getRelatedKeys(transactors, a)\n\t\t\taKeys.delete(b)\n\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\tbKeys.delete(a)\n\t\t}\n\t\tconst replaceRelationsSafely: Write<(a: string, bs: string[]) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tbs,\n\t\t) => {\n\t\t\tconst aRelations = getRelatedKeys(transactors, a)\n\t\t\tfor (const b of aRelations) {\n\t\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\t\tif (bKeys) {\n\t\t\t\t\tbKeys.delete(a)\n\t\t\t\t\tif (bKeys.size === 0) {\n\t\t\t\t\t\tdispose(findRelatedKeysState(b))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttransactors.set(findRelatedKeysState(a), new SetRTX(bs))\n\t\t\tfor (const b of bs) {\n\t\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\t\tbKeys.add(a)\n\t\t\t}\n\t\t}\n\t\tconst replaceRelationsUnsafely: Write<(a: string, bs: string[]) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tbs,\n\t\t) => {\n\t\t\ttransactors.set(findRelatedKeysState(a), new SetRTX(bs))\n\t\t\tfor (const b of bs) {\n\t\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\t\tbKeys.add(a)\n\t\t\t}\n\t\t}\n\t\tconst has: Read<(a: string, b?: string) => boolean> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tb,\n\t\t) => {\n\t\t\tconst aKeys = getRelatedKeys(transactors, a)\n\t\t\treturn b ? aKeys.has(b) : aKeys.size > 0\n\t\t}\n\t\tconst baseExternalStoreConfiguration: BaseExternalStoreConfiguration = {\n\t\t\tgetRelatedKeys: (key) => getRelatedKeys(this.transactors, key),\n\t\t\taddRelation: (a, b) => addRelation(this.transactors, a, b),\n\t\t\tdeleteRelation: (a, b) => deleteRelation(this.transactors, a, b),\n\t\t\treplaceRelationsSafely: (a, bs) =>\n\t\t\t\treplaceRelationsSafely(this.transactors, a, bs),\n\t\t\treplaceRelationsUnsafely: (a, bs) =>\n\t\t\t\treplaceRelationsUnsafely(this.transactors, a, bs),\n\t\t\thas: (a, b) => has(this.transactors, a, b),\n\t\t}\n\t\tlet externalStore: ExternalStoreConfiguration<Content>\n\t\tlet findContentState: AtomFamily<Content, string>\n\t\tif (defaultContent) {\n\t\t\tfindContentState = createRegularAtomFamily<Content, string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/content`,\n\t\t\t\t\tdefault: defaultContent,\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tconst getContent: Read<(key: string) => Content | null> = ({ get }, key) =>\n\t\t\t\tget(findContentState(key))\n\t\t\tconst setContent: Write<(key: string, content: Content) => void> = (\n\t\t\t\ttransactors,\n\t\t\t\tkey,\n\t\t\t\tcontent,\n\t\t\t) => transactors.set(findContentState(key), content)\n\t\t\tconst deleteContent: Write<(key: string) => void> = (_, key) =>\n\t\t\t\tdispose(findContentState(key))\n\t\t\tconst externalStoreWithContentConfiguration = {\n\t\t\t\tgetContent: (contentKey: string) => {\n\t\t\t\t\tconst content = getContent(this.transactors, contentKey)\n\t\t\t\t\treturn content\n\t\t\t\t},\n\t\t\t\tsetContent: (contentKey: string, content: Content) => {\n\t\t\t\t\tsetContent(this.transactors, contentKey, content)\n\t\t\t\t},\n\t\t\t\tdeleteContent: (contentKey: string) => {\n\t\t\t\t\tdeleteContent(this.transactors, contentKey)\n\t\t\t\t},\n\t\t\t}\n\t\t\texternalStore = Object.assign(\n\t\t\t\tbaseExternalStoreConfiguration,\n\t\t\t\texternalStoreWithContentConfiguration,\n\t\t\t) as ExternalStoreConfiguration<Content>\n\t\t} else {\n\t\t\texternalStore =\n\t\t\t\tbaseExternalStoreConfiguration as ExternalStoreConfiguration<Content>\n\t\t}\n\t\tconst relations = new Junction<ASide, BSide, Content>(options, {\n\t\t\texternalStore,\n\t\t\tmakeContentKey: (...args) => args.sort().join(`:`),\n\t\t})\n\n\t\tconst createSingleKeyStateFamily = () =>\n\t\t\tcreateSelectorFamily<string | null, string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/singleRelatedKey`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst relatedKeys = get(findRelatedKeysState(key))\n\t\t\t\t\t\t\tfor (const relatedKey of relatedKeys) {\n\t\t\t\t\t\t\t\treturn relatedKey\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\tconst getMultipleKeyStateFamily = () => {\n\t\t\treturn createSelectorFamily<string[], string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/multipleRelatedKeys`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst jsonFamily = getJsonFamily(findRelatedKeysState, store)\n\t\t\t\t\t\t\tconst json = get(jsonFamily(key))\n\t\t\t\t\t\t\treturn json.members\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\t}\n\t\tconst createSingleEntryStateFamily = () =>\n\t\t\tcreateSelectorFamily<[string, Content] | null, string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/singleRelatedEntry`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst relatedKeys = get(findRelatedKeysState(key))\n\t\t\t\t\t\t\tfor (const relatedKey of relatedKeys) {\n\t\t\t\t\t\t\t\tconst contentKey = relations.makeContentKey(key, relatedKey)\n\t\t\t\t\t\t\t\treturn [relatedKey, get(findContentState(contentKey))]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\tconst getMultipleEntryStateFamily = () =>\n\t\t\tcreateSelectorFamily<[string, Content][], string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/multipleRelatedEntries`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst jsonFamily = getJsonFamily(findRelatedKeysState, store)\n\t\t\t\t\t\t\tconst json = get(jsonFamily(key))\n\t\t\t\t\t\t\treturn json.members.map((relatedKey) => {\n\t\t\t\t\t\t\t\tconst contentKey = relations.makeContentKey(key, relatedKey)\n\t\t\t\t\t\t\t\treturn [relatedKey, get(findContentState(contentKey))]\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\n\t\tswitch (options.cardinality) {\n\t\t\tcase `1:1`: {\n\t\t\t\tconst findSingleRelatedKeyState = createSingleKeyStateFamily()\n\t\t\t\tconst stateKeyA = `${a}KeyOf${capitalize(b)}` as const\n\t\t\t\tconst stateKeyB = `${b}KeyOf${capitalize(a)}` as const\n\t\t\t\tconst findStateBase = {\n\t\t\t\t\t[stateKeyA]: findSingleRelatedKeyState,\n\t\t\t\t\t[stateKeyB]: findSingleRelatedKeyState,\n\t\t\t\t} as JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tlet findState: JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tif (defaultContent) {\n\t\t\t\t\tconst findSingleRelatedEntryState = createSingleEntryStateFamily()\n\t\t\t\t\tconst entriesStateKeyA = `${a}EntryOf${capitalize(b)}` as const\n\t\t\t\t\tconst entriesStateKeyB = `${b}EntryOf${capitalize(a)}` as const\n\t\t\t\t\tconst findStateWithContent = {\n\t\t\t\t\t\t[entriesStateKeyA]: findSingleRelatedEntryState,\n\t\t\t\t\t\t[entriesStateKeyB]: findSingleRelatedEntryState,\n\t\t\t\t\t}\n\t\t\t\t\tfindState = Object.assign(findStateBase, findStateWithContent)\n\t\t\t\t} else {\n\t\t\t\t\tfindState = findStateBase\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.findState = findState\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase `1:n`: {\n\t\t\t\tconst findSingleRelatedKeyState = createSingleKeyStateFamily()\n\t\t\t\tconst findMultipleRelatedKeysState = getMultipleKeyStateFamily()\n\t\t\t\tconst stateKeyA = `${a}KeyOf${capitalize(b)}` as const\n\t\t\t\tconst stateKeyB = `${b}KeysOf${capitalize(a)}` as const\n\t\t\t\tconst findStateBase = {\n\t\t\t\t\t[stateKeyA]: findSingleRelatedKeyState,\n\t\t\t\t\t[stateKeyB]: findMultipleRelatedKeysState,\n\t\t\t\t} as JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tlet findState: JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tif (defaultContent) {\n\t\t\t\t\tconst findSingleRelatedEntryState = createSingleEntryStateFamily()\n\t\t\t\t\tconst findMultipleRelatedEntriesState = getMultipleEntryStateFamily()\n\t\t\t\t\tconst entriesStateKeyA = `${a}EntryOf${capitalize(b)}` as const\n\t\t\t\t\tconst entriesStateKeyB = `${b}EntriesOf${capitalize(a)}` as const\n\t\t\t\t\tconst findStateWithContent = {\n\t\t\t\t\t\t[entriesStateKeyA]: findSingleRelatedEntryState,\n\t\t\t\t\t\t[entriesStateKeyB]: findMultipleRelatedEntriesState,\n\t\t\t\t\t}\n\t\t\t\t\tfindState = Object.assign(findStateBase, findStateWithContent)\n\t\t\t\t} else {\n\t\t\t\t\tfindState = findStateBase\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.findState = findState\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst findMultipleRelatedKeysState = getMultipleKeyStateFamily()\n\t\t\t\tconst stateKeyA = `${a}KeysOf${capitalize(b)}` as const\n\t\t\t\tconst stateKeyB = `${b}KeysOf${capitalize(a)}` as const\n\t\t\t\tconst findStateBase = {\n\t\t\t\t\t[stateKeyA]: findMultipleRelatedKeysState,\n\t\t\t\t\t[stateKeyB]: findMultipleRelatedKeysState,\n\t\t\t\t} as JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tlet findState: JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tif (defaultContent) {\n\t\t\t\t\tconst findMultipleRelatedEntriesState = getMultipleEntryStateFamily()\n\t\t\t\t\tconst entriesStateKeyA = `${a}EntriesOf${capitalize(b)}` as const\n\t\t\t\t\tconst entriesStateKeyB = `${b}EntriesOf${capitalize(a)}` as const\n\t\t\t\t\tconst findStateWithContent = {\n\t\t\t\t\t\t[entriesStateKeyA]: findMultipleRelatedEntriesState,\n\t\t\t\t\t\t[entriesStateKeyB]: findMultipleRelatedEntriesState,\n\t\t\t\t\t}\n\t\t\t\t\tfindState = Object.assign(findStateBase, findStateWithContent)\n\t\t\t\t} else {\n\t\t\t\t\tfindState = findStateBase\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.findState = findState\n\t\t\t}\n\t\t}\n\t}\n}\nexport function join<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Cardinality extends `1:1` | `1:n` | `n:n`,\n>(\n\toptions: JoinOptions<ASide, BSide, Cardinality, null>,\n\tdefaultContent?: undefined,\n\tstore?: Store,\n): {\n\treadonly relations: Junction<ASide, BSide, null>\n\treadonly findState: JoinState<ASide, BSide, Cardinality, null>\n\treadonly transact: (\n\t\ttransactors: Transactors,\n\t\trun: (join: Join<ASide, BSide, Cardinality, null>) => void,\n\t) => void\n\treadonly core: {\n\t\treadonly findRelatedKeysState: MutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>\n\t}\n}\nexport function join<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Cardinality extends `1:1` | `1:n` | `n:n`,\n\tconst Content extends Json.Object,\n>(\n\toptions: JoinOptions<ASide, BSide, Cardinality, Content>,\n\tdefaultContent: Content,\n\tstore?: Store,\n): {\n\treadonly relations: Junction<ASide, BSide, Content>\n\treadonly findState: JoinState<ASide, BSide, Cardinality, Content>\n\treadonly transact: (\n\t\ttransactors: Transactors,\n\t\trun: (join: Join<ASide, BSide, Cardinality, Content>) => void,\n\t) => void\n\treadonly core: {\n\t\treadonly findRelatedKeysState: MutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>\n\t}\n}\nexport function join<\n\tASide extends string,\n\tBSide extends string,\n\tCardinality extends `1:1` | `1:n` | `n:n`,\n\tContent extends Json.Object,\n>(\n\toptions: JoinOptions<ASide, BSide, Cardinality, Content>,\n\tdefaultContent: Content | undefined,\n\tstore: Store = IMPLICIT.STORE,\n): Join<ASide, BSide, Cardinality, Content> {\n\treturn new Join(options, defaultContent, store)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { IMPLICIT } from \"atom.io/internal\"\n\nimport { createRegularAtom, createSelector } from \"atom.io/internal\"\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\n\nexport function struct<\n\tStruct extends { [key: string]: unknown },\n\tKey extends string,\n>(\n\toptions: {\n\t\tkey: Key\n\t\tdefault: Struct\n\t},\n\tstore: Store = IMPLICIT.STORE,\n): [\n\t{\n\t\t[K in keyof Struct as `${Key}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomToken<Struct[K]>\n\t},\n\tAtomIO.ReadonlySelectorToken<Struct>,\n] {\n\tconst atoms: {\n\t\t[K in keyof Struct as `${Key}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomToken<Struct[K]>\n\t} = Object.keys(options.default).reduce((acc, key) => {\n\t\tconst atomName = options.key + capitalize(key) + `State`\n\t\tacc[atomName] = createRegularAtom(\n\t\t\t{\n\t\t\t\tkey: `${options.key}.${key}`,\n\t\t\t\tdefault: options.default[key],\n\t\t\t},\n\t\t\tundefined,\n\t\t\tstore,\n\t\t)\n\t\treturn acc\n\t}, {} as any)\n\tconst structState = createSelector(\n\t\t{\n\t\t\tkey: options.key,\n\t\t\tget: ({ get }) => {\n\t\t\t\treturn Object.keys(options.default).reduce((acc, key) => {\n\t\t\t\t\tacc[key] = get(atoms[options.key + capitalize(key) + `State`])\n\t\t\t\t\treturn acc\n\t\t\t\t}, {} as any)\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t\tstore,\n\t)\n\treturn [atoms, structState]\n}\n","import type * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tcreateRegularAtomFamily,\n\tcreateSelectorFamily,\n} from \"atom.io/internal\"\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\nconst nameFamily = (topKey: string, subKey: string) =>\n\t`find` + capitalize(topKey) + capitalize(subKey) + `State`\n\nexport function structFamily<\n\tStruct extends object,\n\tKey extends string,\n>(options: {\n\tkey: Key\n\tdefault: Struct\n}): [\n\t{\n\t\t[K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomFamily<Struct[K], string>\n\t},\n\tAtomIO.ReadonlySelectorFamily<Struct>,\n] {\n\tconst atoms: {\n\t\t[K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomFamily<Struct[K], string>\n\t} = Object.keys(options.default).reduce((acc, subKey) => {\n\t\tconst atomFamilyName = nameFamily(options.key, subKey)\n\t\tacc[atomFamilyName] = createRegularAtomFamily(\n\t\t\t{\n\t\t\t\tkey: `${options.key}.${subKey}`,\n\t\t\t\tdefault: (options.default as any)[subKey],\n\t\t\t},\n\t\t\tIMPLICIT.STORE,\n\t\t)\n\t\treturn acc\n\t}, {} as any)\n\tconst findStructState = createSelectorFamily(\n\t\t{\n\t\t\tkey: options.key,\n\t\t\tget:\n\t\t\t\t(id) =>\n\t\t\t\t({ get }) => {\n\t\t\t\t\treturn Object.keys(options.default).reduce((acc, subKey) => {\n\t\t\t\t\t\tacc[subKey] = get(\n\t\t\t\t\t\t\t(atoms as any)[nameFamily(options.key, subKey)](id),\n\t\t\t\t\t\t)\n\t\t\t\t\t\treturn acc\n\t\t\t\t\t}, {} as any)\n\t\t\t\t},\n\t\t},\n\t\tIMPLICIT.STORE,\n\t)\n\treturn [atoms, findStructState]\n}\n","export type Loadable<T> = Promise<T> | T\nexport type Fated<T, E extends Error = Error> = Loadable<E | T>\n\n/**\n * Utility for handling loadable values\n * @param loadable Loadable value\n * @param fallback Fallback value until Loadable is resolved\n * @returns Fallback value if your loadable is a promise, otherwise the loadable's resolved value\n */\nexport function until<T>(loadable: Loadable<T>, fallback: T): T {\n\tif (loadable instanceof Promise) {\n\t\treturn fallback\n\t}\n\treturn loadable\n}\n"]}
package/data/src/join.ts CHANGED
@@ -3,7 +3,7 @@ import type {
3
3
  AtomFamily,
4
4
  MutableAtomFamily,
5
5
  Read,
6
- SelectorFamily,
6
+ ReadonlySelectorFamily,
7
7
  Transactors,
8
8
  Write,
9
9
  } from "atom.io"
@@ -57,7 +57,7 @@ export type JoinState<
57
57
  ? {
58
58
  readonly [AB in ASide | BSide as AB extends ASide
59
59
  ? `${AB}EntryOf${Capitalize<BSide>}`
60
- : `${AB}EntryOf${Capitalize<ASide>}`]: SelectorFamily<
60
+ : `${AB}EntryOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<
61
61
  [string, Content] | null,
62
62
  string
63
63
  >
@@ -65,7 +65,7 @@ export type JoinState<
65
65
  : {}) & {
66
66
  readonly [AB in ASide | BSide as AB extends ASide
67
67
  ? `${AB}KeyOf${Capitalize<BSide>}`
68
- : `${AB}KeyOf${Capitalize<ASide>}`]: SelectorFamily<
68
+ : `${AB}KeyOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<
69
69
  string | null,
70
70
  string
71
71
  >
@@ -73,23 +73,23 @@ export type JoinState<
73
73
  : Cardinality extends `1:n`
74
74
  ? (Content extends Json.Object
75
75
  ? {
76
- readonly [A in ASide as `${A}EntryOf${Capitalize<BSide>}`]: SelectorFamily<
76
+ readonly [A in ASide as `${A}EntryOf${Capitalize<BSide>}`]: ReadonlySelectorFamily<
77
77
  [string, Content] | null,
78
78
  string
79
79
  >
80
80
  } & {
81
- readonly [B in BSide as `${B}EntriesOf${Capitalize<ASide>}`]: SelectorFamily<
81
+ readonly [B in BSide as `${B}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<
82
82
  [string, Content][],
83
83
  string
84
84
  >
85
85
  }
86
86
  : {}) & {
87
- readonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: SelectorFamily<
87
+ readonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: ReadonlySelectorFamily<
88
88
  string | null,
89
89
  string
90
90
  >
91
91
  } & {
92
- readonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: SelectorFamily<
92
+ readonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<
93
93
  string[],
94
94
  string
95
95
  >
@@ -99,7 +99,7 @@ export type JoinState<
99
99
  ? {
100
100
  readonly [AB in ASide | BSide as AB extends ASide
101
101
  ? `${AB}EntriesOf${Capitalize<BSide>}`
102
- : `${AB}EntriesOf${Capitalize<ASide>}`]: SelectorFamily<
102
+ : `${AB}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<
103
103
  [string, Content][],
104
104
  string
105
105
  >
@@ -107,7 +107,7 @@ export type JoinState<
107
107
  : {}) & {
108
108
  readonly [AB in ASide | BSide as AB extends ASide
109
109
  ? `${AB}KeysOf${Capitalize<BSide>}`
110
- : `${AB}KeysOf${Capitalize<ASide>}`]: SelectorFamily<
110
+ : `${AB}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<
111
111
  string[],
112
112
  string
113
113
  >
@@ -169,10 +169,10 @@ export class Join<
169
169
  a,
170
170
  b,
171
171
  ) => {
172
- const aKeys = getRelatedKeys(transactors, a)
173
- const bKeys = getRelatedKeys(transactors, b)
174
- transactors.set(findRelatedKeysState(a), aKeys.add(b))
175
- transactors.set(findRelatedKeysState(b), bKeys.add(a))
172
+ const aKeysState = findRelatedKeysState(a)
173
+ const bKeysState = findRelatedKeysState(b)
174
+ transactors.set(aKeysState, (aKeys) => aKeys.add(b))
175
+ transactors.set(bKeysState, (bKeys) => bKeys.add(a))
176
176
  }
177
177
  const deleteRelation: Write<(a: string, b: string) => void> = (
178
178
  transactors,
@@ -181,14 +181,8 @@ export class Join<
181
181
  ) => {
182
182
  const aKeys = getRelatedKeys(transactors, a)
183
183
  aKeys.delete(b)
184
- if (aKeys.size === 0) {
185
- dispose(findRelatedKeysState(a))
186
- }
187
184
  const bKeys = getRelatedKeys(transactors, b)
188
185
  bKeys.delete(a)
189
- if (bKeys.size === 0) {
190
- dispose(findRelatedKeysState(b))
191
- }
192
186
  }
193
187
  const replaceRelationsSafely: Write<(a: string, bs: string[]) => void> = (
194
188
  transactors,
@@ -70,11 +70,12 @@ function selectorFamily(options) {
70
70
  return createSelectorFamily(options, IMPLICIT.STORE);
71
71
  }
72
72
  function setState(token, value, store = Internal3.IMPLICIT.STORE) {
73
+ var _a;
73
74
  const rejection = Internal3.openOperation(token, store);
74
75
  if (rejection) {
75
76
  return;
76
77
  }
77
- const state = Internal3.withdraw(token, store);
78
+ const state = (_a = Internal3.withdraw(token, store)) != null ? _a : Internal3.withdrawNewFamilyMember(token, store);
78
79
  if (state === void 0) {
79
80
  throw new Internal3.NotFoundError(token, store);
80
81
  }
@@ -134,4 +135,4 @@ var runTransaction = (token, store = IMPLICIT.STORE) => (...parameters) => {
134
135
 
135
136
  export { AtomIOLogger, LOG_LEVELS, Silo, atom, atomFamily, dispose, getState, redo, runTransaction, selector, selectorFamily, setState, simpleLog, simpleLogger, subscribe, timeline, transaction, undo };
136
137
  //# sourceMappingURL=out.js.map
137
- //# sourceMappingURL=chunk-S7R5MU6A.js.map
138
+ //# sourceMappingURL=chunk-K22LR3V6.js.map