atom.io 0.15.5 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/dist/index.cjs +20 -22
- package/data/dist/index.cjs.map +1 -1
- package/data/dist/index.d.ts +6 -6
- package/data/dist/index.js +21 -23
- package/data/dist/index.js.map +1 -1
- package/data/src/dict.ts +6 -7
- package/data/src/join.ts +23 -23
- package/data/src/struct-family.ts +2 -2
- package/data/src/struct.ts +4 -5
- package/dist/index.cjs +12 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +67 -60
- package/dist/index.js +13 -6
- package/dist/index.js.map +1 -1
- package/internal/dist/index.cjs +912 -886
- package/internal/dist/index.cjs.map +1 -1
- package/internal/dist/index.d.ts +157 -162
- package/internal/dist/index.js +487 -460
- package/internal/dist/index.js.map +1 -1
- package/internal/src/atom/create-regular-atom.ts +9 -12
- package/internal/src/atom/create-standalone-atom.ts +33 -0
- package/internal/src/atom/delete-atom.ts +5 -2
- package/internal/src/atom/index.ts +1 -16
- package/internal/src/atom/is-default.ts +0 -1
- package/internal/src/caching.ts +6 -3
- package/internal/src/families/create-atom-family.ts +11 -7
- package/internal/src/families/create-readonly-selector-family.ts +4 -3
- package/internal/src/families/create-regular-atom-family.ts +12 -27
- package/internal/src/families/create-selector-family.ts +13 -49
- package/internal/src/families/create-writable-selector-family.ts +51 -0
- package/internal/src/index.ts +44 -3
- package/internal/src/lineage.ts +0 -7
- package/internal/src/mutable/create-mutable-atom-family.ts +61 -15
- package/internal/src/mutable/create-mutable-atom.ts +70 -25
- package/internal/src/mutable/get-json-family.ts +4 -5
- package/internal/src/mutable/get-json-token.ts +6 -3
- package/internal/src/mutable/get-update-token.ts +3 -3
- package/internal/src/mutable/index.ts +1 -7
- package/internal/src/mutable/is-mutable.ts +6 -7
- package/internal/src/mutable/tracker-family.ts +4 -4
- package/internal/src/mutable/tracker.ts +6 -6
- package/internal/src/read-or-compute-value.ts +6 -3
- package/internal/src/selector/create-readonly-selector.ts +2 -3
- package/internal/src/selector/create-standalone-selector.ts +32 -0
- package/internal/src/selector/{create-read-write-selector.ts → create-writable-selector.ts} +12 -9
- package/internal/src/selector/delete-selector.ts +2 -2
- package/internal/src/selector/index.ts +3 -1
- package/internal/src/selector/trace-selector-atoms.ts +3 -2
- package/internal/src/selector/update-selector-atoms.ts +1 -1
- package/internal/src/set-state/copy-mutable-if-needed.ts +5 -6
- package/internal/src/set-state/copy-mutable-in-transaction.ts +4 -36
- package/internal/src/set-state/emit-update.ts +2 -3
- package/internal/src/set-state/evict-downstream.ts +1 -1
- package/internal/src/set-state/set-atom-or-selector.ts +3 -3
- package/internal/src/set-state/set-atom.ts +8 -4
- package/internal/src/set-state/stow-update.ts +1 -1
- package/internal/src/store/deposit.ts +25 -13
- package/internal/src/store/store.ts +21 -21
- package/internal/src/store/withdraw-new-family-member.ts +16 -9
- package/internal/src/store/withdraw.ts +43 -19
- package/internal/src/subscribe/recall-state.ts +2 -6
- package/internal/src/subscribe/subscribe-to-root-atoms.ts +39 -41
- package/internal/src/subscribe/subscribe-to-state.ts +3 -1
- package/internal/src/timeline/add-atom-to-timeline.ts +5 -5
- package/internal/src/timeline/create-timeline.ts +19 -22
- package/introspection/dist/index.cjs +4 -8
- package/introspection/dist/index.cjs.map +1 -1
- package/introspection/dist/index.d.ts +5 -5
- package/introspection/dist/index.js +5 -9
- package/introspection/dist/index.js.map +1 -1
- package/introspection/src/attach-atom-index.ts +4 -5
- package/introspection/src/attach-selector-index.ts +4 -5
- package/introspection/src/attach-timeline-index.ts +6 -3
- package/introspection/src/attach-transaction-index.ts +6 -3
- package/introspection/src/index.ts +9 -5
- package/json/dist/index.cjs +3 -4
- package/json/dist/index.cjs.map +1 -1
- package/json/dist/index.d.ts +4 -3
- package/json/dist/index.js +4 -5
- package/json/dist/index.js.map +1 -1
- package/json/src/select-json-family.ts +24 -4
- package/json/src/select-json.ts +3 -4
- package/package.json +2 -2
- package/react-devtools/dist/index.cjs.map +1 -1
- package/react-devtools/dist/index.d.ts +9 -9
- package/react-devtools/dist/index.js.map +1 -1
- package/react-devtools/src/StateIndex.tsx +18 -10
- package/react-devtools/src/TimelineIndex.tsx +6 -2
- package/react-devtools/src/TransactionIndex.tsx +2 -2
- package/realtime-client/dist/index.cjs +27 -13
- package/realtime-client/dist/index.cjs.map +1 -1
- package/realtime-client/dist/index.d.ts +6 -4
- package/realtime-client/dist/index.js +20 -7
- package/realtime-client/dist/index.js.map +1 -1
- package/realtime-client/src/index.ts +4 -3
- package/realtime-client/src/server-action.ts +2 -55
- package/realtime-client/src/sync-server-action.ts +75 -0
- package/realtime-react/dist/index.cjs +22 -13
- package/realtime-react/dist/index.cjs.map +1 -1
- package/realtime-react/dist/index.d.ts +3 -1
- package/realtime-react/dist/index.js +20 -12
- package/realtime-react/dist/index.js.map +1 -1
- package/realtime-react/src/index.ts +1 -0
- package/realtime-react/src/use-server-action.ts +2 -4
- package/realtime-react/src/use-sync-server-action.ts +19 -0
- package/realtime-server/dist/index.cjs +83 -81
- package/realtime-server/dist/index.cjs.map +1 -1
- package/realtime-server/dist/index.d.ts +8 -8
- package/realtime-server/dist/index.js +58 -56
- package/realtime-server/dist/index.js.map +1 -1
- package/realtime-server/src/index.ts +15 -1
- package/realtime-server/src/{hook-composition/receive-transaction.ts → realtime-action-receiver.ts} +6 -2
- package/realtime-server/src/{hook-composition/sync-transaction.ts → realtime-action-synchronizer.ts} +10 -43
- package/realtime-server/src/{hook-composition/expose-family.ts → realtime-family-provider.ts} +9 -23
- package/realtime-server/src/{hook-composition/expose-mutable-family.ts → realtime-mutable-family-provider.ts} +4 -4
- package/realtime-server/src/{hook-composition/expose-mutable.ts → realtime-mutable-provider.ts} +4 -5
- package/realtime-server/src/realtime-server-store.ts +39 -0
- package/realtime-server/src/{hook-composition/expose-single.ts → realtime-state-provider.ts} +7 -8
- package/realtime-server/src/{hook-composition/receive-state.ts → realtime-state-receiver.ts} +7 -4
- package/src/atom.ts +39 -24
- package/src/find-state.ts +20 -19
- package/src/index.ts +41 -28
- package/src/logger.ts +1 -0
- package/src/selector.ts +31 -16
- package/src/silo.ts +45 -6
- package/src/subscribe.ts +1 -0
- package/src/validators.ts +35 -25
- package/internal/src/atom/create-atom.ts +0 -21
- package/internal/src/mutable/get-update-family.ts +0 -23
- package/internal/src/selector/create-selector.ts +0 -65
- package/realtime-server/src/hook-composition/index.ts +0 -15
- /package/realtime-client/src/{pull.ts → pull-state.ts} +0 -0
- /package/realtime-client/src/{push.ts → push-state.ts} +0 -0
- /package/realtime-client/src/{realtime-state.ts → realtime-client-store.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mutable/create-mutable-atom.ts","../src/lineage.ts","../src/future.ts","../src/set-state/copy-mutable-if-needed.ts","../src/set-state/copy-mutable-in-transaction.ts","../src/caching.ts","../src/read-or-compute-value.ts","../src/operation.ts","../src/set-state/become.ts","../src/subject.ts","../src/selector/register-selector.ts","../src/set-state/emit-update.ts","../src/set-state/evict-downstream.ts","../src/set-state/stow-update.ts","../src/set-state/set-atom.ts","../src/set-state/set-atom-or-selector.ts","../src/store/deposit.ts","../src/store/store.ts","../src/store/withdraw.ts","../src/store/withdraw-new-family-member.ts","../src/keys.ts","../src/selector/get-selector-dependency-keys.ts","../src/selector/trace-selector-atoms.ts","../src/selector/update-selector-atoms.ts","../src/selector/create-read-write-selector.ts","../src/selector/create-readonly-selector.ts","../src/selector/create-selector.ts","../src/selector/delete-selector.ts","../src/subscribe/recall-state.ts","../src/subscribe/subscribe-to-root-atoms.ts","../src/subscribe/subscribe-to-state.ts","../src/subscribe/subscribe-to-timeline.ts","../src/subscribe/subscribe-to-transaction.ts","../src/mutable/tracker.ts","../src/mutable/create-mutable-atom-family.ts","../src/mutable/tracker-family.ts","../src/families/create-regular-atom-family.ts","../src/families/create-atom-family.ts","../src/families/create-readonly-selector-family.ts","../src/families/create-selector-family.ts","../src/mutable/get-json-family.ts","../src/mutable/get-json-token.ts","../src/mutable/get-update-token.ts","../src/mutable/get-update-family.ts","../src/mutable/transceiver.ts","../src/atom/create-regular-atom.ts","../src/atom/is-default.ts","../src/atom/create-atom.ts","../src/atom/delete-atom.ts","../src/get-environment-data.ts","../src/ingest-updates/ingest-atom-update.ts","../src/ingest-updates/ingest-selector-update.ts","../src/ingest-updates/ingest-transaction-update.ts","../src/lazy-map.ts","../src/not-found-error.ts","../src/timeline/add-atom-to-timeline.ts","../src/mutable/is-mutable.ts","../src/timeline/create-timeline.ts","../src/timeline/time-travel.ts","../src/transaction/abort-transaction.ts","../src/transaction/apply-transaction.ts","../src/transaction/build-transaction.ts","../src/transaction/create-transaction.ts","../src/transaction/index.ts"],"names":["withdraw","target","update","unsubscribe","store","stringifyJson","setState","_a","_b","updates","token","findInStore","getState","key"],"mappings":";;;;;;;;;AAMA,SAAS,kBAAkB;;;ACDpB,SAAS,OAA0B,OAAa;AACtD,SAAO,MAAM,UAAU,MAAM;AAC5B,YAAQ,MAAM;AAAA,EACf;AACA,SAAO;AACR;AAEO,SAAS,OAA0B,OAAa;AACtD,SAAO,MAAM,WAAW,MAAM;AAC7B,YAAQ,MAAM;AAAA,EACf;AACA,SAAO;AACR;;;ACRO,IAAM,SAAN,cAAwB,QAAW;AAAA,EAGlC,YACN,UAGC;AACD,UAAM,CAAC,SAAS,WAAW;AAC1B,YAAM,OAAO,CAAC,UACb,KAAK,aAAa,OAAO,UAAU,IAAI,QAAQ,KAAK;AACrD,YAAM,OAAO,CAAC,WACb,KAAK,aAAa,OAAO,UAAU,IAAI,OAAO,MAAM;AACrD,UAAI,OAAO,aAAa,YAAY;AACnC,iBAAS,MAAM,IAAI;AAAA,MACpB,OAAO;AACN,iBAAS,KAAK,MAAM,IAAI;AAAA,MACzB;AAAA,IACD,CAAC;AAjBF,SAAO,aAAa;AAAA,EAkBpB;AAAA,EAEO,SAAe;AACrB,SAAK,aAAa;AAAA,EACnB;AACD;;;AC3BO,SAAS,oBACf,MACA,WACA,QACA,QACI;AACJ,QAAM,cAAc,OAAO,SAAS,IAAI,KAAK,GAAG;AAChD,QAAM,cAAc,OAAO,SAAS,IAAI,KAAK,GAAG;AAChD,MAAI,gBAAgB,aAAa;AAChC,WAAO,OAAO,KAAK,aAAM,QAAQ,GAAG,KAAK,GAAG,IAAI,SAAS;AACzD,UAAM,YAAY,UAAU,OAAO,WAAW;AAC9C,UAAM,cAAc,UAAU,SAAS,SAAS;AAChD,WAAO,SAAS,IAAI,KAAK,KAAK,WAAW;AACzC,QAAI,QAAQ,MAAM,MAAM;AACxB,WAAO;AAAA,EACR;AACA,SAAO;AACR;;;AChBO,SAAS,+BACf,UACA,MACA,OACI;AACJ,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,SAAS,OAAO;AACtB,MAAI,WAAW,MAAM;AACpB,QAAI,YAAY,MAAM;AACrB,YAAM,SAAS,OAAO,SAAS,IAAI,KAAK,OAAO,GAAG;AAClD,UAAI,UAAU,OAAO,SAAS,eAAe;AAC5C,cAAM,SAAS;AAAA,UACd;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD;AACA,YAAI,QAAQ;AACX,iBAAO;AAAA,QACR;AAAA,MACD;AAAA,IACD;AACA,QAAI,YAAY,QAAQ,cAAc,MAAM;AAC3C,YAAM,cAAc,oBAAoB,MAAM,MAAM,QAAQ,MAAM;AAClE,aAAO;AAAA,IACR;AAAA,EACD;AACA,SAAO;AACR;AAEO,SAAS,yCACf,MACA,QAGA,QACA,QACW;AACX,MAAI,YAAY,UAAU,cAAc,QAAQ;AAC/C,UAAM,cAAc,oBAAoB,MAAM,QAAQ,QAAQ,MAAM;AACpE,WAAO;AAAA,EACR;AACA,SAAO;AACR;;;AC/BO,SAAS,WACf,KACA,OACA,SACA,QACgB;AAChB,QAAM,eAAe,OAAO,SAAS,IAAI,GAAG;AAC5C,MAAI,wBAAwB,QAAQ;AACnC,iBAAa,OAAO;AAAA,EACrB;AACA,MAAI,iBAAiB,SAAS;AAC7B,UAAM,SAAS,IAAI,OAAU,KAAK;AAClC,WAAO,SAAS,IAAI,KAAK,MAAM;AAC/B,WACE,KAAK,CAAC,aAAa;AACnB,UAAI,OAAO,YAAY;AACtB;AAAA,MACD;AACA,iBAAW,KAAK,UAAU,SAAS,MAAM;AACzC,cAAQ,KAAK,EAAE,UAAU,UAAU,UAAU,OAAO,CAAC;AAAA,IACtD,CAAC,EACA,MAAM,CAAC,WAAW;AAClB,UAAI,WAAW,YAAY;AAC1B,eAAO,OAAO,MAAM,aAAM,SAAS,KAAK,aAAa,MAAM;AAAA,MAC5D;AAAA,IACD,CAAC;AACF,WAAO;AAAA,EACR;AACA,SAAO,SAAS,IAAI,KAAK,KAAK;AAC9B,SAAO;AACR;AAEO,IAAM,kBAAkB,CAAI,OAAuB,WAAqB;AAC9E,MAAI,QAAQ,OAAO,SAAS,IAAI,MAAM,GAAG;AACzC,MAAI,MAAM,SAAS,QAAQ;AAC1B,YAAQ,+BAA+B,OAAO,OAAO,MAAM;AAAA,EAC5D;AACA,SAAO;AACR;AAEO,IAAM,mBAAmB,CAAC,KAAa,WAAwB;AACrE,QAAM,eAAe,OAAO,SAAS,IAAI,GAAG;AAC5C,MAAI,wBAAwB,QAAQ;AACnC,iBAAa,OAAO;AAAA,EACrB;AACA,MAAI,OAAO,UAAU,MAAM;AAC1B,WAAO,UAAU,KAAK,IAAI,KAAK,YAAY;AAAA,EAC5C;AACA,SAAO,SAAS,OAAO,GAAG;AAC1B,SAAO,OAAO,KAAK,aAAM,SAAS,KAAK,SAAS;AACjD;;;ACjEO,IAAM,qBAAqB,CAAI,OAAqB,WAAqB;AAC/E,MAAI,OAAO,SAAS,IAAI,MAAM,GAAG,GAAG;AACnC,WAAO,OAAO,KAAK,aAAM,MAAM,MAAM,MAAM,KAAK,sBAAsB;AACtE,WAAO,gBAAgB,OAAO,MAAM;AAAA,EACrC;AACA,MAAI,MAAM,SAAS,QAAQ;AAC1B,WAAO,OAAO,KAAK,aAAM,MAAM,MAAM,MAAM,KAAK,iBAAiB;AACjE,WAAO,MAAM,IAAI;AAAA,EAClB;AACA,QAAM,WACL,MAAM,mBAAmB,WAAW,MAAM,QAAQ,IAAI,MAAM;AAC7D,SAAO,OAAO;AAAA,IACb;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACD;AACA,SAAO,MAAM,mBAAmB,WAAW,MAAM,QAAQ,IAAI,MAAM;AACpE;;;ACNO,IAAM,gBAAgB,CAC5B,OACA,UAC6B;AAC7B,MAAI,MAAM,UAAU,MAAM;AACzB,UAAM,OAAO;AAAA,MACZ;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN,6CAA6C,MAAM,UAAU,MAAM,GAAG;AAAA,IACvE;AACA,WAAO;AAAA,EACR;AACA,QAAM,YAAY;AAAA,IACjB,MAAM;AAAA,IACN,MAAM,oBAAI,IAAI;AAAA,IACd,MAAM,oBAAI,IAAI;AAAA,IACd,MAAM,KAAK,IAAI;AAAA,IACf;AAAA,EACD;AACA,QAAM,OAAO;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN,6BAA6B,MAAM,OAAO,IAAI,IAC7C,MAAM,oBAAoB,OACvB,KACA,IAAI,MAAM,gBAAgB,KAAK,KAAK,MAAM,gBAAgB,OAAO,GAAG,GACxE;AAAA,EACD;AACD;AACO,IAAM,iBAAiB,CAAC,UAAuB;AACrD,MAAI,MAAM,UAAU,MAAM;AACzB,UAAM,OAAO;AAAA,MACZ;AAAA,MACA,MAAM,UAAU,MAAM;AAAA,MACtB,MAAM,UAAU,MAAM;AAAA,MACtB,4BAA4B,MAAM,OAAO,IAAI;AAAA,IAC9C;AAAA,EACD;AACA,QAAM,YAAY,EAAE,MAAM,MAAM;AAChC,QAAM,GAAG,eAAe,KAAK,MAAM,SAAS;AAC7C;AAEO,IAAM,SAAS,CAAC,KAAa,UAA0B;AAC7D,MAAI,CAAC,MAAM,UAAU,MAAM;AAC1B,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,WAAO;AAAA,EACR;AACA,SAAO,MAAM,UAAU,KAAK,IAAI,GAAG;AACpC;AACO,IAAM,WAAW,CAAC,KAAa,UAAuB;AAC5D,MAAI,CAAC,MAAM,UAAU,MAAM;AAC1B,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA;AAAA,EACD;AACA,QAAM,UAAU,KAAK,IAAI,GAAG;AAC7B;;;AClFO,IAAM,SACZ,CAAI,uBACJ,CAAC,kBACA,8BAA8B,WAC3B;AAAA,EACA,yBAAyB,WAAW,cAAc,IAAI;AACtD,IACA;;;ACTE,IAAM,UAAN,MAAiB;AAAA,EAAjB;AAGN,SAAO,cAA+C,oBAAI,IAAI;AAAA;AAAA,EAEvD,UAAU,KAAa,YAA4C;AACzE,SAAK,YAAY,IAAI,KAAK,UAAU;AACpC,UAAM,cAAc,MAAM,KAAK,YAAY,GAAG;AAC9C,WAAO;AAAA,EACR;AAAA,EAEQ,YAAY,KAAa;AAChC,SAAK,YAAY,OAAO,GAAG;AAAA,EAC5B;AAAA,EAEO,KAAK,OAAgB;AAC3B,UAAM,cAAc,KAAK,YAAY,OAAO;AAC5C,eAAW,cAAc,aAAa;AACrC,iBAAW,KAAK;AAAA,IACjB;AAAA,EACD;AACD;AAEO,IAAM,kBAAN,cAAiC,QAAW;AAAA,EAG3C,YAAY,cAAiB;AACnC,UAAM;AACN,SAAK,QAAQ;AAAA,EACd;AAAA,EAEO,KAAK,OAAgB;AAC3B,SAAK,QAAQ;AACb,UAAM,KAAK,KAAK;AAAA,EACjB;AACD;;;AClCA,SAAS,mBAAmB;;;ACKrB,IAAM,aAAa,CACzB,OACA,QACA,UACU;AACV,QAAM,OAAO;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,MAAM,QAAQ;AAAA,EACf;AACA,QAAM,QAAQ,KAAK,MAAM;AAC1B;;;AClBO,IAAM,kBAAkB,CAAI,MAAe,UAAuB;AACxE,QAAM,iBAAiB,MAAM,cAAc,eAAe,KAAK,GAAG;AAClE,QAAM,OAAO;AAAA,IACZ;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,iBACG,YAAY,eAAe,IAAI,wBAC/B;AAAA,IACH,0CAAkB;AAAA,EACnB;AACA,MAAI,gBAAgB;AACnB,QAAI,MAAM,UAAU,MAAM;AACzB,YAAM,OAAO;AAAA,QACZ;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK,CAAC,GAAG,MAAM,UAAU,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,MAC1C;AAAA,IACD;AACA,eAAW,OAAO,gBAAgB;AACjC,UAAI,OAAO,KAAK,KAAK,GAAG;AACvB;AAAA,MACD;AACA,uBAAiB,KAAK,KAAK;AAC3B,eAAS,KAAK,KAAK;AAAA,IACpB;AAAA,EACD;AACD;;;AC1BA,SAAS,qBAAqB,KAAa,QAAmC;AAE7E,MAAI,cAAc,OAAO,QAAQ,GAAG;AACnC,WAAO;AAAA,EACR;AAEA,MAAI,IAAI,SAAS,0BAAO,GAAG;AAC1B,WAAO;AAAA,EACR;AACA,SAAO;AACR;AAEO,IAAM,aAAa,CACzB,OACA,QACA,UACU;AACV,QAAM,EAAE,IAAI,IAAI;AAChB,QAAM,SAAS,OAAO,KAAK;AAC3B,MACC,OAAO,oBAAoB,QAC3B,OAAO,gBAAgB,UAAU,YAChC;AACD,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA;AAAA,EACD;AACA,QAAM,aAAa,qBAAqB,KAAK,MAAM;AACnD,MAAI,CAAC,YAAY;AAChB;AAAA,EACD;AACA,QAAM,aAAkC,iBAAE,OAAQ;AAClD,MAAI,MAAM,QAAQ;AACjB,eAAW,SAAS,MAAM;AAAA,EAC3B;AACA,SAAO,gBAAgB,OAAO,QAAQ,KAAK,UAAU;AACrD,QAAM,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,OAAO;AAAA,IACP;AAAA,EACD;AACD;;;AC7CO,IAAM,UAAU,CACtB,MACA,MACA,WACU;AACV,QAAM,WAAW,mBAAmB,MAAM,MAAM;AAChD,MAAI,WAAW,+BAA+B,UAAU,MAAM,MAAM;AACpE,aAAW,OAAO,IAAI,EAAE,QAAQ;AAChC,SAAO,OAAO,KAAK,aAAM,QAAQ,KAAK,KAAK,UAAU,QAAQ;AAC7D,aAAW,WAAW,KAAK,KAAK,UAAU,KAAK,SAAS,MAAM;AAC9D,MAAI,cAAc,KAAK,KAAK,MAAM,GAAG;AACpC,yBAAqB,KAAK,KAAK,MAAM;AAAA,EACtC;AACA,WAAS,KAAK,KAAK,MAAM;AACzB,kBAAgB,MAAM,MAAM;AAC5B,QAAM,SAAS,EAAE,UAAU,SAAS;AACpC,MAAI,OAAO,oBAAoB,MAAM;AACpC,eAAW,MAAM,QAAQ,MAAM;AAAA,EAChC,WAAW,OAAO,gBAAgB,UAAU,cAAc,OAAO,QAAQ;AACxE,eAAW,MAAM,QAAQ,OAAO,MAAM;AAAA,EACvC,OAAO;AACN,eAAW,MAAM,QAAQ,MAAM;AAAA,EAChC;AACD;;;AC9BO,IAAM,oBAAoB,CAChC,OACA,OACA,UACU;AACV,UAAQ,MAAM,MAAM;AAAA,IACnB,KAAK;AACJ,cAAQ,OAAO,OAAO,KAAK;AAC3B;AAAA,IACD,KAAK;AACJ,YAAM,IAAI,KAAK;AACf;AAAA,EACF;AACD;;;ACKO,SAAS,QACf,OASsB;AACtB,QAAM,QAAQ;AAAA,IACb,KAAK,MAAM;AAAA,IACX,MAAM,MAAM;AAAA,EACb;AACA,MAAI,YAAY,OAAO;AACtB,UAAM,SAAS,MAAM;AAAA,EACtB;AACA,SAAO;AACR;;;AC1CA,SAAS,oBAAoB;AA+BtB,IAAM,QAAN,MAA+B;AAAA,EA+E9B,YAAY,MAAc,QAAsB,MAAM;AA9E7D,SAAO,SAAuB;AAC9B,SAAO,QAAsB;AAE7B,SAAO,WAAW,oBAAI,IAAiB;AAEvC,SAAO,QAAQ,oBAAI,IAA0C;AAC7D,SAAO,YAAY,oBAAI,IAA2B;AAClD,SAAO,oBAAoB,oBAAI,IAAmC;AAElE,SAAO,WAAW,oBAAI,IAAuC;AAC7D,SAAO,WAAW,oBAAI,IAKpB;AAEF,SAAO,YAAY,oBAAI,IAA2B;AAClD,SAAO,eAAe,oBAAI,IAA6B;AAEvD,SAAO,sBAAsB,oBAAI,IAAY;AAE7C,SAAO,gBAAgB,IAAI,SAAS;AAAA,MACnC,SAAS,CAAC,eAAe,SAAS;AAAA,MAClC,aAAa;AAAA,IACd,CAAC;AACD,SAAO,gBAAgB,IAAI,SAAS;AAAA,MACnC,SAAS,CAAC,eAAe,SAAS;AAAA,MAClC,aAAa;AAAA,IACd,CAAC;AACD,SAAO,gBAAgB,IAAI;AAAA,MAK1B;AAAA,QACC,SAAS,CAAC,uBAAuB,uBAAuB;AAAA,QACxD,aAAa;AAAA,MACd;AAAA,MACA;AAAA,QACC,gBAAgB,IAAI,SAAS,KAAK,KAAK,EAAE,KAAK,GAAG;AAAA,MAClD;AAAA,IACD;AAEA,SAAO,KAAK;AAAA,MACX,cAAc,IAAI,QAA4B;AAAA,MAC9C,kBAAkB,IAAI,QAEpB;AAAA,MACF,qBAAqB,IAAI,QAA8B;AAAA,MACvD,kBAAkB,IAAI,QAAgC;AAAA,MACtD,qBAAqB,IAAI,gBAA4C,IAAI;AAAA,MACzE,gBAAgB,IAAI,QAA2B;AAAA,IAChD;AACA,SAAO,YAA+B,EAAE,MAAM,MAAM;AACpD,SAAO,kBAA8C;AAErD,SAAO,SAEH;AAAA,MACH,MAAM;AAAA,IACP;AAEA,SAAO,UAA0B;AAAA,MAChC,IAAI,aAAa,QAAQ,CAAC,GAAG,IAAI,QAAQ,CAAC,IAAI,SAAS,0BAAO,CAAC;AAAA,IAChE;AACA,SAAO,SAAiB;AAAA,MACvB,OAAO,IAAI,aAAa;AACvB,mBAAW,UAAU,KAAK;AAAS,iBAAO,MAAM,GAAG,QAAQ;AAAA,MAC5D;AAAA,MACA,MAAM,IAAI,aAAa;AACtB,mBAAW,UAAU,KAAK;AAAS,iBAAO,KAAK,GAAG,QAAQ;AAAA,MAC3D;AAAA,MACA,MAAM,IAAI,aAAa;AACtB,mBAAW,UAAU,KAAK;AAAS,iBAAO,KAAK,GAAG,QAAQ;AAAA,MAC3D;AAAA,IACD;AAGC,QAAI,UAAU,MAAM;AACnB,WAAK,WAAW,IAAI,IAAI,+BAAO,QAAQ;AACvC,WAAK,YAAY,mBAAK,+BAAO;AAC7B,WAAK,mBAAkB,+BAAO,mBAC3B,mBAAK,+BAAO,mBACZ;AACH,WAAK,SAAS,iCACV,+BAAO,SADG;AAAA,QAEb;AAAA,MACD;AACA,iBAAW,CAAC,EAAE,MAAM,KAAK,MAAM,UAAU;AACxC,eAAO,QAAQ,IAAI;AAAA,MACpB;AACA,YAAM,iBAAiB,oBAAI,IAAY;AACvC,iBAAW,CAAC,EAAE,IAAI,KAAK,MAAM,OAAO;AACnC,YAAI,eAAe,IAAI,KAAK,GAAG,GAAG;AACjC;AAAA,QACD;AACA,aAAK,QAAQ,IAAI;AACjB,YAAI,aAAa,MAAM;AACtB,gBAAM,oBAAoB,aAAa,IAAI;AAC3C,gBAAM,sBAAsB,eAAe,IAAI;AAC/C,yBAAe,IAAI,kBAAkB,GAAG;AACxC,yBAAe,IAAI,oBAAoB,GAAG;AAAA,QAC3C;AAAA,MACD;AACA,iBAAW,CAAC,EAAE,QAAQ,KAAK,MAAM,mBAAmB;AACnD,iBAAS,QAAQ,IAAI;AAAA,MACtB;AACA,iBAAW,CAAC,EAAE,QAAQ,KAAK,MAAM,WAAW;AAC3C,YAAI,eAAe,IAAI,SAAS,GAAG,GAAG;AACrC;AAAA,QACD;AACA,iBAAS,QAAQ,IAAI;AAAA,MACtB;AACA,iBAAW,CAAC,EAAE,EAAE,KAAK,MAAM,cAAc;AACxC,WAAG,QAAQ,IAAI;AAAA,MAChB;AACA,iBAAW,CAAC,EAAE,QAAQ,KAAK,MAAM,WAAW;AAC3C,iBAAS,QAAQ,IAAI;AAAA,MACtB;AAAA,IACD;AAAA,EACD;AACD;AAEO,IAAM,WAAW;AAAA,EACvB,gBAAgB;AAAA,EAChB,IAAI,QAAe;AA9JpB;AA+JE,YACC,UAAK,mBAAL,YAAwB,KAAK,iBAAiB,IAAI,MAAM,gBAAgB;AAAA,EAE1E;AACD;AAEO,IAAM,aAAa,CAAC,UAAuB;AACjD,QAAM,EAAE,OAAO,IAAI;AACnB,SAAO,OAAO,OAAO,IAAI,MAAM,OAAO,IAAI,CAAC;AAC3C,QAAM,SAAS;AAChB;;;ACnHO,SAAS,SACf,OACA,OAC8B;AAC9B,MAAI;AACJ,MAAI,SAAuB;AAC3B,SAAO,WAAW,MAAM;AACvB,YAAQ,MAAM,MAAM;AAAA,MACnB,KAAK;AACJ,oBAAY,OAAO,MAAM,IAAI,MAAM,GAAG;AACtC;AAAA,MACD,KAAK;AACJ,oBAAY,OAAO,UAAU,IAAI,MAAM,GAAG;AAC1C;AAAA,MACD,KAAK;AACJ,oBAAY,OAAO,kBAAkB,IAAI,MAAM,GAAG;AAClD;AAAA,MACD,KAAK;AACJ,oBAAY,OAAO,UAAU,IAAI,MAAM,GAAG;AAC1C;AAAA,MACD,KAAK;AACJ,oBAAY,OAAO,aAAa,IAAI,MAAM,GAAG;AAC7C;AAAA,IACF;AACA,QAAI,WAAW;AACd,aAAO;AAAA,IACR;AACA,aAAS,OAAO;AAAA,EACjB;AACD;;;ACrDO,SAAS,wBACf,OACA,OAC2B;AAC3B,MAAI,MAAM,QAAQ;AACjB,UAAM,OAAO;AAAA,MACZ;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN,wCAAwC,MAAM,OAAO,IAAI;AAAA,IAC1D;AACA,UAAM,SAAS,OAAO,KAAK;AAC3B,UAAM,SAAS,OAAO,SAAS,IAAI,MAAM,OAAO,GAAG;AACnD,QAAI,QAAQ;AACX,YAAM,aAAa,KAAK,MAAM,MAAM,OAAO,MAAM;AACjD,aAAO,UAAU;AACjB,YAAM,QAAQ,SAAS,OAAO,KAAK;AACnC,aAAO;AAAA,IACR;AAAA,EACD;AACA,SAAO;AACR;;;ACzCO,IAAM,YAAY,CAAC,KAAa,UACtC,OAAO,KAAK,EAAE,MAAM,IAAI,GAAG;AACrB,IAAM,gBAAgB,CAC5B,KACA,UACiC,OAAO,KAAK,EAAE,UAAU,IAAI,GAAG;AAC1D,IAAM,wBAAwB,CACpC,KACA,UAEA,OAAO,KAAK,EAAE,kBAAkB,IAAI,GAAG;AAGjC,IAAM,aAAa,CACzB,KACA,UAEA,UAAU,KAAK,KAAK,KACpB,cAAc,KAAK,KAAK,KACxB,sBAAsB,KAAK,KAAK;;;ACxB1B,IAAM,4BAA4B,CACxC,KACA,UAKM;AACN,QAAM,UAAU,OAAO,KAAK,EAC1B,cAAc,mBAAmB,EAAE,uBAAuB,IAAI,CAAC,EAC/D,OAAO,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,WAAW,GAAG,EAC1C,IAAI,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,MAAM,EAC/B,OAAO,CAAC,WAAW,WAAW,QAAQ,KAAK,CAAC;AAC9C,SAAO;AACR;;;ACdO,IAAM,qBAAqB,CACjC,aACA,qBACA,UACwB;AACxB,QAAM,WAA+B,CAAC;AAEtC,QAAM,yBAAyB;AAAA,IAC9B;AAAA,IACA;AAAA,EACD;AACA,MAAI,QAAQ;AACZ,SAAO,uBAAuB,SAAS,GAAG;AAEzC,UAAM,wBAAwB,uBAAuB,MAAM;AAC3D,MAAE;AACF,QAAI,QAAQ,OAAO;AAClB,YAAM,IAAI;AAAA,QACT,qEAAqE,WAAW;AAAA,MACjF;AAAA,IACD;AAEA,QAAI,CAAC,UAAU,uBAAuB,KAAK,GAAG;AAC7C,6BAAuB;AAAA,QACtB,GAAG,0BAA0B,uBAAuB,KAAK;AAAA,MAC1D;AAAA,IACD,WAAW,CAAC,SAAS,SAAS,qBAAqB,GAAG;AACrD,eAAS,KAAK,qBAAqB;AAAA,IACpC;AAAA,EACD;AAEA,SAAO;AACR;AAEO,IAAM,wBAAwB,CACpC,aACA,UACwB;AACxB,QAAM,uBAAuB,0BAA0B,aAAa,KAAK;AACzE,SAAO,qBAAqB;AAAA,IAAQ,CAAC,WACpC,UAAU,QAAQ,KAAK,IACpB,SACA,mBAAmB,aAAa,QAAQ,KAAK;AAAA,EACjD;AACD;;;AC3CO,IAAM,sBAAsB,CAClC,aACA,YACA,UACU;AACV,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAI,WAAW,SAAS,QAAQ;AAC/B,WAAO,cAAc,IAAI;AAAA,MACxB;AAAA,MACA,SAAS,WAAW;AAAA,IACrB,CAAC;AACD,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA,wBAAwB,WAAW,GAAG;AAAA,IACvC;AAAA,EACD,OAAO;AACN,UAAM,WAAW,mBAAmB,aAAa,WAAW,KAAK,KAAK;AACtE,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA,2BAA2B,SACzB,IAAI,CAAC,QAAQ,IAAI,GAAG,GAAG,EACvB,KAAK,IAAI,CAAC;AAAA,IACb;AACA,eAAW,WAAW,UAAU;AAC/B,aAAO,gBAAgB,OAAO,cAAc,IAAI;AAAA,QAC/C;AAAA,QACA;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD;AACD;;;Ab9BO,IAAM,mBAAmB,CAC/B,aACA,WACkB;AAAA,EAClB,KAAK,CAAC,eAAe;AACpB,UAAM,SAAS,OAAO,KAAK;AAE3B,UAAM,kBAAkB,SAAS,YAAY,KAAK;AAClD,QAAI,oBAAoB,QAAW;AAClC,YAAM,IAAI;AAAA,QACT,UAAU,WAAW,GAAG;AAAA,MACzB;AAAA,IACD;AACA,UAAM,kBAAkB,mBAAmB,iBAAiB,KAAK;AAEjE,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA,2BAA2B,WAAW,GAAG;AAAA,MACzC;AAAA,MACA;AAAA,IACD;AAEA,WAAO,cAAc;AAAA,MACpB;AAAA,QACC,qBAAqB,WAAW;AAAA,QAChC,uBAAuB;AAAA,MACxB;AAAA,MACA;AAAA,QACC,QAAQ,WAAW;AAAA,MACpB;AAAA,IACD;AACA,wBAAoB,aAAa,YAAY,KAAK;AAClD,WAAO;AAAA,EACR;AAAA,EACA,KAAK,CAAC,eAAe,aAAa;AACjC,UAAM,QAAQ,SAAS,eAAe,KAAK;AAC3C,QAAI,UAAU,QAAW;AACxB,YAAM,IAAI;AAAA,QACT,UAAU,cAAc,GAAG;AAAA,MAC5B;AAAA,IACD;AACA,sBAAkB,OAAO,UAAU,KAAK;AAAA,EACzC;AAAA,EACA,MAAO,CAAC,OAAO,QAAQ,YAAY,OAAO,KAAK,KAAK;AACrD;;;Ac5CO,IAAM,0BAA0B,CACtC,SACA,QACA,UACsB;AACtB,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,UAAU,IAAI,QAAsC;AAC1D,QAAM,cAAc,iBAAiB,QAAQ,KAAK,KAAK;AACvD,QAAM,EAAE,MAAM,IAAI,IAAI;AACtB,QAAM,sBAAsB,EAAE,MAAM,IAAI;AAExC,QAAM,UAAU,MAAM;AACrB,UAAM,QAAQ,QAAQ,IAAI,mBAAmB;AAC7C,eAAW,QAAQ,KAAK,OAAO,SAAS,OAAO,KAAK,CAAC;AACrD,WAAO;AAAA,EACR;AAEA,QAAM,UAAU,CAAC,SAAyC;AACzD,UAAM,WAAW,QAAQ;AACzB,UAAM,WAAW,OAAO,IAAI,EAAE,QAAQ;AACtC,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,eAAW,QAAQ,KAAK,UAAU,SAAS,KAAK;AAChD,aAAS,QAAQ,KAAK,KAAK;AAC3B,QAAI,OAAO,oBAAoB,MAAM;AACpC,cAAQ,KAAK,EAAE,UAAU,SAAS,CAAC;AAAA,IACpC;AACA,YAAQ,IAAI,aAAa,QAAQ;AAAA,EAClC;AACA,QAAM,aAA0B,gDAC5B,UAD4B;AAAA,IAE/B;AAAA,IACA,SAAS,CAAC,MAAa,eAAe,SAAS,QAAQ,CAAC;AAAA,IACxD,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,MACF,UAAU,EAAE,OAAO;AAExB,SAAO,UAAU,IAAI,QAAQ,KAAK,UAAU;AAC5C,QAAM,eAAe,QAAQ;AAC7B,QAAM,OAAO,KAAK,UAAK,WAAW,MAAM,WAAW,KAAK,KAAK,YAAY;AACzE,QAAM,QAA0B;AAAA,IAC/B,KAAK,QAAQ;AAAA,IACb,MAAM;AAAA,EACP;AACA,MAAI,QAAQ;AACX,UAAM,SAAS;AAAA,EAChB;AACA,QAAM,GAAG,iBAAiB,KAAK,KAAK;AACpC,SAAO;AACR;;;ACxDO,IAAM,yBAAyB,CACrC,SACA,QACA,UAC8B;AAC9B,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,UAAU,IAAI,QAAsC;AAE1D,QAAM,EAAE,KAAK,KAAK,IAAI,iBAAiB,QAAQ,KAAK,KAAK;AACzD,QAAM,UAAU,MAAM;AACrB,UAAM,QAAQ,QAAQ,IAAI,EAAE,KAAK,KAAK,CAAC;AACvC,eAAW,QAAQ,KAAK,OAAO,SAAS,KAAK;AAC7C,WAAO;AAAA,EACR;AAEA,QAAM,mBAAwC,gDAC1C,UAD0C;AAAA,IAE7C;AAAA,IACA,SAAS,CAAC,MAAa,eAAe,SAAS,QAAQ,CAAC;AAAA,IACxD,KAAK;AAAA,IACL,MAAM;AAAA,MACF,UAAU,EAAE,OAAO;AAExB,SAAO,kBAAkB,IAAI,QAAQ,KAAK,gBAAgB;AAC1D,QAAM,eAAe,QAAQ;AAC7B,QAAM,OAAO;AAAA,IACZ;AAAA,IACA,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,EACD;AACA,QAAM,QAAkC;AAAA,IACvC,KAAK,QAAQ;AAAA,IACb,MAAM;AAAA,EACP;AACA,MAAI,QAAQ;AACX,UAAM,SAAS;AAAA,EAChB;AACA,QAAM,GAAG,iBAAiB,KAAK,KAAK;AACpC,SAAO;AACR;;;ACbO,SAAS,eACf,SACA,QACA,OAC8C;AAC9C,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,mBAAmB,OAAO,UAAU,IAAI,QAAQ,GAAG;AACzD,QAAM,mBAAmB,OAAO,kBAAkB,IAAI,QAAQ,GAAG;AAEjE,MAAI,oBAAoB,kBAAkB;AACzC,UAAM,OAAO;AAAA,MACZ;AAAA,MACA,mBAAmB,sBAAsB;AAAA,MACzC,QAAQ;AAAA,MACR;AAAA,IACD;AAAA,EACD;AAEA,MAAI,SAAS,SAAS;AACrB,WAAO,wBAAwB,SAAS,QAAQ,KAAK;AAAA,EACtD;AACA,SAAO,uBAAuB,SAAS,QAAQ,KAAK;AACrD;;;AC3DO,SAAS,eACf,eACA,OACO;AACP,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,EAAE,IAAI,IAAI;AAChB,UAAQ,cAAc,MAAM;AAAA,IAC3B,KAAK;AACJ,aAAO,UAAU,OAAO,GAAG;AAC3B;AAAA,IACD,KAAK;AACJ,aAAO,kBAAkB,OAAO,GAAG;AACnC;AAAA,EACF;AACA,SAAO,SAAS,OAAO,GAAG;AAC1B,SAAO,cAAc,OAAO,GAAG;AAC/B,QAAM,mBAAmB,OAAO,cAC9B,mBAAmB,EAAE,qBAAqB,IAAI,CAAC,EAC/C,OAAO,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,WAAW,GAAG,EAC1C;AAAA,IACA,CAAC,CAAC,qBAAqB,MAAG;AAzB7B;AA0BI,0BAAO,UAAU,IAAI,qBAAqB,MAA1C,YACA,OAAO,kBAAkB,IAAI,qBAAqB;AAAA;AAAA,EACpD;AACD,aAAW,mBAAmB,kBAAkB;AAC/C,QAAI,iBAAiB;AACpB,qBAAe,iBAAiB,KAAK;AAAA,IACtC;AAAA,EACD;AACA,SAAO,cAAc,OAAO,GAAG;AAC/B,QAAM,OAAO,KAAK,aAAM,cAAc,MAAM,GAAG,GAAG,IAAI,SAAS;AAChE;;;AC/BO,IAAM,cAAc,CAC1B,OACA,UACO;AACP,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAI,CAAC,OAAO,UAAU,MAAM;AAC3B,WAAO,OAAO,SAAS,IAAI,MAAM,GAAG;AAAA,EACrC;AACA,SAAO,OAAO,UAAU,KAAK,IAAI,MAAM,GAAG;AAC3C;;;ACPO,IAAM,uBAAuB,CACnC,OACA,UAC2B;AAC3B,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,0BACL,aAAa,QACV,OACA,sBAAsB,MAAM,KAAK,KAAK,EAAE,IAAI,CAAC,YAAY;AACzD,UAAM,OAAO,OAAO,MAAM,IAAI,OAAO;AACrC,QAAI,SAAS,QAAW;AACvB,YAAM,IAAI;AAAA,QACT,SAAS,OAAO,gCAAgC,MAAM,GAAG,0BAA0B,MAAM,OAAO,IAAI;AAAA,MACrG;AAAA,IACD;AACA,WAAO,KAAK,QAAQ;AAAA,MACnB,GAAG,MAAM,IAAI,IAAI,MAAM,GAAG;AAAA,MAC1B,CAAC,eAAe;AACf,cAAM,OAAO;AAAA,UACZ;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX;AAAA,UACA,WAAW;AAAA,QACZ;AACA,cAAM,WAAW,YAAY,OAAO,MAAM;AAE1C,cAAM,WAAW,mBAAmB,OAAO,MAAM;AACjD,cAAM,OAAO;AAAA,UACZ;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD;AACA,cAAM,QAAQ,KAAK,EAAE,UAAU,SAAS,CAAC;AAAA,MAC1C;AAAA,IACD;AAAA,EACA,CAAC;AACL,SAAO;AACR;;;AChDO,SAAS,iBACf,OACA,cACA,KACA,OACa;AAVd;AAWC,QAAM,SACL,cAAY,OAAO,KAAK,MAAxB,YAA6B,wBAAwB,OAAO,KAAK;AAClE,MAAI,UAAU,QAAW;AACxB,UAAM,IAAI;AAAA,MACT,UAAU,MAAM,GAAG;AAAA,IACpB;AAAA,EACD;AACA,QAAM,gBAAgB,MAAM,QAAQ,UAAU,KAAK,YAAY;AAC/D,QAAM,OAAO,KAAK,aAAM,MAAM,MAAM,MAAM,KAAK,wBAAwB,GAAG,GAAG;AAC7E,QAAM,2BACL,MAAM,SAAS,SAAS,qBAAqB,OAAO,KAAK,IAAI;AAE9D,QAAM,cACL,6BAA6B,OAC1B,MAAM;AACN,UAAM,OAAO;AAAA,MACZ;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN,0BAA0B,GAAG;AAAA,IAC9B;AACA,kBAAc;AAAA,EACd,IACA,MAAM;AACN,UAAM,OAAO;AAAA,MACZ;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN,0BAA0B,GAAG;AAAA,IAC9B;AACA,kBAAc;AACd,eAAW,uBAAuB,0BAA0B;AAC3D,0BAAoB;AAAA,IACrB;AAAA,EACA;AAEJ,SAAO;AACR;;;AC9CA,SAAS,YAAAA,iBAAgB;AAElB,IAAM,sBAAsB,CAClC,OACA,cACA,KACA,UACkB;AAClB,QAAM,KAAKA,UAAS,OAAO,KAAK;AAChC,MAAI,OAAO,QAAW;AACrB,UAAM,IAAI;AAAA,MACT,iCAAiC,MAAM,GAAG,mCAAmC,MAAM,OAAO,IAAI;AAAA,IAC/F;AAAA,EACD;AACA,QAAM,OAAO,KAAK,aAAM,YAAY,MAAM,KAAK,wBAAwB,GAAG,GAAG;AAC7E,QAAM,cAAc,GAAG,QAAQ,UAAU,KAAK,YAAY;AAC1D,SAAO,MAAM;AACZ,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,0BAA0B,GAAG;AAAA,IAC9B;AACA,gBAAY;AAAA,EACb;AACD;;;ACzBA,SAAS,YAAAA,iBAAgB;AAElB,IAAM,yBAAyB,CACrC,OACA,cACA,KACA,UACkB;AAClB,QAAM,KAAKA,UAAS,OAAO,KAAK;AAChC,MAAI,OAAO,QAAW;AACrB,UAAM,IAAI;AAAA,MACT,oCAAoC,MAAM,GAAG,sCAAsC,MAAM,OAAO,IAAI;AAAA,IACrG;AAAA,EACD;AACA,QAAM,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,wBAAwB,GAAG;AAAA,EAC5B;AACA,QAAM,cAAc,GAAG,QAAQ,UAAU,KAAK,YAAY;AAC1D,SAAO,MAAM;AACZ,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,0BAA0B,GAAG;AAAA,IAC9B;AACA,gBAAY;AAAA,EACb;AACD;;;AC/BA,SAAS,UAAU,gBAAgB;AAa5B,IAAM,UAAN,MAAgD;AAAA,EAG9C,gBACP,cACA,OACuC;AApBzC;AAqBE,UAAM,uBAAuB,IAAI,aAAa,GAAG;AACjD,UAAM,MAAM,OAAO,oBAAoB;AACvC,UAAM,SAAS,OAAO,oBAAoB;AAC1C,UAAM,iBAA6C,aAAa,SAC7D;AAAA,MACA,KAAK,IAAI,aAAa,OAAO,GAAG;AAAA,MAChC,QAAQ,aAAa,OAAO;AAAA,IAC5B,IACA;AACH,UAAM,oBAAoB;AAAA,MAGzB;AAAA,QACC,KAAK;AAAA,QACL,SAAS;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,SAAI,WAAM,WAAN,mBAAc,SAAS,IAAI,uBAAuB;AACrD,YAAM,cAAc,MAAM,OAAO,SAAS,IAAI,oBAAoB;AAClE,YAAM,SAAS,IAAI,sBAAsB,WAAW;AAAA,IACrD;AAEA,WAAO;AAAA,EACR;AAAA,EAIQ,YACP,cACA,mBACA,OACO;AACP,UAAM,qBAAqB,SAAS,cAAc,KAAK;AACvD,UAAM,SAAS,OAAO,KAAK;AAC3B,SAAK,4BAA4B,mBAAmB;AAAA,MACnD,WAAW,MAAM,OAAO,IAAI,IAC3B,OAAO,oBAAoB,OACxB,SACA,OAAO,gBAAgB,OAAO,GAClC;AAAA,MACA,CAAC,WAAW;AACX,YAAI,OAAO,UAAU,MAAM;AAC1B,gBAAM,cAAc,OAAO,GAAG,eAAe;AAAA,YAC5C,aAAa;AAAA,YACb,MAAM;AACL,0BAAY;AACZ,uBAAS,mBAAmB,QAAQ,MAAM;AAAA,YAC3C;AAAA,UACD;AAAA,QACD,OAAO;AACN,mBAAS,cAAc,CAAC,YAAY,SAAS,MAAM;AACnD,mBAAS,mBAAmB,QAAQ,MAAM;AAAA,QAC3C;AAAA,MACD;AAAA,IACD;AACA,SAAK,uBAAuB;AAAA,MAC3B;AAAA,MACA,CAAC,WAAW;AACX,YAAI,OAAO,aAAa,OAAO,UAAU;AACxC,eAAK,0BAA0B;AAC/B,gBAAMC,UAAS,OAAO,KAAK;AAC3B,eAAK,4BAA4B,OAAO,SAAS;AAAA,YAChD,WAAW,MAAM,OAAO,IAAI,IAC3BA,QAAO,oBAAoB,OACxB,SACAA,QAAO,gBAAgB,OAAO,GAClC;AAAA,YACA,CAACC,YAAW;AACX,kBAAID,QAAO,UAAU,MAAM;AAC1B,sBAAM,cAAcA,QAAO,GAAG,eAAe;AAAA,kBAC5C,aAAa;AAAA,kBACb,MAAM;AACL,gCAAY;AACZ,6BAAS,mBAAmBC,SAAQD,OAAM;AAAA,kBAC3C;AAAA,gBACD;AAAA,cACD,OAAO;AACN,yBAAS,cAAc,CAAC,YAAY,SAASA,OAAM;AACnD,yBAAS,mBAAmBC,SAAQD,OAAM;AAAA,cAC3C;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,MACA,GAAG,MAAM,OAAO,IAAI;AAAA,MACpB;AAAA,IACD;AAAA,EACD;AAAA,EAEQ,WACP,cACA,mBACA,OACO;AACP;AAAA,MACC;AAAA,MACA,CAAC,EAAE,UAAU,SAAS,MAAM;AAC3B,cAAM,aAAa,MAAM,cAAc;AAAA,UACtC,kBAAkB;AAAA,QACnB;AACA,YAAI,YAAY;AACf,gBAAM,eAAe,MAAM,UAAU,IAAI,UAAU;AACnD,cAAI,6CAAc,eAAe;AAChC,kBAAME,eAAc;AAAA,cACnB,EAAE,KAAK,YAAY,MAAM,WAAW;AAAA,cACpC,CAAC,WAAW;AACX,gBAAAA,aAAY;AACZ;AAAA,kBACC;AAAA,kBACA,CAAC,gBAAgB;AAChB,wBAAI,WAAW,UAAU,UAAU;AAClC,kCAAY,GAAG,QAAQ;AAAA,oBACxB,WAAW,WAAW,UAAU,UAAU;AACzC,kCAAY,KAAK,QAAQ;AAAA,oBAC1B;AACA,2BAAO;AAAA,kBACR;AAAA,kBACA;AAAA,gBACD;AAAA,cACD;AAAA,cACA,GAAG,aAAa,GAAG;AAAA,cACnB;AAAA,YACD;AACA;AAAA,UACD;AAAA,QACD;AAEA,cAAM,cAAc,MAAM,GAAG,eAAe;AAAA,UAC3C,kBAAkB;AAAA,UAClB,MAAM;AACL,wBAAY;AACZ,kBAAM,UAAU,SAAS,cAAc,KAAK;AAE5C,kBAAM,eACL,aAAa,OAAO,KAAK,QAAQ,gBAAgB,QAAQ;AAC1D,kBAAM,cAAc,eAAe,QAAQ;AAC3C,gBAAI,YAAY,gBAAgB,GAAG;AAElC;AAAA,gBACC;AAAA,gBACA,CAAC,iBAAiB,YAAY,GAAG,QAAQ,GAAG;AAAA,gBAC5C;AAAA,cACD;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,MACA,GAAG,MAAM,OAAO,IAAI;AAAA,MACpB;AAAA,IACD;AAAA,EACD;AAAA,EAOO,YACN,cACA,OACC;AACD,SAAK,eAAe;AACpB,UAAM,SAAS,OAAO,KAAK;AAC3B,SAAK,oBAAoB,KAAK,gBAAgB,cAAc,MAAM;AAClE,SAAK,YAAY,cAAc,KAAK,mBAAmB,MAAM;AAC7D,SAAK,WAAW,cAAc,KAAK,mBAAmB,MAAM;AAC5D,WAAO,SAAS,IAAI,aAAa,KAAK,IAAI;AAC1C,SAAK,UAAU,MAAM;AACpB,WAAK,0BAA0B;AAC/B,WAAK,qBAAqB;AAC1B,aAAO,SAAS,OAAO,aAAa,GAAG;AAAA,IACxC;AAAA,EACD;AACD;;;AjCrLO,SAAS,kBAIf,SACA,QACA,OAC2C;AAC3C,QAAM,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,sBAAsB,MAAM,OAAO,IAAI;AAAA,EACxC;AACA,QAAM,YAAY,kBAAwB,SAAS,QAAQ,KAAK;AAChE,MAAI,QAAQ,WAAW,KAAK;AAC5B,QAAM,YAAY,WAAW,WAAW,SAAS,KAAK;AACtD,QAAM,SAAS,OAAO,KAAK;AAC3B;AAAA,IACC;AAAA,IACA,MAAM;AACL,YAAM,4BAA4B,OAAO,KAAK,EAAE,SAAS,IAAI,UAAU,GAAG;AAC1E,UAAI,CAAC,2BAA2B;AAC/B,YAAI,QAAQ,WAAW,KAAK;AAAA,MAC7B;AAAA,IACD;AAAA,IACA,uBAAuB,+BAAO,OAAO,IAAI,IACxC,OAAO,oBAAoB,OACxB,SACA,GAAG,OAAO,gBAAgB,OAAO,GAAG,EACxC;AAAA,IACA;AAAA,EACD;AACA,SAAO;AACR;;;AkC/CA,SAAS,wBAAwB;;;ACAjC,SAAS,iBAAiB;;;ACO1B,SAAS,qBAAqB;AASvB,SAAS,wBACf,SACA,OACmB;AACnB,QAAM,UAAU,IAAI,QAAsB;AAC1C,QAAM,aAAa,OAAO;AAAA,IACzB,CAAC,QAAyB;AACzB,YAAM,SAAS,cAAc,GAAG;AAChC,YAAM,SAAyB,EAAE,KAAK,QAAQ,KAAK,OAAO;AAC1D,YAAM,UAAU,GAAG,QAAQ,GAAG,IAAI,MAAM;AACxC,YAAM,WAAW,SAAS,EAAE,KAAK,SAAS,MAAM,OAAO,GAAG,KAAK;AAC/D,UAAI;AACJ,UAAI,UAAU;AACb,gBAAQ,QAAQ,QAAQ;AAAA,MACzB,OAAO;AACN,cAAM,oBAAsC;AAAA,UAC3C,KAAK;AAAA,UACL,SACC,QAAQ,mBAAmB,WACxB,QAAQ,QAAQ,GAAG,IACnB,QAAQ;AAAA,QACb;AACA,YAAI,QAAQ,SAAS;AACpB,4BAAkB,UAAU,QAAQ,QAAQ,GAAG;AAAA,QAChD;AACA,YAAI,aAAa,SAAS;AACzB,gBAAM,iBAAiB,iCACnB,oBADmB;AAAA,YAEtB,SAAS;AAAA,YACT,QAAQ,QAAQ;AAAA,YAChB,UAAU,QAAQ;AAAA,UACnB;AACA,kBAAQ,kBAAkB,gBAAgB,QAAQ,KAAK;AAAA,QACxD,OAAO;AACN,kBAAQ,kBAAqB,mBAAmB,QAAQ,KAAK;AAAA,QAC9D;AACA,gBAAQ,KAAK,KAAK;AAAA,MACnB;AACA,aAAO;AAAA,IACR;AAAA,IACA;AAAA,MACC,KAAK,QAAQ;AAAA,MACb,MAAM;AAAA,MACN;AAAA,MACA,SAAS,CAACC,WAAiB,wBAAwB,SAASA,MAAK;AAAA,IAClE;AAAA,EACD;AACA,MAAI,aAAa,WAAW,OAAO,QAAQ,YAAY,WAAW;AACjE,WAAO,OAAO,YAAY,EAAE,SAAS,QAAQ,QAAQ,CAAC;AAAA,EACvD;AACA,QAAM,SAAS,OAAO,KAAK;AAC3B,SAAO,SAAS,IAAI,QAAQ,KAAK,UAAU;AAC3C,SAAO;AACR;;;AC/CO,SAAS,iBACf,SACA,OACsD;AACtD,MAAI,aAAa,SAAS;AACzB,WAAO,wBAAwB,SAAS,KAAK;AAAA,EAC9C;AACA,SAAO,wBAA8B,SAAS,KAAK;AACpD;;;ACzBA,SAAS,iBAAAC,sBAAqB;AAOvB,SAAS,6BACf,SACA,OAC+B;AAC/B,QAAM,UAAU,IAAI,QAAkC;AACtD,QAAM,yBAAyB,OAAO;AAAA,IACrC,CAAC,QAAqC;AACrC,YAAM,SAAS,OAAO,KAAK;AAC3B,YAAM,SAASA,eAAc,GAAG;AAChC,YAAM,SAAyB,EAAE,KAAK,QAAQ,KAAK,OAAO;AAC1D,YAAM,UAAU,GAAG,QAAQ,GAAG,IAAI,MAAM;AACxC,YAAM,WAAW,OAAO,kBAAkB,IAAI,OAAO;AACrD,UAAI,UAAU;AACb,eAAO,QAAQ,QAAQ;AAAA,MACxB;AACA,aAAO;AAAA,QACN;AAAA,UACC,KAAK;AAAA,UACL,KAAK,QAAQ,IAAI,GAAG;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,IACD;AAAA,IACA;AAAA,MACC,KAAK,QAAQ;AAAA,MACb,MAAM;AAAA,MACN;AAAA,MACA,SAAS,CAACD,WAAiB,6BAA6B,SAASA,MAAK;AAAA,IACvE;AAAA,EACD;AACA,QAAM,SAAS,IAAI,QAAQ,KAAK,sBAAsB;AACtD,SAAO;AACR;;;ACtCA,SAAS,iBAAAC,sBAAqB;AAiBvB,SAAS,qBACf,SACA,OACsD;AACtD,QAAM,aAAa,EAAE,SAAS;AAE9B,MAAI,YAAY;AACf,WAAO,6BAA6B,SAAS,KAAK;AAAA,EACnD;AACA,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,UAAU,IAAI,QAA0B;AAE9C,QAAM,iBAAiB,OAAO;AAAA,IAC7B,CAAC,QAA6B;AAC7B,YAAM,SAASA,eAAc,GAAG;AAChC,YAAM,SAAyB,EAAE,KAAK,QAAQ,KAAK,OAAO;AAC1D,YAAM,UAAU,GAAG,QAAQ,GAAG,IAAI,MAAM;AACxC,YAAM,WAAW,OAAO,UAAU,IAAI,OAAO;AAC7C,UAAI,UAAU;AACb,eAAO,QAAQ,QAAQ;AAAA,MACxB;AACA,YAAM,QAAQ;AAAA,QACb;AAAA,UACC,KAAK;AAAA,UACL,KAAK,QAAQ,IAAI,GAAG;AAAA,UACpB,KAAK,QAAQ,IAAI,GAAG;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,MACD;AACA,cAAQ,KAAK,KAAK;AAClB,aAAO;AAAA,IACR;AAAA,IACA;AAAA,MACC,KAAK,QAAQ;AAAA,MACb,MAAM;AAAA,MACN;AAAA,MACA,SAAS,CAACD,WAAiB,qBAAqB,SAASA,MAAK;AAAA,IAC/D;AAAA,EACD;AACA,SAAO,SAAS,IAAI,QAAQ,KAAK,cAAc;AAC/C,SAAO;AACR;;;AJ3DO,IAAM,gBAAN,MAGL;AAAA,EAWM,YACN,kBACA,OACC;AACD,SAAK,wBAAwB;AAAA,MAI5B;AAAA,QACC,KAAK,IAAI,iBAAiB,GAAG;AAAA,QAC7B,SAAS;AAAA,MACV;AAAA,MACA;AAAA,IACD;AACA,SAAK,mBAAmB;AACxB,SAAK,iBAAiB,QAAQ;AAAA,MAC7B,SAAS,MAAM,OAAO,IAAI;AAAA,MAC1B,CAAC,cAAc;AACd,YAAI,UAAU,QAAQ;AACrB,gBAAM,MAAM,UAAU,UAAU,OAAO,MAAM;AAC7C,eAAK,sBAAsB,GAAG;AAC9B,cAAI,QAAc,WAAW,KAAK;AAAA,QACnC;AAAA,MACD;AAAA,IACD;AACA,SAAK,sBAAsB,QAAQ;AAAA,MAClC,SAAS,MAAM,OAAO,IAAI;AAAA,MAC1B,CAAC,cAAc;AACd,YAAI,UAAU,QAAQ;AACrB,gBAAM,MAAM,UAAU,UAAU,OAAO,MAAM;AAC7C,gBAAM,mBAAmB,KAAK,iBAAiB,GAAG;AAClD,cAAI,QAAc,kBAAkB,KAAK;AAAA,QAC1C;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;;;ADlDO,SAAS,wBAKf,SACA,OACiD;AACjD,QAAM,aAAa,OAAO;AAAA,IACzB,wBAAmC,SAAS,KAAK;AAAA,IACjD;AAAA,EACD;AACA,mBAAiB,YAAY,OAAO;AACpC,MAAI,cAAc,YAAY,KAAK;AACnC,SAAO;AACR;;;AMjBO,IAAM,gBAAgB,CAK5B,mBACA,UAC2C;AAC3C,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,MAAM,GAAG,kBAAkB,GAAG;AACpC,QAAM,aAAoD,OAAO,SAAS;AAAA,IACzE;AAAA,EACD;AACA,SAAO;AACR;;;AChBO,IAAM,eAAe,CAI3B,qBACqC;AACrC,QAAM,MAAM,iBAAiB,SAC1B,GAAG,iBAAiB,OAAO,GAAG,SAAS,iBAAiB,OAAO,MAAM,MACrE,GAAG,iBAAiB,GAAG;AAC1B,QAAM,YAA6C,EAAE,MAAM,YAAY,IAAI;AAC3E,MAAI,iBAAiB,QAAQ;AAC5B,cAAU,SAAS;AAAA,MAClB,KAAK,GAAG,iBAAiB,OAAO,GAAG;AAAA,MACnC,QAAQ,iBAAiB,OAAO;AAAA,IACjC;AAAA,EACD;AACA,SAAO;AACR;;;AClBO,IAAM,iBAAiB,CAI7B,qBAC6B;AAC7B,QAAM,MAAM,IAAI,iBAAiB,GAAG;AACpC,QAAM,cAAuC,EAAE,MAAM,QAAQ,IAAI;AACjE,MAAI,iBAAiB,QAAQ;AAC5B,gBAAY,SAAS;AAAA,MACpB,KAAK,IAAI,iBAAiB,OAAO,GAAG;AAAA,MACpC,QAAQ,iBAAiB,OAAO;AAAA,IACjC;AAAA,EACD;AACA,SAAO;AACR;;;ACZO,IAAM,kBAAkB,CAK9B,mBACA,UAC0C;AAC1C,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,MAAM,IAAI,kBAAkB,GAAG;AACrC,QAAM,eAAe,OAAO,SAAS,IAAI,GAAG;AAI5C,SAAO;AACR;;;ACZO,SAAS,cACf,OAC0C;AAC1C,SACC,OAAO,UAAU,YACjB,UAAU,QACV,QAAQ,SACR,UAAU,SACV,eAAe;AAEjB;;;ACbA,SAAS,YAAAE,iBAAgB;;;ACHlB,IAAM,gBAAgB,CAAC,KAAa,UAA0B;AACpE,QAAM,OAAO,OAAO,KAAK;AACzB,SAAO,KAAK,oBAAoB,IAAI,GAAG;AACxC;AAEO,IAAM,oBAAoB,CAAC,KAAa,UAAuB;AACrE,QAAM,OAAO,OAAO,KAAK;AACzB,OAAK,sBAAsB,IAAI,IAAI,KAAK,mBAAmB,EAAE,IAAI,GAAG;AACrE;AAEO,IAAM,uBAAuB,CAAC,KAAa,UAAuB;AACxE,QAAM,OAAO,OAAO,KAAK;AACzB,OAAK,sBAAsB,IAAI,IAAI,OAAO,KAAK,EAAE,mBAAmB;AACpE,OAAK,oBAAoB,OAAO,GAAG;AACpC;;;ADCO,SAAS,kBACf,SACA,QACA,OACe;AACf,QAAM,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,sBAAsB,MAAM,OAAO,IAAI;AAAA,EACxC;AACA,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,WAAW,OAAO,MAAM,IAAI,QAAQ,GAAG;AAC7C,MAAI,UAAU;AACb,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACD;AACA,WAAO,QAAQ,QAAQ;AAAA,EACxB;AACA,QAAM,UAAU,IAAI,QAAsC;AAC1D,QAAM,UAAmB,iCACrB,UADqB;AAAA,IAExB,MAAM;AAAA,IACN,SAAS,CAACF,WAAiB;AAC1B,MAAAA,OAAM,OAAO;AAAA,QACZ;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,wBAAwBA,OAAM,OAAO,IAAI;AAAA,MAC1C;AACA,aAAO,aAAa,UACjB,kBAAkB,SAAS,QAAQA,MAAK,IACxC,kBAAkB,SAAS,QAAQA,MAAK;AAAA,IAC5C;AAAA,IACA;AAAA,EACD;AACA,MAAI,QAAQ;AACX,YAAQ,SAAS;AAAA,EAClB;AACA,MAAI,eAAe,QAAQ;AAC3B,MAAI,QAAQ,mBAAmB,UAAU;AACxC,mBAAe,QAAQ,QAAQ;AAAA,EAChC;AACA,SAAO,MAAM,IAAI,QAAQ,KAAK,OAAO;AACrC,oBAAkB,QAAQ,KAAK,KAAK;AACpC,aAAW,QAAQ,KAAK,cAAc,SAAS,MAAM;AACrD,QAAM,QAAQ,QAAQ,OAAO;AAC7B,MAAI,QAAQ,SAAS;AACpB,QAAI,cAAc;AAClB,UAAM,mBAAmC,CAAC;AAC1C,eAAW,UAAU,QAAQ,SAAS;AACrC,YAAM,UAAU,OAAO;AAAA,QACtB,SAAS,CAAC,SAASE,UAAS,OAAO,MAAM,KAAK;AAAA,QAC9C,OAAO,CAAC,WACP,iBAAiB,OAAO,QAAQ,UAAU,WAAW,KAAK,KAAK;AAAA,MACjE,CAAC;AACD,UAAI,SAAS;AACZ,yBAAiB,KAAK,OAAO;AAAA,MAC9B;AACA,QAAE;AAAA,IACH;AACA,YAAQ,UAAU,MAAM;AACvB,iBAAW,WAAW,kBAAkB;AACvC,gBAAQ;AAAA,MACT;AAAA,IACD;AAAA,EACD;AACA,QAAM,GAAG,aAAa,KAAK,KAAK;AAChC,SAAO;AACR;;;AEhFO,SAAS,WACf,SACA,QACA,OACe;AACf,MAAI,aAAa,SAAS;AACzB,WAAO,kBAAkB,SAAS,QAAQ,KAAK;AAAA,EAChD;AACA,SAAO,kBAAqB,SAAS,QAAQ,KAAK;AACnD;;;ACfO,SAAS,WAAW,WAA+B,OAAoB;AAL9E;AAMC,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,EAAE,IAAI,IAAI;AAChB,QAAM,OAAO,OAAO,MAAM,IAAI,GAAG;AACjC,MAAI,CAAC,MAAM;AACV,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA,GAAG,GAAG;AAAA,MACN;AAAA,IACD;AAAA,EACD;AACA,qCAAM,YAAN;AACA,SAAO,MAAM,OAAO,GAAG;AACvB,SAAO,SAAS,OAAO,GAAG;AAC1B,QAAM,eAAe,OAAO,cAAc,eAAe,GAAG;AAC5D,MAAI,cAAc;AACjB,eAAW,eAAe,cAAc;AACvC,YAAM,SACL,YAAO,UAAU,IAAI,WAAW,MAAhC,YACA,OAAO,kBAAkB,IAAI,WAAW;AACzC,UAAI,OAAO;AACV,uBAAe,OAAO,KAAK;AAAA,MAC5B;AAAA,IACD;AAAA,EACD;AACA,SAAO,cAAc,OAAO,GAAG;AAC/B,SAAO,oBAAoB,OAAO,GAAG;AACrC,SAAO,cAAc,OAAO,GAAG;AAC/B,QAAM,OAAO,KAAK,aAAM,QAAQ,GAAG,GAAG,IAAI,SAAS;AACpD;;;AC5BO,SAAS,mBAAmB,OAA+B;AACjE,SAAO;AAAA,IACN,SACC,OAAO,WAAW,cACf,OAAO,WAAW,WACjB,SACA,YACD;AAAA,IACJ;AAAA,EACD;AACD;;;AChBA,SAAS,YAAAA,iBAAgB;AAIlB,SAAS,iBACf,UACA,YACA,OACO;AACP,QAAM,EAAE,KAAK,UAAU,SAAS,IAAI;AACpC,QAAM,QAAQ,aAAa,aAAa,WAAW;AACnD,EAAAA,UAAS,EAAE,KAAK,MAAM,OAAO,GAAG,OAAO,KAAK;AAC7C;;;ACTO,SAAS,qBACf,UACA,gBACA,OACO;AACP,QAAM,UACL,aAAa,aACV,eAAe,cACf,CAAC,GAAG,eAAe,WAAW,EAAE,QAAQ;AAC5C,aAAW,cAAc,SAAS;AACjC,qBAAiB,UAAU,YAAY,KAAK;AAAA,EAC7C;AACD;;;ACXO,SAAS,wBACf,UACA,mBACA,OACO;AACP,QAAM,UACL,aAAa,aACV,kBAAkB,UAClB,CAAC,GAAG,kBAAkB,OAAO,EAAE,QAAQ;AAC3C,aAAW,yBAAyB,SAAS;AAC5C,QAAI,cAAc,uBAAuB;AACxC,uBAAiB,UAAU,uBAAuB,KAAK;AAAA,IACxD,OAAO;AACN,8BAAwB,UAAU,uBAAuB,KAAK;AAAA,IAC/D;AAAA,EACD;AACD;;;ACrBO,IAAM,UAAN,cAA4B,IAAU;AAAA,EAGrC,YAA+B,QAAmB;AACxD,UAAM;AAD+B;AAFtC,SAAO,UAAU,oBAAI,IAAO;AAAA,EAI5B;AAAA,EAEO,IAAI,KAAuB;AACjC,UAAM,MAAM,MAAM,IAAI,GAAG;AACzB,QAAI,KAAK;AACR,aAAO,MAAM,IAAI,GAAG;AAAA,IACrB;AACA,QAAI,CAAC,KAAK,QAAQ,IAAI,GAAG,KAAK,KAAK,OAAO,IAAI,GAAG,GAAG;AACnD,YAAM,QAAQ,KAAK,OAAO,IAAI,GAAG;AACjC,aAAO;AAAA,IACR;AACA,WAAO;AAAA,EACR;AAAA,EAEO,IAAI,KAAQ,OAAgB;AAClC,SAAK,QAAQ,OAAO,GAAG;AACvB,WAAO,MAAM,IAAI,KAAK,KAAK;AAAA,EAC5B;AAAA,EAEO,OAAO,KAAiB;AAC9B,WAAO,MAAM,IAAI,GAAG;AAAA,EACrB;AAAA,EAEO,IAAI,KAAiB;AAC3B,WAAO,CAAC,KAAK,QAAQ,IAAI,GAAG,MAAM,MAAM,IAAI,GAAG,KAAK,KAAK,OAAO,IAAI,GAAG;AAAA,EACxE;AAAA,EAEO,OAAO,KAAiB;AAC9B,SAAK,QAAQ,IAAI,GAAG;AACpB,WAAO,MAAM,OAAO,GAAG;AAAA,EACxB;AACD;;;AChCA,IAAM,aAAa,CAAC,QAAgB,IAAI,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAEtE,SAAS,qBAAqB,OAA2B;AACxD,MAAI,MAAM,SAAS,qBAAqB;AACvC,WAAO;AAAA,EACR;AACA,SAAO,WAAW,MAAM,IAAI;AAC7B;AAEO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACjC,YAAY,OAA2B,OAAc;AAC3D;AAAA,MACC,GAAG,qBAAqB,KAAK,CAAC,KAAK,MAAM,GAAG,yBAC3C,MAAM,OAAO,IACd;AAAA,IACD;AAAA,EACD;AACD;;;ACRO,IAAM,oBAAoB,CAChC,WACA,IACA,UACU;AACV,MAAI,YAAY,SAAS,WAAW,KAAK;AACzC,MAAI,uCAAW,SAAS;AACvB,YAAQ,IAAI,kCAAkC,UAAU,GAAG;AAC3D,UAAM,cAAc,eAAe,SAAS;AAC5C,gBAAY,SAAS,aAAa,KAAK;AAAA,EACxC;AACA,QAAM,OAAO;AACb,MAAI,SAAS,QAAW;AACvB,UAAM,IAAI;AAAA,MACT,6BAA6B,UAAU,GAAG,mDAAmD,MAAM,OAAO,IAAI;AAAA,IAC/G;AAAA,EACD;AAEA,OAAK,QAAQ,UAAU,YAAY,CAAC,WAAW;AA/BhD;AAiCE,UAAM,SAAS,OAAO,KAAK;AAC3B,UAAM,qBACL,MAAM,UAAU,QAAQ,MAAM,UAAU,MAAM,SAAS,aACpD,MAAM,UAAU,MAAM,MACtB;AACJ,UAAM,sBACL,MAAM,UAAU,QAAQ,MAAM,UAAU,MAAM,SAAS,aACpD,MAAM,UAAU,OAChB;AACJ,UAAM,yBAAwB,YAAO,GAAG,oBAAoB,UAA9B,mBAAqC,OAAO;AAC1E,UAAM,0BAAyB,YAAO,GAAG,oBAAoB,UAA9B,mBAAqC;AAEpE,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,OAAO;AAAA,MACP,wBACG,mBAAmB,qBAAqB,MACxC,qBACE,gBAAgB,kBAAkB,MAClC;AAAA,IACN;AACA,QAAI,GAAG,kBAAkB,MAAM;AAC9B,UAAI,GAAG,gBAAgB,GAAG,iBAAiB,qBAAqB;AAC/D,cAAM,mBACL,GAAG,QAAQ,GAAG,EAAE;AACjB,YAAI,qBAAqB,QAAW;AACnC,gBAAM,IAAI;AAAA,YACT,aAAa,GAAG,GAAG;AAAA,UACpB;AAAA,QACD;AAAA,MACD;AACA,UAAI,uBAAuB;AAC1B,cAAM,qBAAqB;AAAA,UAC1B,EAAE,KAAK,uBAAuB,MAAM,cAAc;AAAA,UAClD;AAAA,QACD;AACA,YAAI,uBAAuB,QAAW;AACrC,gBAAM,IAAI;AAAA,YACT,gBAAgB,qBAAqB,yBAAyB,MAAM,OAAO,IAAI,sEAAsE,qBAAqB;AAAA,UAC3K;AAAA,QACD;AACA,YAAI,GAAG,mBAAmB,uBAAuB;AAChD,cAAI,GAAG,gBAAgB;AACtB,kBAAM,OAAO;AAAA,cACZ;AAAA,cACA;AAAA,cACA,GAAG;AAAA,cACH,kCAAkC,GAAG,cAAc;AAAA,YACpD;AAAA,UACD;AACA,aAAG,iBAAiB;AACpB,gBAAM,cAAc,mBAAmB,QAAQ;AAAA,YAC9C,YAAY,GAAG,GAAG;AAAA,YAClB,CAACJ,YAAW;AA7FlB,kBAAAK,KAAAC;AA8FO,0BAAY;AACZ,kBAAI,GAAG,kBAAkB,QAAQ,wBAAwB;AACxD,oBAAI,GAAG,OAAO,GAAG,QAAQ,QAAQ;AAChC,qBAAG,QAAQ,OAAO,GAAG,EAAE;AAAA,gBACxB;AAEA,sBAAM,gBAAgB,CACrBC,aAEAA,SACE,OAAO,CAAC,iBAAiB;AACzB,wBAAMR,UAAS,OAAO,KAAK;AAC3B,sBAAI,aAAa,cAAc;AAC9B,2BAAO;AAAA,kBACR;AACA,wBAAM,mBACLA,QAAO,cAAc,eAAe,GAAG,GAAG;AAE3C,yBAAO,mBACJ,CAAC,GAAG,gBAAgB,EAAE;AAAA,oBACtB,CAAC,QAAK;AAlHpB,0BAAAM;AAmHe,qCAAQ,aAAa,OACrB,UAAQA,MAAA,aAAa,WAAb,gBAAAA,IAAqB;AAAA;AAAA,kBAC9B,IACA;AAAA,gBACJ,CAAC,EACA,IAAI,CAAC,iBAAiB;AACtB,sBAAI,aAAa,cAAc;AAC9B,2BAAO,iCACH,eADG;AAAA,sBAEN,SAAS,cAAc,aAAa,OAAO;AAAA,oBAC5C;AAAA,kBACD;AACA,yBAAO;AAAA,gBACR,CAAC;AAEH,sBAAM,UAAU,cAAcL,QAAO,OAAO;AAE5C,sBAAM,4BAAuD;AAAA,kBAC5D,MAAM;AAAA,kBACN,WAAW;AAAA,mBACRA,UAHyD;AAAA,kBAI5D;AAAA,gBACD;AACA,sBAAM,eACLM,OAAAD,MAAA,GAAG,kBAAH,gBAAAA,IAAA,SAAmB,2BAA2B,QAA9C,OAAAC,MAAqD;AACtD,oBAAI,aAAa;AAChB,qBAAG,QAAQ,KAAK,yBAAyB;AACzC,qBAAG,KAAK,GAAG,QAAQ;AACnB,qBAAG,QAAQ,KAAK,yBAAyB;AAAA,gBAC1C;AAAA,cACD;AACA,iBAAG,iBAAiB;AACpB,oBAAM,OAAO;AAAA,gBACZ;AAAA,gBACA;AAAA,gBACA,GAAG;AAAA,gBACH,6BAA6BN,QAAO,GAAG;AAAA,cACxC;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD,WAAW,sBAAsB,qBAAqB;AACrD,YAAI,eAAgD,GAAG,QAAQ,GAAG,EAAE;AAEpE,YAAI,wBAAwB,GAAG,cAAc;AAC5C,yBAAe;AAAA,YACd,MAAM;AAAA,YACN,WAAW;AAAA,YACX,KAAK;AAAA,YACL,aAAa,CAAC;AAAA,UACf;AACA,uBAAa,YAAY,KAAK;AAAA,YAC7B,KAAK,KAAK;AAAA,YACV,MAAM;AAAA,aACH,OACH;AACD,cAAI,GAAG,OAAO,GAAG,QAAQ,QAAQ;AAChC,eAAG,QAAQ,OAAO,GAAG,EAAE;AAAA,UACxB;AAEA,aAAG,QAAQ,KAAK,YAAY;AAE5B,gBAAM,OAAO;AAAA,YACZ;AAAA,YACA;AAAA,YACA,GAAG;AAAA,YACH,0BAA0B,kBAAkB;AAAA,YAC5C,aAAa,YAAY,IAAI,CAAC,eAAe,WAAW,GAAG;AAAA,UAC5D;AAEA,aAAG,KAAK,GAAG,QAAQ;AACnB,aAAG,eAAe;AAAA,QACnB,OAAO;AACN,eAAI,6CAAc,UAAS,mBAAmB;AAC7C,yBAAa,YAAY,KAAK;AAAA,cAC7B,KAAK,KAAK;AAAA,cACV,MAAM;AAAA,eACH,OACH;AACD,kBAAM,OAAO;AAAA,cACZ;AAAA,cACA;AAAA,cACA,GAAG;AAAA,cACH,wBAAwB,kBAAkB;AAAA,cAC1C,6CAAc,YAAY,IAAI,CAAC,eAAe,WAAW;AAAA,YAC1D;AAAA,UACD;AAAA,QACD;AACA,YAAI,cAAc;AACjB,gBAAM,6BACL,cAAG,kBAAH,4BAAmB,cAAc,QAAjC,YAAwC;AACzC,cAAI,2BAA2B;AAC9B,eAAG,QAAQ,KAAK,YAAY;AAAA,UAC7B,OAAO;AACN,eAAG,QAAQ,IAAI;AACf,eAAG,KAAK,GAAG,QAAQ;AAAA,UACpB;AAAA,QACD;AAAA,MACD,OAAO;AACN,cAAM,YAAY,KAAK,IAAI;AAC3B,WAAG,eAAe;AAClB,YAAI,GAAG,OAAO,GAAG,QAAQ,QAAQ;AAChC,aAAG,QAAQ,OAAO,GAAG,EAAE;AAAA,QACxB;AACA,cAAM,aAAsC;AAAA,UAC3C,MAAM;AAAA,UACN;AAAA,UACA,KAAK,KAAK;AAAA,UACV,UAAU,OAAO;AAAA,UACjB,UAAU,OAAO;AAAA,QAClB;AACA,YAAI,KAAK,QAAQ;AAChB,qBAAW,SAAS,KAAK;AAAA,QAC1B;AACA,cAAM,eAAc,cAAG,kBAAH,4BAAmB,YAAY,QAA/B,YAAsC;AAC1D,cAAM,OAAO;AAAA,UACZ;AAAA,UACA;AAAA,UACA,GAAG;AAAA,UACH,0BAA0B,KAAK,GAAG;AAAA,QACnC;AACA,YAAI,aAAa;AAChB,aAAG,QAAQ,KAAK,UAAU;AAC1B,aAAG,KAAK,GAAG,QAAQ;AACnB,aAAG,QAAQ,KAAK,UAAU;AAAA,QAC3B;AAAA,MACD;AAAA,IACD;AAAA,EACD,CAAC;AACF;;;AC3OO,SAAS,UACf,qBACU;AACV,MAAI,aAAa,qBAAqB;AACrC,WAAO,oBAAoB;AAAA,EAC5B;AACA,SAAO;AACR;;;AC+CO,SAAS,eACf,SACA,OACA,MAC6B;AAnE9B;AAoEC,QAAM,KAA4B;AAAA,IACjC,MAAM;AAAA,IACN,KAAK,QAAQ;AAAA,IACb,IAAI;AAAA,IACJ,eAAe;AAAA,IACf,cAAc;AAAA,IACd,gBAAgB;AAAA,KACb,OAP8B;AAAA,IAQjC,UAAS,kCAAM,QAAQ,IAAI,CAAC,WAAY,mBAAK,aAApC,YAAkD,CAAC;AAAA,IAC5D,SAAS,CAACE,WAAU,eAAe,SAASA,QAAO,EAAE;AAAA,IACrD,SAAS,IAAI,QAAQ;AAAA,EACtB;AACA,MAAI,QAAQ,eAAe;AAC1B,OAAG,gBAAgB,QAAQ;AAAA,EAC5B;AACA,QAAM,cAAc,QAAQ;AAC5B,QAAM,SAAS,OAAO,KAAK;AAC3B,aAAW,iBAAiB,QAAQ,OAAO;AAC1C,QAAI,UAAU,cAAc;AAC5B,UAAM,sBAAsB,OAAO,cAAc,cAAc,OAAO;AACtE,QAAI,qBAAqB;AACxB,YAAM,OAAO;AAAA,QACZ;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,uBAAuB,OAAO,6CAA6C,mBAAmB;AAAA,MAC/F;AACA;AAAA,IACD;AACA,QAAI,cAAc,SAAS,eAAe;AACzC,UAAI,SAA0B;AAC9B,UAAI,UAAU,MAAM,GAAG;AACtB,iBAAS,gBAAgB,QAAQ,KAAK;AACtC,kBAAU,OAAO;AAAA,MAClB;AACA,aAAO,QAAQ,UAAU,YAAY,QAAQ,GAAG,IAAI,CAACM,WAAU;AAC9D,0BAAkBA,QAAO,IAAI,KAAK;AAAA,MACnC,CAAC;AACD,iBAAW,QAAQ,OAAO,MAAM,OAAO,GAAG;AACzC,cAAI,UAAK,WAAL,mBAAa,SAAQ,OAAO,KAAK;AACpC,4BAAkB,MAAM,IAAI,KAAK;AAAA,QAClC;AAAA,MACD;AAAA,IACD,OAAO;AACN,UAAI,OAAO,SAAS,eAAe,KAAK;AACxC,UAAI,SAAS,QAAW;AACvB,cAAM,OAAO;AAAA,UACZ;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,uBAAuB,OAAO;AAAA,QAC/B;AACA;AAAA,MACD;AACA,UAAI,UAAU,IAAI,GAAG;AACpB,cAAM,aAAa,SAAS,eAAe,IAAI,GAAG,KAAK;AACvD,YAAI,eAAe,QAAW;AAC7B,gBAAM,OAAO;AAAA,YACZ;AAAA,YACA;AAAA,YACA,QAAQ;AAAA,YACR,8BAA8B,OAAO;AAAA,UACtC;AACA;AAAA,QACD;AACA,eAAO;AACP,kBAAU,KAAK;AAAA,MAChB;AACA,UAAI,YAAY,MAAM;AACrB,cAAM,oBAAoB,OAAO,cAAc;AAAA,UAC9C,KAAK,OAAO;AAAA,QACb;AACA,YAAI,mBAAmB;AACtB,gBAAM,OAAO;AAAA,YACZ;AAAA,YACA;AAAA,YACA,QAAQ;AAAA,YACR,uBAAuB,KAAK,GAAG,yBAAyB,KAAK,OAAO,GAAG,kCAAkC,iBAAiB;AAAA,UAC3H;AACA;AAAA,QACD;AAAA,MACD;AACA,wBAAkB,MAAM,IAAI,KAAK;AAAA,IAClC;AACA,WAAO,cAAc,IAAI,EAAE,SAAS,YAAY,CAAC;AAAA,EAClD;AAEA,QAAM,UAAU,IAAI,QAAQ,KAAK,EAAE;AACnC,QAAM,QAAoC;AAAA,IACzC,KAAK;AAAA,IACL,MAAM;AAAA,EACP;AACA,QAAM,GAAG,iBAAiB,KAAK,KAAK;AACpC,SAAO;AACR;;;ACzJO,IAAM,aAAa,CACzB,QACA,OACA,UACU;AACV,QAAM,OAAO;AAAA,IACZ,WAAW,SAAS,WAAM;AAAA,IAC1B;AAAA,IACA,MAAM;AAAA,IACN;AAAA,EACD;AACA,QAAM,eAAe,MAAM,UAAU,IAAI,MAAM,GAAG;AAClD,MAAI,CAAC,cAAc;AAClB,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,aAAa,MAAM;AAAA,IACpB;AACA;AAAA,EACD;AACA,MACE,WAAW,UAAU,aAAa,OAAO,aAAa,QAAQ,UAC9D,WAAW,UAAU,aAAa,OAAO,GACzC;AACD,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,aAAa,MAAM,WAClB,WAAW,SAAS,QAAQ,WAC7B,iBAAiB,MAAM,GAAG,0BAA0B,MAAM;AAAA,IAC3D;AACA;AAAA,EACD;AAEA,eAAa,gBAAgB,WAAW,SAAS,gBAAgB;AACjE,MAAI,WAAW,QAAQ;AACtB,MAAE,aAAa;AAAA,EAChB;AAEA,QAAM,SAAS,aAAa,QAAQ,aAAa,EAAE;AACnD,QAAM,WAAW,WAAW,SAAS,aAAa;AAElD,UAAQ,OAAO,MAAM;AAAA,IACpB,KAAK,eAAe;AACnB,uBAAiB,UAAU,QAAQ,KAAK;AACxC;AAAA,IACD;AAAA,IACA,KAAK,mBAAmB;AACvB,2BAAqB,UAAU,QAAQ,KAAK;AAC5C;AAAA,IACD;AAAA,IACA,KAAK,sBAAsB;AAC1B,8BAAwB,UAAU,QAAQ,KAAK;AAC/C;AAAA,IACD;AAAA,EACD;AAEA,MAAI,WAAW,QAAQ;AACtB,MAAE,aAAa;AAAA,EAChB;AAEA,eAAa,QAAQ,KAAK,MAAM;AAChC,eAAa,gBAAgB;AAC7B,QAAM,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,IAAI,MAAM,GAAG,eAAe,aAAa,EAAE,MAAM,aAAa,QAAQ,MAAM;AAAA,EAC7E;AACD;;;AC7EO,IAAM,mBAAmB,CAAC,UAAuB;AACvD,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAI,OAAO,oBAAoB,QAAQ,OAAO,WAAW,MAAM;AAC9D,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA;AAAA,EACD;AACA,QAAM,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA,OAAO,gBAAgB,OAAO;AAAA,IAC9B;AAAA,EACD;AACA,SAAO,OAAO,QAAQ;AACvB;;;ACdO,IAAM,mBAAmB,CAC/B,QACA,UACU;AAVX;AAWC,QAAM,QAAQ,OAAO,KAAK;AAC1B,QAAM,EAAE,OAAO,IAAI;AACnB,MACC,WAAW,QACX,MAAM,oBAAoB,UAC1B,WAAM,oBAAN,mBAAuB,WAAU,YAChC;AACD,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA;AAAA,EACD;AACA,QAAM,gBAAgB,QAAQ;AAC9B,QAAM,gBAAgB,OAAO,SAAS;AACtC,SAAO,QAAQ;AACf,SAAO,GAAG,oBAAoB,KAAK,MAAM,eAAe;AACxD,QAAM,EAAE,QAAQ,IAAI,MAAM,gBAAgB;AAC1C,QAAM,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA,MAAM,gBAAgB,OAAO;AAAA,IAC7B,6BAA6B,QAAQ,MAAM;AAAA,IAC3C;AAAA,EACD;AACA,aAAW,WAAW,MAAM,SAAS,OAAO,GAAG;AAC9C,UAAM,aAAa,QAAQ,aAAa;AACxC,QAAI,CAAC,OAAO,MAAM,IAAI,UAAU,GAAG;AAClC,YAAM,OAAO,MAAM,MAAM,IAAI,UAAU;AACvC,mCAAM,QAAQ;AAAA,IACf;AACA,YAAQ,QAAQ;AAAA,EACjB;AACA,aAAW,QAAQ,MAAM,MAAM,OAAO,GAAG;AACxC,QAAI,CAAC,OAAO,MAAM,IAAI,KAAK,GAAG,GAAG;AAChC,aAAO,MAAM,IAAI,KAAK,KAAK,IAAI;AAC/B,aAAO,SAAS,IAAI,KAAK,KAAK,KAAK,OAAO;AAC1C,aAAO,OAAO;AAAA,QACb;AAAA,QACA;AAAA,QACA,MAAM,gBAAgB,OAAO;AAAA,QAC7B,gBAAgB,KAAK,GAAG;AAAA,MACzB;AAAA,IACD;AAAA,EACD;AACA,0BAAwB,YAAY,MAAM,gBAAgB,QAAQ,MAAM;AACxE,MAAI,OAAO,oBAAoB,MAAM;AACpC,UAAM,gBAAgB;AAAA,MACrB,EAAE,KAAK,MAAM,gBAAgB,OAAO,KAAK,MAAM,cAAc;AAAA,MAC7D;AAAA,IACD;AACA,mDAAe,QAAQ,KAAK,MAAM,gBAAgB;AAClD,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA,MAAM,gBAAgB,OAAO;AAAA,MAC7B;AAAA,IACD;AAAA,EACD,OAAO;AACN,WAAO,gBAAgB,OAAO,QAAQ,KAAK,MAAM,gBAAgB,MAAM;AAAA,EACxE;AACA,SAAO,GAAG,oBAAoB,KAAK,IAAI;AACxC;;;AC3EA,SAAS,eAAAC,cAAa,YAAAC,WAAU,gBAAgB,YAAAN,iBAAgB;AAUzD,IAAM,mBAAmB,CAC/B,KACA,QACA,OACA,OACU;AACV,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,QAAe;AAAA,IACpB;AAAA,IACA,OAAO;AAAA,IACP,IAAI,OAAO;AAAA,IACX,SAAS,OAAO;AAAA,IAChB,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO;AAAA,IACf,iBAAiB;AAAA,IACjB,OAAO,IAAI,QAAQ,OAAO,KAAK;AAAA,IAC/B,qBAAqB,IAAI,IAAI,OAAO,mBAAmB;AAAA,IACvD,UAAU,IAAI,QAAQ,OAAO,QAAQ;AAAA,IACrC,WAAW,EAAE,MAAM,MAAM;AAAA,IACzB,mBAAmB,IAAI,QAAQ,OAAO,iBAAiB;AAAA,IACvD,WAAW,IAAI,QAAQ,OAAO,SAAS;AAAA,IACvC,eAAe,IAAI,SAAS,OAAO,cAAc,OAAO,CAAC;AAAA,IACzD,UAAU,oBAAI,IAAI;AAAA,IAClB,cAAc,IAAI,QAAQ,OAAO,YAAY;AAAA,IAC7C,eAAe,IAAI,SAAS,OAAO,cAAc,OAAO,CAAC;AAAA,IACzD,eAAe,IAAI,SAAS,OAAO,cAAc,OAAO,GAAG;AAAA,MAC1D,gBAAgB,IAAI,SAAS,KAAK,KAAK,EAAE,KAAK,GAAG;AAAA,IAClD,CAAC;AAAA,IACD,WAAW,IAAI,QAAQ,OAAO,SAAS;AAAA,IACvC,UAAU,IAAI,QAAQ,OAAO,QAAQ;AAAA,EACtC;AACA,QAAM,kBAAkB;AAAA,IACvB,OAAO;AAAA,IACP,MAAM,KAAK,IAAI;AAAA,IACf,QAAQ;AAAA,MACP;AAAA,MACA,IAAI,kBAAM,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC;AAAA,MAC5C,SAAS,CAAC;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACT;AAAA,IACA,aAAa;AAAA,MACZ,KAAK,CAAC,UAAUM,UAAS,OAAO,KAAK;AAAA,MACrC,KAAK,CAAC,OAAO,UAAUN,UAAS,OAAO,OAAO,KAAK;AAAA,MACnD,KAAK,CAAC,UAAU,eAAe,OAAO,KAAK;AAAA,MAC3C,MAAO,CAAC,OAAOO,SAAQF,aAAY,OAAOE,MAAK,KAAK;AAAA,MACpD,KAAK,MAAM,mBAAmB,KAAK;AAAA,IACpC;AAAA,EACD;AACA,SAAO,QAAQ;AACf,QAAM,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;;;AC5CO,SAAS,kBACf,SACA,OACsB;AACtB,QAAM,iBAAiC;AAAA,IACtC,KAAK,QAAQ;AAAA,IACb,MAAM;AAAA,IACN,KAAK,CAAC,QAAuB,OAAgB;AAC5C,uBAAiB,QAAQ,KAAK,QAAQ,OAAO,EAAE;AAC/C,UAAI;AACH,cAAMZ,UAAS,OAAO,KAAK;AAE3B,cAAM,EAAE,YAAY,IAAIA,QAAO;AAC/B,cAAM,SAAS,QAAQ,GAAG,aAAa,GAAG,MAAM;AAChD,yBAAiB,QAAQA,OAAM;AAC/B,eAAO;AAAA,MACR,SAAS,QAAQ;AAChB,yBAAiB,MAAM;AACvB,cAAM,OAAO,KAAK,aAAM,eAAe,QAAQ,KAAK,WAAW,MAAM;AACrE,cAAM;AAAA,MACP;AAAA,IACD;AAAA,IACA,SAAS,CAACG,WAAU,kBAAkB,SAASA,MAAK;AAAA,IACpD,SAAS,IAAI,QAAQ;AAAA,EACtB;AACA,QAAM,SAAS,OAAO,KAAK;AAC3B,SAAO,aAAa,IAAI,eAAe,KAAK,cAAc;AAC1D,QAAM,QAAQ,QAAQ,cAAc;AACpC,QAAM,GAAG,oBAAoB,KAAK,KAAK;AACvC,SAAO;AACR;;;AC9CO,IAAM,qBAAqB,CAAC,QAAQ,YAAY,UAAU","sourcesContent":["import type {\n\tFamilyMetadata,\n\tMutableAtomOptions,\n\tMutableAtomToken,\n} from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { selectJson } from \"atom.io/json\"\n\nimport { createRegularAtom } from \"../atom\"\nimport { newest } from \"../lineage\"\nimport type { Store } from \"../store\"\nimport { subscribeToState } from \"../subscribe\"\nimport { Tracker } from \"./tracker\"\nimport type { Transceiver } from \"./transceiver\"\n\nexport function createMutableAtom<\n\tCore extends Transceiver<any>,\n\tSerializableCore extends Json.Serializable,\n>(\n\toptions: MutableAtomOptions<Core, SerializableCore>,\n\tfamily: FamilyMetadata | undefined,\n\tstore: Store,\n): MutableAtomToken<Core, SerializableCore> {\n\tstore.logger.info(\n\t\t`🔧`,\n\t\t`atom`,\n\t\toptions.key,\n\t\t`creating in store \"${store.config.name}\"`,\n\t)\n\tconst coreState = createRegularAtom<Core>(options, family, store)\n\tnew Tracker(coreState, store)\n\tconst jsonState = selectJson(coreState, options, store)\n\tconst target = newest(store)\n\tsubscribeToState(\n\t\tjsonState,\n\t\t() => {\n\t\t\tconst trackerHasBeenInitialized = newest(store).trackers.has(coreState.key)\n\t\t\tif (!trackerHasBeenInitialized) {\n\t\t\t\tnew Tracker(coreState, store)\n\t\t\t}\n\t\t},\n\t\t`tracker-initializer:${store?.config.name}:${\n\t\t\ttarget.transactionMeta === null\n\t\t\t\t? `main`\n\t\t\t\t: `${target.transactionMeta.update.key}`\n\t\t}`,\n\t\tstore,\n\t)\n\treturn coreState as MutableAtomToken<Core, SerializableCore>\n}\n","export interface Lineage {\n\tparent: typeof this | null\n\tchild: typeof this | null\n}\n\nexport function newest<T extends Lineage>(scion: T): T {\n\twhile (scion.child !== null) {\n\t\tscion = scion.child\n\t}\n\treturn scion\n}\n\nexport function eldest<T extends Lineage>(scion: T): T {\n\twhile (scion.parent !== null) {\n\t\tscion = scion.parent\n\t}\n\treturn scion\n}\n","/**\n * A Promise that can be canceled.\n * @internal\n * @private\n * @typeParam T The type of the value that the promise will resolve to.\n *\n * @remarks\n * Can be constructed like a Promise, or from an existing Promise.\n */\nexport class Future<T> extends Promise<T> {\n\tpublic isCanceled = false\n\n\tpublic constructor(\n\t\texecutor:\n\t\t\t| Promise<T>\n\t\t\t| ((resolve: (value: T) => void, reject: (reason?: any) => void) => void),\n\t) {\n\t\tsuper((resolve, reject) => {\n\t\t\tconst pass = (value: T) =>\n\t\t\t\tthis.isCanceled ? reject(`canceled`) : resolve(value)\n\t\t\tconst fail = (reason: any) =>\n\t\t\t\tthis.isCanceled ? reject(`canceled`) : reject(reason)\n\t\t\tif (typeof executor === `function`) {\n\t\t\t\texecutor(pass, fail)\n\t\t\t} else {\n\t\t\t\texecutor.then(pass, fail)\n\t\t\t}\n\t\t})\n\t}\n\n\tpublic cancel(): void {\n\t\tthis.isCanceled = true\n\t}\n}\n","import type { JsonInterface } from \"atom.io/json\"\n\nimport type { Atom } from \"../atom\"\nimport { Tracker } from \"../mutable\"\nimport type { Store } from \"../store\"\n\nexport function copyMutableIfNeeded<T>(\n\tatom: Atom<T>,\n\ttransform: JsonInterface<T>,\n\torigin: Store,\n\ttarget: Store,\n): T {\n\tconst originValue = origin.valueMap.get(atom.key)\n\tconst targetValue = target.valueMap.get(atom.key)\n\tif (originValue === targetValue) {\n\t\torigin.logger.info(`📃`, `atom`, `${atom.key}`, `copying`)\n\t\tconst jsonValue = transform.toJson(originValue)\n\t\tconst copiedValue = transform.fromJson(jsonValue)\n\t\ttarget.valueMap.set(atom.key, copiedValue)\n\t\tnew Tracker(atom, origin)\n\t\treturn copiedValue\n\t}\n\treturn targetValue\n}\n","import type { AtomFamily } from \"atom.io\"\nimport type { Json, JsonInterface } from \"atom.io/json\"\nimport { newest } from \"..\"\nimport type { Store } from \"..\"\nimport type { Atom } from \"../atom\"\nimport { copyMutableIfNeeded } from \"./copy-mutable-if-needed\"\n\nexport function copyMutableIfWithinTransaction<T>(\n\toldValue: T,\n\tatom: Atom<T> | (Atom<T> & JsonInterface<T, Json.Serializable>),\n\tstore: Store,\n): T {\n\tconst target = newest(store)\n\tconst parent = target.parent\n\tif (parent !== null) {\n\t\tif (`family` in atom) {\n\t\t\tconst family = parent.families.get(atom.family.key)\n\t\t\tif (family && family.type === `atom_family`) {\n\t\t\t\tconst result = copyMutableFamilyMemberWithinTransaction<T>(\n\t\t\t\t\tatom,\n\t\t\t\t\tfamily,\n\t\t\t\t\tparent,\n\t\t\t\t\ttarget,\n\t\t\t\t)\n\t\t\t\tif (result) {\n\t\t\t\t\treturn result\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (`toJson` in atom && `fromJson` in atom) {\n\t\t\tconst copiedValue = copyMutableIfNeeded(atom, atom, parent, target)\n\t\t\treturn copiedValue\n\t\t}\n\t}\n\treturn oldValue\n}\n\nexport function copyMutableFamilyMemberWithinTransaction<T>(\n\tatom: Atom<T>,\n\tfamily:\n\t\t| AtomFamily<T, any>\n\t\t| (AtomFamily<T, any> & JsonInterface<T, Json.Serializable>),\n\torigin: Store,\n\ttarget: Store,\n): T | null {\n\tif (`toJson` in family && `fromJson` in family) {\n\t\tconst copyCreated = copyMutableIfNeeded(atom, family, origin, target)\n\t\treturn copyCreated\n\t}\n\treturn null\n}\n","import type { ReadableToken, StateUpdate } from \"atom.io\"\nimport type { StateNode } from \".\"\nimport { Future } from \"./future\"\nimport { copyMutableIfWithinTransaction } from \"./set-state/copy-mutable-in-transaction\"\nimport type { Store } from \"./store\"\nimport type { Subject } from \"./subject\"\n\nexport function cacheValue<T>(\n\tkey: string,\n\tvalue: T,\n\tsubject: Subject<StateUpdate<unknown>>,\n\tstore: Store,\n): T\nexport function cacheValue<T extends Promise<any>>(\n\tkey: string,\n\tvalue: T,\n\tsubject: Subject<StateUpdate<unknown>>,\n\tstore: Store,\n): Future<T>\nexport function cacheValue<T>(\n\tkey: string,\n\tvalue: T,\n\tsubject: Subject<StateUpdate<unknown>>,\n\ttarget: Store,\n): Future<T> | T {\n\tconst currentValue = target.valueMap.get(key)\n\tif (currentValue instanceof Future) {\n\t\tcurrentValue.cancel()\n\t}\n\tif (value instanceof Promise) {\n\t\tconst future = new Future<T>(value)\n\t\ttarget.valueMap.set(key, future)\n\t\tfuture\n\t\t\t.then((resolved) => {\n\t\t\t\tif (future.isCanceled) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tcacheValue(key, resolved, subject, target)\n\t\t\t\tsubject.next({ newValue: resolved, oldValue: future })\n\t\t\t})\n\t\t\t.catch((thrown) => {\n\t\t\t\tif (thrown !== `canceled`) {\n\t\t\t\t\ttarget.logger.error(`💥`, `state`, key, `rejected:`, thrown)\n\t\t\t\t}\n\t\t\t})\n\t\treturn future\n\t}\n\ttarget.valueMap.set(key, value)\n\treturn value\n}\n\nexport const readCachedValue = <T>(token: StateNode<any>, target: Store): T => {\n\tlet value = target.valueMap.get(token.key) as T\n\tif (token.type === `atom`) {\n\t\tvalue = copyMutableIfWithinTransaction(value, token, target)\n\t}\n\treturn value\n}\n\nexport const evictCachedValue = (key: string, target: Store): void => {\n\tconst currentValue = target.valueMap.get(key)\n\tif (currentValue instanceof Future) {\n\t\tcurrentValue.cancel()\n\t}\n\tif (target.operation.open) {\n\t\ttarget.operation.prev.set(key, currentValue)\n\t}\n\ttarget.valueMap.delete(key)\n\ttarget.logger.info(`🗑`, `state`, key, `evicted`)\n}\n","import type { StateNode } from \".\"\nimport { readCachedValue } from \"./caching\"\nimport type { Store } from \"./store\"\n\nexport const readOrComputeValue = <T>(state: StateNode<T>, target: Store): T => {\n\tif (target.valueMap.has(state.key)) {\n\t\ttarget.logger.info(`📖`, state.type, state.key, `reading cached value`)\n\t\treturn readCachedValue(state, target)\n\t}\n\tif (state.type !== `atom`) {\n\t\ttarget.logger.info(`🧮`, state.type, state.key, `computing value`)\n\t\treturn state.get()\n\t}\n\tconst fallback =\n\t\tstate.default instanceof Function ? state.default() : state.default\n\ttarget.logger.info(\n\t\t`💁`,\n\t\t`atom`,\n\t\tstate.key,\n\t\t`could not find cached value; using default`,\n\t\tfallback,\n\t)\n\treturn state.default instanceof Function ? state.default() : state.default\n}\n","import type { WritableToken } from \"atom.io\"\n\nimport { newest } from \"./lineage\"\nimport type { Store } from \"./store\"\n\nexport type OperationProgress =\n\t| {\n\t\t\topen: false\n\t }\n\t| {\n\t\t\topen: true\n\t\t\tdone: Set<string>\n\t\t\tprev: Map<string, any>\n\t\t\ttime: number\n\t\t\ttoken: WritableToken<any>\n\t }\n\nexport const openOperation = (\n\ttoken: WritableToken<any>,\n\tstore: Store,\n): `rejection` | undefined => {\n\tif (store.operation.open) {\n\t\tstore.logger.error(\n\t\t\t`❌`,\n\t\t\ttoken.type,\n\t\t\ttoken.key,\n\t\t\t`failed to setState during a setState for \"${store.operation.token.key}\"`,\n\t\t)\n\t\treturn `rejection`\n\t}\n\tstore.operation = {\n\t\topen: true,\n\t\tdone: new Set(),\n\t\tprev: new Map(),\n\t\ttime: Date.now(),\n\t\ttoken,\n\t}\n\tstore.logger.info(\n\t\t`⭕`,\n\t\ttoken.type,\n\t\ttoken.key,\n\t\t`operation start in store \"${store.config.name}\"${\n\t\t\tstore.transactionMeta === null\n\t\t\t\t? ``\n\t\t\t\t: ` ${store.transactionMeta.phase} \"${store.transactionMeta.update.key}\"`\n\t\t}`,\n\t)\n}\nexport const closeOperation = (store: Store): void => {\n\tif (store.operation.open) {\n\t\tstore.logger.info(\n\t\t\t`🔴`,\n\t\t\tstore.operation.token.type,\n\t\t\tstore.operation.token.key,\n\t\t\t`operation done in store \"${store.config.name}\"`,\n\t\t)\n\t}\n\tstore.operation = { open: false }\n\tstore.on.operationClose.next(store.operation)\n}\n\nexport const isDone = (key: string, store: Store): boolean => {\n\tif (!store.operation.open) {\n\t\tstore.logger.warn(\n\t\t\t`🐞`,\n\t\t\t`unknown`,\n\t\t\tkey,\n\t\t\t`isDone called outside of an operation. This is probably a bug.`,\n\t\t)\n\t\treturn true\n\t}\n\treturn store.operation.done.has(key)\n}\nexport const markDone = (key: string, store: Store): void => {\n\tif (!store.operation.open) {\n\t\tstore.logger.warn(\n\t\t\t`🐞`,\n\t\t\t`unknown`,\n\t\t\tkey,\n\t\t\t`markDone called outside of an operation. This is probably a bug.`,\n\t\t)\n\t\treturn\n\t}\n\tstore.operation.done.add(key)\n}\n","export type Modify<T> = (thing: T) => T\n\nexport const become =\n\t<T>(nextVersionOfThing: Modify<T> | T) =>\n\t(originalThing: T): T =>\n\t\tnextVersionOfThing instanceof Function\n\t\t\t? nextVersionOfThing(\n\t\t\t\t\toriginalThing instanceof Function ? originalThing() : originalThing,\n\t\t\t )\n\t\t\t: nextVersionOfThing\n","export class Subject<T> {\n\tpublic Subscriber: (value: T) => void\n\n\tpublic subscribers: Map<string, this[`Subscriber`]> = new Map()\n\n\tpublic subscribe(key: string, subscriber: this[`Subscriber`]): () => void {\n\t\tthis.subscribers.set(key, subscriber)\n\t\tconst unsubscribe = () => this.unsubscribe(key)\n\t\treturn unsubscribe\n\t}\n\n\tprivate unsubscribe(key: string) {\n\t\tthis.subscribers.delete(key)\n\t}\n\n\tpublic next(value: T): void {\n\t\tconst subscribers = this.subscribers.values()\n\t\tfor (const subscriber of subscribers) {\n\t\t\tsubscriber(value)\n\t\t}\n\t}\n}\n\nexport class StatefulSubject<T> extends Subject<T> {\n\tpublic state: T\n\n\tpublic constructor(initialState: T) {\n\t\tsuper()\n\t\tthis.state = initialState\n\t}\n\n\tpublic next(value: T): void {\n\t\tthis.state = value\n\t\tsuper.next(value)\n\t}\n}\n","import type { Transactors, findState } from \"atom.io\"\nimport { findInStore } from \"atom.io\"\n\nimport { newest } from \"../lineage\"\nimport { readOrComputeValue } from \"../read-or-compute-value\"\nimport { setAtomOrSelector } from \"../set-state\"\nimport type { Store } from \"../store\"\nimport { withdraw } from \"../store\"\nimport { updateSelectorAtoms } from \"./update-selector-atoms\"\n\nexport const registerSelector = (\n\tselectorKey: string,\n\tstore: Store,\n): Transactors => ({\n\tget: (dependency) => {\n\t\tconst target = newest(store)\n\n\t\tconst dependencyState = withdraw(dependency, store)\n\t\tif (dependencyState === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`State \"${dependency.key}\" not found in this store. Did you forget to initialize with the \"atom\" or \"selector\" function?`,\n\t\t\t)\n\t\t}\n\t\tconst dependencyValue = readOrComputeValue(dependencyState, store)\n\n\t\tstore.logger.info(\n\t\t\t`🔌`,\n\t\t\t`selector`,\n\t\t\tselectorKey,\n\t\t\t`registers dependency ( \"${dependency.key}\" =`,\n\t\t\tdependencyValue,\n\t\t\t`)`,\n\t\t)\n\n\t\ttarget.selectorGraph.set(\n\t\t\t{\n\t\t\t\tupstreamSelectorKey: dependency.key,\n\t\t\t\tdownstreamSelectorKey: selectorKey,\n\t\t\t},\n\t\t\t{\n\t\t\t\tsource: dependency.key,\n\t\t\t},\n\t\t)\n\t\tupdateSelectorAtoms(selectorKey, dependency, store)\n\t\treturn dependencyValue\n\t},\n\tset: (WritableToken, newValue) => {\n\t\tconst state = withdraw(WritableToken, store)\n\t\tif (state === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`State \"${WritableToken.key}\" not found in this store. Did you forget to initialize with the \"atom\" or \"selector\" function?`,\n\t\t\t)\n\t\t}\n\t\tsetAtomOrSelector(state, newValue, store)\n\t},\n\tfind: ((token, key) => findInStore(token, key, store)) as typeof findState,\n})\n","import type { StateUpdate } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\n\nimport type { Atom } from \"../atom\"\nimport type { ReadonlySelector, Selector } from \"../selector\"\n\nexport const emitUpdate = <T>(\n\tstate: Atom<T> | ReadonlySelector<T> | Selector<T>,\n\tupdate: StateUpdate<T>,\n\tstore: Store,\n): void => {\n\tstore.logger.info(\n\t\t`📢`,\n\t\tstate.type,\n\t\tstate.key,\n\t\t`went (`,\n\t\tupdate.oldValue,\n\t\t`->`,\n\t\tupdate.newValue,\n\t\t`) subscribers:`,\n\t\tstate.subject.subscribers,\n\t)\n\tstate.subject.next(update)\n}\n","import type { Atom } from \"../atom\"\nimport { evictCachedValue } from \"../caching\"\nimport { isDone, markDone } from \"../operation\"\nimport type { Store } from \"../store\"\n\nexport const evictDownStream = <T>(atom: Atom<T>, store: Store): void => {\n\tconst downstreamKeys = store.selectorAtoms.getRelatedKeys(atom.key)\n\tstore.logger.info(\n\t\t`🧹`,\n\t\tatom.type,\n\t\tatom.key,\n\t\tdownstreamKeys\n\t\t\t? `evicting ${downstreamKeys.size} states downstream:`\n\t\t\t: `no downstream states`,\n\t\tdownstreamKeys ?? `to evict`,\n\t)\n\tif (downstreamKeys) {\n\t\tif (store.operation.open) {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧹`,\n\t\t\t\tatom.type,\n\t\t\t\tatom.key,\n\t\t\t\t`[ ${[...store.operation.done].join(`, `)} ] already done`,\n\t\t\t)\n\t\t}\n\t\tfor (const key of downstreamKeys) {\n\t\t\tif (isDone(key, store)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tevictCachedValue(key, store)\n\t\t\tmarkDone(key, store)\n\t\t}\n\t}\n}\n","import type { KeyedStateUpdate, StateUpdate } from \"atom.io\"\n\nimport type { Atom } from \"../atom\"\nimport { newest } from \"../lineage\"\nimport { isTransceiver } from \"../mutable\"\nimport type { Store } from \"../store\"\n\nfunction shouldUpdateBeStowed(key: string, update: StateUpdate<any>): boolean {\n\t// do not stow updates that aren't json\n\tif (isTransceiver(update.newValue)) {\n\t\treturn false\n\t}\n\t// do not stow updates where the key contains 👁🗨\n\tif (key.includes(`👁🗨`)) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nexport const stowUpdate = <T>(\n\tstate: Atom<T>,\n\tupdate: StateUpdate<T>,\n\tstore: Store,\n): void => {\n\tconst { key } = state\n\tconst target = newest(store)\n\tif (\n\t\ttarget.transactionMeta === null ||\n\t\ttarget.transactionMeta.phase !== `building`\n\t) {\n\t\tstore.logger.error(\n\t\t\t`🐞`,\n\t\t\t`atom`,\n\t\t\tkey,\n\t\t\t`stowUpdate called outside of a transaction. This is probably a bug.`,\n\t\t)\n\t\treturn\n\t}\n\tconst shouldStow = shouldUpdateBeStowed(key, update)\n\tif (!shouldStow) {\n\t\treturn\n\t}\n\tconst atomUpdate: KeyedStateUpdate<T> = { key, ...update }\n\tif (state.family) {\n\t\tatomUpdate.family = state.family\n\t}\n\ttarget.transactionMeta.update.updates.push(atomUpdate)\n\tstore.logger.info(\n\t\t`📁`,\n\t\t`atom`,\n\t\tkey,\n\t\t`stowed (`,\n\t\tupdate.oldValue,\n\t\t`->`,\n\t\tupdate.newValue,\n\t\t`)`,\n\t)\n}\n","import type { Atom } from \"../atom\"\nimport { isAtomDefault, markAtomAsNotDefault } from \"../atom\"\nimport { cacheValue } from \"../caching\"\nimport { markDone } from \"../operation\"\nimport { readOrComputeValue } from \"../read-or-compute-value\"\nimport type { Store } from \"../store\"\nimport { become } from \"./become\"\nimport { copyMutableIfWithinTransaction } from \"./copy-mutable-in-transaction\"\nimport { emitUpdate } from \"./emit-update\"\nimport { evictDownStream } from \"./evict-downstream\"\nimport { stowUpdate } from \"./stow-update\"\n\nexport const setAtom = <T>(\n\tatom: Atom<T>,\n\tnext: T | ((oldValue: T) => T),\n\ttarget: Store,\n): void => {\n\tconst oldValue = readOrComputeValue(atom, target)\n\tlet newValue = copyMutableIfWithinTransaction(oldValue, atom, target)\n\tnewValue = become(next)(newValue)\n\ttarget.logger.info(`📝`, `atom`, atom.key, `set to`, newValue)\n\tnewValue = cacheValue(atom.key, newValue, atom.subject, target)\n\tif (isAtomDefault(atom.key, target)) {\n\t\tmarkAtomAsNotDefault(atom.key, target)\n\t}\n\tmarkDone(atom.key, target)\n\tevictDownStream(atom, target)\n\tconst update = { oldValue, newValue }\n\tif (target.transactionMeta === null) {\n\t\temitUpdate(atom, update, target)\n\t} else if (target.transactionMeta.phase === `applying` && target.parent) {\n\t\temitUpdate(atom, update, target.parent)\n\t} else {\n\t\tstowUpdate(atom, update, target)\n\t}\n}\n","import type { Atom } from \"../atom\"\nimport type { Selector } from \"../selector\"\nimport type { Store } from \"../store\"\nimport { setAtom } from \"./set-atom\"\n\nexport const setAtomOrSelector = <T>(\n\tstate: Atom<T> | Selector<T>,\n\tvalue: T | ((oldValue: T) => T),\n\tstore: Store,\n): void => {\n\tswitch (state.type) {\n\t\tcase `atom`:\n\t\t\tsetAtom(state, value, store)\n\t\t\tbreak\n\t\tcase `selector`:\n\t\t\tstate.set(value)\n\t\t\tbreak\n\t}\n}\n","import type {\n\tAtomToken,\n\tReadableToken,\n\tReadonlySelectorToken,\n\tSelectorToken,\n\tTransactionToken,\n\tWritableToken,\n\tƒn,\n} from \"atom.io\"\n\nimport type { StateNode } from \"..\"\nimport type { Atom } from \"../atom\"\nimport type { ReadonlySelector, Selector } from \"../selector\"\nimport type { Transaction } from \"../transaction\"\n\nexport function deposit<T>(state: Atom<T>): AtomToken<T>\nexport function deposit<T>(state: Selector<T>): SelectorToken<T>\nexport function deposit<T>(state: Atom<T> | Selector<T>): WritableToken<T>\nexport function deposit<T>(state: ReadonlySelector<T>): ReadonlySelectorToken<T>\nexport function deposit<T>(\n\tstate: Transaction<T extends ƒn ? T : never>,\n): TransactionToken<T>\nexport function deposit<T>(state: StateNode<T>): ReadableToken<T>\nexport function deposit<T>(\n\tstate:\n\t\t| Atom<T>\n\t\t| ReadonlySelector<T>\n\t\t| Selector<T>\n\t\t| Transaction<T extends ƒn ? T : never>,\n):\n\t| AtomToken<T>\n\t| ReadonlySelectorToken<T>\n\t| SelectorToken<T>\n\t| TransactionToken<T> {\n\tconst token = {\n\t\tkey: state.key,\n\t\ttype: state.type,\n\t} as any\n\tif (`family` in state) {\n\t\ttoken.family = state.family\n\t}\n\treturn token\n}\n","import { AtomIOLogger } from \"atom.io\"\nimport type {\n\tAtomFamily,\n\tAtomToken,\n\tLogger,\n\tReadonlySelectorFamily,\n\tReadonlySelectorToken,\n\tSelectorFamily,\n\tSelectorToken,\n\tTimelineToken,\n\tTransactionToken,\n\tƒn,\n} from \"atom.io\"\n\nimport { Junction } from \"~/packages/rel8/junction/src\"\n\nimport type { Atom } from \"../atom\"\nimport type { Lineage } from \"../lineage\"\nimport {\n\ttype MutableAtom,\n\ttype Tracker,\n\ttype Transceiver,\n\tgetJsonToken,\n\tgetUpdateToken,\n} from \"../mutable\"\nimport type { OperationProgress } from \"../operation\"\nimport type { ReadonlySelector, Selector } from \"../selector\"\nimport { StatefulSubject, Subject } from \"../subject\"\nimport type { Timeline } from \"../timeline\"\nimport type { Transaction, TransactionMeta } from \"../transaction\"\n\nexport class Store implements Lineage {\n\tpublic parent: Store | null = null\n\tpublic child: Store | null = null\n\n\tpublic valueMap = new Map<string, any>()\n\n\tpublic atoms = new Map<string, Atom<any> | MutableAtom<any>>()\n\tpublic selectors = new Map<string, Selector<any>>()\n\tpublic readonlySelectors = new Map<string, ReadonlySelector<any>>()\n\n\tpublic trackers = new Map<string, Tracker<Transceiver<any>>>()\n\tpublic families = new Map<\n\t\tstring,\n\t\t| AtomFamily<any, any>\n\t\t| ReadonlySelectorFamily<any, any>\n\t\t| SelectorFamily<any, any>\n\t>()\n\n\tpublic timelines = new Map<string, Timeline<any>>()\n\tpublic transactions = new Map<string, Transaction<ƒn>>()\n\n\tpublic atomsThatAreDefault = new Set<string>()\n\n\tpublic timelineAtoms = new Junction({\n\t\tbetween: [`timelineKey`, `atomKey`],\n\t\tcardinality: `1:n`,\n\t})\n\tpublic selectorAtoms = new Junction({\n\t\tbetween: [`selectorKey`, `atomKey`],\n\t\tcardinality: `n:n`,\n\t})\n\tpublic selectorGraph = new Junction<\n\t\t`upstreamSelectorKey`,\n\t\t`downstreamSelectorKey`,\n\t\t{ source: string }\n\t>(\n\t\t{\n\t\t\tbetween: [`upstreamSelectorKey`, `downstreamSelectorKey`],\n\t\t\tcardinality: `n:n`,\n\t\t},\n\t\t{\n\t\t\tmakeContentKey: (...keys) => keys.sort().join(`:`),\n\t\t},\n\t)\n\n\tpublic on = {\n\t\tatomCreation: new Subject<AtomToken<unknown>>(),\n\t\tselectorCreation: new Subject<\n\t\t\tReadonlySelectorToken<unknown> | SelectorToken<unknown>\n\t\t>(),\n\t\ttransactionCreation: new Subject<TransactionToken<ƒn>>(),\n\t\ttimelineCreation: new Subject<TimelineToken<unknown>>(),\n\t\ttransactionApplying: new StatefulSubject<TransactionMeta<ƒn> | null>(null),\n\t\toperationClose: new Subject<OperationProgress>(),\n\t}\n\tpublic operation: OperationProgress = { open: false }\n\tpublic transactionMeta: TransactionMeta<ƒn> | null = null\n\n\tpublic config: {\n\t\tname: string\n\t} = {\n\t\tname: `IMPLICIT_STORE`,\n\t}\n\n\tpublic loggers: AtomIOLogger[] = [\n\t\tnew AtomIOLogger(`warn`, (_, __, key) => !key.includes(`👁🗨`)),\n\t]\n\tpublic logger: Logger = {\n\t\terror: (...messages) => {\n\t\t\tfor (const logger of this.loggers) logger.error(...messages)\n\t\t},\n\t\tinfo: (...messages) => {\n\t\t\tfor (const logger of this.loggers) logger.info(...messages)\n\t\t},\n\t\twarn: (...messages) => {\n\t\t\tfor (const logger of this.loggers) logger.warn(...messages)\n\t\t},\n\t}\n\n\tpublic constructor(name: string, store: Store | null = null) {\n\t\tif (store !== null) {\n\t\t\tthis.valueMap = new Map(store?.valueMap)\n\t\t\tthis.operation = { ...store?.operation }\n\t\t\tthis.transactionMeta = store?.transactionMeta\n\t\t\t\t? { ...store?.transactionMeta }\n\t\t\t\t: null\n\t\t\tthis.config = {\n\t\t\t\t...store?.config,\n\t\t\t\tname,\n\t\t\t}\n\t\t\tfor (const [, family] of store.families) {\n\t\t\t\tfamily.install(this)\n\t\t\t}\n\t\t\tconst mutableHelpers = new Set<string>()\n\t\t\tfor (const [, atom] of store.atoms) {\n\t\t\t\tif (mutableHelpers.has(atom.key)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tatom.install(this)\n\t\t\t\tif (`mutable` in atom) {\n\t\t\t\t\tconst originalJsonToken = getJsonToken(atom)\n\t\t\t\t\tconst originalUpdateToken = getUpdateToken(atom)\n\t\t\t\t\tmutableHelpers.add(originalJsonToken.key)\n\t\t\t\t\tmutableHelpers.add(originalUpdateToken.key)\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const [, selector] of store.readonlySelectors) {\n\t\t\t\tselector.install(this)\n\t\t\t}\n\t\t\tfor (const [, selector] of store.selectors) {\n\t\t\t\tif (mutableHelpers.has(selector.key)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tselector.install(this)\n\t\t\t}\n\t\t\tfor (const [, tx] of store.transactions) {\n\t\t\t\ttx.install(this)\n\t\t\t}\n\t\t\tfor (const [, timeline] of store.timelines) {\n\t\t\t\ttimeline.install(this)\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport const IMPLICIT = {\n\tSTORE_INTERNAL: undefined as Store | undefined,\n\tget STORE(): Store {\n\t\treturn (\n\t\t\tthis.STORE_INTERNAL ?? (this.STORE_INTERNAL = new Store(`IMPLICIT_STORE`))\n\t\t)\n\t},\n}\n\nexport const clearStore = (store: Store): void => {\n\tconst { config } = store\n\tObject.assign(store, new Store(config.name))\n\tstore.config = config\n}\n","import type {\n\tAtomToken,\n\tReadableToken,\n\tReadonlySelectorToken,\n\tSelectorToken,\n\tTimelineManageable,\n\tTimelineToken,\n\tTransactionToken,\n\tWritableToken,\n\tƒn,\n} from \"atom.io\"\n\nimport type { StateNode } from \"..\"\nimport type { Atom } from \"../atom\"\nimport type { ReadonlySelector, Selector } from \"../selector\"\nimport type { Timeline } from \"../timeline\"\nimport type { Transaction } from \"../transaction\"\nimport type { Store } from \"./store\"\n\ntype Withdrawable<T> =\n\t| Atom<T>\n\t| ReadonlySelector<T>\n\t| Selector<T>\n\t| Timeline<T extends TimelineManageable ? T : never>\n\t| Transaction<T extends ƒn ? T : never>\n\nexport function withdraw<T>(\n\ttoken: AtomToken<T>,\n\tstore: Store,\n): Atom<T> | undefined\nexport function withdraw<T>(\n\ttoken: SelectorToken<T>,\n\tstore: Store,\n): Selector<T> | undefined\nexport function withdraw<T>(\n\ttoken: WritableToken<T>,\n\tstore: Store,\n): Atom<T> | Selector<T> | undefined\nexport function withdraw<T>(\n\ttoken: ReadonlySelectorToken<T>,\n\tstore: Store,\n): ReadonlySelector<T> | undefined\nexport function withdraw<T>(\n\ttoken: TransactionToken<T>,\n\tstore: Store,\n): Transaction<T extends ƒn ? T : never> | undefined\nexport function withdraw<T>(\n\ttoken: ReadableToken<T>,\n\tstore: Store,\n): StateNode<T> | undefined\nexport function withdraw<T>(\n\ttoken: TimelineToken<T>,\n\tstore: Store,\n): Timeline<T extends TimelineManageable ? T : never> | undefined\nexport function withdraw<T>(\n\ttoken: ReadableToken<T> | TimelineToken<T> | TransactionToken<T>,\n\tstore: Store,\n): Withdrawable<T> | undefined {\n\tlet withdrawn: Withdrawable<T> | undefined\n\tlet target: Store | null = store\n\twhile (target !== null) {\n\t\tswitch (token.type) {\n\t\t\tcase `atom`:\n\t\t\t\twithdrawn = target.atoms.get(token.key)\n\t\t\t\tbreak\n\t\t\tcase `selector`:\n\t\t\t\twithdrawn = target.selectors.get(token.key)\n\t\t\t\tbreak\n\t\t\tcase `readonly_selector`:\n\t\t\t\twithdrawn = target.readonlySelectors.get(token.key)\n\t\t\t\tbreak\n\t\t\tcase `timeline`:\n\t\t\t\twithdrawn = target.timelines.get(token.key)\n\t\t\t\tbreak\n\t\t\tcase `transaction`:\n\t\t\t\twithdrawn = target.transactions.get(token.key)\n\t\t\t\tbreak\n\t\t}\n\t\tif (withdrawn) {\n\t\t\treturn withdrawn\n\t\t}\n\t\ttarget = target.child\n\t}\n}\n","import type {\n\tAtomToken,\n\tReadableToken,\n\tReadonlySelectorToken,\n\tSelectorToken,\n\tWritableToken,\n} from \"atom.io\"\nimport type { Atom, ReadonlySelector, Selector, StateNode, Store } from \"..\"\nimport { newest, withdraw } from \"..\"\n\nexport function withdrawNewFamilyMember<T>(\n\ttoken: AtomToken<T>,\n\tstore: Store,\n): Atom<T> | undefined\nexport function withdrawNewFamilyMember<T>(\n\ttoken: SelectorToken<T>,\n\tstore: Store,\n): Selector<T> | undefined\nexport function withdrawNewFamilyMember<T>(\n\ttoken: ReadonlySelectorToken<T>,\n\tstore: Store,\n): ReadonlySelector<T> | undefined\nexport function withdrawNewFamilyMember<T>(\n\ttoken: WritableToken<T>,\n\tstore: Store,\n): Atom<T> | Selector<T> | undefined\nexport function withdrawNewFamilyMember<T>(\n\ttoken: ReadableToken<T>,\n\tstore: Store,\n): StateNode<T> | undefined\nexport function withdrawNewFamilyMember<T>(\n\ttoken: ReadableToken<T>,\n\tstore: Store,\n): StateNode<T> | undefined {\n\tif (token.family) {\n\t\tstore.logger.info(\n\t\t\t`👪`,\n\t\t\ttoken.type,\n\t\t\ttoken.key,\n\t\t\t`creating new family member in store \"${store.config.name}\"`,\n\t\t)\n\t\tconst target = newest(store)\n\t\tconst family = target.families.get(token.family.key)\n\t\tif (family) {\n\t\t\tconst jsonSubKey = JSON.parse(token.family.subKey)\n\t\t\tfamily(jsonSubKey)\n\t\t\tconst state = withdraw(token, store)\n\t\t\treturn state\n\t\t}\n\t}\n\treturn undefined\n}\n","import { newest } from \"./lineage\"\nimport type { Store } from \"./store\"\n\nexport type AtomKey<T> = string & { __atomKey?: never; __brand?: T }\nexport type SelectorKey<T> = string & { __selectorKey?: never; __brand?: T }\nexport type ReadonlySelectorKey<T> = string & {\n\t__readonlySelectorKey?: never\n\t__brand?: T\n}\n\nexport const isAtomKey = (key: string, store: Store): key is AtomKey<unknown> =>\n\tnewest(store).atoms.has(key)\nexport const isSelectorKey = (\n\tkey: string,\n\tstore: Store,\n): key is SelectorKey<unknown> => newest(store).selectors.has(key)\nexport const isReadonlySelectorKey = (\n\tkey: string,\n\tstore: Store,\n): key is ReadonlySelectorKey<unknown> =>\n\tnewest(store).readonlySelectors.has(key)\n\nexport type StateKey<T> = AtomKey<T> | ReadonlySelectorKey<T> | SelectorKey<T>\nexport const isStateKey = (\n\tkey: string,\n\tstore: Store,\n): key is StateKey<unknown> =>\n\tisAtomKey(key, store) ||\n\tisSelectorKey(key, store) ||\n\tisReadonlySelectorKey(key, store)\n","import type { AtomKey, ReadonlySelectorKey, SelectorKey } from \"../keys\"\nimport { isStateKey } from \"../keys\"\nimport { newest } from \"../lineage\"\nimport type { Store } from \"../store\"\n\nexport const getSelectorDependencyKeys = (\n\tkey: string,\n\tstore: Store,\n): (\n\t| AtomKey<unknown>\n\t| ReadonlySelectorKey<unknown>\n\t| SelectorKey<unknown>\n)[] => {\n\tconst sources = newest(store)\n\t\t.selectorGraph.getRelationEntries({ downstreamSelectorKey: key })\n\t\t.filter(([_, { source }]) => source !== key)\n\t\t.map(([_, { source }]) => source)\n\t\t.filter((source) => isStateKey(source, store))\n\treturn sources\n}\n","import type { Store } from \"..\"\nimport type { AtomKey, StateKey } from \"../keys\"\nimport { isAtomKey } from \"../keys\"\nimport { getSelectorDependencyKeys } from \"./get-selector-dependency-keys\"\n\nexport const traceSelectorAtoms = (\n\tselectorKey: string,\n\tdirectDependencyKey: StateKey<unknown>,\n\tstore: Store,\n): AtomKey<unknown>[] => {\n\tconst rootKeys: AtomKey<unknown>[] = []\n\n\tconst indirectDependencyKeys = getSelectorDependencyKeys(\n\t\tdirectDependencyKey,\n\t\tstore,\n\t)\n\tlet depth = 0\n\twhile (indirectDependencyKeys.length > 0) {\n\t\t// biome-ignore lint/style/noNonNullAssertion: just checked length ^^^\n\t\tconst indirectDependencyKey = indirectDependencyKeys.shift()!\n\t\t++depth\n\t\tif (depth > 99999) {\n\t\t\tthrow new Error(\n\t\t\t\t`Maximum selector dependency depth exceeded (> 99999) in selector \"${selectorKey}\". This is likely due to a circular dependency.`,\n\t\t\t)\n\t\t}\n\n\t\tif (!isAtomKey(indirectDependencyKey, store)) {\n\t\t\tindirectDependencyKeys.push(\n\t\t\t\t...getSelectorDependencyKeys(indirectDependencyKey, store),\n\t\t\t)\n\t\t} else if (!rootKeys.includes(indirectDependencyKey)) {\n\t\t\trootKeys.push(indirectDependencyKey)\n\t\t}\n\t}\n\n\treturn rootKeys\n}\n\nexport const traceAllSelectorAtoms = (\n\tselectorKey: string,\n\tstore: Store,\n): AtomKey<unknown>[] => {\n\tconst directDependencyKeys = getSelectorDependencyKeys(selectorKey, store)\n\treturn directDependencyKeys.flatMap((depKey) =>\n\t\tisAtomKey(depKey, store)\n\t\t\t? depKey\n\t\t\t: traceSelectorAtoms(selectorKey, depKey, store),\n\t)\n}\n","import type { ReadonlySelectorToken, WritableToken } from \"atom.io\"\n\nimport { newest } from \"../lineage\"\nimport type { Store } from \"../store\"\nimport { traceSelectorAtoms } from \"./trace-selector-atoms\"\n\nexport const updateSelectorAtoms = (\n\tselectorKey: string,\n\tdependency: ReadonlySelectorToken<unknown> | WritableToken<unknown>,\n\tstore: Store,\n): void => {\n\tconst target = newest(store)\n\tif (dependency.type === `atom`) {\n\t\ttarget.selectorAtoms.set({\n\t\t\tselectorKey,\n\t\t\tatomKey: dependency.key,\n\t\t})\n\t\tstore.logger.info(\n\t\t\t`🔍`,\n\t\t\t`selector`,\n\t\t\tselectorKey,\n\t\t\t`discovers root atom \"${dependency.key}\"`,\n\t\t)\n\t} else {\n\t\tconst rootKeys = traceSelectorAtoms(selectorKey, dependency.key, store)\n\t\tstore.logger.info(\n\t\t\t`🔍`,\n\t\t\t`selector`,\n\t\t\tselectorKey,\n\t\t\t`discovers root atoms: [ ${rootKeys\n\t\t\t\t.map((key) => `\"${key}\"`)\n\t\t\t\t.join(`, `)} ]`,\n\t\t)\n\t\tfor (const atomKey of rootKeys) {\n\t\t\ttarget.selectorAtoms = target.selectorAtoms.set({\n\t\t\t\tselectorKey,\n\t\t\t\tatomKey,\n\t\t\t})\n\t\t}\n\t}\n}\n","import type { FamilyMetadata, SelectorOptions, SelectorToken } from \"atom.io\"\n\nimport { cacheValue } from \"../caching\"\nimport { newest } from \"../lineage\"\nimport { markDone } from \"../operation\"\nimport { become } from \"../set-state/become\"\nimport type { Store } from \"../store\"\nimport { Subject } from \"../subject\"\nimport type { Selector } from \"./create-selector\"\nimport { createSelector } from \"./create-selector\"\nimport { registerSelector } from \"./register-selector\"\n\nexport const createReadWriteSelector = <T>(\n\toptions: SelectorOptions<T>,\n\tfamily: FamilyMetadata | undefined,\n\tstore: Store,\n): SelectorToken<T> => {\n\tconst target = newest(store)\n\tconst subject = new Subject<{ newValue: T; oldValue: T }>()\n\tconst transactors = registerSelector(options.key, store)\n\tconst { find, get } = transactors\n\tconst readonlyTransactors = { find, get }\n\n\tconst getSelf = () => {\n\t\tconst value = options.get(readonlyTransactors)\n\t\tcacheValue(options.key, value, subject, newest(store))\n\t\treturn value\n\t}\n\n\tconst setSelf = (next: T | ((oldValue: T) => T)): void => {\n\t\tconst oldValue = getSelf()\n\t\tconst newValue = become(next)(oldValue)\n\t\tstore.logger.info(\n\t\t\t`📝`,\n\t\t\t`selector`,\n\t\t\toptions.key,\n\t\t\t`set (`,\n\t\t\toldValue,\n\t\t\t`->`,\n\t\t\tnewValue,\n\t\t\t`)`,\n\t\t)\n\t\tcacheValue(options.key, newValue, subject, store)\n\t\tmarkDone(options.key, store)\n\t\tif (target.transactionMeta === null) {\n\t\t\tsubject.next({ newValue, oldValue })\n\t\t}\n\t\toptions.set(transactors, newValue)\n\t}\n\tconst mySelector: Selector<T> = {\n\t\t...options,\n\t\tsubject,\n\t\tinstall: (s: Store) => createSelector(options, family, s),\n\t\tget: getSelf,\n\t\tset: setSelf,\n\t\ttype: `selector`,\n\t\t...(family && { family }),\n\t}\n\ttarget.selectors.set(options.key, mySelector)\n\tconst initialValue = getSelf()\n\tstore.logger.info(`✨`, mySelector.type, mySelector.key, `=`, initialValue)\n\tconst token: SelectorToken<T> = {\n\t\tkey: options.key,\n\t\ttype: `selector`,\n\t}\n\tif (family) {\n\t\ttoken.family = family\n\t}\n\tstore.on.selectorCreation.next(token)\n\treturn token\n}\n","import type {\n\tFamilyMetadata,\n\tReadonlySelectorOptions,\n\tReadonlySelectorToken,\n} from \"atom.io\"\n\nimport { cacheValue } from \"../caching\"\nimport { newest } from \"../lineage\"\nimport type { Store } from \"../store\"\nimport { Subject } from \"../subject\"\nimport type { ReadonlySelector } from \"./create-selector\"\nimport { createSelector } from \"./create-selector\"\nimport { registerSelector } from \"./register-selector\"\n\nexport const createReadonlySelector = <T>(\n\toptions: ReadonlySelectorOptions<T>,\n\tfamily: FamilyMetadata | undefined,\n\tstore: Store,\n): ReadonlySelectorToken<T> => {\n\tconst target = newest(store)\n\tconst subject = new Subject<{ newValue: T; oldValue: T }>()\n\n\tconst { get, find } = registerSelector(options.key, store)\n\tconst getSelf = () => {\n\t\tconst value = options.get({ get, find })\n\t\tcacheValue(options.key, value, subject, store)\n\t\treturn value\n\t}\n\n\tconst readonlySelector: ReadonlySelector<T> = {\n\t\t...options,\n\t\tsubject,\n\t\tinstall: (s: Store) => createSelector(options, family, s),\n\t\tget: getSelf,\n\t\ttype: `readonly_selector`,\n\t\t...(family && { family }),\n\t}\n\ttarget.readonlySelectors.set(options.key, readonlySelector)\n\tconst initialValue = getSelf()\n\tstore.logger.info(\n\t\t`✨`,\n\t\treadonlySelector.type,\n\t\treadonlySelector.key,\n\t\t`=`,\n\t\tinitialValue,\n\t)\n\tconst token: ReadonlySelectorToken<T> = {\n\t\tkey: options.key,\n\t\ttype: `readonly_selector`,\n\t}\n\tif (family) {\n\t\ttoken.family = family\n\t}\n\tstore.on.selectorCreation.next(token)\n\treturn token\n}\n","import type {\n\tFamilyMetadata,\n\tReadonlySelectorOptions,\n\tReadonlySelectorToken,\n\tSelectorOptions,\n\tSelectorToken,\n} from \"atom.io\"\n\nimport { newest } from \"../lineage\"\nimport type { Store } from \"../store\"\nimport type { Subject } from \"../subject\"\nimport { createReadWriteSelector } from \"./create-read-write-selector\"\nimport { createReadonlySelector } from \"./create-readonly-selector\"\n\nexport type Selector<T> = {\n\tkey: string\n\ttype: `selector`\n\tfamily?: FamilyMetadata\n\tinstall: (store: Store) => void\n\tsubject: Subject<{ newValue: T; oldValue: T }>\n\tget: () => T\n\tset: (newValue: T | ((oldValue: T) => T)) => void\n}\nexport type ReadonlySelector<T> = {\n\tkey: string\n\ttype: `readonly_selector`\n\tfamily?: FamilyMetadata\n\tinstall: (store: Store) => void\n\tsubject: Subject<{ newValue: T; oldValue: T }>\n\tget: () => T\n}\n\nexport function createSelector<T>(\n\toptions: SelectorOptions<T>,\n\tfamily: FamilyMetadata | undefined,\n\tstore: Store,\n): SelectorToken<T>\nexport function createSelector<T>(\n\toptions: ReadonlySelectorOptions<T>,\n\tfamily: FamilyMetadata | undefined,\n\tstore: Store,\n): ReadonlySelectorToken<T>\nexport function createSelector<T>(\n\toptions: ReadonlySelectorOptions<T> | SelectorOptions<T>,\n\tfamily: FamilyMetadata | undefined,\n\tstore: Store,\n): ReadonlySelectorToken<T> | SelectorToken<T> {\n\tconst target = newest(store)\n\tconst existingWritable = target.selectors.get(options.key)\n\tconst existingReadonly = target.readonlySelectors.get(options.key)\n\n\tif (existingWritable || existingReadonly) {\n\t\tstore.logger.error(\n\t\t\t`❌`,\n\t\t\texistingReadonly ? `readonly_selector` : `selector`,\n\t\t\toptions.key,\n\t\t\t`Tried to create selector, but it already exists in the store.`,\n\t\t)\n\t}\n\n\tif (`set` in options) {\n\t\treturn createReadWriteSelector(options, family, store)\n\t}\n\treturn createReadonlySelector(options, family, store)\n}\n","import type { ReadonlySelectorToken, SelectorToken } from \"atom.io\"\n\nimport { newest } from \"..\"\nimport type { Store } from \"..\"\n\nexport function deleteSelector(\n\tselectorToken: ReadonlySelectorToken<unknown> | SelectorToken<unknown>,\n\tstore: Store,\n): void {\n\tconst target = newest(store)\n\tconst { key } = selectorToken\n\tswitch (selectorToken.type) {\n\t\tcase `selector`:\n\t\t\ttarget.selectors.delete(key)\n\t\t\tbreak\n\t\tcase `readonly_selector`:\n\t\t\ttarget.readonlySelectors.delete(key)\n\t\t\tbreak\n\t}\n\ttarget.valueMap.delete(key)\n\ttarget.selectorAtoms.delete(key)\n\tconst downstreamTokens = target.selectorGraph\n\t\t.getRelationEntries({ upstreamSelectorKey: key })\n\t\t.filter(([_, { source }]) => source === key)\n\t\t.map(\n\t\t\t([downstreamSelectorKey]) =>\n\t\t\t\ttarget.selectors.get(downstreamSelectorKey) ??\n\t\t\t\ttarget.readonlySelectors.get(downstreamSelectorKey),\n\t\t)\n\tfor (const downstreamToken of downstreamTokens) {\n\t\tif (downstreamToken) {\n\t\t\tdeleteSelector(downstreamToken, store)\n\t\t}\n\t}\n\ttarget.selectorGraph.delete(key)\n\tstore.logger.info(`🔥`, selectorToken.type, `${key}`, `deleted`)\n}\n","import type { Atom } from \"../atom\"\nimport { newest } from \"../lineage\"\nimport type { ReadonlySelector, Selector } from \"../selector\"\nimport type { Store } from \"../store\"\n\nexport const recallState = <T>(\n\tstate: Atom<T> | ReadonlySelector<T> | Selector<T>,\n\tstore: Store,\n): T => {\n\tconst target = newest(store)\n\tif (!target.operation.open) {\n\t\treturn target.valueMap.get(state.key)\n\t}\n\treturn target.operation.prev.get(state.key)\n}\n","import { newest } from \"../lineage\"\nimport { readOrComputeValue } from \"../read-or-compute-value\"\nimport type { ReadonlySelector, Selector } from \"../selector\"\nimport { traceAllSelectorAtoms } from \"../selector\"\nimport type { Store } from \"../store\"\nimport { recallState } from \"./recall-state\"\n\nexport const subscribeToRootAtoms = <T>(\n\tstate: ReadonlySelector<T> | Selector<T>,\n\tstore: Store,\n): (() => void)[] | null => {\n\tconst target = newest(store)\n\tconst dependencySubscriptions =\n\t\t`default` in state\n\t\t\t? null\n\t\t\t: traceAllSelectorAtoms(state.key, store).map((atomKey) => {\n\t\t\t\t\tconst atom = target.atoms.get(atomKey)\n\t\t\t\t\tif (atom === undefined) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Atom \"${atomKey}\", a dependency of selector \"${state.key}\", not found in store \"${store.config.name}\".`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\treturn atom.subject.subscribe(\n\t\t\t\t\t\t`${state.type}:${state.key}`,\n\t\t\t\t\t\t(atomChange) => {\n\t\t\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t\t\t`📢`,\n\t\t\t\t\t\t\t\tstate.type,\n\t\t\t\t\t\t\t\tstate.key,\n\t\t\t\t\t\t\t\t`root`,\n\t\t\t\t\t\t\t\tatomKey,\n\t\t\t\t\t\t\t\t`went`,\n\t\t\t\t\t\t\t\tatomChange.oldValue,\n\t\t\t\t\t\t\t\t`->`,\n\t\t\t\t\t\t\t\tatomChange.newValue,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tconst oldValue = recallState(state, target)\n\t\t\t\t\t\t\t// ❌ this retrieves a stale cached value when applying a transaction on the server\n\t\t\t\t\t\t\tconst newValue = readOrComputeValue(state, target)\n\t\t\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t\t\t`✨`,\n\t\t\t\t\t\t\t\tstate.type,\n\t\t\t\t\t\t\t\tstate.key,\n\t\t\t\t\t\t\t\t`went`,\n\t\t\t\t\t\t\t\toldValue,\n\t\t\t\t\t\t\t\t`->`,\n\t\t\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tstate.subject.next({ newValue, oldValue })\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t })\n\treturn dependencySubscriptions\n}\n","import type { ReadableToken, UpdateHandler } from \"atom.io\"\nimport type { Store } from \"../store\"\nimport { withdraw, withdrawNewFamilyMember } from \"../store\"\nimport { subscribeToRootAtoms } from \"./subscribe-to-root-atoms\"\n\nexport function subscribeToState<T>(\n\ttoken: ReadableToken<T>,\n\thandleUpdate: UpdateHandler<T>,\n\tkey: string,\n\tstore: Store,\n): () => void {\n\tconst state =\n\t\twithdraw<T>(token, store) ?? withdrawNewFamilyMember(token, store)\n\tif (state === undefined) {\n\t\tthrow new Error(\n\t\t\t`State \"${token.key}\" not found in this store. Did you forget to initialize with the \"atom\" or \"selector\" function?`,\n\t\t)\n\t}\n\tconst unsubFunction = state.subject.subscribe(key, handleUpdate)\n\tstore.logger.info(`👀`, state.type, state.key, `Adding subscription \"${key}\"`)\n\tconst dependencyUnsubFunctions =\n\t\tstate.type !== `atom` ? subscribeToRootAtoms(state, store) : null\n\n\tconst unsubscribe =\n\t\tdependencyUnsubFunctions === null\n\t\t\t? () => {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🙈`,\n\t\t\t\t\t\tstate.type,\n\t\t\t\t\t\tstate.key,\n\t\t\t\t\t\t`Removing subscription \"${key}\"`,\n\t\t\t\t\t)\n\t\t\t\t\tunsubFunction()\n\t\t\t }\n\t\t\t: () => {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🙈`,\n\t\t\t\t\t\tstate.type,\n\t\t\t\t\t\tstate.key,\n\t\t\t\t\t\t`Removing subscription \"${key}\"`,\n\t\t\t\t\t)\n\t\t\t\t\tunsubFunction()\n\t\t\t\t\tfor (const unsubFromDependency of dependencyUnsubFunctions) {\n\t\t\t\t\t\tunsubFromDependency()\n\t\t\t\t\t}\n\t\t\t }\n\n\treturn unsubscribe\n}\n","import type { TimelineManageable, TimelineToken, TimelineUpdate } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { withdraw } from \"atom.io/internal\"\n\nexport const subscribeToTimeline = <ManagedAtom extends TimelineManageable>(\n\ttoken: TimelineToken<ManagedAtom>,\n\thandleUpdate: (update: TimelineUpdate<any> | `redo` | `undo`) => void,\n\tkey: string,\n\tstore: Store,\n): (() => void) => {\n\tconst tl = withdraw(token, store)\n\tif (tl === undefined) {\n\t\tthrow new Error(\n\t\t\t`Cannot subscribe to timeline \"${token.key}\": timeline not found in store \"${store.config.name}\".`,\n\t\t)\n\t}\n\tstore.logger.info(`👀`, `timeline`, token.key, `Adding subscription \"${key}\"`)\n\tconst unsubscribe = tl.subject.subscribe(key, handleUpdate)\n\treturn () => {\n\t\tstore.logger.info(\n\t\t\t`🙈`,\n\t\t\t`timeline`,\n\t\t\ttoken.key,\n\t\t\t`Removing subscription \"${key}\" from timeline`,\n\t\t)\n\t\tunsubscribe()\n\t}\n}\n","import type { TransactionToken, TransactionUpdateHandler, ƒn } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { withdraw } from \"atom.io/internal\"\n\nexport const subscribeToTransaction = <ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\thandleUpdate: TransactionUpdateHandler<ƒ>,\n\tkey: string,\n\tstore: Store,\n): (() => void) => {\n\tconst tx = withdraw(token, store)\n\tif (tx === undefined) {\n\t\tthrow new Error(\n\t\t\t`Cannot subscribe to transaction \"${token.key}\": transaction not found in store \"${store.config.name}\".`,\n\t\t)\n\t}\n\tstore.logger.info(\n\t\t`👀`,\n\t\t`transaction`,\n\t\ttoken.key,\n\t\t`Adding subscription \"${key}\"`,\n\t)\n\tconst unsubscribe = tx.subject.subscribe(key, handleUpdate)\n\treturn () => {\n\t\tstore.logger.info(\n\t\t\t`🙈`,\n\t\t\t`transaction`,\n\t\t\ttoken.key,\n\t\t\t`Removing subscription \"${key}\"`,\n\t\t)\n\t\tunsubscribe()\n\t}\n}\n","import type { AtomToken, FamilyMetadata, MutableAtomToken } from \"atom.io\"\nimport { getState, setState } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { Store } from \"..\"\nimport { newest, subscribeToState, subscribeToTimeline } from \"..\"\nimport { createRegularAtom } from \"../atom\"\nimport type { Transceiver } from \"./transceiver\"\n\n/**\n * @internal Give the tracker a transceiver state and a store, and it will\n * subscribe to the transceiver's inner value. When the inner value changes,\n * the tracker will update its own state to reflect the change.\n */\nexport class Tracker<Mutable extends Transceiver<any>> {\n\tprivate Update: Mutable extends Transceiver<infer Signal> ? Signal : never\n\n\tprivate initializeState(\n\t\tmutableState: MutableAtomToken<Mutable, Json.Serializable>,\n\t\tstore: Store,\n\t): AtomToken<typeof this.Update | null> {\n\t\tconst latestUpdateStateKey = `*${mutableState.key}`\n\t\tstore.atoms.delete(latestUpdateStateKey)\n\t\tstore.valueMap.delete(latestUpdateStateKey)\n\t\tconst familyMetaData: FamilyMetadata | undefined = mutableState.family\n\t\t\t? {\n\t\t\t\t\tkey: `*${mutableState.family.key}`,\n\t\t\t\t\tsubKey: mutableState.family.subKey,\n\t\t\t }\n\t\t\t: undefined\n\t\tconst latestUpdateState = createRegularAtom<\n\t\t\t(Mutable extends Transceiver<infer Signal> ? Signal : never) | null\n\t\t>(\n\t\t\t{\n\t\t\t\tkey: latestUpdateStateKey,\n\t\t\t\tdefault: null,\n\t\t\t},\n\t\t\tfamilyMetaData,\n\t\t\tstore,\n\t\t)\n\t\tif (store.parent?.valueMap.has(latestUpdateStateKey)) {\n\t\t\tconst parentValue = store.parent.valueMap.get(latestUpdateStateKey)\n\t\t\tstore.valueMap.set(latestUpdateStateKey, parentValue)\n\t\t}\n\n\t\treturn latestUpdateState\n\t}\n\n\tprivate unsubscribeFromInnerValue: () => void\n\tprivate unsubscribeFromState: () => void\n\tprivate observeCore(\n\t\tmutableState: MutableAtomToken<Mutable, Json.Serializable>,\n\t\tlatestUpdateState: AtomToken<typeof this.Update | null>,\n\t\tstore: Store,\n\t): void {\n\t\tconst originalInnerValue = getState(mutableState, store)\n\t\tconst target = newest(store)\n\t\tthis.unsubscribeFromInnerValue = originalInnerValue.subscribe(\n\t\t\t`tracker:${store.config.name}:${\n\t\t\t\ttarget.transactionMeta === null\n\t\t\t\t\t? `main`\n\t\t\t\t\t: target.transactionMeta.update.key\n\t\t\t}`,\n\t\t\t(update) => {\n\t\t\t\tif (target.operation.open) {\n\t\t\t\t\tconst unsubscribe = target.on.operationClose.subscribe(\n\t\t\t\t\t\tmutableState.key,\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tunsubscribe()\n\t\t\t\t\t\t\tsetState(latestUpdateState, update, target)\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tsetState(mutableState, (current) => current, target)\n\t\t\t\t\tsetState(latestUpdateState, update, target)\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t\tthis.unsubscribeFromState = subscribeToState(\n\t\t\tmutableState,\n\t\t\t(update) => {\n\t\t\t\tif (update.newValue !== update.oldValue) {\n\t\t\t\t\tthis.unsubscribeFromInnerValue()\n\t\t\t\t\tconst target = newest(store)\n\t\t\t\t\tthis.unsubscribeFromInnerValue = update.newValue.subscribe(\n\t\t\t\t\t\t`tracker:${store.config.name}:${\n\t\t\t\t\t\t\ttarget.transactionMeta === null\n\t\t\t\t\t\t\t\t? `main`\n\t\t\t\t\t\t\t\t: target.transactionMeta.update.key\n\t\t\t\t\t\t}`,\n\t\t\t\t\t\t(update) => {\n\t\t\t\t\t\t\tif (target.operation.open) {\n\t\t\t\t\t\t\t\tconst unsubscribe = target.on.operationClose.subscribe(\n\t\t\t\t\t\t\t\t\tmutableState.key,\n\t\t\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\t\t\tunsubscribe()\n\t\t\t\t\t\t\t\t\t\tsetState(latestUpdateState, update, target)\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsetState(mutableState, (current) => current, target)\n\t\t\t\t\t\t\t\tsetState(latestUpdateState, update, target)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t},\n\t\t\t`${store.config.name}: tracker observing inner value`,\n\t\t\tstore,\n\t\t)\n\t}\n\n\tprivate updateCore<Core extends Transceiver<any>>(\n\t\tmutableState: MutableAtomToken<Core, Json.Serializable>,\n\t\tlatestUpdateState: AtomToken<typeof this.Update | null>,\n\t\tstore: Store,\n\t): void {\n\t\tsubscribeToState(\n\t\t\tlatestUpdateState,\n\t\t\t({ newValue, oldValue }) => {\n\t\t\t\tconst timelineId = store.timelineAtoms.getRelatedKey(\n\t\t\t\t\tlatestUpdateState.key,\n\t\t\t\t)\n\t\t\t\tif (timelineId) {\n\t\t\t\t\tconst timelineData = store.timelines.get(timelineId)\n\t\t\t\t\tif (timelineData?.timeTraveling) {\n\t\t\t\t\t\tconst unsubscribe = subscribeToTimeline(\n\t\t\t\t\t\t\t{ key: timelineId, type: `timeline` },\n\t\t\t\t\t\t\t(update) => {\n\t\t\t\t\t\t\t\tunsubscribe()\n\t\t\t\t\t\t\t\tsetState(\n\t\t\t\t\t\t\t\t\tmutableState,\n\t\t\t\t\t\t\t\t\t(transceiver) => {\n\t\t\t\t\t\t\t\t\t\tif (update === `redo` && newValue) {\n\t\t\t\t\t\t\t\t\t\t\ttransceiver.do(newValue)\n\t\t\t\t\t\t\t\t\t\t} else if (update === `undo` && oldValue) {\n\t\t\t\t\t\t\t\t\t\t\ttransceiver.undo(oldValue)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn transceiver\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`${mutableState.key}: tracker observing timeline`,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst unsubscribe = store.on.operationClose.subscribe(\n\t\t\t\t\tlatestUpdateState.key,\n\t\t\t\t\t() => {\n\t\t\t\t\t\tunsubscribe()\n\t\t\t\t\t\tconst mutable = getState(mutableState, store)\n\t\t\t\t\t\t// debugger\n\t\t\t\t\t\tconst updateNumber =\n\t\t\t\t\t\t\tnewValue === null ? -1 : mutable.getUpdateNumber(newValue)\n\t\t\t\t\t\tconst eventOffset = updateNumber - mutable.cacheUpdateNumber\n\t\t\t\t\t\tif (newValue && eventOffset === 1) {\n\t\t\t\t\t\t\t// ❗ new:\"0=add:\\\"myHand\\\"\",old:\"0=add:\\\"deckId\\\"\"\n\t\t\t\t\t\t\tsetState(\n\t\t\t\t\t\t\t\tmutableState,\n\t\t\t\t\t\t\t\t(transceiver) => (transceiver.do(newValue), transceiver),\n\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t},\n\t\t\t`${store.config.name}: tracker observing latest update`,\n\t\t\tstore,\n\t\t)\n\t}\n\n\tpublic mutableState: MutableAtomToken<Mutable, Json.Serializable>\n\tpublic latestUpdateState: AtomToken<typeof this.Update | null>\n\n\tpublic dispose: () => void\n\n\tpublic constructor(\n\t\tmutableState: MutableAtomToken<Mutable, Json.Serializable>,\n\t\tstore: Store,\n\t) {\n\t\tthis.mutableState = mutableState\n\t\tconst target = newest(store)\n\t\tthis.latestUpdateState = this.initializeState(mutableState, target)\n\t\tthis.observeCore(mutableState, this.latestUpdateState, target)\n\t\tthis.updateCore(mutableState, this.latestUpdateState, target)\n\t\ttarget.trackers.set(mutableState.key, this)\n\t\tthis.dispose = () => {\n\t\t\tthis.unsubscribeFromInnerValue()\n\t\t\tthis.unsubscribeFromState()\n\t\t\ttarget.trackers.delete(mutableState.key)\n\t\t}\n\t}\n}\n","import type { MutableAtomFamily, MutableAtomFamilyOptions } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { selectJsonFamily } from \"atom.io/json\"\n\nimport type { Store } from \"..\"\nimport { createRegularAtomFamily } from \"..\"\nimport { FamilyTracker } from \"./tracker-family\"\nimport type { Transceiver } from \"./transceiver\"\n\nexport function createMutableAtomFamily<\n\tCore extends Transceiver<any>,\n\tSerializableCore extends Json.Serializable,\n\tKey extends string,\n>(\n\toptions: MutableAtomFamilyOptions<Core, SerializableCore, Key>,\n\tstore: Store,\n): MutableAtomFamily<Core, SerializableCore, Key> {\n\tconst coreFamily = Object.assign(\n\t\tcreateRegularAtomFamily<Core, Key>(options, store),\n\t\toptions,\n\t) as MutableAtomFamily<Core, SerializableCore, Key>\n\tselectJsonFamily(coreFamily, options)\n\tnew FamilyTracker(coreFamily, store)\n\treturn coreFamily\n}\n","import type { AtomFamily } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport { createRegularAtomFamily } from \"../families\"\nimport type { Store } from \"../store\"\nimport { Tracker } from \"./tracker\"\nimport type { Transceiver } from \"./transceiver\"\n\nexport class FamilyTracker<\n\tCore extends Transceiver<any>,\n\tFamilyMemberKey extends Json.Serializable,\n> {\n\tprivate readonly Update: Core extends Transceiver<infer Signal>\n\t\t? Signal\n\t\t: never\n\n\tpublic readonly findLatestUpdateState: AtomFamily<\n\t\ttypeof this.Update | null,\n\t\tFamilyMemberKey\n\t>\n\tpublic readonly findMutableState: AtomFamily<Core, FamilyMemberKey>\n\n\tpublic constructor(\n\t\tfindMutableState: AtomFamily<Core, FamilyMemberKey>,\n\t\tstore: Store,\n\t) {\n\t\tthis.findLatestUpdateState = createRegularAtomFamily<\n\t\t\ttypeof this.Update | null,\n\t\t\tFamilyMemberKey\n\t\t>(\n\t\t\t{\n\t\t\t\tkey: `*${findMutableState.key}`,\n\t\t\t\tdefault: null,\n\t\t\t},\n\t\t\tstore,\n\t\t)\n\t\tthis.findMutableState = findMutableState\n\t\tthis.findMutableState.subject.subscribe(\n\t\t\t`store=${store.config.name}::tracker-atom-family`,\n\t\t\t(atomToken) => {\n\t\t\t\tif (atomToken.family) {\n\t\t\t\t\tconst key = parseJson(atomToken.family.subKey) as FamilyMemberKey\n\t\t\t\t\tthis.findLatestUpdateState(key)\n\t\t\t\t\tnew Tracker<Core>(atomToken, store)\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t\tthis.findLatestUpdateState.subject.subscribe(\n\t\t\t`store=${store.config.name}::tracker-atom-family`,\n\t\t\t(atomToken) => {\n\t\t\t\tif (atomToken.family) {\n\t\t\t\t\tconst key = parseJson(atomToken.family.subKey) as FamilyMemberKey\n\t\t\t\t\tconst mutableAtomToken = this.findMutableState(key)\n\t\t\t\t\tnew Tracker<Core>(mutableAtomToken, store)\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t}\n}\n","import type {\n\tAtomFamily,\n\tAtomFamilyOptions,\n\tAtomOptions,\n\tAtomToken,\n\tFamilyMetadata,\n\tMutableAtomFamilyOptions,\n} from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { stringifyJson } from \"atom.io/json\"\n\nimport { createRegularAtom } from \"../atom\"\nimport { newest } from \"../lineage\"\nimport { createMutableAtom } from \"../mutable\"\nimport { deposit, withdraw } from \"../store\"\nimport type { Store } from \"../store\"\nimport { Subject } from \"../subject\"\n\nexport function createRegularAtomFamily<T, K extends Json.Serializable>(\n\toptions: AtomFamilyOptions<T, K> | MutableAtomFamilyOptions<any, any, K>,\n\tstore: Store,\n): AtomFamily<T, K> {\n\tconst subject = new Subject<AtomToken<T>>()\n\tconst atomFamily = Object.assign(\n\t\t(key: K): AtomToken<T> => {\n\t\t\tconst subKey = stringifyJson(key)\n\t\t\tconst family: FamilyMetadata = { key: options.key, subKey }\n\t\t\tconst fullKey = `${options.key}(${subKey})`\n\t\t\tconst existing = withdraw({ key: fullKey, type: `atom` }, store)\n\t\t\tlet token: AtomToken<any>\n\t\t\tif (existing) {\n\t\t\t\ttoken = deposit(existing)\n\t\t\t} else {\n\t\t\t\tconst individualOptions: AtomOptions<any> = {\n\t\t\t\t\tkey: fullKey,\n\t\t\t\t\tdefault:\n\t\t\t\t\t\toptions.default instanceof Function\n\t\t\t\t\t\t\t? options.default(key)\n\t\t\t\t\t\t\t: options.default,\n\t\t\t\t}\n\t\t\t\tif (options.effects) {\n\t\t\t\t\tindividualOptions.effects = options.effects(key)\n\t\t\t\t}\n\t\t\t\tif (`mutable` in options) {\n\t\t\t\t\tconst mutableOptions = {\n\t\t\t\t\t\t...individualOptions,\n\t\t\t\t\t\tmutable: true,\n\t\t\t\t\t\ttoJson: options.toJson,\n\t\t\t\t\t\tfromJson: options.fromJson,\n\t\t\t\t\t} as const\n\t\t\t\t\ttoken = createMutableAtom(mutableOptions, family, store)\n\t\t\t\t} else {\n\t\t\t\t\ttoken = createRegularAtom<T>(individualOptions, family, store)\n\t\t\t\t}\n\t\t\t\tsubject.next(token)\n\t\t\t}\n\t\t\treturn token\n\t\t},\n\t\t{\n\t\t\tkey: options.key,\n\t\t\ttype: `atom_family`,\n\t\t\tsubject,\n\t\t\tinstall: (store: Store) => createRegularAtomFamily(options, store),\n\t\t} as const,\n\t)\n\tif (`mutable` in options && typeof options.mutable === `boolean`) {\n\t\tObject.assign(atomFamily, { mutable: options.mutable })\n\t}\n\tconst target = newest(store)\n\ttarget.families.set(options.key, atomFamily)\n\treturn atomFamily\n}\n","import type {\n\tAtomFamily,\n\tAtomFamilyOptions,\n\tMutableAtomFamily,\n\tMutableAtomFamilyOptions,\n} from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport { type Transceiver, createMutableAtomFamily } from \"../mutable\"\nimport type { Store } from \"../store\"\nimport { createRegularAtomFamily } from \"./create-regular-atom-family\"\n\nexport function createAtomFamily<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n>(\n\toptions: MutableAtomFamilyOptions<T, J, K>,\n\tstore: Store,\n): MutableAtomFamily<T, J, K>\nexport function createAtomFamily<T, K extends Json.Serializable>(\n\toptions: AtomFamilyOptions<T, K>,\n\tstore: Store,\n): AtomFamily<T, K>\nexport function createAtomFamily<T, K extends Json.Serializable>(\n\toptions: AtomFamilyOptions<T, K> | MutableAtomFamilyOptions<any, any, any>,\n\tstore: Store,\n): AtomFamily<T, K> | MutableAtomFamily<any, any, any> {\n\tif (`mutable` in options) {\n\t\treturn createMutableAtomFamily(options, store)\n\t}\n\treturn createRegularAtomFamily<T, K>(options, store)\n}\n","import type {\n\tFamilyMetadata,\n\tReadonlySelectorFamily,\n\tReadonlySelectorFamilyOptions,\n\tReadonlySelectorToken,\n} from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { stringifyJson } from \"atom.io/json\"\n\nimport { newest } from \"../lineage\"\nimport { createSelector } from \"../selector\"\nimport { type Store, deposit } from \"../store\"\nimport { Subject } from \"../subject\"\n\nexport function createReadonlySelectorFamily<T, K extends Json.Serializable>(\n\toptions: ReadonlySelectorFamilyOptions<T, K>,\n\tstore: Store,\n): ReadonlySelectorFamily<T, K> {\n\tconst subject = new Subject<ReadonlySelectorToken<T>>()\n\tconst readonlySelectorFamily = Object.assign(\n\t\t(key: K): ReadonlySelectorToken<T> => {\n\t\t\tconst target = newest(store)\n\t\t\tconst subKey = stringifyJson(key)\n\t\t\tconst family: FamilyMetadata = { key: options.key, subKey }\n\t\t\tconst fullKey = `${options.key}(${subKey})`\n\t\t\tconst existing = target.readonlySelectors.get(fullKey)\n\t\t\tif (existing) {\n\t\t\t\treturn deposit(existing)\n\t\t\t}\n\t\t\treturn createSelector<T>(\n\t\t\t\t{\n\t\t\t\t\tkey: fullKey,\n\t\t\t\t\tget: options.get(key),\n\t\t\t\t},\n\t\t\t\tfamily,\n\t\t\t\tstore,\n\t\t\t) as ReadonlySelectorToken<T>\n\t\t},\n\t\t{\n\t\t\tkey: options.key,\n\t\t\ttype: `readonly_selector_family`,\n\t\t\tsubject,\n\t\t\tinstall: (store: Store) => createReadonlySelectorFamily(options, store),\n\t\t} as const,\n\t) as ReadonlySelectorFamily<T, K>\n\tstore.families.set(options.key, readonlySelectorFamily)\n\treturn readonlySelectorFamily\n}\n","import type {\n\tFamilyMetadata,\n\tReadonlySelectorFamily,\n\tReadonlySelectorFamilyOptions,\n\tSelectorFamily,\n\tSelectorFamilyOptions,\n\tSelectorToken,\n} from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { stringifyJson } from \"atom.io/json\"\n\nimport { newest } from \"../lineage\"\nimport { createSelector } from \"../selector\"\nimport type { Store } from \"../store\"\nimport { deposit } from \"../store\"\nimport { Subject } from \"../subject\"\nimport { createReadonlySelectorFamily } from \"./create-readonly-selector-family\"\n\nexport function createSelectorFamily<T, K extends Json.Serializable>(\n\toptions: SelectorFamilyOptions<T, K>,\n\tstore: Store,\n): SelectorFamily<T, K>\nexport function createSelectorFamily<T, K extends Json.Serializable>(\n\toptions: ReadonlySelectorFamilyOptions<T, K>,\n\tstore: Store,\n): ReadonlySelectorFamily<T, K>\nexport function createSelectorFamily<T, K extends Json.Serializable>(\n\toptions: ReadonlySelectorFamilyOptions<T, K> | SelectorFamilyOptions<T, K>,\n\tstore: Store,\n): ReadonlySelectorFamily<T, K> | SelectorFamily<T, K> {\n\tconst isReadonly = !(`set` in options)\n\n\tif (isReadonly) {\n\t\treturn createReadonlySelectorFamily(options, store)\n\t}\n\tconst target = newest(store)\n\tconst subject = new Subject<SelectorToken<T>>()\n\n\tconst selectorFamily = Object.assign(\n\t\t(key: K): SelectorToken<T> => {\n\t\t\tconst subKey = stringifyJson(key)\n\t\t\tconst family: FamilyMetadata = { key: options.key, subKey }\n\t\t\tconst fullKey = `${options.key}(${subKey})`\n\t\t\tconst existing = target.selectors.get(fullKey)\n\t\t\tif (existing) {\n\t\t\t\treturn deposit(existing)\n\t\t\t}\n\t\t\tconst token = createSelector<T>(\n\t\t\t\t{\n\t\t\t\t\tkey: fullKey,\n\t\t\t\t\tget: options.get(key),\n\t\t\t\t\tset: options.set(key),\n\t\t\t\t},\n\t\t\t\tfamily,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsubject.next(token)\n\t\t\treturn token\n\t\t},\n\t\t{\n\t\t\tkey: options.key,\n\t\t\ttype: `selector_family`,\n\t\t\tsubject,\n\t\t\tinstall: (store: Store) => createSelectorFamily(options, store),\n\t\t} as const,\n\t) as SelectorFamily<T, K>\n\ttarget.families.set(options.key, selectorFamily)\n\treturn selectorFamily\n}\n","import type { MutableAtomFamily, SelectorFamily } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport { newest } from \"../lineage\"\nimport type { Store } from \"../store\"\nimport type { Transceiver } from \"./transceiver\"\n\nexport const getJsonFamily = <\n\tCore extends Transceiver<Json.Serializable>,\n\tSerializableCore extends Json.Serializable,\n\tKey extends string,\n>(\n\tmutableAtomFamily: MutableAtomFamily<Core, SerializableCore, Key>,\n\tstore: Store,\n): SelectorFamily<SerializableCore, Key> => {\n\tconst target = newest(store)\n\tconst key = `${mutableAtomFamily.key}:JSON`\n\tconst jsonFamily: SelectorFamily<SerializableCore, Key> = target.families.get(\n\t\tkey,\n\t) as SelectorFamily<SerializableCore, Key>\n\treturn jsonFamily\n}\n","import type { MutableAtomToken, SelectorToken } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { Transceiver } from \"./transceiver\"\n\nexport const getJsonToken = <\n\tCore extends Transceiver<any>,\n\tSerializableCore extends Json.Serializable,\n>(\n\tmutableAtomToken: MutableAtomToken<Core, SerializableCore>,\n): SelectorToken<SerializableCore> => {\n\tconst key = mutableAtomToken.family\n\t\t? `${mutableAtomToken.family.key}:JSON(${mutableAtomToken.family.subKey})`\n\t\t: `${mutableAtomToken.key}:JSON`\n\tconst jsonToken: SelectorToken<SerializableCore> = { type: `selector`, key }\n\tif (mutableAtomToken.family) {\n\t\tjsonToken.family = {\n\t\t\tkey: `${mutableAtomToken.family.key}:JSON`,\n\t\t\tsubKey: mutableAtomToken.family.subKey,\n\t\t}\n\t}\n\treturn jsonToken\n}\n","import type { AtomToken, MutableAtomToken } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport type { Signal, Transceiver } from \"./transceiver\"\n\nexport const getUpdateToken = <\n\tCore extends Transceiver<any>,\n\tSerializableCore extends Json.Serializable,\n>(\n\tmutableAtomToken: MutableAtomToken<Core, SerializableCore>,\n): AtomToken<Signal<Core>> => {\n\tconst key = `*${mutableAtomToken.key}`\n\tconst updateToken: AtomToken<Signal<Core>> = { type: `atom`, key }\n\tif (mutableAtomToken.family) {\n\t\tupdateToken.family = {\n\t\t\tkey: `*${mutableAtomToken.family.key}`,\n\t\t\tsubKey: mutableAtomToken.family.subKey,\n\t\t}\n\t}\n\treturn updateToken\n}\n","import type { AtomFamily, MutableAtomFamily } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport { newest } from \"../lineage\"\nimport type { Store } from \"../store\"\nimport type { Signal, Transceiver } from \"./transceiver\"\n\nexport const getUpdateFamily = <\n\tCore extends Transceiver<Json.Serializable>,\n\tSerializableCore extends Json.Serializable,\n\tKey extends string,\n>(\n\tmutableAtomFamily: MutableAtomFamily<Core, SerializableCore, Key>,\n\tstore: Store,\n): AtomFamily<Signal<Core> | null, Key> => {\n\tconst target = newest(store)\n\tconst key = `*${mutableAtomFamily.key}`\n\tconst updateFamily = target.families.get(key) as AtomFamily<\n\t\tSignal<Core> | null,\n\t\tKey\n\t>\n\treturn updateFamily\n}\n","import type { Json } from \"atom.io/json\"\n\nexport interface Transceiver<Signal extends Json.Serializable> {\n\tdo: (update: Signal) => void\n\tundo: (update: Signal) => void\n\tsubscribe: (key: string, fn: (update: Signal) => void) => () => void\n\tcacheUpdateNumber: number\n\tgetUpdateNumber: (update: Signal) => number\n}\n\nexport function isTransceiver(\n\tvalue: unknown,\n): value is Transceiver<Json.Serializable> {\n\treturn (\n\t\ttypeof value === `object` &&\n\t\tvalue !== null &&\n\t\t`do` in value &&\n\t\t`undo` in value &&\n\t\t`subscribe` in value\n\t)\n}\n\nexport type TransceiverMode = `playback` | `record` | `transaction`\n\nexport type Signal<TVR extends Transceiver<any>> = TVR extends Transceiver<\n\tinfer Signal\n>\n\t? Signal\n\t: never\n\n/*\nA transceiver may also keep a list of updates that have been applied to it.\nThis is useful for undo/redo functionality, especially in the context of\nrevising history. It is a good idea to accept a cache limit in your \nconstructor, and overwrite old updates. Here's an example of how we \nmight set that up:\n\nmyTransceiver = Transceiver {\n\tcacheUpdateNumber: number = 27\n\tcacheIdx: number = 1\n\tcacheLimit: number = 3\n\tcache: Array<Update> = [\n\t\t26=add:\"x\"\n\t\t27=del:\"x\" (current)\n\t\t25=add:\"y\"\n\t]\n}\n\nCONFIRM/NO-OP\nUpdate `27=del:\"x\"` is passed to myTransceiver.do:\n- [updateNumber = 27, update = `del:\"x\"`]\t\n- updateOffset = updateNumber - cacheUpdateNumber // 0\n- eventOffset < 1 // true (we're validating the past)\n- |eventOffset| < cacheLimit // true (we remember this update)\n- eventIdx = cacheIdx + updateOffset // 1\n- update === cache.get(eventIdx) // true\n- return null // 👍\n\nEXPECTED UPDATE\nUpdate `28=add:\"x\"` is passed to myTransceiver.do:\n- [updateNumber = 28, update = `add:\"x\"`]\n- updateOffset = updateNumber - cacheUpdateNumber // 1\n- eventOffset < 1 // false (we're in the future)\n- eventOffset === 1 // true (we're ready to apply this update)\n- cacheIdx += eventOffset // 2\n- cacheIdx %= cacheLimit // 2\n- cache[cacheIdx] = update // cache = <{ 0 => add:\"x\" }>\n- return null // 👍\n\nUNEXPECTED UPDATE\nUpdate `29=del:\"x\"` is passed to myTransceiver.do:\n- [updateNumber = 29, update = `del:\"x\"`]\n- updateOffset = updateNumber - cacheUpdateNumber // 2\n- eventOffset < 1 // false (we're in the future)\n- eventOffset === 1 // false (we're NOT ready to apply this update)\n- updateIdx := cacheIdx + updateOffset // 3\n- updateIdx %= cacheLimit // 0\n- cache[updateIdx] = update // cache = <{ 0 => del:\"x\" }> \n- expectedUpdateNumber = cacheUpdateNumber + 1 // 28\n- return expectedUpdateNumber // 🤨👂\n\nSUCCESSFUL ROLLBACK UPDATE\nUpdate `25=add:\"z\"` is passed to myTransceiver.do:\n- [updateNumber = 25, update = `add:\"z\"`]\n- updateOffset = updateNumber - cacheUpdateNumber // -2\n- eventOffset < 1 // true (we're validating the past)\n- |eventOffset| < cacheLimit // true (we remember this update)\n- eventIdx = cacheIdx + updateOffset // -1\n- eventIdx %= cacheLimit // 2\n- update === cache[eventIdx] // false (we're rolling back)\n- done := false\n- update := cache[cacheIdx] // update = `del:\"x\"`\n- undo(update) // myTransceiver.undo(`del:\"x\"`)\n- while (!done) {\n- \tcacheIdx -= 1 // 0, -1\n- \tcacheIdx %= cacheLimit // 0, 2\n- \tupdate = cache[cacheIdx] // update = `add:\"y\"`, `add:\"x\"`\n- \tundo(update) // myTransceiver.undo(`add:\"y\"`), myTransceiver.undo(`add:\"x\"`)\n- \tdone = cacheIdx === eventIdx // false, true\n- }\n- do(update) // myTransceiver.do(`add:\"z\"`)\n- return null // 👍\n\nUNSUCCESSFUL ROLLBACK UPDATE\nUpdate `24=add:\"z\"` is passed to myTransceiver.do:\n- [updateNumber = 24, update = `add:\"z\"`]\n- updateOffset = updateNumber - cacheUpdateNumber // -3\n- eventOffset < 1 // true (we're validating the past)\n- |eventOffset| < cacheLimit // 3 < 3 // false (we don't remember this update)\n- return `OUT_OF_RANGE` // 😵💫👂\n\n*/\n","import type {\n\tAtomOptions,\n\tAtomToken,\n\tFamilyMetadata,\n\tMutableAtomOptions,\n\tUpdateHandler,\n} from \"atom.io\"\nimport { setState } from \"atom.io\"\n\nimport type { Atom } from \".\"\nimport { cacheValue } from \"../caching\"\nimport { newest } from \"../lineage\"\nimport { createMutableAtom } from \"../mutable\"\nimport type { Store } from \"../store\"\nimport { deposit } from \"../store\"\nimport { Subject } from \"../subject\"\nimport { subscribeToState } from \"../subscribe\"\nimport { markAtomAsDefault } from \"./is-default\"\n\nexport function createRegularAtom<T>(\n\toptions: AtomOptions<T> | MutableAtomOptions<any, any>,\n\tfamily: FamilyMetadata | undefined,\n\tstore: Store,\n): AtomToken<T> {\n\tstore.logger.info(\n\t\t`🔨`,\n\t\t`atom`,\n\t\toptions.key,\n\t\t`creating in store \"${store.config.name}\"`,\n\t)\n\tconst target = newest(store)\n\tconst existing = target.atoms.get(options.key)\n\tif (existing) {\n\t\tstore.logger.error(\n\t\t\t`❌`,\n\t\t\t`atom`,\n\t\t\toptions.key,\n\t\t\t`Tried to create atom, but it already exists in the store.`,\n\t\t)\n\t\treturn deposit(existing)\n\t}\n\tconst subject = new Subject<{ newValue: T; oldValue: T }>()\n\tconst newAtom: Atom<T> = {\n\t\t...options,\n\t\ttype: `atom`,\n\t\tinstall: (store: Store) => {\n\t\t\tstore.logger.info(\n\t\t\t\t`🛠️`,\n\t\t\t\t`atom`,\n\t\t\t\toptions.key,\n\t\t\t\t`installing in store \"${store.config.name}\"`,\n\t\t\t)\n\t\t\treturn `mutable` in options\n\t\t\t\t? createMutableAtom(options, family, store)\n\t\t\t\t: createRegularAtom(options, family, store)\n\t\t},\n\t\tsubject,\n\t} as const\n\tif (family) {\n\t\tnewAtom.family = family\n\t}\n\tlet initialValue = options.default\n\tif (options.default instanceof Function) {\n\t\tinitialValue = options.default()\n\t}\n\ttarget.atoms.set(newAtom.key, newAtom)\n\tmarkAtomAsDefault(options.key, store)\n\tcacheValue(options.key, initialValue, subject, target)\n\tconst token = deposit(newAtom)\n\tif (options.effects) {\n\t\tlet effectIndex = 0\n\t\tconst cleanupFunctions: (() => void)[] = []\n\t\tfor (const effect of options.effects) {\n\t\t\tconst cleanup = effect({\n\t\t\t\tsetSelf: (next) => setState(token, next, store),\n\t\t\t\tonSet: (handle: UpdateHandler<T>) =>\n\t\t\t\t\tsubscribeToState(token, handle, `effect[${effectIndex}]`, store),\n\t\t\t})\n\t\t\tif (cleanup) {\n\t\t\t\tcleanupFunctions.push(cleanup)\n\t\t\t}\n\t\t\t++effectIndex\n\t\t}\n\t\tnewAtom.cleanup = () => {\n\t\t\tfor (const cleanup of cleanupFunctions) {\n\t\t\t\tcleanup()\n\t\t\t}\n\t\t}\n\t}\n\tstore.on.atomCreation.next(token)\n\treturn token as AtomToken<T>\n}\n","import { newest } from \"../lineage\"\nimport { traceAllSelectorAtoms } from \"../selector\"\nimport type { Store } from \"../store\"\n\nexport const isAtomDefault = (key: string, store: Store): boolean => {\n\tconst core = newest(store)\n\treturn core.atomsThatAreDefault.has(key)\n}\n\nexport const markAtomAsDefault = (key: string, store: Store): void => {\n\tconst core = newest(store)\n\tcore.atomsThatAreDefault = new Set(core.atomsThatAreDefault).add(key)\n}\n\nexport const markAtomAsNotDefault = (key: string, store: Store): void => {\n\tconst core = newest(store)\n\tcore.atomsThatAreDefault = new Set(newest(store).atomsThatAreDefault)\n\tcore.atomsThatAreDefault.delete(key)\n}\n","import type {\n\tAtomOptions,\n\tAtomToken,\n\tFamilyMetadata,\n\tMutableAtomOptions,\n} from \"atom.io\"\n\nimport { createMutableAtom } from \"../mutable\"\nimport type { Store } from \"../store\"\nimport { createRegularAtom } from \"./create-regular-atom\"\n\nexport function createAtom<T>(\n\toptions: AtomOptions<T> | MutableAtomOptions<any, any>,\n\tfamily: FamilyMetadata | undefined,\n\tstore: Store,\n): AtomToken<T> {\n\tif (`mutable` in options) {\n\t\treturn createMutableAtom(options, family, store)\n\t}\n\treturn createRegularAtom<T>(options, family, store)\n}\n","import type { AtomToken } from \"atom.io\"\n\nimport type { Store } from \"..\"\nimport { deleteSelector, newest } from \"..\"\n\nexport function deleteAtom(atomToken: AtomToken<unknown>, store: Store): void {\n\tconst target = newest(store)\n\tconst { key } = atomToken\n\tconst atom = target.atoms.get(key)\n\tif (!atom) {\n\t\tstore.logger.error(\n\t\t\t`❌`,\n\t\t\t`atom`,\n\t\t\t`${key}`,\n\t\t\t`Tried to delete atom, but it does not exist in the store.`,\n\t\t)\n\t}\n\tatom?.cleanup?.()\n\ttarget.atoms.delete(key)\n\ttarget.valueMap.delete(key)\n\tconst selectorKeys = target.selectorAtoms.getRelatedKeys(key)\n\tif (selectorKeys) {\n\t\tfor (const selectorKey of selectorKeys) {\n\t\t\tconst token =\n\t\t\t\ttarget.selectors.get(selectorKey) ??\n\t\t\t\ttarget.readonlySelectors.get(selectorKey)\n\t\t\tif (token) {\n\t\t\t\tdeleteSelector(token, store)\n\t\t\t}\n\t\t}\n\t}\n\ttarget.selectorAtoms.delete(key)\n\ttarget.atomsThatAreDefault.delete(key)\n\ttarget.timelineAtoms.delete(key)\n\tstore.logger.info(`🔥`, `atom`, `${key}`, `deleted`)\n}\n","import type { Store } from \"./store\"\n\nexport type EnvironmentData = {\n\truntime: `browser` | `node` | `unknown`\n\tstore: Store\n}\n\nexport function getEnvironmentData(store: Store): EnvironmentData {\n\treturn {\n\t\truntime:\n\t\t\ttypeof window === `undefined`\n\t\t\t\t? typeof global === `object`\n\t\t\t\t\t? `node`\n\t\t\t\t\t: `unknown`\n\t\t\t\t: `browser`,\n\t\tstore,\n\t}\n}\n","import type { KeyedStateUpdate } from \"atom.io\"\nimport { setState } from \"atom.io\"\n\nimport type { Store } from \"../store\"\n\nexport function ingestAtomUpdate(\n\tapplying: `newValue` | `oldValue`,\n\tatomUpdate: KeyedStateUpdate<any>,\n\tstore: Store,\n): void {\n\tconst { key, newValue, oldValue } = atomUpdate\n\tconst value = applying === `newValue` ? newValue : oldValue\n\tsetState({ key, type: `atom` }, value, store)\n}\n","import type { Store } from \"../store\"\nimport type { TimelineSelectorUpdate } from \"../timeline\"\nimport { ingestAtomUpdate } from \"./ingest-atom-update\"\n\nexport function ingestSelectorUpdate(\n\tapplying: `newValue` | `oldValue`,\n\tselectorUpdate: TimelineSelectorUpdate<any>,\n\tstore: Store,\n): void {\n\tconst updates =\n\t\tapplying === `newValue`\n\t\t\t? selectorUpdate.atomUpdates\n\t\t\t: [...selectorUpdate.atomUpdates].reverse()\n\tfor (const atomUpdate of updates) {\n\t\tingestAtomUpdate(applying, atomUpdate, store)\n\t}\n}\n","import type { TransactionUpdate } from \"atom.io\"\n\nimport type { Store } from \"../store\"\nimport { ingestAtomUpdate } from \"./ingest-atom-update\"\n\nexport function ingestTransactionUpdate(\n\tapplying: `newValue` | `oldValue`,\n\ttransactionUpdate: TransactionUpdate<any>,\n\tstore: Store,\n): void {\n\tconst updates =\n\t\tapplying === `newValue`\n\t\t\t? transactionUpdate.updates\n\t\t\t: [...transactionUpdate.updates].reverse()\n\tfor (const updateFromTransaction of updates) {\n\t\tif (`newValue` in updateFromTransaction) {\n\t\t\tingestAtomUpdate(applying, updateFromTransaction, store)\n\t\t} else {\n\t\t\tingestTransactionUpdate(applying, updateFromTransaction, store)\n\t\t}\n\t}\n}\n","export class LazyMap<K, V> extends Map<K, V> {\n\tpublic deleted = new Set<K>()\n\n\tpublic constructor(protected readonly source: Map<K, V>) {\n\t\tsuper()\n\t}\n\n\tpublic get(key: K): V | undefined {\n\t\tconst has = super.has(key)\n\t\tif (has) {\n\t\t\treturn super.get(key)\n\t\t}\n\t\tif (!this.deleted.has(key) && this.source.has(key)) {\n\t\t\tconst value = this.source.get(key)\n\t\t\treturn value\n\t\t}\n\t\treturn undefined\n\t}\n\n\tpublic set(key: K, value: V): this {\n\t\tthis.deleted.delete(key)\n\t\treturn super.set(key, value)\n\t}\n\n\tpublic hasOwn(key: K): boolean {\n\t\treturn super.has(key)\n\t}\n\n\tpublic has(key: K): boolean {\n\t\treturn !this.deleted.has(key) && (super.has(key) || this.source.has(key))\n\t}\n\n\tpublic delete(key: K): boolean {\n\t\tthis.deleted.add(key)\n\t\treturn super.delete(key)\n\t}\n}\n","import type { ReadableToken } from \"atom.io\"\n\nimport type { Store } from \"./store\"\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\n\nfunction prettyPrintTokenType(token: ReadableToken<any>) {\n\tif (token.type === `readonly_selector`) {\n\t\treturn `Readonly Selector`\n\t}\n\treturn capitalize(token.type)\n}\n\nexport class NotFoundError extends Error {\n\tpublic constructor(token: ReadableToken<any>, store: Store) {\n\t\tsuper(\n\t\t\t`${prettyPrintTokenType(token)} \"${token.key}\" not found in store \"${\n\t\t\t\tstore.config.name\n\t\t\t}\".`,\n\t\t)\n\t}\n}\n","import type { TransactionUpdate, ƒn } from \"atom.io\"\nimport type { AtomToken, TimelineUpdate } from \"atom.io\"\n\nimport { newest } from \"../lineage\"\nimport { getUpdateToken } from \"../mutable\"\nimport type { Store } from \"../store\"\nimport { withdraw } from \"../store\"\nimport type {\n\tTimeline,\n\tTimelineAtomUpdate,\n\tTimelineTransactionUpdate,\n} from \"./create-timeline\"\n\nexport const addAtomToTimeline = (\n\tatomToken: AtomToken<any>,\n\ttl: Timeline<any>,\n\tstore: Store,\n): void => {\n\tlet maybeAtom = withdraw(atomToken, store)\n\tif (maybeAtom?.mutable) {\n\t\tconsole.log(`adding transceiver to timeline`, atomToken.key)\n\t\tconst updateToken = getUpdateToken(atomToken)\n\t\tmaybeAtom = withdraw(updateToken, store)\n\t}\n\tconst atom = maybeAtom\n\tif (atom === undefined) {\n\t\tthrow new Error(\n\t\t\t`Cannot subscribe to atom \"${atomToken.key}\" because it has not been initialized in store \"${store.config.name}\"`,\n\t\t)\n\t}\n\n\tatom.subject.subscribe(`timeline`, (update) => {\n\t\t// debugger\n\t\tconst target = newest(store)\n\t\tconst currentSelectorKey =\n\t\t\tstore.operation.open && store.operation.token.type === `selector`\n\t\t\t\t? store.operation.token.key\n\t\t\t\t: null\n\t\tconst currentSelectorTime =\n\t\t\tstore.operation.open && store.operation.token.type === `selector`\n\t\t\t\t? store.operation.time\n\t\t\t\t: null\n\t\tconst currentTransactionKey = target.on.transactionApplying.state?.update.key\n\t\tconst currentTransactionTime = target.on.transactionApplying.state?.time\n\n\t\tstore.logger.info(\n\t\t\t`⏳`,\n\t\t\t`timeline`,\n\t\t\ttl.key,\n\t\t\t`atom`,\n\t\t\tatomToken.key,\n\t\t\t`went`,\n\t\t\tupdate.oldValue,\n\t\t\t`->`,\n\t\t\tupdate.newValue,\n\t\t\tcurrentTransactionKey\n\t\t\t\t? `in transaction \"${currentTransactionKey}\"`\n\t\t\t\t: currentSelectorKey\n\t\t\t\t ? `in selector \"${currentSelectorKey}\"`\n\t\t\t\t : ``,\n\t\t)\n\t\tif (tl.timeTraveling === null) {\n\t\t\tif (tl.selectorTime && tl.selectorTime !== currentSelectorTime) {\n\t\t\t\tconst mostRecentUpdate: TimelineUpdate<any> | undefined =\n\t\t\t\t\ttl.history.at(-1)\n\t\t\t\tif (mostRecentUpdate === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Timeline \"${tl.key}\" has a selectorTime, but no history. This is most likely a bug in AtomIO.`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (currentTransactionKey) {\n\t\t\t\tconst currentTransaction = withdraw(\n\t\t\t\t\t{ key: currentTransactionKey, type: `transaction` },\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tif (currentTransaction === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Transaction \"${currentTransactionKey}\" not found in store \"${store.config.name}\". This is surprising, because we are in the application phase of \"${currentTransactionKey}\".`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif (tl.transactionKey !== currentTransactionKey) {\n\t\t\t\t\tif (tl.transactionKey) {\n\t\t\t\t\t\tstore.logger.error(\n\t\t\t\t\t\t\t`🐞`,\n\t\t\t\t\t\t\t`timeline`,\n\t\t\t\t\t\t\ttl.key,\n\t\t\t\t\t\t\t`unable to resolve transaction \"${tl.transactionKey}. This is probably a bug in AtomIO.`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\ttl.transactionKey = currentTransactionKey\n\t\t\t\t\tconst unsubscribe = currentTransaction.subject.subscribe(\n\t\t\t\t\t\t`timeline:${tl.key}`,\n\t\t\t\t\t\t(update) => {\n\t\t\t\t\t\t\tunsubscribe()\n\t\t\t\t\t\t\tif (tl.timeTraveling === null && currentTransactionTime) {\n\t\t\t\t\t\t\t\tif (tl.at !== tl.history.length) {\n\t\t\t\t\t\t\t\t\ttl.history.splice(tl.at)\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst filterUpdates = (\n\t\t\t\t\t\t\t\t\tupdates: TransactionUpdate<ƒn>[`updates`],\n\t\t\t\t\t\t\t\t) =>\n\t\t\t\t\t\t\t\t\tupdates\n\t\t\t\t\t\t\t\t\t\t.filter((updateFromTx) => {\n\t\t\t\t\t\t\t\t\t\t\tconst target = newest(store)\n\t\t\t\t\t\t\t\t\t\t\tif (`updates` in updateFromTx) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn true\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tconst atomOrFamilyKeys =\n\t\t\t\t\t\t\t\t\t\t\t\ttarget.timelineAtoms.getRelatedKeys(tl.key)\n\n\t\t\t\t\t\t\t\t\t\t\treturn atomOrFamilyKeys\n\t\t\t\t\t\t\t\t\t\t\t\t? [...atomOrFamilyKeys].some(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey === updateFromTx.key ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey === updateFromTx.family?.key,\n\t\t\t\t\t\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t\t\t\t\t\t: false\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t.map((updateFromTx) => {\n\t\t\t\t\t\t\t\t\t\t\tif (`updates` in updateFromTx) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\t\t\t\t...updateFromTx,\n\t\t\t\t\t\t\t\t\t\t\t\t\tupdates: filterUpdates(updateFromTx.updates),\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn updateFromTx\n\t\t\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t\tconst updates = filterUpdates(update.updates)\n\n\t\t\t\t\t\t\t\tconst timelineTransactionUpdate: TimelineTransactionUpdate = {\n\t\t\t\t\t\t\t\t\ttype: `transaction_update`,\n\t\t\t\t\t\t\t\t\ttimestamp: currentTransactionTime,\n\t\t\t\t\t\t\t\t\t...update,\n\t\t\t\t\t\t\t\t\tupdates,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst willCapture =\n\t\t\t\t\t\t\t\t\ttl.shouldCapture?.(timelineTransactionUpdate, tl) ?? true\n\t\t\t\t\t\t\t\tif (willCapture) {\n\t\t\t\t\t\t\t\t\ttl.history.push(timelineTransactionUpdate)\n\t\t\t\t\t\t\t\t\ttl.at = tl.history.length\n\t\t\t\t\t\t\t\t\ttl.subject.next(timelineTransactionUpdate)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttl.transactionKey = null\n\t\t\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t\t\t`⌛`,\n\t\t\t\t\t\t\t\t`timeline`,\n\t\t\t\t\t\t\t\ttl.key,\n\t\t\t\t\t\t\t\t`got a transaction_update \"${update.key}\"`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t} else if (currentSelectorKey && currentSelectorTime) {\n\t\t\t\tlet latestUpdate: TimelineUpdate<any> | undefined = tl.history.at(-1)\n\n\t\t\t\tif (currentSelectorTime !== tl.selectorTime) {\n\t\t\t\t\tlatestUpdate = {\n\t\t\t\t\t\ttype: `selector_update`,\n\t\t\t\t\t\ttimestamp: currentSelectorTime,\n\t\t\t\t\t\tkey: currentSelectorKey,\n\t\t\t\t\t\tatomUpdates: [],\n\t\t\t\t\t}\n\t\t\t\t\tlatestUpdate.atomUpdates.push({\n\t\t\t\t\t\tkey: atom.key,\n\t\t\t\t\t\ttype: `atom_update`,\n\t\t\t\t\t\t...update,\n\t\t\t\t\t})\n\t\t\t\t\tif (tl.at !== tl.history.length) {\n\t\t\t\t\t\ttl.history.splice(tl.at)\n\t\t\t\t\t}\n\n\t\t\t\t\ttl.history.push(latestUpdate)\n\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`⌛`,\n\t\t\t\t\t\t`timeline`,\n\t\t\t\t\t\ttl.key,\n\t\t\t\t\t\t`got a selector_update \"${currentSelectorKey}\" with`,\n\t\t\t\t\t\tlatestUpdate.atomUpdates.map((atomUpdate) => atomUpdate.key),\n\t\t\t\t\t)\n\n\t\t\t\t\ttl.at = tl.history.length\n\t\t\t\t\ttl.selectorTime = currentSelectorTime\n\t\t\t\t} else {\n\t\t\t\t\tif (latestUpdate?.type === `selector_update`) {\n\t\t\t\t\t\tlatestUpdate.atomUpdates.push({\n\t\t\t\t\t\t\tkey: atom.key,\n\t\t\t\t\t\t\ttype: `atom_update`,\n\t\t\t\t\t\t\t...update,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t\t`⌛`,\n\t\t\t\t\t\t\t`timeline`,\n\t\t\t\t\t\t\ttl.key,\n\t\t\t\t\t\t\t`set selector_update \"${currentSelectorKey}\" to`,\n\t\t\t\t\t\t\tlatestUpdate?.atomUpdates.map((atomUpdate) => atomUpdate.key),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (latestUpdate) {\n\t\t\t\t\tconst willCaptureSelectorUpdate =\n\t\t\t\t\t\ttl.shouldCapture?.(latestUpdate, tl) ?? true\n\t\t\t\t\tif (willCaptureSelectorUpdate) {\n\t\t\t\t\t\ttl.subject.next(latestUpdate)\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttl.history.pop()\n\t\t\t\t\t\ttl.at = tl.history.length\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst timestamp = Date.now()\n\t\t\t\ttl.selectorTime = null\n\t\t\t\tif (tl.at !== tl.history.length) {\n\t\t\t\t\ttl.history.splice(tl.at)\n\t\t\t\t}\n\t\t\t\tconst atomUpdate: TimelineAtomUpdate<any> = {\n\t\t\t\t\ttype: `atom_update`,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\tkey: atom.key,\n\t\t\t\t\toldValue: update.oldValue,\n\t\t\t\t\tnewValue: update.newValue,\n\t\t\t\t}\n\t\t\t\tif (atom.family) {\n\t\t\t\t\tatomUpdate.family = atom.family\n\t\t\t\t}\n\t\t\t\tconst willCapture = tl.shouldCapture?.(atomUpdate, tl) ?? true\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`⌛`,\n\t\t\t\t\t`timeline`,\n\t\t\t\t\ttl.key,\n\t\t\t\t\t`got an atom_update to \"${atom.key}\"`,\n\t\t\t\t)\n\t\t\t\tif (willCapture) {\n\t\t\t\t\ttl.history.push(atomUpdate)\n\t\t\t\t\ttl.at = tl.history.length\n\t\t\t\t\ttl.subject.next(atomUpdate)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n}\n","import type { AtomFamily, MutableAtomFamily } from \"atom.io\"\n\nimport type { MutableAtom } from \".\"\nimport type { Atom } from \"../atom\"\n\nexport function isMutable(atom: Atom<any>): atom is MutableAtom<any>\nexport function isMutable(\n\tfamily: AtomFamily<any, any>,\n): family is MutableAtomFamily<any, any, any>\nexport function isMutable(\n\tatomOrTokenOrFamily: Atom<any> | AtomFamily<any, any>,\n): boolean {\n\tif (`mutable` in atomOrTokenOrFamily) {\n\t\treturn atomOrTokenOrFamily.mutable\n\t}\n\treturn false\n}\n","import type {\n\tAtomFamily,\n\tAtomToken,\n\tFamilyMetadata,\n\tStateUpdate,\n\tTimelineManageable,\n\tTimelineOptions,\n\tTimelineToken,\n\tTimelineUpdate,\n\tTokenType,\n\tTransactionUpdate,\n\tƒn,\n} from \"atom.io\"\n\nimport { newest } from \"../lineage\"\nimport { getUpdateToken } from \"../mutable\"\nimport { getUpdateFamily } from \"../mutable/get-update-family\"\nimport { isMutable } from \"../mutable/is-mutable\"\nimport { type Store, withdraw } from \"../store\"\nimport { Subject } from \"../subject\"\nimport { addAtomToTimeline } from \"./add-atom-to-timeline\"\n\nexport type TimelineAtomUpdate<ManagedAtom extends TimelineManageable> =\n\tStateUpdate<TokenType<ManagedAtom>> & {\n\t\tkey: string\n\t\ttype: `atom_update`\n\t\ttimestamp: number\n\t\tfamily?: FamilyMetadata\n\t}\nexport type TimelineSelectorUpdate<ManagedAtom extends TimelineManageable> = {\n\tkey: string\n\ttype: `selector_update`\n\ttimestamp: number\n\tatomUpdates: Omit<TimelineAtomUpdate<ManagedAtom>, `timestamp`>[]\n}\nexport type TimelineTransactionUpdate = TransactionUpdate<ƒn> & {\n\tkey: string\n\ttype: `transaction_update`\n\ttimestamp: number\n}\n\nexport type Timeline<ManagedAtom extends TimelineManageable> = {\n\ttype: `timeline`\n\tkey: string\n\tat: number\n\tshouldCapture?: (\n\t\tupdate: TimelineUpdate<TimelineManageable>,\n\t\ttimeline: Timeline<ManagedAtom>,\n\t) => boolean\n\ttimeTraveling: `into_future` | `into_past` | null\n\thistory: TimelineUpdate<ManagedAtom>[]\n\tselectorTime: number | null\n\ttransactionKey: string | null\n\tinstall: (store: Store) => void\n\tsubject: Subject<\n\t\t| TimelineAtomUpdate<ManagedAtom>\n\t\t| TimelineSelectorUpdate<ManagedAtom>\n\t\t| TimelineTransactionUpdate\n\t\t| `redo`\n\t\t| `undo`\n\t>\n}\n\nexport function createTimeline<ManagedAtom extends TimelineManageable>(\n\toptions: TimelineOptions<ManagedAtom>,\n\tstore: Store,\n\tdata?: Timeline<ManagedAtom>,\n): TimelineToken<ManagedAtom> {\n\tconst tl: Timeline<ManagedAtom> = {\n\t\ttype: `timeline`,\n\t\tkey: options.key,\n\t\tat: 0,\n\t\ttimeTraveling: null,\n\t\tselectorTime: null,\n\t\ttransactionKey: null,\n\t\t...data,\n\t\thistory: data?.history.map((update) => ({ ...update })) ?? [],\n\t\tinstall: (store) => createTimeline(options, store, tl),\n\t\tsubject: new Subject(),\n\t}\n\tif (options.shouldCapture) {\n\t\ttl.shouldCapture = options.shouldCapture\n\t}\n\tconst timelineKey = options.key\n\tconst target = newest(store)\n\tfor (const tokenOrFamily of options.atoms) {\n\t\tlet atomKey = tokenOrFamily.key\n\t\tconst existingTimelineKey = target.timelineAtoms.getRelatedKey(atomKey)\n\t\tif (existingTimelineKey) {\n\t\t\tstore.logger.error(\n\t\t\t\t`❌`,\n\t\t\t\t`timeline`,\n\t\t\t\toptions.key,\n\t\t\t\t`Failed to add atom \"${atomKey}\" because it already belongs to timeline \"${existingTimelineKey}\"`,\n\t\t\t)\n\t\t\tcontinue\n\t\t}\n\t\tif (tokenOrFamily.type === `atom_family`) {\n\t\t\tlet family: AtomFamily<any> = tokenOrFamily\n\t\t\tif (isMutable(family)) {\n\t\t\t\tfamily = getUpdateFamily(family, store)\n\t\t\t\tatomKey = family.key\n\t\t\t}\n\t\t\tfamily.subject.subscribe(`timeline:${options.key}`, (token) => {\n\t\t\t\taddAtomToTimeline(token, tl, store)\n\t\t\t})\n\t\t\tfor (const atom of target.atoms.values()) {\n\t\t\t\tif (atom.family?.key === family.key) {\n\t\t\t\t\taddAtomToTimeline(atom, tl, store)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tlet atom = withdraw(tokenOrFamily, store)\n\t\t\tif (atom === undefined) {\n\t\t\t\tstore.logger.error(\n\t\t\t\t\t`❌`,\n\t\t\t\t\t`timeline`,\n\t\t\t\t\toptions.key,\n\t\t\t\t\t`Failed to add atom \"${atomKey}\" because it does not exist in the store`,\n\t\t\t\t)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (isMutable(atom)) {\n\t\t\t\tconst updateAtom = withdraw(getUpdateToken(atom), store)\n\t\t\t\tif (updateAtom === undefined) {\n\t\t\t\t\tstore.logger.error(\n\t\t\t\t\t\t`❌`,\n\t\t\t\t\t\t`timeline`,\n\t\t\t\t\t\toptions.key,\n\t\t\t\t\t\t`Failed to add update atom \"${atomKey}\" because it does not exist in the store`,\n\t\t\t\t\t)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tatom = updateAtom\n\t\t\t\tatomKey = atom.key\n\t\t\t}\n\t\t\tif (`family` in atom) {\n\t\t\t\tconst familyTimelineKey = target.timelineAtoms.getRelatedKey(\n\t\t\t\t\tatom.family.key,\n\t\t\t\t)\n\t\t\t\tif (familyTimelineKey) {\n\t\t\t\t\tstore.logger.error(\n\t\t\t\t\t\t`❌`,\n\t\t\t\t\t\t`timeline`,\n\t\t\t\t\t\toptions.key,\n\t\t\t\t\t\t`Failed to add atom \"${atom.key}\" because its family \"${atom.family.key}\" already belongs to timeline \"${familyTimelineKey}\"`,\n\t\t\t\t\t)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t\taddAtomToTimeline(atom, tl, store)\n\t\t}\n\t\ttarget.timelineAtoms.set({ atomKey, timelineKey })\n\t}\n\n\tstore.timelines.set(options.key, tl)\n\tconst token: TimelineToken<ManagedAtom> = {\n\t\tkey: timelineKey,\n\t\ttype: `timeline`,\n\t}\n\tstore.on.timelineCreation.next(token)\n\treturn token\n}\n","import type { TimelineToken } from \"atom.io\"\n\nimport {\n\tingestAtomUpdate,\n\tingestSelectorUpdate,\n\tingestTransactionUpdate,\n} from \"../ingest-updates\"\nimport type { Store } from \"../store\"\n\nexport const timeTravel = (\n\taction: `redo` | `undo`,\n\ttoken: TimelineToken<any>,\n\tstore: Store,\n): void => {\n\tstore.logger.info(\n\t\taction === `redo` ? `⏩` : `⏪`,\n\t\t`timeline`,\n\t\ttoken.key,\n\t\taction,\n\t)\n\tconst timelineData = store.timelines.get(token.key)\n\tif (!timelineData) {\n\t\tstore.logger.error(\n\t\t\t`🐞`,\n\t\t\t`timeline`,\n\t\t\ttoken.key,\n\t\t\t`Failed to ${action}. This timeline has not been initialized.`,\n\t\t)\n\t\treturn\n\t}\n\tif (\n\t\t(action === `redo` && timelineData.at === timelineData.history.length) ||\n\t\t(action === `undo` && timelineData.at === 0)\n\t) {\n\t\tstore.logger.warn(\n\t\t\t`💁`,\n\t\t\t`timeline`,\n\t\t\ttoken.key,\n\t\t\t`Failed to ${action} at the ${\n\t\t\t\taction === `redo` ? `end` : `beginning`\n\t\t\t} of timeline \"${token.key}\". There is nothing to ${action}.`,\n\t\t)\n\t\treturn\n\t}\n\n\ttimelineData.timeTraveling = action === `redo` ? `into_future` : `into_past`\n\tif (action === `undo`) {\n\t\t--timelineData.at\n\t}\n\n\tconst update = timelineData.history[timelineData.at]\n\tconst applying = action === `redo` ? `newValue` : `oldValue`\n\n\tswitch (update.type) {\n\t\tcase `atom_update`: {\n\t\t\tingestAtomUpdate(applying, update, store)\n\t\t\tbreak\n\t\t}\n\t\tcase `selector_update`: {\n\t\t\tingestSelectorUpdate(applying, update, store)\n\t\t\tbreak\n\t\t}\n\t\tcase `transaction_update`: {\n\t\t\tingestTransactionUpdate(applying, update, store)\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif (action === `redo`) {\n\t\t++timelineData.at\n\t}\n\n\ttimelineData.subject.next(action)\n\ttimelineData.timeTraveling = null\n\tstore.logger.info(\n\t\t`⏹️`,\n\t\t`timeline`,\n\t\ttoken.key,\n\t\t`\"${token.key}\" is now at ${timelineData.at} / ${timelineData.history.length}`,\n\t)\n}\n","import { newest } from \"../lineage\"\nimport type { Store } from \"../store\"\n\nexport const abortTransaction = (store: Store): void => {\n\tconst target = newest(store)\n\tif (target.transactionMeta === null || target.parent === null) {\n\t\tstore.logger.warn(\n\t\t\t`🐞`,\n\t\t\t`transaction`,\n\t\t\t`???`,\n\t\t\t`abortTransaction called outside of a transaction. This is probably a bug in AtomIO.`,\n\t\t)\n\t\treturn\n\t}\n\tstore.logger.info(\n\t\t`🪂`,\n\t\t`transaction`,\n\t\ttarget.transactionMeta.update.key,\n\t\t`Aborting transaction`,\n\t)\n\ttarget.parent.child = null\n}\n","import type { ƒn } from \"atom.io\"\n\nimport { ingestTransactionUpdate } from \"../ingest-updates\"\nimport { newest } from \"../lineage\"\nimport { withdraw } from \"../store\"\nimport type { Store } from \"../store\"\n\nexport const applyTransaction = <ƒ extends ƒn>(\n\toutput: ReturnType<ƒ>,\n\tstore: Store,\n): void => {\n\tconst child = newest(store)\n\tconst { parent } = child\n\tif (\n\t\tparent === null ||\n\t\tchild.transactionMeta === null ||\n\t\tchild.transactionMeta?.phase !== `building`\n\t) {\n\t\tstore.logger.warn(\n\t\t\t`🐞`,\n\t\t\t`transaction`,\n\t\t\t`???`,\n\t\t\t`applyTransaction called outside of a transaction. This is probably a bug in AtomIO.`,\n\t\t)\n\t\treturn\n\t}\n\tchild.transactionMeta.phase = `applying`\n\tchild.transactionMeta.update.output = output\n\tparent.child = null\n\tparent.on.transactionApplying.next(child.transactionMeta)\n\tconst { updates } = child.transactionMeta.update\n\tstore.logger.info(\n\t\t`🛄`,\n\t\t`transaction`,\n\t\tchild.transactionMeta.update.key,\n\t\t`Applying transaction with ${updates.length} updates:`,\n\t\tupdates,\n\t)\n\tfor (const tracker of child.trackers.values()) {\n\t\tconst mutableKey = tracker.mutableState.key\n\t\tif (!parent.atoms.has(mutableKey)) {\n\t\t\tconst atom = child.atoms.get(mutableKey)\n\t\t\tatom?.install(parent)\n\t\t}\n\t\ttracker.dispose()\n\t}\n\tfor (const atom of child.atoms.values()) {\n\t\tif (!parent.atoms.has(atom.key)) {\n\t\t\tparent.atoms.set(atom.key, atom)\n\t\t\tparent.valueMap.set(atom.key, atom.default)\n\t\t\tparent.logger.info(\n\t\t\t\t`🔨`,\n\t\t\t\t`transaction`,\n\t\t\t\tchild.transactionMeta.update.key,\n\t\t\t\t`Adding atom \"${atom.key}\"`,\n\t\t\t)\n\t\t}\n\t}\n\tingestTransactionUpdate(`newValue`, child.transactionMeta.update, parent)\n\tif (parent.transactionMeta === null) {\n\t\tconst myTransaction = withdraw<ƒ>(\n\t\t\t{ key: child.transactionMeta.update.key, type: `transaction` },\n\t\t\tstore,\n\t\t)\n\t\tmyTransaction?.subject.next(child.transactionMeta.update)\n\t\tstore.logger.info(\n\t\t\t`🛬`,\n\t\t\t`transaction`,\n\t\t\tchild.transactionMeta.update.key,\n\t\t\t`Finished applying transaction.`,\n\t\t)\n\t} else {\n\t\tparent.transactionMeta.update.updates.push(child.transactionMeta.update)\n\t}\n\tparent.on.transactionApplying.next(null)\n}\n","import { findInStore, getState, runTransaction, setState } from \"atom.io\"\nimport type { findState } from \"atom.io\"\n\nimport { Junction } from \"~/packages/rel8/junction/src\"\n\nimport { getEnvironmentData } from \"../get-environment-data\"\nimport { LazyMap } from \"../lazy-map\"\nimport { newest } from \"../lineage\"\nimport type { Store } from \"../store\"\n\nexport const buildTransaction = (\n\tkey: string,\n\tparams: any[],\n\tstore: Store,\n\tid?: string,\n): void => {\n\tconst parent = newest(store)\n\tconst child: Store = {\n\t\tparent,\n\t\tchild: null,\n\t\ton: parent.on,\n\t\tloggers: parent.loggers,\n\t\tlogger: parent.logger,\n\t\tconfig: parent.config,\n\t\ttransactionMeta: null,\n\t\tatoms: new LazyMap(parent.atoms),\n\t\tatomsThatAreDefault: new Set(parent.atomsThatAreDefault),\n\t\tfamilies: new LazyMap(parent.families),\n\t\toperation: { open: false },\n\t\treadonlySelectors: new LazyMap(parent.readonlySelectors),\n\t\ttimelines: new LazyMap(parent.timelines),\n\t\ttimelineAtoms: new Junction(parent.timelineAtoms.toJSON()),\n\t\ttrackers: new Map(),\n\t\ttransactions: new LazyMap(parent.transactions),\n\t\tselectorAtoms: new Junction(parent.selectorAtoms.toJSON()),\n\t\tselectorGraph: new Junction(parent.selectorGraph.toJSON(), {\n\t\t\tmakeContentKey: (...keys) => keys.sort().join(`:`),\n\t\t}),\n\t\tselectors: new LazyMap(parent.selectors),\n\t\tvalueMap: new LazyMap(parent.valueMap),\n\t}\n\tchild.transactionMeta = {\n\t\tphase: `building`,\n\t\ttime: Date.now(),\n\t\tupdate: {\n\t\t\tkey,\n\t\t\tid: id ?? Math.random().toString(36).slice(2),\n\t\t\tupdates: [],\n\t\t\tparams,\n\t\t\toutput: undefined,\n\t\t},\n\t\ttransactors: {\n\t\t\tget: (token) => getState(token, child),\n\t\t\tset: (token, value) => setState(token, value, child),\n\t\t\trun: (token) => runTransaction(token, child),\n\t\t\tfind: ((token, key) => findInStore(token, key, child)) as typeof findState,\n\t\t\tenv: () => getEnvironmentData(child),\n\t\t},\n\t}\n\tparent.child = child\n\tstore.logger.info(\n\t\t`🛫`,\n\t\t`transaction`,\n\t\tkey,\n\t\t`Building transaction with params:`,\n\t\tparams,\n\t)\n}\n","import type {\n\tTransactionOptions,\n\tTransactionToken,\n\tTransactionUpdate,\n\tƒn,\n} from \"atom.io\"\n\nimport { newest } from \"../lineage\"\nimport { deposit } from \"../store\"\nimport type { Store } from \"../store\"\nimport { Subject } from \"../subject\"\nimport { abortTransaction } from \"./abort-transaction\"\nimport { applyTransaction } from \"./apply-transaction\"\nimport { buildTransaction } from \"./build-transaction\"\n\nexport type Transaction<ƒ extends ƒn> = {\n\tkey: string\n\ttype: `transaction`\n\tinstall: (store: Store) => void\n\tsubject: Subject<TransactionUpdate<ƒ>>\n\trun: (parameters: Parameters<ƒ>, id?: string) => ReturnType<ƒ>\n}\n\nexport function createTransaction<ƒ extends ƒn>(\n\toptions: TransactionOptions<ƒ>,\n\tstore: Store,\n): TransactionToken<ƒ> {\n\tconst newTransaction: Transaction<ƒ> = {\n\t\tkey: options.key,\n\t\ttype: `transaction`,\n\t\trun: (params: Parameters<ƒ>, id?: string) => {\n\t\t\tbuildTransaction(options.key, params, store, id)\n\t\t\ttry {\n\t\t\t\tconst target = newest(store)\n\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: this happens right above\n\t\t\t\tconst { transactors } = target.transactionMeta!\n\t\t\t\tconst output = options.do(transactors, ...params)\n\t\t\t\tapplyTransaction(output, target)\n\t\t\t\treturn output\n\t\t\t} catch (thrown) {\n\t\t\t\tabortTransaction(target)\n\t\t\t\tstore.logger.warn(`💥`, `transaction`, options.key, `caught:`, thrown)\n\t\t\t\tthrow thrown\n\t\t\t}\n\t\t},\n\t\tinstall: (store) => createTransaction(options, store),\n\t\tsubject: new Subject(),\n\t}\n\tconst target = newest(store)\n\ttarget.transactions.set(newTransaction.key, newTransaction)\n\tconst token = deposit(newTransaction)\n\tstore.on.transactionCreation.next(token)\n\treturn token\n}\n","import type { TransactionUpdate, TransactorsWithRunAndEnv, ƒn } from \"atom.io\"\n\nexport * from \"./abort-transaction\"\nexport * from \"./apply-transaction\"\nexport * from \"./build-transaction\"\nexport * from \"./create-transaction\"\n\nexport const TRANSACTION_PHASES = [`idle`, `building`, `applying`] as const\nexport type TransactionPhase = (typeof TRANSACTION_PHASES)[number]\n\nexport type TransactionMeta<ƒ extends ƒn> = {\n\tphase: `applying` | `building`\n\ttime: number\n\tupdate: TransactionUpdate<ƒ>\n\ttransactors: TransactorsWithRunAndEnv\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/mutable/create-mutable-atom.ts","../src/lineage.ts","../src/store/deposit.ts","../src/store/store.ts","../src/subject.ts","../src/store/withdraw.ts","../src/store/withdraw-new-family-member.ts","../src/future.ts","../src/set-state/copy-mutable-if-needed.ts","../src/set-state/copy-mutable-in-transaction.ts","../src/caching.ts","../src/read-or-compute-value.ts","../src/selector/register-selector.ts","../src/set-state/become.ts","../src/operation.ts","../src/set-state/emit-update.ts","../src/set-state/evict-downstream.ts","../src/set-state/stow-update.ts","../src/set-state/set-atom.ts","../src/set-state/set-atom-or-selector.ts","../src/keys.ts","../src/selector/get-selector-dependency-keys.ts","../src/selector/trace-selector-atoms.ts","../src/selector/update-selector-atoms.ts","../src/selector/create-readonly-selector.ts","../src/selector/create-writable-selector.ts","../src/selector/create-standalone-selector.ts","../src/selector/delete-selector.ts","../src/subscribe/recall-state.ts","../src/subscribe/subscribe-to-root-atoms.ts","../src/subscribe/subscribe-to-state.ts","../src/subscribe/subscribe-to-timeline.ts","../src/subscribe/subscribe-to-transaction.ts","../src/mutable/tracker.ts","../src/mutable/create-mutable-atom-family.ts","../src/mutable/tracker-family.ts","../src/families/create-regular-atom-family.ts","../src/families/create-atom-family.ts","../src/families/create-readonly-selector-family.ts","../src/families/create-writable-selector-family.ts","../src/families/create-selector-family.ts","../src/mutable/get-json-family.ts","../src/mutable/get-json-token.ts","../src/mutable/get-update-token.ts","../src/mutable/is-mutable.ts","../src/mutable/transceiver.ts","../src/atom/create-regular-atom.ts","../src/atom/is-default.ts","../src/atom/create-standalone-atom.ts","../src/atom/delete-atom.ts","../src/get-environment-data.ts","../src/ingest-updates/ingest-atom-update.ts","../src/ingest-updates/ingest-selector-update.ts","../src/ingest-updates/ingest-transaction-update.ts","../src/lazy-map.ts","../src/not-found-error.ts","../src/timeline/add-atom-to-timeline.ts","../src/timeline/create-timeline.ts","../src/timeline/time-travel.ts","../src/transaction/abort-transaction.ts","../src/transaction/apply-transaction.ts","../src/transaction/build-transaction.ts","../src/transaction/create-transaction.ts","../src/transaction/index.ts"],"names":["setState","withdraw","target","update","unsubscribe","store","stringifyJson","isMutable","_a","_b","updates","token","findInStore","getState","key"],"mappings":"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","sourcesContent":["import type { UpdateHandler } from \"atom.io\"\nimport type {\n\tFamilyMetadata,\n\tMutableAtomOptions,\n\tMutableAtomToken,\n} from \"atom.io\"\nimport { setState } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { selectJson } from \"atom.io/json\"\n\nimport { type MutableAtom, cacheValue } from \"..\"\nimport { createRegularAtom, markAtomAsDefault } from \"../atom\"\nimport { newest } from \"../lineage\"\nimport { type Store, deposit } from \"../store\"\nimport { Subject } from \"../subject\"\nimport { subscribeToState } from \"../subscribe\"\nimport { Tracker } from \"./tracker\"\nimport type { Transceiver } from \"./transceiver\"\n\nexport function createMutableAtom<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(\n\toptions: MutableAtomOptions<T, J>,\n\tfamily: FamilyMetadata | undefined,\n\tstore: Store,\n): MutableAtomToken<T, J> {\n\tstore.logger.info(\n\t\t`🔨`,\n\t\t`atom`,\n\t\toptions.key,\n\t\t`creating in store \"${store.config.name}\"`,\n\t)\n\tconst target = newest(store)\n\tconst existing = target.atoms.get(options.key)\n\tif (existing && existing.type === `mutable_atom`) {\n\t\tstore.logger.error(\n\t\t\t`❌`,\n\t\t\t`atom`,\n\t\t\toptions.key,\n\t\t\t`Tried to create atom, but it already exists in the store.`,\n\t\t)\n\t\treturn deposit(existing)\n\t}\n\tconst subject = new Subject<{ newValue: T; oldValue: T }>()\n\tconst newAtom: MutableAtom<T, J> = {\n\t\t...options,\n\t\ttype: `mutable_atom`,\n\t\tinstall: (store: Store) => {\n\t\t\tstore.logger.info(\n\t\t\t\t`🛠️`,\n\t\t\t\t`atom`,\n\t\t\t\toptions.key,\n\t\t\t\t`installing in store \"${store.config.name}\"`,\n\t\t\t)\n\t\t\treturn createMutableAtom(options, family, store)\n\t\t},\n\t\tsubject,\n\t} as const\n\tif (family) {\n\t\tnewAtom.family = family\n\t}\n\tconst initialValue = options.default()\n\ttarget.atoms.set(newAtom.key, newAtom)\n\tmarkAtomAsDefault(options.key, store)\n\tcacheValue(options.key, initialValue, subject, target)\n\tconst token = deposit(newAtom)\n\tif (options.effects) {\n\t\tlet effectIndex = 0\n\t\tconst cleanupFunctions: (() => void)[] = []\n\t\tfor (const effect of options.effects) {\n\t\t\tconst cleanup = effect({\n\t\t\t\tsetSelf: (next) => setState(token, next, store),\n\t\t\t\tonSet: (handle: UpdateHandler<T>) =>\n\t\t\t\t\tsubscribeToState(token, handle, `effect[${effectIndex}]`, store),\n\t\t\t})\n\t\t\tif (cleanup) {\n\t\t\t\tcleanupFunctions.push(cleanup)\n\t\t\t}\n\t\t\t++effectIndex\n\t\t}\n\t\tnewAtom.cleanup = () => {\n\t\t\tfor (const cleanup of cleanupFunctions) {\n\t\t\t\tcleanup()\n\t\t\t}\n\t\t}\n\t}\n\n\tnew Tracker(token, store)\n\tselectJson(token, options, store)\n\n\tstore.on.atomCreation.next(token)\n\n\treturn token\n}\n","export interface Lineage {\n\tparent: typeof this | null\n\tchild: typeof this | null\n}\n\nexport function newest<T extends Lineage>(scion: T): T {\n\twhile (scion.child !== null) {\n\t\tscion = scion.child\n\t}\n\treturn scion\n}\n","import type {\n\tMutableAtomToken,\n\tReadableToken,\n\tReadonlySelectorToken,\n\tRegularAtomToken,\n\tSelectorToken,\n\tTransactionToken,\n\tWritableSelectorToken,\n\tWritableToken,\n\tƒn,\n} from \"atom.io\"\n\nimport type {\n\tMutableAtom,\n\tReadableState,\n\tReadonlySelector,\n\tRegularAtom,\n\tTransceiver,\n\tWritableSelector,\n\tWritableState,\n} from \"..\"\nimport type { Transaction } from \"../transaction\"\n\nexport function deposit<T>(state: RegularAtom<T>): RegularAtomToken<T>\nexport function deposit<T extends Transceiver<any>>(\n\tstate: MutableAtom<T, any>,\n): MutableAtomToken<T, any>\nexport function deposit<T>(state: WritableSelector<T>): WritableSelectorToken<T>\nexport function deposit<T>(state: ReadonlySelector<T>): ReadonlySelectorToken<T>\nexport function deposit<T>(state: WritableState<T>): WritableToken<T>\nexport function deposit<T>(\n\tstate: Transaction<T extends ƒn ? T : never>,\n): TransactionToken<T>\nexport function deposit<T>(state: ReadableState<T>): ReadableToken<T>\nexport function deposit<T>(\n\tstate:\n\t\t| ReadonlySelector<T>\n\t\t| RegularAtom<T>\n\t\t| Transaction<T extends ƒn ? T : never>\n\t\t| WritableSelector<T>\n\t\t| (T extends Transceiver<any> ? MutableAtom<T, any> : never),\n):\n\t| MutableAtomToken<T extends Transceiver<any> ? T : never, any>\n\t| RegularAtomToken<T>\n\t| SelectorToken<T>\n\t| TransactionToken<T> {\n\tconst token = {\n\t\tkey: state.key,\n\t\ttype: state.type,\n\t} as any\n\tif (`family` in state) {\n\t\ttoken.family = state.family\n\t}\n\treturn token\n}\n","import { AtomIOLogger } from \"atom.io\"\nimport type {\n\tAtomToken,\n\tLogger,\n\tMutableAtomFamily,\n\tReadonlySelectorFamily,\n\tReadonlySelectorToken,\n\tRegularAtomFamily,\n\tRegularAtomToken,\n\tTimelineToken,\n\tTransactionToken,\n\tWritableSelectorFamily,\n\tWritableSelectorToken,\n\tƒn,\n} from \"atom.io\"\n\nimport { Junction } from \"~/packages/rel8/junction/src\"\n\nimport type {\n\tAtom,\n\tReadonlySelector,\n\tTracker,\n\tTransceiver,\n\tWritableSelector,\n} from \"..\"\nimport type { Lineage } from \"../lineage\"\nimport { getJsonToken, getUpdateToken } from \"../mutable\"\nimport type { OperationProgress } from \"../operation\"\nimport { StatefulSubject, Subject } from \"../subject\"\nimport type { Timeline } from \"../timeline\"\nimport type { Transaction, TransactionMeta } from \"../transaction\"\n\nexport class Store implements Lineage {\n\tpublic parent: Store | null = null\n\tpublic child: Store | null = null\n\n\tpublic valueMap = new Map<string, any>()\n\n\tpublic atoms = new Map<string, Atom<any>>()\n\tpublic selectors = new Map<string, WritableSelector<any>>()\n\tpublic readonlySelectors = new Map<string, ReadonlySelector<any>>()\n\n\tpublic trackers = new Map<string, Tracker<Transceiver<any>>>()\n\tpublic families = new Map<\n\t\tstring,\n\t\t| MutableAtomFamily<any, any, any>\n\t\t| ReadonlySelectorFamily<any, any>\n\t\t| RegularAtomFamily<any, any>\n\t\t| WritableSelectorFamily<any, any>\n\t>()\n\n\tpublic timelines = new Map<string, Timeline<any>>()\n\tpublic transactions = new Map<string, Transaction<ƒn>>()\n\n\tpublic atomsThatAreDefault = new Set<string>()\n\n\tpublic timelineAtoms = new Junction({\n\t\tbetween: [`timelineKey`, `atomKey`],\n\t\tcardinality: `1:n`,\n\t})\n\tpublic selectorAtoms = new Junction({\n\t\tbetween: [`selectorKey`, `atomKey`],\n\t\tcardinality: `n:n`,\n\t})\n\tpublic selectorGraph = new Junction<\n\t\t`upstreamSelectorKey`,\n\t\t`downstreamSelectorKey`,\n\t\t{ source: string }\n\t>(\n\t\t{\n\t\t\tbetween: [`upstreamSelectorKey`, `downstreamSelectorKey`],\n\t\t\tcardinality: `n:n`,\n\t\t},\n\t\t{\n\t\t\tmakeContentKey: (...keys) => keys.sort().join(`:`),\n\t\t},\n\t)\n\n\tpublic on = {\n\t\tatomCreation: new Subject<AtomToken<unknown>>(),\n\t\tselectorCreation: new Subject<\n\t\t\tReadonlySelectorToken<unknown> | WritableSelectorToken<unknown>\n\t\t>(),\n\t\ttransactionCreation: new Subject<TransactionToken<ƒn>>(),\n\t\ttimelineCreation: new Subject<TimelineToken<unknown>>(),\n\t\ttransactionApplying: new StatefulSubject<TransactionMeta<ƒn> | null>(null),\n\t\toperationClose: new Subject<OperationProgress>(),\n\t}\n\tpublic operation: OperationProgress = { open: false }\n\tpublic transactionMeta: TransactionMeta<ƒn> | null = null\n\n\tpublic config: {\n\t\tname: string\n\t} = {\n\t\tname: `IMPLICIT_STORE`,\n\t}\n\n\tpublic loggers: AtomIOLogger[] = [\n\t\tnew AtomIOLogger(`warn`, (_, __, key) => !key.includes(`👁🗨`)),\n\t]\n\tpublic logger: Logger = {\n\t\terror: (...messages) => {\n\t\t\tfor (const logger of this.loggers) logger.error(...messages)\n\t\t},\n\t\tinfo: (...messages) => {\n\t\t\tfor (const logger of this.loggers) logger.info(...messages)\n\t\t},\n\t\twarn: (...messages) => {\n\t\t\tfor (const logger of this.loggers) logger.warn(...messages)\n\t\t},\n\t}\n\n\tpublic constructor(name: string, store: Store | null = null) {\n\t\tif (store !== null) {\n\t\t\tthis.valueMap = new Map(store?.valueMap)\n\t\t\tthis.operation = { ...store?.operation }\n\t\t\tthis.transactionMeta = null\n\t\t\tthis.config = {\n\t\t\t\t...store?.config,\n\t\t\t\tname,\n\t\t\t}\n\t\t\tfor (const [, family] of store.families) {\n\t\t\t\tfamily.install(this)\n\t\t\t}\n\t\t\tconst mutableHelpers = new Set<string>()\n\t\t\tfor (const [, atom] of store.atoms) {\n\t\t\t\tif (mutableHelpers.has(atom.key)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tatom.install(this)\n\t\t\t\tif (atom.type === `mutable_atom`) {\n\t\t\t\t\tconst originalJsonToken = getJsonToken(atom)\n\t\t\t\t\tconst originalUpdateToken = getUpdateToken(atom)\n\t\t\t\t\tmutableHelpers.add(originalJsonToken.key)\n\t\t\t\t\tmutableHelpers.add(originalUpdateToken.key)\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const [, selector] of store.readonlySelectors) {\n\t\t\t\tselector.install(this)\n\t\t\t}\n\t\t\tfor (const [, selector] of store.selectors) {\n\t\t\t\tif (mutableHelpers.has(selector.key)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tselector.install(this)\n\t\t\t}\n\t\t\tfor (const [, tx] of store.transactions) {\n\t\t\t\ttx.install(this)\n\t\t\t}\n\t\t\tfor (const [, timeline] of store.timelines) {\n\t\t\t\ttimeline.install(this)\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport const IMPLICIT = {\n\tSTORE_INTERNAL: undefined as Store | undefined,\n\tget STORE(): Store {\n\t\treturn (\n\t\t\tthis.STORE_INTERNAL ?? (this.STORE_INTERNAL = new Store(`IMPLICIT_STORE`))\n\t\t)\n\t},\n}\n\nexport const clearStore = (store: Store): void => {\n\tconst { config } = store\n\tObject.assign(store, new Store(config.name))\n\tstore.config = config\n}\n","export class Subject<T> {\n\tpublic Subscriber: (value: T) => void\n\n\tpublic subscribers: Map<string, this[`Subscriber`]> = new Map()\n\n\tpublic subscribe(key: string, subscriber: this[`Subscriber`]): () => void {\n\t\tthis.subscribers.set(key, subscriber)\n\t\tconst unsubscribe = () => this.unsubscribe(key)\n\t\treturn unsubscribe\n\t}\n\n\tprivate unsubscribe(key: string) {\n\t\tthis.subscribers.delete(key)\n\t}\n\n\tpublic next(value: T): void {\n\t\tconst subscribers = this.subscribers.values()\n\t\tfor (const subscriber of subscribers) {\n\t\t\tsubscriber(value)\n\t\t}\n\t}\n}\n\nexport class StatefulSubject<T> extends Subject<T> {\n\tpublic state: T\n\n\tpublic constructor(initialState: T) {\n\t\tsuper()\n\t\tthis.state = initialState\n\t}\n\n\tpublic next(value: T): void {\n\t\tthis.state = value\n\t\tsuper.next(value)\n\t}\n}\n","import type {\n\tAtomToken,\n\tMutableAtomToken,\n\tReadableToken,\n\tReadonlySelectorToken,\n\tRegularAtomToken,\n\tSelectorToken,\n\tTimelineManageable,\n\tTimelineToken,\n\tTransactionToken,\n\tWritableSelectorToken,\n\tWritableToken,\n\tƒn,\n} from \"atom.io\"\n\nimport type {\n\tAtom,\n\tMutableAtom,\n\tReadableState,\n\tReadonlySelector,\n\tRegularAtom,\n\tSelector,\n\tTransceiver,\n\tWritableSelector,\n\tWritableState,\n} from \"..\"\nimport type { Timeline } from \"../timeline\"\nimport type { Transaction } from \"../transaction\"\nimport type { Store } from \"./store\"\n\nexport type Withdrawable = ReadableState<any> | Timeline<any> | Transaction<any>\n\nexport function withdraw<T>(\n\ttoken: RegularAtomToken<T>,\n\tstore: Store,\n): RegularAtom<T> | undefined\nexport function withdraw<T extends Transceiver<any>>(\n\ttoken: MutableAtomToken<T, any>,\n\tstore: Store,\n): MutableAtom<T, any> | undefined\nexport function withdraw<T>(\n\ttoken: AtomToken<T>,\n\tstore: Store,\n): Atom<T> | undefined\nexport function withdraw<T>(\n\ttoken: WritableSelectorToken<T>,\n\tstore: Store,\n): WritableSelector<T> | undefined\nexport function withdraw<T>(\n\ttoken: ReadonlySelectorToken<T>,\n\tstore: Store,\n): ReadonlySelector<T> | undefined\nexport function withdraw<T>(\n\ttoken: SelectorToken<T>,\n\tstore: Store,\n): Selector<T> | undefined\nexport function withdraw<T>(\n\ttoken: WritableToken<T>,\n\tstore: Store,\n): WritableState<T> | undefined\nexport function withdraw<T>(\n\ttoken: ReadableToken<T>,\n\tstore: Store,\n): ReadableState<T> | undefined\nexport function withdraw<T>(\n\ttoken: TransactionToken<T>,\n\tstore: Store,\n): Transaction<T extends ƒn ? T : never> | undefined\nexport function withdraw<T>(\n\ttoken: TimelineToken<T>,\n\tstore: Store,\n): Timeline<T extends TimelineManageable ? T : never> | undefined\nexport function withdraw<T>(\n\ttoken:\n\t\t| RegularAtomToken<T>\n\t\t| SelectorToken<T>\n\t\t| TimelineToken<T>\n\t\t| TransactionToken<T>\n\t\t| (T extends Transceiver<any> ? MutableAtomToken<T, any> : never),\n\tstore: Store,\n): Withdrawable | undefined {\n\tlet withdrawn: Withdrawable | undefined\n\tlet target: Store | null = store\n\twhile (target !== null) {\n\t\tswitch (token.type) {\n\t\t\tcase `atom`:\n\t\t\tcase `mutable_atom`:\n\t\t\t\twithdrawn = target.atoms.get(token.key)\n\t\t\t\tbreak\n\t\t\tcase `selector`:\n\t\t\t\twithdrawn = target.selectors.get(token.key)\n\t\t\t\tbreak\n\t\t\tcase `readonly_selector`:\n\t\t\t\twithdrawn = target.readonlySelectors.get(token.key)\n\t\t\t\tbreak\n\t\t\tcase `timeline`:\n\t\t\t\twithdrawn = target.timelines.get(token.key)\n\t\t\t\tbreak\n\t\t\tcase `transaction`:\n\t\t\t\twithdrawn = target.transactions.get(token.key)\n\t\t\t\tbreak\n\t\t}\n\t\tif (withdrawn) {\n\t\t\treturn withdrawn\n\t\t}\n\t\ttarget = target.child\n\t}\n}\n","import type {\n\tReadableToken,\n\tReadonlySelectorToken,\n\tRegularAtomToken,\n\tWritableSelectorToken,\n\tWritableToken,\n} from \"atom.io\"\nimport type {\n\tAtom,\n\tReadableState,\n\tReadonlySelector,\n\tStore,\n\tWritableSelector,\n\tWritableState,\n} from \"..\"\nimport { newest, withdraw } from \"..\"\n\nexport function withdrawNewFamilyMember<T>(\n\ttoken: RegularAtomToken<T>,\n\tstore: Store,\n): Atom<T> | undefined\nexport function withdrawNewFamilyMember<T>(\n\ttoken: WritableSelectorToken<T>,\n\tstore: Store,\n): WritableSelector<T> | undefined\nexport function withdrawNewFamilyMember<T>(\n\ttoken: ReadonlySelectorToken<T>,\n\tstore: Store,\n): ReadonlySelector<T> | undefined\nexport function withdrawNewFamilyMember<T>(\n\ttoken: WritableToken<T>,\n\tstore: Store,\n): WritableState<T> | undefined\nexport function withdrawNewFamilyMember<T>(\n\ttoken: ReadableToken<T>,\n\tstore: Store,\n): ReadableState<T> | undefined\nexport function withdrawNewFamilyMember<T>(\n\ttoken: ReadableToken<T>,\n\tstore: Store,\n): ReadableState<T> | undefined {\n\tif (token.family) {\n\t\tstore.logger.info(\n\t\t\t`👪`,\n\t\t\ttoken.type,\n\t\t\ttoken.key,\n\t\t\t`creating new family member in store \"${store.config.name}\"`,\n\t\t)\n\t\tconst target = newest(store)\n\t\tconst family = target.families.get(token.family.key)\n\t\tif (family) {\n\t\t\tconst jsonSubKey = JSON.parse(token.family.subKey)\n\t\t\tfamily(jsonSubKey)\n\t\t\tconst state = withdraw(token, store)\n\t\t\treturn state\n\t\t}\n\t}\n\treturn undefined\n}\n","/**\n * A Promise that can be canceled.\n * @internal\n * @private\n * @typeParam T The type of the value that the promise will resolve to.\n *\n * @remarks\n * Can be constructed like a Promise, or from an existing Promise.\n */\nexport class Future<T> extends Promise<T> {\n\tpublic isCanceled = false\n\n\tpublic constructor(\n\t\texecutor:\n\t\t\t| Promise<T>\n\t\t\t| ((resolve: (value: T) => void, reject: (reason?: any) => void) => void),\n\t) {\n\t\tsuper((resolve, reject) => {\n\t\t\tconst pass = (value: T) =>\n\t\t\t\tthis.isCanceled ? reject(`canceled`) : resolve(value)\n\t\t\tconst fail = (reason: any) =>\n\t\t\t\tthis.isCanceled ? reject(`canceled`) : reject(reason)\n\t\t\tif (typeof executor === `function`) {\n\t\t\t\texecutor(pass, fail)\n\t\t\t} else {\n\t\t\t\texecutor.then(pass, fail)\n\t\t\t}\n\t\t})\n\t}\n\n\tpublic cancel(): void {\n\t\tthis.isCanceled = true\n\t}\n}\n","import type { JsonInterface } from \"atom.io/json\"\n\nimport type { MutableAtom, Transceiver } from \"..\"\nimport { Tracker } from \"../mutable\"\nimport type { Store } from \"../store\"\n\nexport function copyMutableIfNeeded<T extends Transceiver<any>>(\n\tatom: MutableAtom<T, any>,\n\torigin: Store,\n\ttarget: Store,\n): T {\n\tconst originValue = origin.valueMap.get(atom.key)\n\tconst targetValue = target.valueMap.get(atom.key)\n\tif (originValue === targetValue) {\n\t\torigin.logger.info(`📃`, `atom`, `${atom.key}`, `copying`)\n\t\tconst jsonValue = atom.toJson(originValue)\n\t\tconst copiedValue = atom.fromJson(jsonValue)\n\t\ttarget.valueMap.set(atom.key, copiedValue)\n\t\tnew Tracker(atom, origin)\n\t\treturn copiedValue\n\t}\n\treturn targetValue\n}\n","import { newest } from \"..\"\nimport type { Atom, Store } from \"..\"\nimport { copyMutableIfNeeded } from \"./copy-mutable-if-needed\"\n\nexport function copyMutableIfWithinTransaction<T>(\n\toldValue: T,\n\tatom: Atom<T>,\n\tstore: Store,\n): T {\n\tconst target = newest(store)\n\tconst parent = target.parent\n\tif (parent !== null) {\n\t\tif (atom.type === `mutable_atom`) {\n\t\t\tconst copiedValue = copyMutableIfNeeded(atom, parent, target)\n\t\t\treturn copiedValue\n\t\t}\n\t}\n\treturn oldValue\n}\n","import type { StateUpdate } from \"atom.io\"\nimport type { ReadableState } from \".\"\nimport { Future } from \"./future\"\nimport { copyMutableIfWithinTransaction } from \"./set-state/copy-mutable-in-transaction\"\nimport type { Store } from \"./store\"\nimport type { Subject } from \"./subject\"\n\nexport function cacheValue<T>(\n\tkey: string,\n\tvalue: T,\n\tsubject: Subject<StateUpdate<unknown>>,\n\tstore: Store,\n): T\nexport function cacheValue<T extends Promise<any>>(\n\tkey: string,\n\tvalue: T,\n\tsubject: Subject<StateUpdate<unknown>>,\n\tstore: Store,\n): Future<T>\nexport function cacheValue<T>(\n\tkey: string,\n\tvalue: T,\n\tsubject: Subject<StateUpdate<unknown>>,\n\ttarget: Store,\n): Future<T> | T {\n\tconst currentValue = target.valueMap.get(key)\n\tif (currentValue instanceof Future) {\n\t\tcurrentValue.cancel()\n\t}\n\tif (value instanceof Promise) {\n\t\tconst future = new Future<T>(value)\n\t\ttarget.valueMap.set(key, future)\n\t\tfuture\n\t\t\t.then((resolved) => {\n\t\t\t\tif (future.isCanceled) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tcacheValue(key, resolved, subject, target)\n\t\t\t\tsubject.next({ newValue: resolved, oldValue: future })\n\t\t\t})\n\t\t\t.catch((thrown) => {\n\t\t\t\tif (thrown !== `canceled`) {\n\t\t\t\t\ttarget.logger.error(`💥`, `state`, key, `rejected:`, thrown)\n\t\t\t\t}\n\t\t\t})\n\t\treturn future\n\t}\n\ttarget.valueMap.set(key, value)\n\treturn value\n}\n\nexport const readCachedValue = <T>(\n\ttoken: ReadableState<any>,\n\ttarget: Store,\n): T => {\n\tlet value = target.valueMap.get(token.key) as T\n\tif (token.type === `atom`) {\n\t\tvalue = copyMutableIfWithinTransaction(value, token, target)\n\t}\n\treturn value\n}\n\nexport const evictCachedValue = (key: string, target: Store): void => {\n\tconst currentValue = target.valueMap.get(key)\n\tif (currentValue instanceof Future) {\n\t\tcurrentValue.cancel()\n\t}\n\tif (target.operation.open) {\n\t\ttarget.operation.prev.set(key, currentValue)\n\t}\n\ttarget.valueMap.delete(key)\n\ttarget.logger.info(`🗑`, `state`, key, `evicted`)\n}\n","import type { ReadableState } from \".\"\nimport { readCachedValue } from \"./caching\"\nimport type { Store } from \"./store\"\n\nexport const readOrComputeValue = <T>(\n\tstate: ReadableState<T>,\n\ttarget: Store,\n): T => {\n\tif (target.valueMap.has(state.key)) {\n\t\ttarget.logger.info(`📖`, state.type, state.key, `reading cached value`)\n\t\treturn readCachedValue(state, target)\n\t}\n\tif (state.type !== `atom` && state.type !== `mutable_atom`) {\n\t\ttarget.logger.info(`🧮`, state.type, state.key, `computing value`)\n\t\treturn state.get()\n\t}\n\tconst fallback =\n\t\tstate.default instanceof Function ? state.default() : state.default\n\ttarget.logger.info(\n\t\t`💁`,\n\t\t`atom`,\n\t\tstate.key,\n\t\t`could not find cached value; using default`,\n\t\tfallback,\n\t)\n\treturn state.default instanceof Function ? state.default() : state.default\n}\n","import type { Transactors, findState } from \"atom.io\"\nimport { findInStore } from \"atom.io\"\n\nimport { newest } from \"../lineage\"\nimport { readOrComputeValue } from \"../read-or-compute-value\"\nimport { setAtomOrSelector } from \"../set-state\"\nimport type { Store } from \"../store\"\nimport { withdraw } from \"../store\"\nimport { updateSelectorAtoms } from \"./update-selector-atoms\"\n\nexport const registerSelector = (\n\tselectorKey: string,\n\tstore: Store,\n): Transactors => ({\n\tget: (dependency) => {\n\t\tconst target = newest(store)\n\n\t\tconst dependencyState = withdraw(dependency, store)\n\t\tif (dependencyState === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`State \"${dependency.key}\" not found in this store. Did you forget to initialize with the \"atom\" or \"selector\" function?`,\n\t\t\t)\n\t\t}\n\t\tconst dependencyValue = readOrComputeValue(dependencyState, store)\n\n\t\tstore.logger.info(\n\t\t\t`🔌`,\n\t\t\t`selector`,\n\t\t\tselectorKey,\n\t\t\t`registers dependency ( \"${dependency.key}\" =`,\n\t\t\tdependencyValue,\n\t\t\t`)`,\n\t\t)\n\n\t\ttarget.selectorGraph.set(\n\t\t\t{\n\t\t\t\tupstreamSelectorKey: dependency.key,\n\t\t\t\tdownstreamSelectorKey: selectorKey,\n\t\t\t},\n\t\t\t{\n\t\t\t\tsource: dependency.key,\n\t\t\t},\n\t\t)\n\t\tupdateSelectorAtoms(selectorKey, dependency, store)\n\t\treturn dependencyValue\n\t},\n\tset: (WritableToken, newValue) => {\n\t\tconst state = withdraw(WritableToken, store)\n\t\tif (state === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`State \"${WritableToken.key}\" not found in this store. Did you forget to initialize with the \"atom\" or \"selector\" function?`,\n\t\t\t)\n\t\t}\n\t\tsetAtomOrSelector(state, newValue, store)\n\t},\n\tfind: ((token, key) => findInStore(token, key, store)) as typeof findState,\n})\n","export type Modify<T> = (thing: T) => T\n\nexport const become =\n\t<T>(nextVersionOfThing: Modify<T> | T) =>\n\t(originalThing: T): T =>\n\t\tnextVersionOfThing instanceof Function\n\t\t\t? nextVersionOfThing(\n\t\t\t\t\toriginalThing instanceof Function ? originalThing() : originalThing,\n\t\t\t )\n\t\t\t: nextVersionOfThing\n","import type { WritableToken } from \"atom.io\"\n\nimport { newest } from \"./lineage\"\nimport type { Store } from \"./store\"\n\nexport type OperationProgress =\n\t| {\n\t\t\topen: false\n\t }\n\t| {\n\t\t\topen: true\n\t\t\tdone: Set<string>\n\t\t\tprev: Map<string, any>\n\t\t\ttime: number\n\t\t\ttoken: WritableToken<any>\n\t }\n\nexport const openOperation = (\n\ttoken: WritableToken<any>,\n\tstore: Store,\n): `rejection` | undefined => {\n\tif (store.operation.open) {\n\t\tstore.logger.error(\n\t\t\t`❌`,\n\t\t\ttoken.type,\n\t\t\ttoken.key,\n\t\t\t`failed to setState during a setState for \"${store.operation.token.key}\"`,\n\t\t)\n\t\treturn `rejection`\n\t}\n\tstore.operation = {\n\t\topen: true,\n\t\tdone: new Set(),\n\t\tprev: new Map(),\n\t\ttime: Date.now(),\n\t\ttoken,\n\t}\n\tstore.logger.info(\n\t\t`⭕`,\n\t\ttoken.type,\n\t\ttoken.key,\n\t\t`operation start in store \"${store.config.name}\"${\n\t\t\tstore.transactionMeta === null\n\t\t\t\t? ``\n\t\t\t\t: ` ${store.transactionMeta.phase} \"${store.transactionMeta.update.key}\"`\n\t\t}`,\n\t)\n}\nexport const closeOperation = (store: Store): void => {\n\tif (store.operation.open) {\n\t\tstore.logger.info(\n\t\t\t`🔴`,\n\t\t\tstore.operation.token.type,\n\t\t\tstore.operation.token.key,\n\t\t\t`operation done in store \"${store.config.name}\"`,\n\t\t)\n\t}\n\tstore.operation = { open: false }\n\tstore.on.operationClose.next(store.operation)\n}\n\nexport const isDone = (key: string, store: Store): boolean => {\n\tif (!store.operation.open) {\n\t\tstore.logger.warn(\n\t\t\t`🐞`,\n\t\t\t`unknown`,\n\t\t\tkey,\n\t\t\t`isDone called outside of an operation. This is probably a bug.`,\n\t\t)\n\t\treturn true\n\t}\n\treturn store.operation.done.has(key)\n}\nexport const markDone = (key: string, store: Store): void => {\n\tif (!store.operation.open) {\n\t\tstore.logger.warn(\n\t\t\t`🐞`,\n\t\t\t`unknown`,\n\t\t\tkey,\n\t\t\t`markDone called outside of an operation. This is probably a bug.`,\n\t\t)\n\t\treturn\n\t}\n\tstore.operation.done.add(key)\n}\n","import type { StateUpdate } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\n\nimport type { Atom, Selector } from \"..\"\n\nexport const emitUpdate = <T>(\n\tstate: Atom<T> | Selector<T>,\n\tupdate: StateUpdate<T>,\n\tstore: Store,\n): void => {\n\tstore.logger.info(\n\t\t`📢`,\n\t\tstate.type,\n\t\tstate.key,\n\t\t`went (`,\n\t\tupdate.oldValue,\n\t\t`->`,\n\t\tupdate.newValue,\n\t\t`) subscribers:`,\n\t\tstate.subject.subscribers,\n\t)\n\tstate.subject.next(update)\n}\n","import type { Atom } from \"..\"\nimport { evictCachedValue } from \"../caching\"\nimport { isDone, markDone } from \"../operation\"\nimport type { Store } from \"../store\"\n\nexport const evictDownStream = <T>(atom: Atom<T>, store: Store): void => {\n\tconst downstreamKeys = store.selectorAtoms.getRelatedKeys(atom.key)\n\tstore.logger.info(\n\t\t`🧹`,\n\t\tatom.type,\n\t\tatom.key,\n\t\tdownstreamKeys\n\t\t\t? `evicting ${downstreamKeys.size} states downstream:`\n\t\t\t: `no downstream states`,\n\t\tdownstreamKeys ?? `to evict`,\n\t)\n\tif (downstreamKeys) {\n\t\tif (store.operation.open) {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧹`,\n\t\t\t\tatom.type,\n\t\t\t\tatom.key,\n\t\t\t\t`[ ${[...store.operation.done].join(`, `)} ] already done`,\n\t\t\t)\n\t\t}\n\t\tfor (const key of downstreamKeys) {\n\t\t\tif (isDone(key, store)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tevictCachedValue(key, store)\n\t\t\tmarkDone(key, store)\n\t\t}\n\t}\n}\n","import type { KeyedStateUpdate, StateUpdate } from \"atom.io\"\n\nimport type { Atom } from \"..\"\nimport { newest } from \"../lineage\"\nimport { isTransceiver } from \"../mutable\"\nimport type { Store } from \"../store\"\n\nfunction shouldUpdateBeStowed(key: string, update: StateUpdate<any>): boolean {\n\t// do not stow updates that aren't json\n\tif (isTransceiver(update.newValue)) {\n\t\treturn false\n\t}\n\t// do not stow updates where the key contains 👁🗨\n\tif (key.includes(`👁🗨`)) {\n\t\treturn false\n\t}\n\treturn true\n}\n\nexport const stowUpdate = <T>(\n\tstate: Atom<T>,\n\tupdate: StateUpdate<T>,\n\tstore: Store,\n): void => {\n\tconst { key } = state\n\tconst target = newest(store)\n\tif (\n\t\ttarget.transactionMeta === null ||\n\t\ttarget.transactionMeta.phase !== `building`\n\t) {\n\t\tstore.logger.error(\n\t\t\t`🐞`,\n\t\t\t`atom`,\n\t\t\tkey,\n\t\t\t`stowUpdate called outside of a transaction. This is probably a bug.`,\n\t\t)\n\t\treturn\n\t}\n\tconst shouldStow = shouldUpdateBeStowed(key, update)\n\tif (!shouldStow) {\n\t\treturn\n\t}\n\tconst atomUpdate: KeyedStateUpdate<T> = { key, ...update }\n\tif (state.family) {\n\t\tatomUpdate.family = state.family\n\t}\n\ttarget.transactionMeta.update.updates.push(atomUpdate)\n\tstore.logger.info(\n\t\t`📁`,\n\t\t`atom`,\n\t\tkey,\n\t\t`stowed (`,\n\t\tupdate.oldValue,\n\t\t`->`,\n\t\tupdate.newValue,\n\t\t`)`,\n\t)\n}\n","import type { Atom } from \"..\"\nimport { isAtomDefault, markAtomAsNotDefault } from \"../atom\"\nimport { cacheValue } from \"../caching\"\nimport type { Transceiver } from \"../mutable\"\nimport { markDone } from \"../operation\"\nimport { readOrComputeValue } from \"../read-or-compute-value\"\nimport type { Store } from \"../store\"\nimport { become } from \"./become\"\nimport { copyMutableIfWithinTransaction } from \"./copy-mutable-in-transaction\"\nimport { emitUpdate } from \"./emit-update\"\nimport { evictDownStream } from \"./evict-downstream\"\nimport { stowUpdate } from \"./stow-update\"\n\nexport const setAtom = <T>(\n\tatom: Atom<T>,\n\tnext: T | ((oldValue: T) => T),\n\ttarget: Store,\n): void => {\n\tconst oldValue = readOrComputeValue(atom, target)\n\tlet newValue = copyMutableIfWithinTransaction(oldValue, atom, target)\n\tnewValue = become(next)(newValue)\n\ttarget.logger.info(`📝`, `atom`, atom.key, `set to`, newValue)\n\tnewValue = cacheValue(atom.key, newValue, atom.subject, target)\n\tif (isAtomDefault(atom.key, target)) {\n\t\tmarkAtomAsNotDefault(atom.key, target)\n\t}\n\tmarkDone(atom.key, target)\n\tevictDownStream(atom, target)\n\tconst update = { oldValue, newValue }\n\tif (target.transactionMeta === null) {\n\t\temitUpdate(atom, update, target)\n\t} else if (target.on.transactionApplying && target.parent) {\n\t\tstowUpdate(atom, update, target)\n\t\tif (atom.key.startsWith(`*`)) {\n\t\t\tconst mutableKey = atom.key.slice(1)\n\t\t\tconst mutable: Transceiver<any> = target.valueMap.get(mutableKey)\n\t\t\tmutable.do(update.newValue)\n\t\t}\n\t}\n}\n","import type { WritableState } from \"..\"\nimport type { Store } from \"../store\"\nimport { setAtom } from \"./set-atom\"\n\nexport const setAtomOrSelector = <T>(\n\tstate: WritableState<T>,\n\tvalue: T | ((oldValue: T) => T),\n\tstore: Store,\n): void => {\n\tswitch (state.type) {\n\t\tcase `atom`:\n\t\tcase `mutable_atom`:\n\t\t\tsetAtom(state, value, store)\n\t\t\tbreak\n\t\tcase `selector`:\n\t\t\tstate.set(value)\n\t\t\tbreak\n\t}\n}\n","import { newest } from \"./lineage\"\nimport type { Store } from \"./store\"\n\nexport type AtomKey<T> = string & { __atomKey?: never; __brand?: T }\nexport type SelectorKey<T> = string & { __selectorKey?: never; __brand?: T }\nexport type ReadonlySelectorKey<T> = string & {\n\t__readonlySelectorKey?: never\n\t__brand?: T\n}\n\nexport const isAtomKey = (key: string, store: Store): key is AtomKey<unknown> =>\n\tnewest(store).atoms.has(key)\nexport const isSelectorKey = (\n\tkey: string,\n\tstore: Store,\n): key is SelectorKey<unknown> => newest(store).selectors.has(key)\nexport const isReadonlySelectorKey = (\n\tkey: string,\n\tstore: Store,\n): key is ReadonlySelectorKey<unknown> =>\n\tnewest(store).readonlySelectors.has(key)\n\nexport type StateKey<T> = AtomKey<T> | ReadonlySelectorKey<T> | SelectorKey<T>\nexport const isStateKey = (\n\tkey: string,\n\tstore: Store,\n): key is StateKey<unknown> =>\n\tisAtomKey(key, store) ||\n\tisSelectorKey(key, store) ||\n\tisReadonlySelectorKey(key, store)\n","import type { AtomKey, ReadonlySelectorKey, SelectorKey } from \"../keys\"\nimport { isStateKey } from \"../keys\"\nimport { newest } from \"../lineage\"\nimport type { Store } from \"../store\"\n\nexport const getSelectorDependencyKeys = (\n\tkey: string,\n\tstore: Store,\n): (\n\t| AtomKey<unknown>\n\t| ReadonlySelectorKey<unknown>\n\t| SelectorKey<unknown>\n)[] => {\n\tconst sources = newest(store)\n\t\t.selectorGraph.getRelationEntries({ downstreamSelectorKey: key })\n\t\t.filter(([_, { source }]) => source !== key)\n\t\t.map(([_, { source }]) => source)\n\t\t.filter((source) => isStateKey(source, store))\n\treturn sources\n}\n","import type { Selector, Store } from \"..\"\nimport type { AtomKey, StateKey } from \"../keys\"\nimport { isAtomKey } from \"../keys\"\nimport { getSelectorDependencyKeys } from \"./get-selector-dependency-keys\"\n\nexport const traceSelectorAtoms = (\n\tselectorKey: string,\n\tdirectDependencyKey: StateKey<unknown>,\n\tstore: Store,\n): AtomKey<unknown>[] => {\n\tconst rootKeys: AtomKey<unknown>[] = []\n\n\tconst indirectDependencyKeys = getSelectorDependencyKeys(\n\t\tdirectDependencyKey,\n\t\tstore,\n\t)\n\tlet depth = 0\n\twhile (indirectDependencyKeys.length > 0) {\n\t\t// biome-ignore lint/style/noNonNullAssertion: just checked length ^^^\n\t\tconst indirectDependencyKey = indirectDependencyKeys.shift()!\n\t\t++depth\n\t\tif (depth > 99999) {\n\t\t\tthrow new Error(\n\t\t\t\t`Maximum selector dependency depth exceeded (> 99999) in selector \"${selectorKey}\". This is likely due to a circular dependency.`,\n\t\t\t)\n\t\t}\n\n\t\tif (!isAtomKey(indirectDependencyKey, store)) {\n\t\t\tindirectDependencyKeys.push(\n\t\t\t\t...getSelectorDependencyKeys(indirectDependencyKey, store),\n\t\t\t)\n\t\t} else if (!rootKeys.includes(indirectDependencyKey)) {\n\t\t\trootKeys.push(indirectDependencyKey)\n\t\t}\n\t}\n\n\treturn rootKeys\n}\n\nexport const traceAllSelectorAtoms = (\n\tselector: Selector<any>,\n\tstore: Store,\n): AtomKey<unknown>[] => {\n\tconst selectorKey = selector.key\n\tconst directDependencyKeys = getSelectorDependencyKeys(selectorKey, store)\n\treturn directDependencyKeys.flatMap((depKey) =>\n\t\tisAtomKey(depKey, store)\n\t\t\t? depKey\n\t\t\t: traceSelectorAtoms(selectorKey, depKey, store),\n\t)\n}\n","import type { ReadonlySelectorToken, WritableToken } from \"atom.io\"\n\nimport { newest } from \"../lineage\"\nimport type { Store } from \"../store\"\nimport { traceSelectorAtoms } from \"./trace-selector-atoms\"\n\nexport const updateSelectorAtoms = (\n\tselectorKey: string,\n\tdependency: ReadonlySelectorToken<unknown> | WritableToken<unknown>,\n\tstore: Store,\n): void => {\n\tconst target = newest(store)\n\tif (dependency.type === `atom` || dependency.type === `mutable_atom`) {\n\t\ttarget.selectorAtoms.set({\n\t\t\tselectorKey,\n\t\t\tatomKey: dependency.key,\n\t\t})\n\t\tstore.logger.info(\n\t\t\t`🔍`,\n\t\t\t`selector`,\n\t\t\tselectorKey,\n\t\t\t`discovers root atom \"${dependency.key}\"`,\n\t\t)\n\t} else {\n\t\tconst rootKeys = traceSelectorAtoms(selectorKey, dependency.key, store)\n\t\tstore.logger.info(\n\t\t\t`🔍`,\n\t\t\t`selector`,\n\t\t\tselectorKey,\n\t\t\t`discovers root atoms: [ ${rootKeys\n\t\t\t\t.map((key) => `\"${key}\"`)\n\t\t\t\t.join(`, `)} ]`,\n\t\t)\n\t\tfor (const atomKey of rootKeys) {\n\t\t\ttarget.selectorAtoms = target.selectorAtoms.set({\n\t\t\t\tselectorKey,\n\t\t\t\tatomKey,\n\t\t\t})\n\t\t}\n\t}\n}\n","import type {\n\tFamilyMetadata,\n\tReadonlySelectorOptions,\n\tReadonlySelectorToken,\n} from \"atom.io\"\n\nimport type { ReadonlySelector } from \"..\"\nimport { cacheValue } from \"../caching\"\nimport { newest } from \"../lineage\"\nimport type { Store } from \"../store\"\nimport { Subject } from \"../subject\"\nimport { registerSelector } from \"./register-selector\"\n\nexport const createReadonlySelector = <T>(\n\toptions: ReadonlySelectorOptions<T>,\n\tfamily: FamilyMetadata | undefined,\n\tstore: Store,\n): ReadonlySelectorToken<T> => {\n\tconst target = newest(store)\n\tconst subject = new Subject<{ newValue: T; oldValue: T }>()\n\n\tconst { get, find } = registerSelector(options.key, store)\n\tconst getSelf = () => {\n\t\tconst value = options.get({ get, find })\n\t\tcacheValue(options.key, value, subject, store)\n\t\treturn value\n\t}\n\n\tconst readonlySelector: ReadonlySelector<T> = {\n\t\t...options,\n\t\tsubject,\n\t\tinstall: (s: Store) => createReadonlySelector(options, family, s),\n\t\tget: getSelf,\n\t\ttype: `readonly_selector`,\n\t\t...(family && { family }),\n\t}\n\ttarget.readonlySelectors.set(options.key, readonlySelector)\n\tconst initialValue = getSelf()\n\tstore.logger.info(\n\t\t`✨`,\n\t\treadonlySelector.type,\n\t\treadonlySelector.key,\n\t\t`=`,\n\t\tinitialValue,\n\t)\n\tconst token: ReadonlySelectorToken<T> = {\n\t\tkey: options.key,\n\t\ttype: `readonly_selector`,\n\t}\n\tif (family) {\n\t\ttoken.family = family\n\t}\n\tstore.on.selectorCreation.next(token)\n\treturn token\n}\n","import type {\n\tFamilyMetadata,\n\tWritableSelectorOptions,\n\tWritableSelectorToken,\n} from \"atom.io\"\n\nimport type { WritableSelector } from \"..\"\nimport { cacheValue } from \"../caching\"\nimport { newest } from \"../lineage\"\nimport { markDone } from \"../operation\"\nimport { become } from \"../set-state/become\"\nimport type { Store } from \"../store\"\nimport { Subject } from \"../subject\"\nimport { registerSelector } from \"./register-selector\"\n\nexport const createWritableSelector = <T>(\n\toptions: WritableSelectorOptions<T>,\n\tfamily: FamilyMetadata | undefined,\n\tstore: Store,\n): WritableSelectorToken<T> => {\n\tconst target = newest(store)\n\tconst subject = new Subject<{ newValue: T; oldValue: T }>()\n\tconst transactors = registerSelector(options.key, store)\n\tconst { find, get } = transactors\n\tconst readonlyTransactors = { find, get }\n\n\tconst getSelf = () => {\n\t\tconst value = options.get(readonlyTransactors)\n\t\tcacheValue(options.key, value, subject, newest(store))\n\t\treturn value\n\t}\n\n\tconst setSelf = (next: T | ((oldValue: T) => T)): void => {\n\t\tconst oldValue = getSelf()\n\t\tconst newValue = become(next)(oldValue)\n\t\tstore.logger.info(\n\t\t\t`📝`,\n\t\t\t`selector`,\n\t\t\toptions.key,\n\t\t\t`set (`,\n\t\t\toldValue,\n\t\t\t`->`,\n\t\t\tnewValue,\n\t\t\t`)`,\n\t\t)\n\t\tcacheValue(options.key, newValue, subject, store)\n\t\tmarkDone(options.key, store)\n\t\tif (target.transactionMeta === null) {\n\t\t\tsubject.next({ newValue, oldValue })\n\t\t}\n\t\toptions.set(transactors, newValue)\n\t}\n\tconst mySelector: WritableSelector<T> = {\n\t\t...options,\n\t\tsubject,\n\t\tinstall: (s: Store) => createWritableSelector(options, family, s),\n\t\tget: getSelf,\n\t\tset: setSelf,\n\t\ttype: `selector`,\n\t\t...(family && { family }),\n\t}\n\ttarget.selectors.set(options.key, mySelector)\n\tconst initialValue = getSelf()\n\tstore.logger.info(`✨`, mySelector.type, mySelector.key, `=`, initialValue)\n\tconst token: WritableSelectorToken<T> = {\n\t\tkey: options.key,\n\t\ttype: `selector`,\n\t}\n\tif (family) {\n\t\ttoken.family = family\n\t}\n\tstore.on.selectorCreation.next(token)\n\treturn token\n}\n","import type {\n\tFamilyMetadata,\n\tReadonlySelectorOptions,\n\tReadonlySelectorToken,\n\tWritableSelectorOptions,\n\tWritableSelectorToken,\n} from \"atom.io\"\n\nimport type { Store } from \"../store\"\nimport type { Subject } from \"../subject\"\nimport { createReadonlySelector } from \"./create-readonly-selector\"\nimport { createWritableSelector } from \"./create-writable-selector\"\n\nexport function createStandaloneSelector<T>(\n\toptions: WritableSelectorOptions<T>,\n\tstore: Store,\n): WritableSelectorToken<T>\nexport function createStandaloneSelector<T>(\n\toptions: ReadonlySelectorOptions<T>,\n\tstore: Store,\n): ReadonlySelectorToken<T>\nexport function createStandaloneSelector<T>(\n\toptions: ReadonlySelectorOptions<T> | WritableSelectorOptions<T>,\n\tstore: Store,\n): ReadonlySelectorToken<T> | WritableSelectorToken<T> {\n\tconst isWritable = `set` in options\n\n\tif (isWritable) {\n\t\treturn createWritableSelector(options, undefined, store)\n\t}\n\treturn createReadonlySelector(options, undefined, store)\n}\n","import type { ReadonlySelectorToken, WritableSelectorToken } from \"atom.io\"\n\nimport { newest } from \"..\"\nimport type { Store } from \"..\"\n\nexport function deleteSelector(\n\tselectorToken: ReadonlySelectorToken<unknown> | WritableSelectorToken<unknown>,\n\tstore: Store,\n): void {\n\tconst target = newest(store)\n\tconst { key } = selectorToken\n\tswitch (selectorToken.type) {\n\t\tcase `selector`:\n\t\t\ttarget.selectors.delete(key)\n\t\t\tbreak\n\t\tcase `readonly_selector`:\n\t\t\ttarget.readonlySelectors.delete(key)\n\t\t\tbreak\n\t}\n\ttarget.valueMap.delete(key)\n\ttarget.selectorAtoms.delete(key)\n\tconst downstreamTokens = target.selectorGraph\n\t\t.getRelationEntries({ upstreamSelectorKey: key })\n\t\t.filter(([_, { source }]) => source === key)\n\t\t.map(\n\t\t\t([downstreamSelectorKey]) =>\n\t\t\t\ttarget.selectors.get(downstreamSelectorKey) ??\n\t\t\t\ttarget.readonlySelectors.get(downstreamSelectorKey),\n\t\t)\n\tfor (const downstreamToken of downstreamTokens) {\n\t\tif (downstreamToken) {\n\t\t\tdeleteSelector(downstreamToken, store)\n\t\t}\n\t}\n\ttarget.selectorGraph.delete(key)\n\tstore.logger.info(`🔥`, selectorToken.type, `${key}`, `deleted`)\n}\n","import type { ReadableState } from \"..\"\nimport { newest } from \"../lineage\"\nimport type { Store } from \"../store\"\n\nexport const recallState = <T>(state: ReadableState<T>, store: Store): T => {\n\tconst target = newest(store)\n\tif (!target.operation.open) {\n\t\treturn target.valueMap.get(state.key)\n\t}\n\treturn target.operation.prev.get(state.key)\n}\n","import type { Selector } from \"..\"\nimport { newest } from \"../lineage\"\nimport { readOrComputeValue } from \"../read-or-compute-value\"\nimport { traceAllSelectorAtoms } from \"../selector\"\nimport type { Store } from \"../store\"\nimport { recallState } from \"./recall-state\"\n\nexport const subscribeToRootAtoms = <T>(\n\tselector: Selector<T>,\n\tstore: Store,\n): (() => void)[] | null => {\n\tconst target = newest(store)\n\tconst dependencySubscriptions = traceAllSelectorAtoms(selector, store).map(\n\t\t(atomKey) => {\n\t\t\tconst atom = target.atoms.get(atomKey)\n\t\t\tif (atom === undefined) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Atom \"${atomKey}\", a dependency of selector \"${selector.key}\", not found in store \"${store.config.name}\".`,\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn atom.subject.subscribe(\n\t\t\t\t`${selector.type}:${selector.key}`,\n\t\t\t\t(atomChange) => {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`📢`,\n\t\t\t\t\t\tselector.type,\n\t\t\t\t\t\tselector.key,\n\t\t\t\t\t\t`root`,\n\t\t\t\t\t\tatomKey,\n\t\t\t\t\t\t`went`,\n\t\t\t\t\t\tatomChange.oldValue,\n\t\t\t\t\t\t`->`,\n\t\t\t\t\t\tatomChange.newValue,\n\t\t\t\t\t)\n\t\t\t\t\tconst oldValue = recallState(selector, target)\n\t\t\t\t\tconst newValue = readOrComputeValue(selector, target)\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`✨`,\n\t\t\t\t\t\tselector.type,\n\t\t\t\t\t\tselector.key,\n\t\t\t\t\t\t`went`,\n\t\t\t\t\t\toldValue,\n\t\t\t\t\t\t`->`,\n\t\t\t\t\t\tnewValue,\n\t\t\t\t\t)\n\t\t\t\t\tselector.subject.next({ newValue, oldValue })\n\t\t\t\t},\n\t\t\t)\n\t\t},\n\t)\n\treturn dependencySubscriptions\n}\n","import type { ReadableToken, UpdateHandler } from \"atom.io\"\nimport type { Store } from \"../store\"\nimport { withdraw, withdrawNewFamilyMember } from \"../store\"\nimport { subscribeToRootAtoms } from \"./subscribe-to-root-atoms\"\n\nexport function subscribeToState<T>(\n\ttoken: ReadableToken<T>,\n\thandleUpdate: UpdateHandler<T>,\n\tkey: string,\n\tstore: Store,\n): () => void {\n\tconst state =\n\t\twithdraw<T>(token, store) ?? withdrawNewFamilyMember(token, store)\n\tif (state === undefined) {\n\t\tthrow new Error(\n\t\t\t`State \"${token.key}\" not found in this store. Did you forget to initialize with the \"atom\" or \"selector\" function?`,\n\t\t)\n\t}\n\tconst unsubFunction = state.subject.subscribe(key, handleUpdate)\n\tstore.logger.info(`👀`, state.type, state.key, `Adding subscription \"${key}\"`)\n\tconst dependencyUnsubFunctions =\n\t\tstate.type !== `atom` && state.type !== `mutable_atom`\n\t\t\t? subscribeToRootAtoms(state, store)\n\t\t\t: null\n\n\tconst unsubscribe =\n\t\tdependencyUnsubFunctions === null\n\t\t\t? () => {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🙈`,\n\t\t\t\t\t\tstate.type,\n\t\t\t\t\t\tstate.key,\n\t\t\t\t\t\t`Removing subscription \"${key}\"`,\n\t\t\t\t\t)\n\t\t\t\t\tunsubFunction()\n\t\t\t }\n\t\t\t: () => {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🙈`,\n\t\t\t\t\t\tstate.type,\n\t\t\t\t\t\tstate.key,\n\t\t\t\t\t\t`Removing subscription \"${key}\"`,\n\t\t\t\t\t)\n\t\t\t\t\tunsubFunction()\n\t\t\t\t\tfor (const unsubFromDependency of dependencyUnsubFunctions) {\n\t\t\t\t\t\tunsubFromDependency()\n\t\t\t\t\t}\n\t\t\t }\n\n\treturn unsubscribe\n}\n","import type { TimelineManageable, TimelineToken, TimelineUpdate } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { withdraw } from \"atom.io/internal\"\n\nexport const subscribeToTimeline = <ManagedAtom extends TimelineManageable>(\n\ttoken: TimelineToken<ManagedAtom>,\n\thandleUpdate: (update: TimelineUpdate<any> | `redo` | `undo`) => void,\n\tkey: string,\n\tstore: Store,\n): (() => void) => {\n\tconst tl = withdraw(token, store)\n\tif (tl === undefined) {\n\t\tthrow new Error(\n\t\t\t`Cannot subscribe to timeline \"${token.key}\": timeline not found in store \"${store.config.name}\".`,\n\t\t)\n\t}\n\tstore.logger.info(`👀`, `timeline`, token.key, `Adding subscription \"${key}\"`)\n\tconst unsubscribe = tl.subject.subscribe(key, handleUpdate)\n\treturn () => {\n\t\tstore.logger.info(\n\t\t\t`🙈`,\n\t\t\t`timeline`,\n\t\t\ttoken.key,\n\t\t\t`Removing subscription \"${key}\" from timeline`,\n\t\t)\n\t\tunsubscribe()\n\t}\n}\n","import type { TransactionToken, TransactionUpdateHandler, ƒn } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { withdraw } from \"atom.io/internal\"\n\nexport const subscribeToTransaction = <ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\thandleUpdate: TransactionUpdateHandler<ƒ>,\n\tkey: string,\n\tstore: Store,\n): (() => void) => {\n\tconst tx = withdraw(token, store)\n\tif (tx === undefined) {\n\t\tthrow new Error(\n\t\t\t`Cannot subscribe to transaction \"${token.key}\": transaction not found in store \"${store.config.name}\".`,\n\t\t)\n\t}\n\tstore.logger.info(\n\t\t`👀`,\n\t\t`transaction`,\n\t\ttoken.key,\n\t\t`Adding subscription \"${key}\"`,\n\t)\n\tconst unsubscribe = tx.subject.subscribe(key, handleUpdate)\n\treturn () => {\n\t\tstore.logger.info(\n\t\t\t`🙈`,\n\t\t\t`transaction`,\n\t\t\ttoken.key,\n\t\t\t`Removing subscription \"${key}\"`,\n\t\t)\n\t\tunsubscribe()\n\t}\n}\n","import type { FamilyMetadata, MutableAtomToken, RegularAtomToken } from \"atom.io\"\nimport { getState, setState } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { Store } from \"..\"\nimport { newest, subscribeToState, subscribeToTimeline } from \"..\"\nimport { createRegularAtom } from \"../atom\"\nimport type { Transceiver } from \"./transceiver\"\n\n/**\n * @internal Give the tracker a transceiver state and a store, and it will\n * subscribe to the transceiver's inner value. When the inner value changes,\n * the tracker will update its own state to reflect the change.\n */\nexport class Tracker<Mutable extends Transceiver<any>> {\n\tprivate Update: Mutable extends Transceiver<infer Signal> ? Signal : never\n\n\tprivate initializeState(\n\t\tmutableState: MutableAtomToken<Mutable, Json.Serializable>,\n\t\tstore: Store,\n\t): RegularAtomToken<typeof this.Update | null> {\n\t\tconst latestUpdateStateKey = `*${mutableState.key}`\n\t\tstore.atoms.delete(latestUpdateStateKey)\n\t\tstore.valueMap.delete(latestUpdateStateKey)\n\t\tconst familyMetaData: FamilyMetadata | undefined = mutableState.family\n\t\t\t? {\n\t\t\t\t\tkey: `*${mutableState.family.key}`,\n\t\t\t\t\tsubKey: mutableState.family.subKey,\n\t\t\t }\n\t\t\t: undefined\n\t\tconst latestUpdateState = createRegularAtom<\n\t\t\t(Mutable extends Transceiver<infer Signal> ? Signal : never) | null\n\t\t>(\n\t\t\t{\n\t\t\t\tkey: latestUpdateStateKey,\n\t\t\t\tdefault: null,\n\t\t\t},\n\t\t\tfamilyMetaData,\n\t\t\tstore,\n\t\t)\n\t\tif (store.parent?.valueMap.has(latestUpdateStateKey)) {\n\t\t\tconst parentValue = store.parent.valueMap.get(latestUpdateStateKey)\n\t\t\tstore.valueMap.set(latestUpdateStateKey, parentValue)\n\t\t}\n\n\t\treturn latestUpdateState\n\t}\n\n\tprivate unsubscribeFromInnerValue: () => void\n\tprivate unsubscribeFromState: () => void\n\tprivate observeCore(\n\t\tmutableState: MutableAtomToken<Mutable, any>,\n\t\tlatestUpdateState: RegularAtomToken<typeof this.Update | null>,\n\t\tstore: Store,\n\t): void {\n\t\tconst originalInnerValue = getState(mutableState, store)\n\t\tconst target = newest(store)\n\t\tthis.unsubscribeFromInnerValue = originalInnerValue.subscribe(\n\t\t\t`tracker:${store.config.name}:${\n\t\t\t\ttarget.transactionMeta === null\n\t\t\t\t\t? `main`\n\t\t\t\t\t: target.transactionMeta.update.key\n\t\t\t}`,\n\t\t\t(update) => {\n\t\t\t\tif (target.operation.open) {\n\t\t\t\t\tconst unsubscribe = target.on.operationClose.subscribe(\n\t\t\t\t\t\tmutableState.key,\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tunsubscribe()\n\t\t\t\t\t\t\tsetState(latestUpdateState, update, target)\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tsetState(mutableState, (current) => current, target)\n\t\t\t\t\tsetState(latestUpdateState, update, target)\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t\tthis.unsubscribeFromState = subscribeToState(\n\t\t\tmutableState,\n\t\t\t(update) => {\n\t\t\t\tif (update.newValue !== update.oldValue) {\n\t\t\t\t\tthis.unsubscribeFromInnerValue()\n\t\t\t\t\tconst target = newest(store)\n\t\t\t\t\tthis.unsubscribeFromInnerValue = update.newValue.subscribe(\n\t\t\t\t\t\t`tracker:${store.config.name}:${\n\t\t\t\t\t\t\ttarget.transactionMeta === null\n\t\t\t\t\t\t\t\t? `main`\n\t\t\t\t\t\t\t\t: target.transactionMeta.update.key\n\t\t\t\t\t\t}`,\n\t\t\t\t\t\t(update) => {\n\t\t\t\t\t\t\tif (target.operation.open) {\n\t\t\t\t\t\t\t\tconst unsubscribe = target.on.operationClose.subscribe(\n\t\t\t\t\t\t\t\t\tmutableState.key,\n\t\t\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\t\t\tunsubscribe()\n\t\t\t\t\t\t\t\t\t\tsetState(latestUpdateState, update, target)\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsetState(mutableState, (current) => current, target)\n\t\t\t\t\t\t\t\tsetState(latestUpdateState, update, target)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t},\n\t\t\t`${store.config.name}: tracker observing inner value`,\n\t\t\tstore,\n\t\t)\n\t}\n\n\tprivate updateCore<Core extends Transceiver<any>>(\n\t\tmutableState: MutableAtomToken<Core, Json.Serializable>,\n\t\tlatestUpdateState: RegularAtomToken<typeof this.Update | null>,\n\t\tstore: Store,\n\t): void {\n\t\tsubscribeToState(\n\t\t\tlatestUpdateState,\n\t\t\t({ newValue, oldValue }) => {\n\t\t\t\tconst timelineId = store.timelineAtoms.getRelatedKey(\n\t\t\t\t\tlatestUpdateState.key,\n\t\t\t\t)\n\t\t\t\tif (timelineId) {\n\t\t\t\t\tconst timelineData = store.timelines.get(timelineId)\n\t\t\t\t\tif (timelineData?.timeTraveling) {\n\t\t\t\t\t\tconst unsubscribe = subscribeToTimeline(\n\t\t\t\t\t\t\t{ key: timelineId, type: `timeline` },\n\t\t\t\t\t\t\t(update) => {\n\t\t\t\t\t\t\t\tunsubscribe()\n\t\t\t\t\t\t\t\tsetState(\n\t\t\t\t\t\t\t\t\tmutableState,\n\t\t\t\t\t\t\t\t\t(transceiver) => {\n\t\t\t\t\t\t\t\t\t\tif (update === `redo` && newValue) {\n\t\t\t\t\t\t\t\t\t\t\ttransceiver.do(newValue)\n\t\t\t\t\t\t\t\t\t\t} else if (update === `undo` && oldValue) {\n\t\t\t\t\t\t\t\t\t\t\ttransceiver.undo(oldValue)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn transceiver\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t`${mutableState.key}: tracker observing timeline`,\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst unsubscribe = store.on.operationClose.subscribe(\n\t\t\t\t\tlatestUpdateState.key,\n\t\t\t\t\t() => {\n\t\t\t\t\t\tunsubscribe()\n\t\t\t\t\t\tconst mutable = getState(mutableState, store)\n\t\t\t\t\t\t// debugger\n\t\t\t\t\t\tconst updateNumber =\n\t\t\t\t\t\t\tnewValue === null ? -1 : mutable.getUpdateNumber(newValue)\n\t\t\t\t\t\tconst eventOffset = updateNumber - mutable.cacheUpdateNumber\n\t\t\t\t\t\tif (newValue && eventOffset === 1) {\n\t\t\t\t\t\t\t// ❗ new:\"0=add:\\\"myHand\\\"\",old:\"0=add:\\\"deckId\\\"\"\n\t\t\t\t\t\t\tsetState(\n\t\t\t\t\t\t\t\tmutableState,\n\t\t\t\t\t\t\t\t(transceiver) => (transceiver.do(newValue), transceiver),\n\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t},\n\t\t\t`${store.config.name}: tracker observing latest update`,\n\t\t\tstore,\n\t\t)\n\t}\n\n\tpublic mutableState: MutableAtomToken<Mutable, Json.Serializable>\n\tpublic latestUpdateState: RegularAtomToken<typeof this.Update | null>\n\n\tpublic dispose: () => void\n\n\tpublic constructor(\n\t\tmutableState: MutableAtomToken<Mutable, Json.Serializable>,\n\t\tstore: Store,\n\t) {\n\t\tthis.mutableState = mutableState\n\t\tconst target = newest(store)\n\t\tthis.latestUpdateState = this.initializeState(mutableState, target)\n\t\tthis.observeCore(mutableState, this.latestUpdateState, target)\n\t\tthis.updateCore(mutableState, this.latestUpdateState, target)\n\t\ttarget.trackers.set(mutableState.key, this)\n\t\tthis.dispose = () => {\n\t\t\tthis.unsubscribeFromInnerValue()\n\t\t\tthis.unsubscribeFromState()\n\t\t\ttarget.trackers.delete(mutableState.key)\n\t\t}\n\t}\n}\n","import type {\n\tMutableAtomFamily,\n\tMutableAtomFamilyOptions,\n\tMutableAtomOptions,\n\tMutableAtomToken,\n} from \"atom.io\"\nimport type { FamilyMetadata } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { selectJsonFamily } from \"atom.io/json\"\nimport { stringifyJson } from \"atom.io/json\"\n\nimport { newest } from \"../lineage\"\nimport { createMutableAtom } from \"../mutable\"\nimport { deposit, withdraw } from \"../store\"\nimport type { Store } from \"../store\"\nimport { Subject } from \"../subject\"\nimport { FamilyTracker } from \"./tracker-family\"\nimport type { Transceiver } from \"./transceiver\"\n\nexport function createMutableAtomFamily<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends string,\n>(\n\toptions: MutableAtomFamilyOptions<T, J, K>,\n\tstore: Store,\n): MutableAtomFamily<T, J, K> {\n\tconst subject = new Subject<MutableAtomToken<T, J>>()\n\tconst atomFamily: MutableAtomFamily<T, J, K> = Object.assign(\n\t\t(key: K): MutableAtomToken<T, J> => {\n\t\t\tconst subKey = stringifyJson(key)\n\t\t\tconst family: FamilyMetadata = { key: options.key, subKey }\n\t\t\tconst fullKey = `${options.key}(${subKey})`\n\t\t\tconst existing = withdraw({ key: fullKey, type: `mutable_atom` }, store)\n\t\t\tlet token: MutableAtomToken<T, J>\n\t\t\tif (existing) {\n\t\t\t\ttoken = deposit(existing)\n\t\t\t} else {\n\t\t\t\tconst individualOptions: MutableAtomOptions<T, J> = {\n\t\t\t\t\tkey: fullKey,\n\t\t\t\t\tdefault: () => options.default(key),\n\t\t\t\t\ttoJson: options.toJson,\n\t\t\t\t\tfromJson: options.fromJson,\n\t\t\t\t\tmutable: true,\n\t\t\t\t}\n\t\t\t\tif (options.effects) {\n\t\t\t\t\tindividualOptions.effects = options.effects(key)\n\t\t\t\t}\n\n\t\t\t\ttoken = createMutableAtom(individualOptions, family, store)\n\n\t\t\t\tsubject.next(token)\n\t\t\t}\n\t\t\treturn token\n\t\t},\n\t\t{\n\t\t\tkey: options.key,\n\t\t\ttype: `mutable_atom_family`,\n\t\t\tsubject,\n\t\t\tinstall: (store: Store) => createMutableAtomFamily(options, store),\n\t\t\ttoJson: options.toJson,\n\t\t\tfromJson: options.fromJson,\n\t\t} as const,\n\t)\n\n\tconst target = newest(store)\n\ttarget.families.set(options.key, atomFamily)\n\tselectJsonFamily(atomFamily, options, store)\n\tnew FamilyTracker(atomFamily, store)\n\treturn atomFamily\n}\n","import type { MutableAtomFamily, RegularAtomFamily } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { parseJson } from \"atom.io/json\"\n\nimport { createRegularAtomFamily } from \"../families\"\nimport type { Store } from \"../store\"\nimport { Tracker } from \"./tracker\"\nimport type { Transceiver } from \"./transceiver\"\n\nexport class FamilyTracker<\n\tCore extends Transceiver<any>,\n\tFamilyMemberKey extends Json.Serializable,\n> {\n\tprivate readonly Update: Core extends Transceiver<infer Signal>\n\t\t? Signal\n\t\t: never\n\n\tpublic readonly findLatestUpdateState: RegularAtomFamily<\n\t\ttypeof this.Update | null,\n\t\tFamilyMemberKey\n\t>\n\tpublic readonly findMutableState: MutableAtomFamily<Core, any, FamilyMemberKey>\n\n\tpublic constructor(\n\t\tfindMutableState: MutableAtomFamily<Core, any, FamilyMemberKey>,\n\t\tstore: Store,\n\t) {\n\t\tthis.findLatestUpdateState = createRegularAtomFamily<\n\t\t\ttypeof this.Update | null,\n\t\t\tFamilyMemberKey\n\t\t>(\n\t\t\t{\n\t\t\t\tkey: `*${findMutableState.key}`,\n\t\t\t\tdefault: null,\n\t\t\t},\n\t\t\tstore,\n\t\t)\n\t\tthis.findMutableState = findMutableState\n\t\tthis.findMutableState.subject.subscribe(\n\t\t\t`store=${store.config.name}::tracker-atom-family`,\n\t\t\t(atomToken) => {\n\t\t\t\tif (atomToken.family) {\n\t\t\t\t\tconst key = parseJson(atomToken.family.subKey) as FamilyMemberKey\n\t\t\t\t\tthis.findLatestUpdateState(key)\n\t\t\t\t\tnew Tracker<Core>(atomToken, store)\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t\tthis.findLatestUpdateState.subject.subscribe(\n\t\t\t`store=${store.config.name}::tracker-atom-family`,\n\t\t\t(atomToken) => {\n\t\t\t\tif (atomToken.family) {\n\t\t\t\t\tconst key = parseJson(atomToken.family.subKey) as FamilyMemberKey\n\t\t\t\t\tconst mutableAtomToken = this.findMutableState(key)\n\t\t\t\t\tnew Tracker<Core>(mutableAtomToken, store)\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t}\n}\n","import type {\n\tFamilyMetadata,\n\tRegularAtomFamily,\n\tRegularAtomFamilyOptions,\n\tRegularAtomOptions,\n\tRegularAtomToken,\n} from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { stringifyJson } from \"atom.io/json\"\n\nimport { createRegularAtom } from \"../atom\"\nimport { newest } from \"../lineage\"\nimport { deposit, withdraw } from \"../store\"\nimport type { Store } from \"../store\"\nimport { Subject } from \"../subject\"\n\nexport function createRegularAtomFamily<T, K extends Json.Serializable>(\n\toptions: RegularAtomFamilyOptions<T, K>,\n\tstore: Store,\n): RegularAtomFamily<T, K> {\n\tconst subject = new Subject<RegularAtomToken<T>>()\n\tconst atomFamily: RegularAtomFamily<T, K> = Object.assign(\n\t\t(key: K): RegularAtomToken<any> => {\n\t\t\tconst subKey = stringifyJson(key)\n\t\t\tconst family: FamilyMetadata = { key: options.key, subKey }\n\t\t\tconst fullKey = `${options.key}(${subKey})`\n\t\t\tconst existing = withdraw({ key: fullKey, type: `atom` }, store)\n\t\t\tlet token: RegularAtomToken<any>\n\t\t\tif (existing) {\n\t\t\t\ttoken = deposit(existing)\n\t\t\t} else {\n\t\t\t\tconst individualOptions: RegularAtomOptions<any> = {\n\t\t\t\t\tkey: fullKey,\n\t\t\t\t\tdefault:\n\t\t\t\t\t\toptions.default instanceof Function\n\t\t\t\t\t\t\t? options.default(key)\n\t\t\t\t\t\t\t: options.default,\n\t\t\t\t}\n\t\t\t\tif (options.effects) {\n\t\t\t\t\tindividualOptions.effects = options.effects(key)\n\t\t\t\t}\n\t\t\t\ttoken = createRegularAtom(individualOptions, family, store)\n\t\t\t\tsubject.next(token)\n\t\t\t}\n\t\t\treturn token\n\t\t},\n\t\t{\n\t\t\tkey: options.key,\n\t\t\ttype: `atom_family`,\n\t\t\tsubject,\n\t\t\tinstall: (store: Store) => createRegularAtomFamily(options, store),\n\t\t} as const,\n\t)\n\tconst target = newest(store)\n\ttarget.families.set(options.key, atomFamily)\n\treturn atomFamily\n}\n","import type {\n\tMutableAtomFamily,\n\tMutableAtomFamilyOptions,\n\tRegularAtomFamily,\n\tRegularAtomFamilyOptions,\n} from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport { type Transceiver, createMutableAtomFamily } from \"../mutable\"\nimport type { Store } from \"../store\"\nimport { createRegularAtomFamily } from \"./create-regular-atom-family\"\n\nexport function createAtomFamily<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n>(\n\toptions: MutableAtomFamilyOptions<T, J, K>,\n\tstore: Store,\n): MutableAtomFamily<T, J, K>\nexport function createAtomFamily<T, K extends Json.Serializable>(\n\toptions: RegularAtomFamilyOptions<T, K>,\n\tstore: Store,\n): RegularAtomFamily<T, K>\nexport function createAtomFamily<T, K extends Json.Serializable>(\n\toptions:\n\t\t| MutableAtomFamilyOptions<any, any, any>\n\t\t| RegularAtomFamilyOptions<T, K>,\n\tstore: Store,\n): MutableAtomFamily<any, any, any> | RegularAtomFamily<T, K> {\n\tconst isMutable = `mutable` in options\n\n\tif (isMutable) {\n\t\treturn createMutableAtomFamily(options, store)\n\t}\n\treturn createRegularAtomFamily<T, K>(options, store)\n}\n","import type {\n\tFamilyMetadata,\n\tReadonlySelectorFamily,\n\tReadonlySelectorFamilyOptions,\n\tReadonlySelectorToken,\n} from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { stringifyJson } from \"atom.io/json\"\n\nimport { newest } from \"../lineage\"\nimport { createReadonlySelector } from \"../selector\"\nimport type { Store } from \"../store\"\nimport { deposit } from \"../store\"\nimport { Subject } from \"../subject\"\n\nexport function createReadonlySelectorFamily<T, K extends Json.Serializable>(\n\toptions: ReadonlySelectorFamilyOptions<T, K>,\n\tstore: Store,\n): ReadonlySelectorFamily<T, K> {\n\tconst subject = new Subject<ReadonlySelectorToken<T>>()\n\tconst readonlySelectorFamily = Object.assign(\n\t\t(key: K): ReadonlySelectorToken<T> => {\n\t\t\tconst target = newest(store)\n\t\t\tconst subKey = stringifyJson(key)\n\t\t\tconst family: FamilyMetadata = { key: options.key, subKey }\n\t\t\tconst fullKey = `${options.key}(${subKey})`\n\t\t\tconst existing = target.readonlySelectors.get(fullKey)\n\t\t\tif (existing) {\n\t\t\t\treturn deposit(existing)\n\t\t\t}\n\t\t\treturn createReadonlySelector(\n\t\t\t\t{\n\t\t\t\t\tkey: fullKey,\n\t\t\t\t\tget: options.get(key),\n\t\t\t\t},\n\t\t\t\tfamily,\n\t\t\t\tstore,\n\t\t\t) as ReadonlySelectorToken<T>\n\t\t},\n\t\t{\n\t\t\tkey: options.key,\n\t\t\ttype: `readonly_selector_family`,\n\t\t\tsubject,\n\t\t\tinstall: (store: Store) => createReadonlySelectorFamily(options, store),\n\t\t} as const,\n\t) as ReadonlySelectorFamily<T, K>\n\tstore.families.set(options.key, readonlySelectorFamily)\n\treturn readonlySelectorFamily\n}\n","import type {\n\tFamilyMetadata,\n\tWritableSelectorFamily,\n\tWritableSelectorFamilyOptions,\n\tWritableSelectorToken,\n} from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { stringifyJson } from \"atom.io/json\"\n\nimport { createWritableSelector } from \"../selector\"\nimport type { Store } from \"../store\"\nimport { deposit } from \"../store\"\nimport { Subject } from \"../subject\"\n\nexport function createWritableSelectorFamily<T, K extends Json.Serializable>(\n\toptions: WritableSelectorFamilyOptions<T, K>,\n\tstore: Store,\n): WritableSelectorFamily<T, K> {\n\tconst subject = new Subject<WritableSelectorToken<T>>()\n\n\tconst selectorFamily = Object.assign(\n\t\t(key: K): WritableSelectorToken<T> => {\n\t\t\tconst subKey = stringifyJson(key)\n\t\t\tconst family: FamilyMetadata = { key: options.key, subKey }\n\t\t\tconst fullKey = `${options.key}(${subKey})`\n\t\t\tconst existing = store.selectors.get(fullKey)\n\t\t\tif (existing) {\n\t\t\t\treturn deposit(existing)\n\t\t\t}\n\t\t\tconst token = createWritableSelector(\n\t\t\t\t{\n\t\t\t\t\tkey: fullKey,\n\t\t\t\t\tget: options.get(key),\n\t\t\t\t\tset: options.set(key),\n\t\t\t\t},\n\t\t\t\tfamily,\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tsubject.next(token)\n\t\t\treturn token\n\t\t},\n\t\t{\n\t\t\tkey: options.key,\n\t\t\ttype: `selector_family`,\n\t\t\tsubject,\n\t\t\tinstall: (store: Store) => createWritableSelectorFamily(options, store),\n\t\t} as const,\n\t) as WritableSelectorFamily<T, K>\n\tstore.families.set(options.key, selectorFamily)\n\treturn selectorFamily\n}\n","import type {\n\tReadonlySelectorFamily,\n\tReadonlySelectorFamilyOptions,\n\tWritableSelectorFamily,\n\tWritableSelectorFamilyOptions,\n} from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { Store } from \"../store\"\nimport { createReadonlySelectorFamily } from \"./create-readonly-selector-family\"\nimport { createWritableSelectorFamily } from \"./create-writable-selector-family\"\n\nexport function createSelectorFamily<T, K extends Json.Serializable>(\n\toptions: WritableSelectorFamilyOptions<T, K>,\n\tstore: Store,\n): WritableSelectorFamily<T, K>\nexport function createSelectorFamily<T, K extends Json.Serializable>(\n\toptions: ReadonlySelectorFamilyOptions<T, K>,\n\tstore: Store,\n): ReadonlySelectorFamily<T, K>\nexport function createSelectorFamily<T, K extends Json.Serializable>(\n\toptions:\n\t\t| ReadonlySelectorFamilyOptions<T, K>\n\t\t| WritableSelectorFamilyOptions<T, K>,\n\tstore: Store,\n): ReadonlySelectorFamily<T, K> | WritableSelectorFamily<T, K> {\n\tconst isWritable = `set` in options\n\n\tif (isWritable) {\n\t\treturn createWritableSelectorFamily(options, store)\n\t}\n\treturn createReadonlySelectorFamily(options, store)\n}\n","import type { MutableAtomFamily, WritableSelectorFamily } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport { newest } from \"../lineage\"\nimport type { Store } from \"../store\"\nimport type { Transceiver } from \"./transceiver\"\n\nexport const getJsonFamily = <\n\tCore extends Transceiver<Json.Serializable>,\n\tSerializableCore extends Json.Serializable,\n\tKey extends string,\n>(\n\tmutableAtomFamily: MutableAtomFamily<Core, SerializableCore, Key>,\n\tstore: Store,\n): WritableSelectorFamily<SerializableCore, Key> => {\n\tconst target = newest(store)\n\tconst key = `${mutableAtomFamily.key}:JSON`\n\tconst jsonFamily: WritableSelectorFamily<SerializableCore, Key> =\n\t\ttarget.families.get(key) as WritableSelectorFamily<SerializableCore, Key>\n\treturn jsonFamily\n}\n","import type { MutableAtomToken, WritableSelectorToken } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { Transceiver } from \"./transceiver\"\n\nexport const getJsonToken = <\n\tCore extends Transceiver<any>,\n\tSerializableCore extends Json.Serializable,\n>(\n\tmutableAtomToken: MutableAtomToken<Core, SerializableCore>,\n): WritableSelectorToken<SerializableCore> => {\n\tconst key = mutableAtomToken.family\n\t\t? `${mutableAtomToken.family.key}:JSON(${mutableAtomToken.family.subKey})`\n\t\t: `${mutableAtomToken.key}:JSON`\n\tconst jsonToken: WritableSelectorToken<SerializableCore> = {\n\t\ttype: `selector`,\n\t\tkey,\n\t}\n\tif (mutableAtomToken.family) {\n\t\tjsonToken.family = {\n\t\t\tkey: `${mutableAtomToken.family.key}:JSON`,\n\t\t\tsubKey: mutableAtomToken.family.subKey,\n\t\t}\n\t}\n\treturn jsonToken\n}\n","import type { MutableAtomToken, RegularAtomToken } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport type { Signal, Transceiver } from \"./transceiver\"\n\nexport const getUpdateToken = <\n\tCore extends Transceiver<any>,\n\tSerializableCore extends Json.Serializable,\n>(\n\tmutableAtomToken: MutableAtomToken<Core, SerializableCore>,\n): RegularAtomToken<Signal<Core>> => {\n\tconst key = `*${mutableAtomToken.key}`\n\tconst updateToken: RegularAtomToken<Signal<Core>> = { type: `atom`, key }\n\tif (mutableAtomToken.family) {\n\t\tupdateToken.family = {\n\t\t\tkey: `*${mutableAtomToken.family.key}`,\n\t\t\tsubKey: mutableAtomToken.family.subKey,\n\t\t}\n\t}\n\treturn updateToken\n}\n","import type { AtomFamily, MutableAtomFamily } from \"atom.io\"\n\nimport type { Atom, MutableAtom } from \"..\"\n\nexport function isMutable(atom: Atom<any>): atom is MutableAtom<any, any>\nexport function isMutable(\n\tfamily: AtomFamily<any, any>,\n): family is MutableAtomFamily<any, any, any>\nexport function isMutable(\n\tatomOrTokenOrFamily: Atom<any> | AtomFamily<any, any>,\n): boolean {\n\treturn (\n\t\tatomOrTokenOrFamily.type === `mutable_atom` ||\n\t\tatomOrTokenOrFamily.type === `mutable_atom_family`\n\t)\n}\n","import type { Json } from \"atom.io/json\"\n\nexport interface Transceiver<Signal extends Json.Serializable> {\n\tdo: (update: Signal) => void\n\tundo: (update: Signal) => void\n\tsubscribe: (key: string, fn: (update: Signal) => void) => () => void\n\tcacheUpdateNumber: number\n\tgetUpdateNumber: (update: Signal) => number\n}\n\nexport function isTransceiver(\n\tvalue: unknown,\n): value is Transceiver<Json.Serializable> {\n\treturn (\n\t\ttypeof value === `object` &&\n\t\tvalue !== null &&\n\t\t`do` in value &&\n\t\t`undo` in value &&\n\t\t`subscribe` in value\n\t)\n}\n\nexport type TransceiverMode = `playback` | `record` | `transaction`\n\nexport type Signal<TVR extends Transceiver<any>> = TVR extends Transceiver<\n\tinfer Signal\n>\n\t? Signal\n\t: never\n\n/*\nA transceiver may also keep a list of updates that have been applied to it.\nThis is useful for undo/redo functionality, especially in the context of\nrevising history. It is a good idea to accept a cache limit in your \nconstructor, and overwrite old updates. Here's an example of how we \nmight set that up:\n\nmyTransceiver = Transceiver {\n\tcacheUpdateNumber: number = 27\n\tcacheIdx: number = 1\n\tcacheLimit: number = 3\n\tcache: Array<Update> = [\n\t\t26=add:\"x\"\n\t\t27=del:\"x\" (current)\n\t\t25=add:\"y\"\n\t]\n}\n\nCONFIRM/NO-OP\nUpdate `27=del:\"x\"` is passed to myTransceiver.do:\n- [updateNumber = 27, update = `del:\"x\"`]\t\n- updateOffset = updateNumber - cacheUpdateNumber // 0\n- eventOffset < 1 // true (we're validating the past)\n- |eventOffset| < cacheLimit // true (we remember this update)\n- eventIdx = cacheIdx + updateOffset // 1\n- update === cache.get(eventIdx) // true\n- return null // 👍\n\nEXPECTED UPDATE\nUpdate `28=add:\"x\"` is passed to myTransceiver.do:\n- [updateNumber = 28, update = `add:\"x\"`]\n- updateOffset = updateNumber - cacheUpdateNumber // 1\n- eventOffset < 1 // false (we're in the future)\n- eventOffset === 1 // true (we're ready to apply this update)\n- cacheIdx += eventOffset // 2\n- cacheIdx %= cacheLimit // 2\n- cache[cacheIdx] = update // cache = <{ 0 => add:\"x\" }>\n- return null // 👍\n\nUNEXPECTED UPDATE\nUpdate `29=del:\"x\"` is passed to myTransceiver.do:\n- [updateNumber = 29, update = `del:\"x\"`]\n- updateOffset = updateNumber - cacheUpdateNumber // 2\n- eventOffset < 1 // false (we're in the future)\n- eventOffset === 1 // false (we're NOT ready to apply this update)\n- updateIdx := cacheIdx + updateOffset // 3\n- updateIdx %= cacheLimit // 0\n- cache[updateIdx] = update // cache = <{ 0 => del:\"x\" }> \n- expectedUpdateNumber = cacheUpdateNumber + 1 // 28\n- return expectedUpdateNumber // 🤨👂\n\nSUCCESSFUL ROLLBACK UPDATE\nUpdate `25=add:\"z\"` is passed to myTransceiver.do:\n- [updateNumber = 25, update = `add:\"z\"`]\n- updateOffset = updateNumber - cacheUpdateNumber // -2\n- eventOffset < 1 // true (we're validating the past)\n- |eventOffset| < cacheLimit // true (we remember this update)\n- eventIdx = cacheIdx + updateOffset // -1\n- eventIdx %= cacheLimit // 2\n- update === cache[eventIdx] // false (we're rolling back)\n- done := false\n- update := cache[cacheIdx] // update = `del:\"x\"`\n- undo(update) // myTransceiver.undo(`del:\"x\"`)\n- while (!done) {\n- \tcacheIdx -= 1 // 0, -1\n- \tcacheIdx %= cacheLimit // 0, 2\n- \tupdate = cache[cacheIdx] // update = `add:\"y\"`, `add:\"x\"`\n- \tundo(update) // myTransceiver.undo(`add:\"y\"`), myTransceiver.undo(`add:\"x\"`)\n- \tdone = cacheIdx === eventIdx // false, true\n- }\n- do(update) // myTransceiver.do(`add:\"z\"`)\n- return null // 👍\n\nUNSUCCESSFUL ROLLBACK UPDATE\nUpdate `24=add:\"z\"` is passed to myTransceiver.do:\n- [updateNumber = 24, update = `add:\"z\"`]\n- updateOffset = updateNumber - cacheUpdateNumber // -3\n- eventOffset < 1 // true (we're validating the past)\n- |eventOffset| < cacheLimit // 3 < 3 // false (we don't remember this update)\n- return `OUT_OF_RANGE` // 😵💫👂\n\n*/\n","import type {\n\tFamilyMetadata,\n\tMutableAtomOptions,\n\tRegularAtomOptions,\n\tRegularAtomToken,\n\tUpdateHandler,\n} from \"atom.io\"\nimport { setState } from \"atom.io\"\n\nimport type { RegularAtom } from \"..\"\nimport { cacheValue } from \"../caching\"\nimport { newest } from \"../lineage\"\nimport type { Store } from \"../store\"\nimport { deposit } from \"../store\"\nimport { Subject } from \"../subject\"\nimport { subscribeToState } from \"../subscribe\"\nimport { markAtomAsDefault } from \"./is-default\"\n\nexport function createRegularAtom<T>(\n\toptions: MutableAtomOptions<any, any> | RegularAtomOptions<T>,\n\tfamily: FamilyMetadata | undefined,\n\tstore: Store,\n): RegularAtomToken<T> {\n\tstore.logger.info(\n\t\t`🔨`,\n\t\t`atom`,\n\t\toptions.key,\n\t\t`creating in store \"${store.config.name}\"`,\n\t)\n\tconst target = newest(store)\n\tconst existing = target.atoms.get(options.key)\n\tif (existing && existing.type === `atom`) {\n\t\tstore.logger.error(\n\t\t\t`❌`,\n\t\t\t`atom`,\n\t\t\toptions.key,\n\t\t\t`Tried to create atom, but it already exists in the store.`,\n\t\t)\n\t\treturn deposit(existing)\n\t}\n\tconst subject = new Subject<{ newValue: T; oldValue: T }>()\n\tconst newAtom: RegularAtom<T> = {\n\t\t...options,\n\t\ttype: `atom`,\n\t\tinstall: (store: Store) => {\n\t\t\tstore.logger.info(\n\t\t\t\t`🛠️`,\n\t\t\t\t`atom`,\n\t\t\t\toptions.key,\n\t\t\t\t`installing in store \"${store.config.name}\"`,\n\t\t\t)\n\t\t\treturn createRegularAtom(options, family, store)\n\t\t},\n\t\tsubject,\n\t} as const\n\tif (family) {\n\t\tnewAtom.family = family\n\t}\n\tlet initialValue = options.default\n\tif (options.default instanceof Function) {\n\t\tinitialValue = options.default()\n\t}\n\ttarget.atoms.set(newAtom.key, newAtom)\n\tmarkAtomAsDefault(options.key, store)\n\tcacheValue(options.key, initialValue, subject, target)\n\tconst token = deposit(newAtom)\n\tif (options.effects) {\n\t\tlet effectIndex = 0\n\t\tconst cleanupFunctions: (() => void)[] = []\n\t\tfor (const effect of options.effects) {\n\t\t\tconst cleanup = effect({\n\t\t\t\tsetSelf: (next) => setState(token, next, store),\n\t\t\t\tonSet: (handle: UpdateHandler<T>) =>\n\t\t\t\t\tsubscribeToState(token, handle, `effect[${effectIndex}]`, store),\n\t\t\t})\n\t\t\tif (cleanup) {\n\t\t\t\tcleanupFunctions.push(cleanup)\n\t\t\t}\n\t\t\t++effectIndex\n\t\t}\n\t\tnewAtom.cleanup = () => {\n\t\t\tfor (const cleanup of cleanupFunctions) {\n\t\t\t\tcleanup()\n\t\t\t}\n\t\t}\n\t}\n\tstore.on.atomCreation.next(token)\n\treturn token\n}\n","import { newest } from \"../lineage\"\nimport type { Store } from \"../store\"\n\nexport const isAtomDefault = (key: string, store: Store): boolean => {\n\tconst core = newest(store)\n\treturn core.atomsThatAreDefault.has(key)\n}\n\nexport const markAtomAsDefault = (key: string, store: Store): void => {\n\tconst core = newest(store)\n\tcore.atomsThatAreDefault = new Set(core.atomsThatAreDefault).add(key)\n}\n\nexport const markAtomAsNotDefault = (key: string, store: Store): void => {\n\tconst core = newest(store)\n\tcore.atomsThatAreDefault = new Set(newest(store).atomsThatAreDefault)\n\tcore.atomsThatAreDefault.delete(key)\n}\n","import type {\n\tAtomToken,\n\tMutableAtomOptions,\n\tMutableAtomToken,\n\tRegularAtomOptions,\n\tRegularAtomToken,\n} from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { Transceiver } from \"../mutable\"\nimport { createMutableAtom } from \"../mutable\"\nimport type { Store } from \"../store\"\nimport { createRegularAtom } from \"./create-regular-atom\"\n\nexport function createStandaloneAtom<T>(\n\toptions: RegularAtomOptions<T>,\n\tstore: Store,\n): RegularAtomToken<T>\nexport function createStandaloneAtom<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n>(options: MutableAtomOptions<T, J>, store: Store): MutableAtomToken<T, J>\nexport function createStandaloneAtom<T>(\n\toptions: MutableAtomOptions<any, any> | RegularAtomOptions<T>,\n\tstore: Store,\n): AtomToken<T> {\n\tconst isMutable = `mutable` in options\n\n\tif (isMutable) {\n\t\treturn createMutableAtom(options, undefined, store)\n\t}\n\treturn createRegularAtom(options, undefined, store)\n}\n","import type { RegularAtomToken } from \"atom.io\"\n\nimport type { Store } from \"..\"\nimport { deleteSelector, newest } from \"..\"\n\nexport function deleteAtom(\n\tatomToken: RegularAtomToken<unknown>,\n\tstore: Store,\n): void {\n\tconst target = newest(store)\n\tconst { key } = atomToken\n\tconst atom = target.atoms.get(key)\n\tif (!atom) {\n\t\tstore.logger.error(\n\t\t\t`❌`,\n\t\t\t`atom`,\n\t\t\t`${key}`,\n\t\t\t`Tried to delete atom, but it does not exist in the store.`,\n\t\t)\n\t}\n\tatom?.cleanup?.()\n\ttarget.atoms.delete(key)\n\ttarget.valueMap.delete(key)\n\tconst selectorKeys = target.selectorAtoms.getRelatedKeys(key)\n\tif (selectorKeys) {\n\t\tfor (const selectorKey of selectorKeys) {\n\t\t\tconst token =\n\t\t\t\ttarget.selectors.get(selectorKey) ??\n\t\t\t\ttarget.readonlySelectors.get(selectorKey)\n\t\t\tif (token) {\n\t\t\t\tdeleteSelector(token, store)\n\t\t\t}\n\t\t}\n\t}\n\ttarget.selectorAtoms.delete(key)\n\ttarget.atomsThatAreDefault.delete(key)\n\ttarget.timelineAtoms.delete(key)\n\tstore.logger.info(`🔥`, `atom`, `${key}`, `deleted`)\n}\n","import type { Store } from \"./store\"\n\nexport type EnvironmentData = {\n\truntime: `browser` | `node` | `unknown`\n\tstore: Store\n}\n\nexport function getEnvironmentData(store: Store): EnvironmentData {\n\treturn {\n\t\truntime:\n\t\t\ttypeof window === `undefined`\n\t\t\t\t? typeof global === `object`\n\t\t\t\t\t? `node`\n\t\t\t\t\t: `unknown`\n\t\t\t\t: `browser`,\n\t\tstore,\n\t}\n}\n","import type { KeyedStateUpdate } from \"atom.io\"\nimport { setState } from \"atom.io\"\n\nimport type { Store } from \"../store\"\n\nexport function ingestAtomUpdate(\n\tapplying: `newValue` | `oldValue`,\n\tatomUpdate: KeyedStateUpdate<any>,\n\tstore: Store,\n): void {\n\tconst { key, newValue, oldValue } = atomUpdate\n\tconst value = applying === `newValue` ? newValue : oldValue\n\tsetState({ key, type: `atom` }, value, store)\n}\n","import type { Store } from \"../store\"\nimport type { TimelineSelectorUpdate } from \"../timeline\"\nimport { ingestAtomUpdate } from \"./ingest-atom-update\"\n\nexport function ingestSelectorUpdate(\n\tapplying: `newValue` | `oldValue`,\n\tselectorUpdate: TimelineSelectorUpdate<any>,\n\tstore: Store,\n): void {\n\tconst updates =\n\t\tapplying === `newValue`\n\t\t\t? selectorUpdate.atomUpdates\n\t\t\t: [...selectorUpdate.atomUpdates].reverse()\n\tfor (const atomUpdate of updates) {\n\t\tingestAtomUpdate(applying, atomUpdate, store)\n\t}\n}\n","import type { TransactionUpdate } from \"atom.io\"\n\nimport type { Store } from \"../store\"\nimport { ingestAtomUpdate } from \"./ingest-atom-update\"\n\nexport function ingestTransactionUpdate(\n\tapplying: `newValue` | `oldValue`,\n\ttransactionUpdate: TransactionUpdate<any>,\n\tstore: Store,\n): void {\n\tconst updates =\n\t\tapplying === `newValue`\n\t\t\t? transactionUpdate.updates\n\t\t\t: [...transactionUpdate.updates].reverse()\n\tfor (const updateFromTransaction of updates) {\n\t\tif (`newValue` in updateFromTransaction) {\n\t\t\tingestAtomUpdate(applying, updateFromTransaction, store)\n\t\t} else {\n\t\t\tingestTransactionUpdate(applying, updateFromTransaction, store)\n\t\t}\n\t}\n}\n","export class LazyMap<K, V> extends Map<K, V> {\n\tpublic deleted = new Set<K>()\n\n\tpublic constructor(protected readonly source: Map<K, V>) {\n\t\tsuper()\n\t}\n\n\tpublic get(key: K): V | undefined {\n\t\tconst has = super.has(key)\n\t\tif (has) {\n\t\t\treturn super.get(key)\n\t\t}\n\t\tif (!this.deleted.has(key) && this.source.has(key)) {\n\t\t\tconst value = this.source.get(key)\n\t\t\treturn value\n\t\t}\n\t\treturn undefined\n\t}\n\n\tpublic set(key: K, value: V): this {\n\t\tthis.deleted.delete(key)\n\t\treturn super.set(key, value)\n\t}\n\n\tpublic hasOwn(key: K): boolean {\n\t\treturn super.has(key)\n\t}\n\n\tpublic has(key: K): boolean {\n\t\treturn !this.deleted.has(key) && (super.has(key) || this.source.has(key))\n\t}\n\n\tpublic delete(key: K): boolean {\n\t\tthis.deleted.add(key)\n\t\treturn super.delete(key)\n\t}\n}\n","import type { ReadableToken } from \"atom.io\"\n\nimport type { Store } from \"./store\"\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\n\nfunction prettyPrintTokenType(token: ReadableToken<any>) {\n\tif (token.type === `readonly_selector`) {\n\t\treturn `Readonly Selector`\n\t}\n\treturn capitalize(token.type)\n}\n\nexport class NotFoundError extends Error {\n\tpublic constructor(token: ReadableToken<any>, store: Store) {\n\t\tsuper(\n\t\t\t`${prettyPrintTokenType(token)} \"${token.key}\" not found in store \"${\n\t\t\t\tstore.config.name\n\t\t\t}\".`,\n\t\t)\n\t}\n}\n","import type { AtomToken, TransactionUpdate, ƒn } from \"atom.io\"\nimport type { TimelineUpdate } from \"atom.io\"\n\nimport { newest } from \"../lineage\"\nimport { getUpdateToken } from \"../mutable\"\nimport type { Store } from \"../store\"\nimport { withdraw } from \"../store\"\nimport type {\n\tTimeline,\n\tTimelineAtomUpdate,\n\tTimelineTransactionUpdate,\n} from \"./create-timeline\"\n\nexport const addAtomToTimeline = (\n\tatomToken: AtomToken<any>,\n\ttl: Timeline<any>,\n\tstore: Store,\n): void => {\n\tlet maybeAtom = withdraw(atomToken, store)\n\tif (maybeAtom?.type === `mutable_atom`) {\n\t\tconst updateToken = getUpdateToken(maybeAtom)\n\t\tmaybeAtom = withdraw(updateToken, store)\n\t}\n\tconst atom = maybeAtom\n\tif (atom === undefined) {\n\t\tthrow new Error(\n\t\t\t`Cannot subscribe to atom \"${atomToken.key}\" because it has not been initialized in store \"${store.config.name}\"`,\n\t\t)\n\t}\n\tstore.timelineAtoms.set({ atomKey: atom.key, timelineKey: tl.key })\n\n\tatom.subject.subscribe(`timeline`, (update) => {\n\t\t// debugger\n\t\tconst target = newest(store)\n\t\tconst currentSelectorKey =\n\t\t\tstore.operation.open && store.operation.token.type === `selector`\n\t\t\t\t? store.operation.token.key\n\t\t\t\t: null\n\t\tconst currentSelectorTime =\n\t\t\tstore.operation.open && store.operation.token.type === `selector`\n\t\t\t\t? store.operation.time\n\t\t\t\t: null\n\t\tconst currentTransactionKey = target.on.transactionApplying.state?.update.key\n\t\tconst currentTransactionTime = target.on.transactionApplying.state?.time\n\n\t\tstore.logger.info(\n\t\t\t`⏳`,\n\t\t\t`timeline`,\n\t\t\ttl.key,\n\t\t\t`atom`,\n\t\t\tatomToken.key,\n\t\t\t`went`,\n\t\t\tupdate.oldValue,\n\t\t\t`->`,\n\t\t\tupdate.newValue,\n\t\t\tcurrentTransactionKey\n\t\t\t\t? `in transaction \"${currentTransactionKey}\"`\n\t\t\t\t: currentSelectorKey\n\t\t\t\t ? `in selector \"${currentSelectorKey}\"`\n\t\t\t\t : ``,\n\t\t)\n\t\tif (tl.timeTraveling === null) {\n\t\t\tif (tl.selectorTime && tl.selectorTime !== currentSelectorTime) {\n\t\t\t\tconst mostRecentUpdate: TimelineUpdate<any> | undefined =\n\t\t\t\t\ttl.history.at(-1)\n\t\t\t\tif (mostRecentUpdate === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Timeline \"${tl.key}\" has a selectorTime, but no history. This is most likely a bug in AtomIO.`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (currentTransactionKey) {\n\t\t\t\tconst currentTransaction = withdraw(\n\t\t\t\t\t{ key: currentTransactionKey, type: `transaction` },\n\t\t\t\t\tstore,\n\t\t\t\t)\n\t\t\t\tif (currentTransaction === undefined) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Transaction \"${currentTransactionKey}\" not found in store \"${store.config.name}\". This is surprising, because we are in the application phase of \"${currentTransactionKey}\".`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif (tl.transactionKey !== currentTransactionKey) {\n\t\t\t\t\tif (tl.transactionKey) {\n\t\t\t\t\t\tstore.logger.error(\n\t\t\t\t\t\t\t`🐞`,\n\t\t\t\t\t\t\t`timeline`,\n\t\t\t\t\t\t\ttl.key,\n\t\t\t\t\t\t\t`unable to resolve transaction \"${tl.transactionKey}. This is probably a bug in AtomIO.`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\ttl.transactionKey = currentTransactionKey\n\t\t\t\t\tconst unsubscribe = currentTransaction.subject.subscribe(\n\t\t\t\t\t\t`timeline:${tl.key}`,\n\t\t\t\t\t\t(update) => {\n\t\t\t\t\t\t\tunsubscribe()\n\t\t\t\t\t\t\tif (tl.timeTraveling === null && currentTransactionTime) {\n\t\t\t\t\t\t\t\tif (tl.at !== tl.history.length) {\n\t\t\t\t\t\t\t\t\ttl.history.splice(tl.at)\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst filterUpdates = (\n\t\t\t\t\t\t\t\t\tupdates: TransactionUpdate<ƒn>[`updates`],\n\t\t\t\t\t\t\t\t) =>\n\t\t\t\t\t\t\t\t\tupdates\n\t\t\t\t\t\t\t\t\t\t.filter((updateFromTx) => {\n\t\t\t\t\t\t\t\t\t\t\tconst target = newest(store)\n\t\t\t\t\t\t\t\t\t\t\tif (`updates` in updateFromTx) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn true\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tconst atomOrFamilyKeys =\n\t\t\t\t\t\t\t\t\t\t\t\ttarget.timelineAtoms.getRelatedKeys(tl.key)\n\n\t\t\t\t\t\t\t\t\t\t\treturn atomOrFamilyKeys\n\t\t\t\t\t\t\t\t\t\t\t\t? [...atomOrFamilyKeys].some(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey === updateFromTx.key ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey === updateFromTx.family?.key,\n\t\t\t\t\t\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t\t\t\t\t\t: false\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t.map((updateFromTx) => {\n\t\t\t\t\t\t\t\t\t\t\tif (`updates` in updateFromTx) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\t\t\t\t...updateFromTx,\n\t\t\t\t\t\t\t\t\t\t\t\t\tupdates: filterUpdates(updateFromTx.updates),\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn updateFromTx\n\t\t\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t\tconst updates = filterUpdates(update.updates)\n\n\t\t\t\t\t\t\t\tconst timelineTransactionUpdate: TimelineTransactionUpdate = {\n\t\t\t\t\t\t\t\t\ttype: `transaction_update`,\n\t\t\t\t\t\t\t\t\ttimestamp: currentTransactionTime,\n\t\t\t\t\t\t\t\t\t...update,\n\t\t\t\t\t\t\t\t\tupdates,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst willCapture =\n\t\t\t\t\t\t\t\t\ttl.shouldCapture?.(timelineTransactionUpdate, tl) ?? true\n\t\t\t\t\t\t\t\tif (willCapture) {\n\t\t\t\t\t\t\t\t\ttl.history.push(timelineTransactionUpdate)\n\t\t\t\t\t\t\t\t\ttl.at = tl.history.length\n\t\t\t\t\t\t\t\t\ttl.subject.next(timelineTransactionUpdate)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttl.transactionKey = null\n\t\t\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t\t\t`⌛`,\n\t\t\t\t\t\t\t\t`timeline`,\n\t\t\t\t\t\t\t\ttl.key,\n\t\t\t\t\t\t\t\t`got a transaction_update \"${update.key}\"`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t} else if (currentSelectorKey && currentSelectorTime) {\n\t\t\t\tlet latestUpdate: TimelineUpdate<any> | undefined = tl.history.at(-1)\n\n\t\t\t\tif (currentSelectorTime !== tl.selectorTime) {\n\t\t\t\t\tlatestUpdate = {\n\t\t\t\t\t\ttype: `selector_update`,\n\t\t\t\t\t\ttimestamp: currentSelectorTime,\n\t\t\t\t\t\tkey: currentSelectorKey,\n\t\t\t\t\t\tatomUpdates: [],\n\t\t\t\t\t}\n\t\t\t\t\tlatestUpdate.atomUpdates.push({\n\t\t\t\t\t\tkey: atom.key,\n\t\t\t\t\t\ttype: `atom_update`,\n\t\t\t\t\t\t...update,\n\t\t\t\t\t})\n\t\t\t\t\tif (tl.at !== tl.history.length) {\n\t\t\t\t\t\ttl.history.splice(tl.at)\n\t\t\t\t\t}\n\n\t\t\t\t\ttl.history.push(latestUpdate)\n\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`⌛`,\n\t\t\t\t\t\t`timeline`,\n\t\t\t\t\t\ttl.key,\n\t\t\t\t\t\t`got a selector_update \"${currentSelectorKey}\" with`,\n\t\t\t\t\t\tlatestUpdate.atomUpdates.map((atomUpdate) => atomUpdate.key),\n\t\t\t\t\t)\n\n\t\t\t\t\ttl.at = tl.history.length\n\t\t\t\t\ttl.selectorTime = currentSelectorTime\n\t\t\t\t} else {\n\t\t\t\t\tif (latestUpdate?.type === `selector_update`) {\n\t\t\t\t\t\tlatestUpdate.atomUpdates.push({\n\t\t\t\t\t\t\tkey: atom.key,\n\t\t\t\t\t\t\ttype: `atom_update`,\n\t\t\t\t\t\t\t...update,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t\t`⌛`,\n\t\t\t\t\t\t\t`timeline`,\n\t\t\t\t\t\t\ttl.key,\n\t\t\t\t\t\t\t`set selector_update \"${currentSelectorKey}\" to`,\n\t\t\t\t\t\t\tlatestUpdate?.atomUpdates.map((atomUpdate) => atomUpdate.key),\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (latestUpdate) {\n\t\t\t\t\tconst willCaptureSelectorUpdate =\n\t\t\t\t\t\ttl.shouldCapture?.(latestUpdate, tl) ?? true\n\t\t\t\t\tif (willCaptureSelectorUpdate) {\n\t\t\t\t\t\ttl.subject.next(latestUpdate)\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttl.history.pop()\n\t\t\t\t\t\ttl.at = tl.history.length\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst timestamp = Date.now()\n\t\t\t\ttl.selectorTime = null\n\t\t\t\tif (tl.at !== tl.history.length) {\n\t\t\t\t\ttl.history.splice(tl.at)\n\t\t\t\t}\n\t\t\t\tconst atomUpdate: TimelineAtomUpdate<any> = {\n\t\t\t\t\ttype: `atom_update`,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\tkey: atom.key,\n\t\t\t\t\toldValue: update.oldValue,\n\t\t\t\t\tnewValue: update.newValue,\n\t\t\t\t}\n\t\t\t\tif (atom.family) {\n\t\t\t\t\tatomUpdate.family = atom.family\n\t\t\t\t}\n\t\t\t\tconst willCapture = tl.shouldCapture?.(atomUpdate, tl) ?? true\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`⌛`,\n\t\t\t\t\t`timeline`,\n\t\t\t\t\ttl.key,\n\t\t\t\t\t`got an atom_update to \"${atom.key}\"`,\n\t\t\t\t)\n\t\t\t\tif (willCapture) {\n\t\t\t\t\ttl.history.push(atomUpdate)\n\t\t\t\t\ttl.at = tl.history.length\n\t\t\t\t\ttl.subject.next(atomUpdate)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n}\n","import type {\n\tAtomFamily,\n\tFamilyMetadata,\n\tStateUpdate,\n\tTimelineManageable,\n\tTimelineOptions,\n\tTimelineToken,\n\tTimelineUpdate,\n\tTokenType,\n\tTransactionUpdate,\n\tƒn,\n} from \"atom.io\"\n\nimport { newest } from \"../lineage\"\nimport { getUpdateToken, isMutable } from \"../mutable\"\nimport { type Store, withdraw } from \"../store\"\nimport { Subject } from \"../subject\"\nimport { addAtomToTimeline } from \"./add-atom-to-timeline\"\n\nexport type TimelineAtomUpdate<ManagedAtom extends TimelineManageable> =\n\tStateUpdate<TokenType<ManagedAtom>> & {\n\t\tkey: string\n\t\ttype: `atom_update`\n\t\ttimestamp: number\n\t\tfamily?: FamilyMetadata\n\t}\nexport type TimelineSelectorUpdate<ManagedAtom extends TimelineManageable> = {\n\tkey: string\n\ttype: `selector_update`\n\ttimestamp: number\n\tatomUpdates: Omit<TimelineAtomUpdate<ManagedAtom>, `timestamp`>[]\n}\nexport type TimelineTransactionUpdate = TransactionUpdate<ƒn> & {\n\tkey: string\n\ttype: `transaction_update`\n\ttimestamp: number\n}\n\nexport type Timeline<ManagedAtom extends TimelineManageable> = {\n\ttype: `timeline`\n\tkey: string\n\tat: number\n\tshouldCapture?: (\n\t\tupdate: TimelineUpdate<TimelineManageable>,\n\t\ttimeline: Timeline<ManagedAtom>,\n\t) => boolean\n\ttimeTraveling: `into_future` | `into_past` | null\n\thistory: TimelineUpdate<ManagedAtom>[]\n\tselectorTime: number | null\n\ttransactionKey: string | null\n\tinstall: (store: Store) => void\n\tsubject: Subject<\n\t\t| TimelineAtomUpdate<ManagedAtom>\n\t\t| TimelineSelectorUpdate<ManagedAtom>\n\t\t| TimelineTransactionUpdate\n\t\t| `redo`\n\t\t| `undo`\n\t>\n}\n\nexport function createTimeline<ManagedAtom extends TimelineManageable>(\n\toptions: TimelineOptions<ManagedAtom>,\n\tstore: Store,\n\tdata?: Timeline<ManagedAtom>,\n): TimelineToken<ManagedAtom> {\n\tconst tl: Timeline<ManagedAtom> = {\n\t\ttype: `timeline`,\n\t\tkey: options.key,\n\t\tat: 0,\n\t\ttimeTraveling: null,\n\t\tselectorTime: null,\n\t\ttransactionKey: null,\n\t\t...data,\n\t\thistory: data?.history.map((update) => ({ ...update })) ?? [],\n\t\tinstall: (store) => createTimeline(options, store, tl),\n\t\tsubject: new Subject(),\n\t}\n\tif (options.shouldCapture) {\n\t\ttl.shouldCapture = options.shouldCapture\n\t}\n\tconst timelineKey = options.key\n\tconst target = newest(store)\n\tfor (const tokenOrFamily of options.atoms) {\n\t\tlet atomKey = tokenOrFamily.key\n\t\tif (\n\t\t\ttokenOrFamily.type === `atom_family` ||\n\t\t\ttokenOrFamily.type === `mutable_atom_family`\n\t\t) {\n\t\t\tconst family: AtomFamily<any> = tokenOrFamily\n\t\t\tconst familyKey = family.key\n\t\t\ttarget.timelineAtoms.set({ atomKey: familyKey, timelineKey })\n\t\t\tfamily.subject.subscribe(`timeline:${options.key}`, (token) => {\n\t\t\t\taddAtomToTimeline(token, tl, store)\n\t\t\t})\n\t\t\tfor (const atom of target.atoms.values()) {\n\t\t\t\tif (atom.family?.key === familyKey) {\n\t\t\t\t\taddAtomToTimeline(atom, tl, store)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tlet atom = withdraw(tokenOrFamily, store)\n\t\t\tif (atom === undefined) {\n\t\t\t\tstore.logger.error(\n\t\t\t\t\t`❌`,\n\t\t\t\t\t`timeline`,\n\t\t\t\t\toptions.key,\n\t\t\t\t\t`Failed to add atom \"${atomKey}\" because it does not exist in the store`,\n\t\t\t\t)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (isMutable(atom)) {\n\t\t\t\tconst updateAtom = withdraw(getUpdateToken(atom), store)\n\t\t\t\tif (updateAtom === undefined) {\n\t\t\t\t\tstore.logger.error(\n\t\t\t\t\t\t`❌`,\n\t\t\t\t\t\t`timeline`,\n\t\t\t\t\t\toptions.key,\n\t\t\t\t\t\t`Failed to add update atom \"${atomKey}\" because it does not exist in the store`,\n\t\t\t\t\t)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tatom = updateAtom\n\t\t\t\tatomKey = atom.key\n\t\t\t}\n\t\t\tif (`family` in atom) {\n\t\t\t\tconst familyTimelineKey = target.timelineAtoms.getRelatedKey(\n\t\t\t\t\tatom.family.key,\n\t\t\t\t)\n\t\t\t\tif (familyTimelineKey) {\n\t\t\t\t\tstore.logger.error(\n\t\t\t\t\t\t`❌`,\n\t\t\t\t\t\t`timeline`,\n\t\t\t\t\t\toptions.key,\n\t\t\t\t\t\t`Failed to add atom \"${atom.key}\" because its family \"${atom.family.key}\" already belongs to timeline \"${familyTimelineKey}\"`,\n\t\t\t\t\t)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst existingTimelineKey = target.timelineAtoms.getRelatedKey(atomKey)\n\t\t\tif (existingTimelineKey) {\n\t\t\t\tstore.logger.error(\n\t\t\t\t\t`❌`,\n\t\t\t\t\t`timeline`,\n\t\t\t\t\toptions.key,\n\t\t\t\t\t`Failed to add atom \"${atomKey}\" because it already belongs to timeline \"${existingTimelineKey}\"`,\n\t\t\t\t)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\taddAtomToTimeline(atom, tl, store)\n\t\t}\n\t}\n\n\tstore.timelines.set(options.key, tl)\n\tconst token: TimelineToken<ManagedAtom> = {\n\t\tkey: timelineKey,\n\t\ttype: `timeline`,\n\t}\n\tstore.on.timelineCreation.next(token)\n\treturn token\n}\n","import type { TimelineToken } from \"atom.io\"\n\nimport {\n\tingestAtomUpdate,\n\tingestSelectorUpdate,\n\tingestTransactionUpdate,\n} from \"../ingest-updates\"\nimport type { Store } from \"../store\"\n\nexport const timeTravel = (\n\taction: `redo` | `undo`,\n\ttoken: TimelineToken<any>,\n\tstore: Store,\n): void => {\n\tstore.logger.info(\n\t\taction === `redo` ? `⏩` : `⏪`,\n\t\t`timeline`,\n\t\ttoken.key,\n\t\taction,\n\t)\n\tconst timelineData = store.timelines.get(token.key)\n\tif (!timelineData) {\n\t\tstore.logger.error(\n\t\t\t`🐞`,\n\t\t\t`timeline`,\n\t\t\ttoken.key,\n\t\t\t`Failed to ${action}. This timeline has not been initialized.`,\n\t\t)\n\t\treturn\n\t}\n\tif (\n\t\t(action === `redo` && timelineData.at === timelineData.history.length) ||\n\t\t(action === `undo` && timelineData.at === 0)\n\t) {\n\t\tstore.logger.warn(\n\t\t\t`💁`,\n\t\t\t`timeline`,\n\t\t\ttoken.key,\n\t\t\t`Failed to ${action} at the ${\n\t\t\t\taction === `redo` ? `end` : `beginning`\n\t\t\t} of timeline \"${token.key}\". There is nothing to ${action}.`,\n\t\t)\n\t\treturn\n\t}\n\n\ttimelineData.timeTraveling = action === `redo` ? `into_future` : `into_past`\n\tif (action === `undo`) {\n\t\t--timelineData.at\n\t}\n\n\tconst update = timelineData.history[timelineData.at]\n\tconst applying = action === `redo` ? `newValue` : `oldValue`\n\n\tswitch (update.type) {\n\t\tcase `atom_update`: {\n\t\t\tingestAtomUpdate(applying, update, store)\n\t\t\tbreak\n\t\t}\n\t\tcase `selector_update`: {\n\t\t\tingestSelectorUpdate(applying, update, store)\n\t\t\tbreak\n\t\t}\n\t\tcase `transaction_update`: {\n\t\t\tingestTransactionUpdate(applying, update, store)\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif (action === `redo`) {\n\t\t++timelineData.at\n\t}\n\n\ttimelineData.subject.next(action)\n\ttimelineData.timeTraveling = null\n\tstore.logger.info(\n\t\t`⏹️`,\n\t\t`timeline`,\n\t\ttoken.key,\n\t\t`\"${token.key}\" is now at ${timelineData.at} / ${timelineData.history.length}`,\n\t)\n}\n","import { newest } from \"../lineage\"\nimport type { Store } from \"../store\"\n\nexport const abortTransaction = (store: Store): void => {\n\tconst target = newest(store)\n\tif (target.transactionMeta === null || target.parent === null) {\n\t\tstore.logger.warn(\n\t\t\t`🐞`,\n\t\t\t`transaction`,\n\t\t\t`???`,\n\t\t\t`abortTransaction called outside of a transaction. This is probably a bug in AtomIO.`,\n\t\t)\n\t\treturn\n\t}\n\tstore.logger.info(\n\t\t`🪂`,\n\t\t`transaction`,\n\t\ttarget.transactionMeta.update.key,\n\t\t`Aborting transaction`,\n\t)\n\ttarget.parent.child = null\n}\n","import type { ƒn } from \"atom.io\"\n\nimport { ingestTransactionUpdate } from \"../ingest-updates\"\nimport { newest } from \"../lineage\"\nimport { withdraw } from \"../store\"\nimport type { Store } from \"../store\"\n\nexport const applyTransaction = <ƒ extends ƒn>(\n\toutput: ReturnType<ƒ>,\n\tstore: Store,\n): void => {\n\tconst child = newest(store)\n\tconst { parent } = child\n\tif (\n\t\tparent === null ||\n\t\tchild.transactionMeta === null ||\n\t\tchild.transactionMeta?.phase !== `building`\n\t) {\n\t\tstore.logger.warn(\n\t\t\t`🐞`,\n\t\t\t`transaction`,\n\t\t\t`???`,\n\t\t\t`applyTransaction called outside of a transaction. This is probably a bug in AtomIO.`,\n\t\t)\n\t\treturn\n\t}\n\tchild.transactionMeta.phase = `applying`\n\tchild.transactionMeta.update.output = output\n\tparent.child = null\n\tparent.on.transactionApplying.next(child.transactionMeta)\n\tconst { updates } = child.transactionMeta.update\n\tstore.logger.info(\n\t\t`🛄`,\n\t\t`transaction`,\n\t\tchild.transactionMeta.update.key,\n\t\t`Applying transaction with ${updates.length} updates:`,\n\t\tupdates,\n\t)\n\tfor (const tracker of child.trackers.values()) {\n\t\tconst mutableKey = tracker.mutableState.key\n\t\tif (!parent.atoms.has(mutableKey)) {\n\t\t\tconst atom = child.atoms.get(mutableKey)\n\t\t\tatom?.install(parent)\n\t\t}\n\t\ttracker.dispose()\n\t}\n\tfor (const atom of child.atoms.values()) {\n\t\tif (!parent.atoms.has(atom.key)) {\n\t\t\tparent.atoms.set(atom.key, atom)\n\t\t\tparent.valueMap.set(atom.key, atom.default)\n\t\t\tparent.logger.info(\n\t\t\t\t`🔨`,\n\t\t\t\t`transaction`,\n\t\t\t\tchild.transactionMeta.update.key,\n\t\t\t\t`Adding atom \"${atom.key}\"`,\n\t\t\t)\n\t\t}\n\t}\n\tingestTransactionUpdate(`newValue`, child.transactionMeta.update, parent)\n\tif (parent.transactionMeta === null) {\n\t\tconst myTransaction = withdraw<ƒ>(\n\t\t\t{ key: child.transactionMeta.update.key, type: `transaction` },\n\t\t\tstore,\n\t\t)\n\t\tmyTransaction?.subject.next(child.transactionMeta.update)\n\t\tstore.logger.info(\n\t\t\t`🛬`,\n\t\t\t`transaction`,\n\t\t\tchild.transactionMeta.update.key,\n\t\t\t`Finished applying transaction.`,\n\t\t)\n\t} else {\n\t\tparent.transactionMeta.update.updates.push(child.transactionMeta.update)\n\t}\n\tparent.on.transactionApplying.next(null)\n}\n","import { findInStore, getState, runTransaction, setState } from \"atom.io\"\nimport type { findState } from \"atom.io\"\n\nimport { Junction } from \"~/packages/rel8/junction/src\"\n\nimport { getEnvironmentData } from \"../get-environment-data\"\nimport { LazyMap } from \"../lazy-map\"\nimport { newest } from \"../lineage\"\nimport type { Store } from \"../store\"\n\nexport const buildTransaction = (\n\tkey: string,\n\tparams: any[],\n\tstore: Store,\n\tid?: string,\n): void => {\n\tconst parent = newest(store)\n\tconst child: Store = {\n\t\tparent,\n\t\tchild: null,\n\t\ton: parent.on,\n\t\tloggers: parent.loggers,\n\t\tlogger: parent.logger,\n\t\tconfig: parent.config,\n\t\ttransactionMeta: null,\n\t\tatoms: new LazyMap(parent.atoms),\n\t\tatomsThatAreDefault: new Set(parent.atomsThatAreDefault),\n\t\tfamilies: new LazyMap(parent.families),\n\t\toperation: { open: false },\n\t\treadonlySelectors: new LazyMap(parent.readonlySelectors),\n\t\ttimelines: new LazyMap(parent.timelines),\n\t\ttimelineAtoms: new Junction(parent.timelineAtoms.toJSON()),\n\t\ttrackers: new Map(),\n\t\ttransactions: new LazyMap(parent.transactions),\n\t\tselectorAtoms: new Junction(parent.selectorAtoms.toJSON()),\n\t\tselectorGraph: new Junction(parent.selectorGraph.toJSON(), {\n\t\t\tmakeContentKey: (...keys) => keys.sort().join(`:`),\n\t\t}),\n\t\tselectors: new LazyMap(parent.selectors),\n\t\tvalueMap: new LazyMap(parent.valueMap),\n\t}\n\tchild.transactionMeta = {\n\t\tphase: `building`,\n\t\ttime: Date.now(),\n\t\tupdate: {\n\t\t\tkey,\n\t\t\tid: id ?? Math.random().toString(36).slice(2),\n\t\t\tupdates: [],\n\t\t\tparams,\n\t\t\toutput: undefined,\n\t\t},\n\t\ttransactors: {\n\t\t\tget: (token) => getState(token, child),\n\t\t\tset: (token, value) => setState(token, value, child),\n\t\t\trun: (token) => runTransaction(token, child),\n\t\t\tfind: ((token, key) => findInStore(token, key, child)) as typeof findState,\n\t\t\tenv: () => getEnvironmentData(child),\n\t\t},\n\t}\n\tparent.child = child\n\tstore.logger.info(\n\t\t`🛫`,\n\t\t`transaction`,\n\t\tkey,\n\t\t`Building transaction with params:`,\n\t\tparams,\n\t)\n}\n","import type {\n\tTransactionOptions,\n\tTransactionToken,\n\tTransactionUpdate,\n\tƒn,\n} from \"atom.io\"\n\nimport { newest } from \"../lineage\"\nimport { deposit } from \"../store\"\nimport type { Store } from \"../store\"\nimport { Subject } from \"../subject\"\nimport { abortTransaction } from \"./abort-transaction\"\nimport { applyTransaction } from \"./apply-transaction\"\nimport { buildTransaction } from \"./build-transaction\"\n\nexport type Transaction<ƒ extends ƒn> = {\n\tkey: string\n\ttype: `transaction`\n\tinstall: (store: Store) => void\n\tsubject: Subject<TransactionUpdate<ƒ>>\n\trun: (parameters: Parameters<ƒ>, id?: string) => ReturnType<ƒ>\n}\n\nexport function createTransaction<ƒ extends ƒn>(\n\toptions: TransactionOptions<ƒ>,\n\tstore: Store,\n): TransactionToken<ƒ> {\n\tconst newTransaction: Transaction<ƒ> = {\n\t\tkey: options.key,\n\t\ttype: `transaction`,\n\t\trun: (params: Parameters<ƒ>, id?: string) => {\n\t\t\tbuildTransaction(options.key, params, store, id)\n\t\t\ttry {\n\t\t\t\tconst target = newest(store)\n\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: this happens right above\n\t\t\t\tconst { transactors } = target.transactionMeta!\n\t\t\t\tconst output = options.do(transactors, ...params)\n\t\t\t\tapplyTransaction(output, target)\n\t\t\t\treturn output\n\t\t\t} catch (thrown) {\n\t\t\t\tabortTransaction(target)\n\t\t\t\tstore.logger.warn(`💥`, `transaction`, options.key, `caught:`, thrown)\n\t\t\t\tthrow thrown\n\t\t\t}\n\t\t},\n\t\tinstall: (store) => createTransaction(options, store),\n\t\tsubject: new Subject(),\n\t}\n\tconst target = newest(store)\n\ttarget.transactions.set(newTransaction.key, newTransaction)\n\tconst token = deposit(newTransaction)\n\tstore.on.transactionCreation.next(token)\n\treturn token\n}\n","import type { TransactionUpdate, TransactorsWithRunAndEnv, ƒn } from \"atom.io\"\n\nexport * from \"./abort-transaction\"\nexport * from \"./apply-transaction\"\nexport * from \"./build-transaction\"\nexport * from \"./create-transaction\"\n\nexport const TRANSACTION_PHASES = [`idle`, `building`, `applying`] as const\nexport type TransactionPhase = (typeof TRANSACTION_PHASES)[number]\n\nexport type TransactionMeta<ƒ extends ƒn> = {\n\tphase: `applying` | `building`\n\ttime: number\n\tupdate: TransactionUpdate<ƒ>\n\ttransactors: TransactorsWithRunAndEnv\n}\n"]}
|