atom.io 0.14.0 → 0.14.1
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 +1473 -52
- package/data/dist/index.cjs.map +1 -1
- package/data/dist/index.d.cts +315 -16
- package/data/dist/index.js +10 -267
- package/data/dist/index.js.map +1 -1
- package/data/package.json +5 -5
- package/data/src/join.ts +3 -3
- package/dist/chunk-5VJ77LZE.js +176 -0
- package/dist/chunk-5VJ77LZE.js.map +1 -0
- package/dist/chunk-CK7GNCU5.js +309 -0
- package/dist/chunk-CK7GNCU5.js.map +1 -0
- package/dist/chunk-KW7RA7IM.js +67 -0
- package/dist/chunk-KW7RA7IM.js.map +1 -0
- package/dist/chunk-LFXB7Y6M.js +68 -0
- package/dist/chunk-LFXB7Y6M.js.map +1 -0
- package/dist/chunk-NYCVSXQB.js +181 -0
- package/dist/chunk-NYCVSXQB.js.map +1 -0
- package/dist/chunk-TE3ZSTQ6.js +2516 -0
- package/dist/chunk-TE3ZSTQ6.js.map +1 -0
- package/dist/index.cjs +2244 -55
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +268 -21
- package/dist/index.js +1 -152
- package/dist/index.js.map +1 -1
- package/dist/metafile-cjs.json +1 -1
- package/internal/dist/index.cjs +208 -79
- package/internal/dist/index.cjs.map +1 -1
- package/internal/dist/index.d.cts +226 -27
- package/internal/dist/index.js +1 -2240
- package/internal/dist/index.js.map +1 -1
- package/internal/package.json +5 -5
- package/introspection/dist/index.cjs +1618 -46
- package/introspection/dist/index.cjs.map +1 -1
- package/introspection/dist/index.d.cts +374 -4
- package/introspection/dist/index.js +2 -316
- package/introspection/dist/index.js.map +1 -1
- package/introspection/package.json +5 -5
- package/json/dist/index.cjs +1560 -8
- package/json/dist/index.cjs.map +1 -1
- package/json/dist/index.d.cts +371 -7
- package/json/dist/index.js +1 -76
- package/json/dist/index.js.map +1 -1
- package/json/package.json +5 -5
- package/package.json +5 -4
- package/react/dist/index.cjs +1604 -14
- package/react/dist/index.cjs.map +1 -1
- package/react/dist/index.d.cts +375 -4
- package/react/dist/index.js +2 -68
- package/react/dist/index.js.map +1 -1
- package/react/package.json +5 -5
- package/react-devtools/dist/index.cjs +2268 -198
- package/react-devtools/dist/index.cjs.map +1 -1
- package/react-devtools/dist/index.css +2 -2
- package/react-devtools/dist/index.d.cts +148 -24
- package/react-devtools/dist/index.js +57 -297
- package/react-devtools/dist/index.js.map +1 -1
- package/react-devtools/package.json +5 -5
- package/realtime-client/dist/index.cjs +1585 -35
- package/realtime-client/dist/index.cjs.map +1 -1
- package/realtime-client/dist/index.d.cts +382 -12
- package/realtime-client/dist/index.js +2 -165
- package/realtime-client/dist/index.js.map +1 -1
- package/realtime-client/package.json +5 -5
- package/realtime-react/dist/index.cjs +1782 -35
- package/realtime-react/dist/index.cjs.map +1 -1
- package/realtime-react/dist/index.d.cts +49 -9
- package/realtime-react/dist/index.js +4 -66
- package/realtime-react/dist/index.js.map +1 -1
- package/realtime-react/package.json +5 -5
- package/realtime-server/dist/index.cjs +1604 -58
- package/realtime-server/dist/index.cjs.map +1 -1
- package/realtime-server/dist/index.d.cts +391 -11
- package/realtime-server/dist/index.js +27 -21
- package/realtime-server/dist/index.js.map +1 -1
- package/realtime-server/package.json +6 -6
- package/realtime-testing/dist/index.cjs +2352 -16
- package/realtime-testing/dist/index.cjs.map +1 -1
- package/realtime-testing/dist/index.d.cts +486 -3
- package/realtime-testing/dist/index.js +10 -31
- package/realtime-testing/dist/index.js.map +1 -1
- package/realtime-testing/package.json +5 -5
- package/transceivers/set-rtx/dist/index.cjs +31 -10
- package/transceivers/set-rtx/dist/index.cjs.map +1 -1
- package/transceivers/set-rtx/dist/index.d.cts +29 -3
- package/transceivers/set-rtx/dist/index.js +2 -3
- package/transceivers/set-rtx/dist/index.js.map +1 -1
- package/transceivers/set-rtx/package.json +6 -6
- package/data/dist/index.d.ts +0 -158
- package/data/dist/metafile-cjs.json +0 -1
- package/data/dist/metafile-esm.json +0 -1
- package/dist/index.d.ts +0 -243
- package/dist/metafile-esm.json +0 -1
- package/internal/dist/index.d.ts +0 -421
- package/internal/dist/metafile-cjs.json +0 -1
- package/internal/dist/metafile-esm.json +0 -1
- package/introspection/dist/index.d.ts +0 -24
- package/introspection/dist/metafile-cjs.json +0 -1
- package/introspection/dist/metafile-esm.json +0 -1
- package/json/dist/index.d.ts +0 -51
- package/json/dist/metafile-cjs.json +0 -1
- package/json/dist/metafile-esm.json +0 -1
- package/react/dist/index.d.ts +0 -23
- package/react/dist/metafile-cjs.json +0 -1
- package/react/dist/metafile-esm.json +0 -1
- package/react-devtools/dist/index.d.ts +0 -341
- package/react-devtools/dist/metafile-cjs.json +0 -1
- package/react-devtools/dist/metafile-esm.json +0 -1
- package/realtime-client/dist/index.d.ts +0 -22
- package/realtime-client/dist/metafile-cjs.json +0 -1
- package/realtime-client/dist/metafile-esm.json +0 -1
- package/realtime-react/dist/index.d.ts +0 -27
- package/realtime-react/dist/metafile-cjs.json +0 -1
- package/realtime-react/dist/metafile-esm.json +0 -1
- package/realtime-server/dist/index.d.ts +0 -25
- package/realtime-server/dist/metafile-cjs.json +0 -1
- package/realtime-server/dist/metafile-esm.json +0 -1
- package/realtime-testing/dist/index.d.ts +0 -49
- package/realtime-testing/dist/metafile-cjs.json +0 -1
- package/realtime-testing/dist/metafile-esm.json +0 -1
- package/transceivers/set-rtx/dist/index.d.ts +0 -40
- package/transceivers/set-rtx/dist/metafile-cjs.json +0 -1
- package/transceivers/set-rtx/dist/metafile-esm.json +0 -1
package/react/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/store-context.tsx","../src/store-hooks.ts"],"names":["React"],"mappings":";AACA,SAAS,gBAAgB;AACzB,YAAY,WAAW;AAQtB;AANM,IAAM,eAAqB,oBAAqB,SAAS,KAAK;AAE9D,IAAM,gBAGR,CAAC,EAAE,UAAU,QAAQ,SAAS,MAAM,MACxC,oBAAC,aAAa,UAAb,EAAsB,OAAO,OAAQ,UAAS;;;ACVhD,YAAYA,YAAW;AAEvB,SAAS,UAAU,MAAM,UAAU,YAAY;AAQ/C;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAIA,SAAS,KACf,OACyD;AACzD,QAAM,QAAc,kBAAW,YAAY;AAC3C,QAAM,SAEI,cAAO,IAAI;AACrB,MAAI,OAAO,YAAY,MAAM;AAC5B,WAAO,UAAU,CAAC,SAAS,SAAS,OAAO,MAAM,KAAK;AAAA,EACvD;AACA,SAAO,OAAO;AACf;AAEO,SAAS,KAAQ,OAAoD;AAC3E,QAAM,QAAc,kBAAW,YAAY;AAC3C,QAAM,KAAW,aAAM;AACvB,SAAa;AAAA,IACZ,CAAC,aAAa,iBAAiB,OAAO,UAAU,SAAS,EAAE,IAAI,KAAK;AAAA,IACpE,MAAM,SAAS,OAAO,KAAK;AAAA,IAC3B,MAAM,SAAS,OAAO,KAAK;AAAA,EAC5B;AACD;AAEO,SAAS,QACf,OACe;AACf,QAAM,YAAY,aAAa,KAAK;AACpC,SAAO,KAAK,SAAS;AACtB;AASO,SAAS,MAAM,OAAoC;AACzD,QAAM,QAAc,kBAAW,YAAY;AAC3C,QAAM,KAAW,aAAM;AACvB,QAAM,WAAW,SAAS,OAAO,KAAK;AACtC,MAAI,aAAa,QAAW;AAC3B,UAAM,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACD;AACA,WAAO;AAAA,MACN,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,MAAM,MAAM;AAAA,MAAC;AAAA,MACb,MAAM,MAAM;AAAA,MAAC;AAAA,IACd;AAAA,EACD;AACA,QAAM,OAAa,cAAqB;AAAA,IACvC,IAAI,SAAS;AAAA,IACb,QAAQ,SAAS,QAAQ;AAAA,IACzB,MAAM,MAAM,KAAK,KAAK;AAAA,IACtB,MAAM,MAAM,KAAK,KAAK;AAAA,EACvB,CAAC;AACD,QAAM,WAAiB,mBAAY,MAAM;AACxC,SAAK,QAAQ,KAAK,SAAS;AAC3B,SAAK,QAAQ,SAAS,SAAS,QAAQ;AACvC,WAAO,KAAK;AAAA,EACb,GAAG,CAAC,IAAI,CAAC;AACT,SAAa;AAAA,IACZ,CAAC,aAAa,oBAAoB,OAAO,UAAU,UAAU,EAAE,IAAI,KAAK;AAAA,IACxE;AAAA,IACA;AAAA,EACD;AACD","sourcesContent":["import type { Store } from \"atom.io/internal\"\nimport { IMPLICIT } from \"atom.io/internal\"\nimport * as React from \"react\"\n\nexport const StoreContext = React.createContext<Store>(IMPLICIT.STORE)\n\nexport const StoreProvider: React.FC<{\n\tchildren: React.ReactNode\n\tstore?: Store\n}> = ({ children, store = IMPLICIT.STORE }) => (\n\t<StoreContext.Provider value={store}>{children}</StoreContext.Provider>\n)\n","import * as React from \"react\"\n\nimport { getState, redo, setState, undo } from \"atom.io\"\nimport type {\n\tMutableAtomToken,\n\tReadonlySelectorToken,\n\tStateToken,\n\tTimelineToken,\n} from \"atom.io\"\n\nimport {\n\tgetJsonToken,\n\tsubscribeToState,\n\tsubscribeToTimeline,\n\twithdraw,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"./store-context\"\n\nexport function useI<T>(\n\ttoken: StateToken<T>,\n): <New extends T>(next: New | ((old: T) => New)) => void {\n\tconst store = React.useContext(StoreContext)\n\tconst setter: React.MutableRefObject<\n\t\t(<New extends T>(next: New | ((old: T) => New)) => void) | null\n\t> = React.useRef(null)\n\tif (setter.current === null) {\n\t\tsetter.current = (next) => setState(token, next, store)\n\t}\n\treturn setter.current\n}\n\nexport function useO<T>(token: ReadonlySelectorToken<T> | StateToken<T>): T {\n\tconst store = React.useContext(StoreContext)\n\tconst id = React.useId()\n\treturn React.useSyncExternalStore<T>(\n\t\t(dispatch) => subscribeToState(token, dispatch, `use-o:${id}`, store),\n\t\t() => getState(token, store),\n\t\t() => getState(token, store),\n\t)\n}\n\nexport function useJSON<Serializable extends Json.Serializable>(\n\ttoken: MutableAtomToken<any, Serializable>,\n): Serializable {\n\tconst jsonToken = getJsonToken(token)\n\treturn useO(jsonToken)\n}\n\nexport type TimelineMeta = {\n\tat: number\n\tlength: number\n\tundo: () => void\n\tredo: () => void\n}\n\nexport function useTL(token: TimelineToken): TimelineMeta {\n\tconst store = React.useContext(StoreContext)\n\tconst id = React.useId()\n\tconst timeline = withdraw(token, store)\n\tif (timeline === undefined) {\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 use timeline because it does not exist`,\n\t\t)\n\t\treturn {\n\t\t\tat: NaN,\n\t\t\tlength: NaN,\n\t\t\tundo: () => {},\n\t\t\tredo: () => {},\n\t\t}\n\t}\n\tconst meta = React.useRef<TimelineMeta>({\n\t\tat: timeline.at,\n\t\tlength: timeline.history.length,\n\t\tundo: () => undo(token),\n\t\tredo: () => redo(token),\n\t})\n\tconst retrieve = React.useCallback(() => {\n\t\tmeta.current.at = timeline.at\n\t\tmeta.current.length = timeline.history.length\n\t\treturn meta.current\n\t}, [meta])\n\treturn React.useSyncExternalStore<TimelineMeta>(\n\t\t(dispatch) => subscribeToTimeline(token, dispatch, `use-tl:${id}`, store),\n\t\tretrieve,\n\t\tretrieve,\n\t)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/get-state.ts","../../src/logger.ts","../../src/set-state.ts","../../src/timeline.ts","../../internal/src/future.ts","../../internal/src/lineage.ts","../../internal/src/caching.ts","../../json/src/select-json.ts","../../internal/src/read-or-compute-value.ts","../../internal/src/operation.ts","../../internal/src/set-state/become.ts","../../internal/src/subject.ts","../../internal/src/set-state/copy-mutable-if-needed.ts","../../internal/src/set-state/copy-mutable-in-transaction.ts","../../internal/src/set-state/emit-update.ts","../../internal/src/set-state/evict-downstream.ts","../../internal/src/set-state/stow-update.ts","../../internal/src/set-state/set-atom.ts","../../internal/src/set-state/set-atom-or-selector.ts","../../internal/src/store/deposit.ts","../../../rel8/junction/src/junction.ts","../../internal/src/store/store.ts","../../internal/src/store/withdraw.ts","../../internal/src/store/withdraw-new-family-member.ts","../../internal/src/keys.ts","../../internal/src/selector/get-selector-dependency-keys.ts","../../internal/src/selector/trace-selector-atoms.ts","../../internal/src/selector/update-selector-atoms.ts","../../internal/src/selector/register-selector.ts","../../internal/src/selector/create-read-write-selector.ts","../../internal/src/selector/create-readonly-selector.ts","../../internal/src/selector/create-selector.ts","../../internal/src/selector/delete-selector.ts","../../internal/src/subscribe/recall-state.ts","../../internal/src/subscribe/subscribe-to-root-atoms.ts","../../internal/src/subscribe/subscribe-to-state.ts","../../internal/src/subscribe/subscribe-to-timeline.ts","../../internal/src/mutable/tracker.ts","../../internal/src/mutable/create-mutable-atom.ts","../../internal/src/mutable/get-json-token.ts","../../internal/src/mutable/transceiver.ts","../../internal/src/atom/is-default.ts","../../internal/src/atom/create-atom.ts","../../internal/src/atom/delete-atom.ts","../../internal/src/not-found-error.ts","../../internal/src/timeline/time-travel.ts","../src/store-context.tsx","../src/store-hooks.ts"],"names":["a","b","target","update","unsubscribe","store","React"],"mappings":"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","sourcesContent":["import * as Internal from \"atom.io/internal\"\n\nimport type { ReadonlySelectorToken, StateToken } from \".\"\n\nexport function getState<T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): T {\n\tconst state =\n\t\tInternal.withdraw(token, store) ??\n\t\tInternal.withdrawNewFamilyMember(token, store)\n\tif (state === undefined) {\n\t\tthrow new Internal.NotFoundError(token, store)\n\t}\n\treturn Internal.readOrComputeValue(state, store)\n}\n","const LoggerIconDictionary = {\n\t\"⌛\": `Timeline event fully captured`,\n\t\"⏩\": `Timeline redo`,\n\t\"⏪\": `Timeline undo`,\n\t\"⏭️\": `Transaction redo`,\n\t\"⏮️\": `Transaction undo`,\n\t\"⏳\": `Timeline event partially captured`,\n\t\"⏹️\": `Time-travel complete`,\n\t\"💁\": `Notice`,\n\t\"🔄\": `Realtime transaction synchronized`,\n\t\"✅\": `Realtime transaction success`,\n\t\"✨\": `Computation complete`,\n\t\"❌\": `Conflict prevents attempted action`,\n\t\"⭕\": `Operation start`,\n\t\"🐞\": `Possible bug in AtomIO`,\n\t\"👀\": `Subscription added`,\n\t\"👪\": `Family member added`,\n\t\"📁\": `Stow update`,\n\t\"📃\": `Copy mutable`,\n\t\"📖\": `Read state`,\n\t\"📝\": `Write state`,\n\t\"📢\": `Notify subscribers`,\n\t\"🔌\": `Register dependency`,\n\t\"🔍\": `Discover root`,\n\t\"🔥\": `Delete state`,\n\t\"🔧\": `Create mutable atom`,\n\t\"🔨\": `Create immutable atom`,\n\t\"🔴\": `Operation complete`,\n\t\"🗑\": `Evict cached value`,\n\t\"💥\": `Caught`,\n\t\"🙈\": `Subscription canceled`,\n\t\"🛄\": `Apply transaction`,\n\t\"🛠️\": `Install atom into store`,\n\t\"🛫\": `Begin transaction`,\n\t\"🛬\": `Complete transaction`,\n\t\"🧮\": `Computing selector`,\n\t\"🧹\": `Prepare to evict`,\n\t\"🪂\": `Abort transaction`,\n} as const\nexport type LoggerIcon = keyof typeof LoggerIconDictionary\n\nexport const LOG_LEVELS = [`info`, `warn`, `error`] as const\nexport type LogLevel = (typeof LOG_LEVELS)[number]\n\nexport type LogFn = (\n\ticon: LoggerIcon,\n\ttokenType:\n\t\t| `atom`\n\t\t| `readonly_selector`\n\t\t| `selector`\n\t\t| `state`\n\t\t| `timeline`\n\t\t| `transaction`\n\t\t| `unknown`,\n\ttokenKey: string,\n\tmessage: string,\n\t...rest: unknown[]\n) => void\nexport type LogFilter = (...params: Parameters<LogFn>) => boolean\n\nexport type Logger = Record<LogLevel, LogFn>\n\nexport const simpleLog =\n\t(logLevel: keyof Logger): LogFn =>\n\t(icon, tokenType, tokenKey, message, ...rest) => {\n\t\tconsole[logLevel](`${icon} ${tokenType} \"${tokenKey}\" ${message}`, ...rest)\n\t}\nexport const simpleLogger: Logger = {\n\terror: simpleLog(`error`),\n\tinfo: simpleLog(`info`),\n\twarn: simpleLog(`warn`),\n}\n\nexport class AtomIOLogger implements Logger {\n\tpublic constructor(\n\t\tpublic logLevel: `error` | `info` | `warn` | null,\n\t\tprivate readonly filter?: LogFilter,\n\t\tprivate readonly logger: Logger = simpleLogger,\n\t) {}\n\n\tpublic error: LogFn = (...args) => {\n\t\tif ((this.filter?.(...args) ?? true) && this.logLevel !== null) {\n\t\t\tthis.logger.error(...args)\n\t\t}\n\t}\n\tpublic info: LogFn = (...args) => {\n\t\tif ((this.filter?.(...args) ?? true) && this.logLevel === `info`) {\n\t\t\tthis.logger.info(...args)\n\t\t}\n\t}\n\tpublic warn: LogFn = (...args) => {\n\t\tif (\n\t\t\t(this.filter?.(...args) ?? true) &&\n\t\t\tthis.logLevel !== `error` &&\n\t\t\tthis.logLevel !== null\n\t\t) {\n\t\t\tthis.logger.warn(...args)\n\t\t}\n\t}\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { StateToken } from \".\"\n\nexport function setState<T, New extends T>(\n\ttoken: StateToken<T>,\n\tvalue: New | ((oldValue: T) => New),\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): void {\n\tconst rejection = Internal.openOperation(token, store)\n\tif (rejection) {\n\t\treturn\n\t}\n\tconst state =\n\t\tInternal.withdraw(token, store) ??\n\t\tInternal.withdrawNewFamilyMember(token, store)\n\tif (state === undefined) {\n\t\tthrow new Internal.NotFoundError(token, store)\n\t}\n\tInternal.setAtomOrSelector(state, value, store)\n\tInternal.closeOperation(store)\n}\n","import type {\n\tTimeline,\n\tTimelineAtomUpdate,\n\tTimelineSelectorUpdate,\n\tTimelineTransactionUpdate,\n} from \"atom.io/internal\"\nimport { IMPLICIT, createTimeline, timeTravel } from \"atom.io/internal\"\n\nimport type { AtomFamily, AtomToken } from \".\"\n\nexport type TimelineToken = {\n\tkey: string\n\ttype: `timeline`\n}\n\nexport type TimelineOptions = {\n\tkey: string\n\tatoms: (AtomFamily<any, any> | AtomToken<any>)[]\n\tshouldCapture?: (update: TimelineUpdate, timeline: Timeline) => boolean\n}\n\nexport type TimelineUpdate =\n\t| TimelineAtomUpdate\n\t| TimelineSelectorUpdate\n\t| TimelineTransactionUpdate\n\nexport const timeline = (options: TimelineOptions): TimelineToken => {\n\treturn createTimeline(options, IMPLICIT.STORE)\n}\n\nexport const redo = (timeline: TimelineToken): void => {\n\ttimeTravel(`forward`, timeline, IMPLICIT.STORE)\n}\n\nexport const undo = (timeline: TimelineToken): void => {\n\ttimeTravel(`backward`, timeline, IMPLICIT.STORE)\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","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","import type { StateUpdate } from \"atom.io\"\nimport { Future } from \"./future\"\nimport { newest } from \"./lineage\"\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\tstore: Store,\n): Future<T> | T {\n\tconst target = newest(store)\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\tnewest(store).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, store)\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\tstore.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>(key: string, store: Store): T => {\n\treturn newest(store).valueMap.get(key) as T\n}\nexport const isValueCached = (key: string, store: Store): boolean => {\n\treturn newest(store).valueMap.has(key)\n}\n\nexport const evictCachedValue = (key: string, store: Store): void => {\n\tconst core = newest(store)\n\tconst currentValue = core.valueMap.get(key)\n\tif (currentValue instanceof Future) {\n\t\tcurrentValue.cancel()\n\t}\n\tif (core.operation.open) {\n\t\tcore.operation.prev.set(key, currentValue)\n\t}\n\tcore.valueMap.delete(key)\n\tstore.logger.info(`🗑`, `state`, key, `evicted`)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { IMPLICIT } from \"atom.io/internal\"\n\nimport { createSelector } from \"atom.io/internal\"\nimport type { Json, JsonInterface } from \".\"\n\nexport const selectJson = <T, J extends Json.Serializable>(\n\tatom: AtomIO.AtomToken<T>,\n\ttransform: JsonInterface<T, J>,\n\tstore: Store = IMPLICIT.STORE,\n): AtomIO.SelectorToken<J> => {\n\treturn createSelector(\n\t\t{\n\t\t\tkey: `${atom.key}:JSON`,\n\t\t\tget: ({ get }) => transform.toJson(get(atom)),\n\t\t\tset: ({ set }, newValue) => set(atom, transform.fromJson(newValue)),\n\t\t},\n\t\tundefined,\n\t\tstore,\n\t)\n}\n","import type { Atom } from \"./atom\"\nimport { isValueCached, readCachedValue } from \"./caching\"\nimport type { ReadonlySelector, Selector } from \"./selector\"\nimport type { Store } from \"./store\"\n\nexport const readOrComputeValue = <T>(\n\tstate: Atom<T> | ReadonlySelector<T> | Selector<T>,\n\tstore: Store,\n): T => {\n\tif (isValueCached(state.key, store)) {\n\t\tstore.logger.info(`📖`, state.type, state.key, `reading cached value`)\n\t\treturn readCachedValue(state.key, store)\n\t}\n\tif (state.type !== `atom`) {\n\t\tstore.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\tstore.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 { StateToken } 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: StateToken<any>\n\t }\n\nexport const openOperation = (\n\ttoken: StateToken<any>,\n\tstore: Store,\n): `rejection` | undefined => {\n\tconst target = newest(store)\n\tif (target.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 \"${target.operation.token.key}\"`,\n\t\t)\n\t\treturn `rejection`\n\t}\n\ttarget.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\ttarget.transactionMeta === null\n\t\t\t\t? ``\n\t\t\t\t: ` ${target.transactionMeta.phase} \"${target.transactionMeta.update.key}\"`\n\t\t}`,\n\t)\n}\nexport const closeOperation = (store: Store): void => {\n\tconst target = newest(store)\n\tif (target.operation.open) {\n\t\tstore.logger.info(\n\t\t\t`🔴`,\n\t\t\ttarget.operation.token.type,\n\t\t\ttarget.operation.token.key,\n\t\t\t`operation done in store \"${store.config.name}\"`,\n\t\t)\n\t}\n\ttarget.operation = { open: false }\n\tstore.subject.operationStatus.next(target.operation)\n}\n\nexport const isDone = (key: string, store: Store): boolean => {\n\tconst target = newest(store)\n\tif (!target.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 target.operation.done.has(key)\n}\nexport const markDone = (key: string, store: Store): void => {\n\tconst target = newest(store)\n\tif (!target.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\ttarget.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\tfor (const subscriber of this.subscribers.values()) {\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 { 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 (`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\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}\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 { 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 { newest } from \"../lineage\"\nimport { isDone, markDone } from \"../operation\"\nimport type { Store } from \"../store\"\n\nexport const evictDownStream = <T>(atom: Atom<T>, store: Store): void => {\n\tconst target = newest(store)\n\tconst downstreamKeys = target.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 (target.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`[ ${[...target.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, unless they're not equal by reference\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 { newest } from \"../lineage\"\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\tstore: Store,\n): void => {\n\tconst target = newest(store)\n\tconst oldValue = readOrComputeValue(atom, store)\n\tlet newValue = copyMutableIfWithinTransaction(oldValue, atom, store)\n\tnewValue = become(next)(newValue)\n\tstore.logger.info(`📝`, `atom`, atom.key, `set to`, newValue)\n\tnewValue = cacheValue(atom.key, newValue, atom.subject, store)\n\tif (isAtomDefault(atom.key, store)) {\n\t\tmarkAtomAsNotDefault(atom.key, store)\n\t}\n\tmarkDone(atom.key, store)\n\tevictDownStream(atom, store)\n\tconst update = { oldValue, newValue }\n\tif (\n\t\ttarget.transactionMeta === null ||\n\t\ttarget.transactionMeta.phase === `applying`\n\t) {\n\t\temitUpdate(atom, update, store)\n\t} else {\n\t\tstowUpdate(atom, update, store)\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\tif (state.type === `selector`) {\n\t\tstate.set(value)\n\t} else {\n\t\tsetAtom(state, value, store)\n\t}\n}\n","import type {\n\tAtomToken,\n\tReadonlySelectorToken,\n\tSelectorToken,\n\tStateToken,\n\tTransactionToken,\n\tƒn,\n} from \"atom.io\"\n\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>): StateToken<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>(\n\tstate: Atom<T> | ReadonlySelector<T> | Selector<T>,\n): ReadonlySelectorToken<T> | StateToken<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 type { Cardinality, Json, Refinement } from \"rel8\"\n\nexport interface JunctionEntries<Content extends Json.Object | null>\n\textends Json.Object {\n\treadonly relations: [string, string[]][]\n\treadonly contents: [string, Content][]\n}\nexport interface JunctionSchema<ASide extends string, BSide extends string>\n\textends Json.Object {\n\treadonly between: [a: ASide, b: BSide]\n\treadonly cardinality: Cardinality\n}\n\nexport type BaseExternalStoreConfiguration = {\n\taddRelation: (a: string, b: string) => void\n\tdeleteRelation: (a: string, b: string) => void\n\treplaceRelationsSafely: (a: string, bs: string[]) => void\n\treplaceRelationsUnsafely: (a: string, bs: string[]) => void\n\tgetRelatedKeys: (key: string) => Set<string> | undefined\n\thas: (a: string, b?: string) => boolean\n}\n\nexport type ExternalStoreWithContentConfiguration<Content extends Json.Object> =\n\t{\n\t\tgetContent: (contentKey: string) => Content | undefined\n\t\tsetContent: (contentKey: string, content: Content) => void\n\t\tdeleteContent: (contentKey: string) => void\n\t}\n\nexport type Empty<Obj extends object> = {\n\t[Key in keyof Obj]?: undefined\n}\n\nexport type ExternalStoreConfiguration<Content extends Json.Object | null> =\n\tContent extends Json.Object\n\t\t? BaseExternalStoreConfiguration &\n\t\t\t\tExternalStoreWithContentConfiguration<Content>\n\t\t: BaseExternalStoreConfiguration &\n\t\t\t\tEmpty<ExternalStoreWithContentConfiguration<Json.Object>>\n\nexport type JunctionAdvancedConfiguration<Content extends Json.Object | null> = {\n\texternalStore?: ExternalStoreConfiguration<Content>\n\tisContent?: Refinement<unknown, Content>\n\tmakeContentKey?: (a: string, b: string) => string\n}\n\nexport type JunctionJSON<\n\tASide extends string,\n\tBSide extends string,\n\tContent extends Json.Object | null,\n> = JunctionEntries<Content> & JunctionSchema<ASide, BSide>\n\nexport class Junction<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Content extends Json.Object | null = null,\n> {\n\tpublic readonly a: ASide\n\tpublic readonly b: BSide\n\tpublic readonly cardinality: Cardinality\n\tpublic readonly relations = new Map<string, Set<string>>()\n\tpublic readonly contents = new Map<string, Content>()\n\n\tpublic isContent: Refinement<unknown, Content> | null\n\tpublic makeContentKey = (a: string, b: string): string => `${a}:${b}`\n\n\tpublic getRelatedKeys(key: string): Set<string> | undefined {\n\t\treturn this.relations.get(key)\n\t}\n\tprotected addRelation(a: string, b: string): void {\n\t\tlet aRelations = this.relations.get(a)\n\t\tlet bRelations = this.relations.get(b)\n\t\tif (aRelations) {\n\t\t\taRelations.add(b)\n\t\t} else {\n\t\t\taRelations = new Set([b])\n\t\t\tthis.relations.set(a, aRelations)\n\t\t}\n\t\tif (bRelations) {\n\t\t\tbRelations.add(a)\n\t\t} else {\n\t\t\tbRelations = new Set([a])\n\t\t\tthis.relations.set(b, bRelations)\n\t\t}\n\t}\n\tprotected deleteRelation(a: string, b: string): void {\n\t\tconst aRelations = this.relations.get(a)\n\t\tif (aRelations) {\n\t\t\taRelations.delete(b)\n\t\t\tif (aRelations.size === 0) {\n\t\t\t\tthis.relations.delete(a)\n\t\t\t}\n\t\t\tconst bRelations = this.relations.get(b)\n\t\t\tif (bRelations) {\n\t\t\t\tbRelations.delete(a)\n\t\t\t\tif (bRelations.size === 0) {\n\t\t\t\t\tthis.relations.delete(b)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected replaceRelationsUnsafely(a: string, bs: string[]): void {\n\t\tthis.relations.set(a, new Set(bs))\n\t\tfor (const b of bs) {\n\t\t\tconst bRelations = new Set([a])\n\t\t\tthis.relations.set(b, bRelations)\n\t\t}\n\t}\n\tprotected replaceRelationsSafely(a: string, bs: string[]): void {\n\t\tconst aRelationsPrev = this.relations.get(a)\n\t\tif (aRelationsPrev) {\n\t\t\tfor (const b of aRelationsPrev) {\n\t\t\t\tconst bRelations = this.relations.get(b)\n\t\t\t\tif (bRelations) {\n\t\t\t\t\tif (bRelations.size === 1) {\n\t\t\t\t\t\tthis.relations.delete(b)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbRelations.delete(a)\n\t\t\t\t\t}\n\t\t\t\t\tthis.contents.delete(this.makeContentKey(a, b))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.relations.set(a, new Set(bs))\n\t\tfor (const b of bs) {\n\t\t\tlet bRelations = this.relations.get(b)\n\t\t\tif (bRelations) {\n\t\t\t\tbRelations.add(a)\n\t\t\t} else {\n\t\t\t\tbRelations = new Set([a])\n\t\t\t\tthis.relations.set(b, bRelations)\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected getContentInternal(contentKey: string): Content | undefined {\n\t\treturn this.contents.get(contentKey)\n\t}\n\tprotected setContent(contentKey: string, content: Content): void {\n\t\tthis.contents.set(contentKey, content)\n\t}\n\tprotected deleteContent(contentKey: string): void {\n\t\tthis.contents.delete(contentKey)\n\t}\n\n\tpublic constructor(\n\t\tdata: JunctionSchema<ASide, BSide> & Partial<JunctionEntries<Content>>,\n\t\tconfig?: JunctionAdvancedConfiguration<Content>,\n\t) {\n\t\tthis.a = data.between[0]\n\t\tthis.b = data.between[1]\n\n\t\tthis.cardinality = data.cardinality\n\t\tif (!config?.externalStore) {\n\t\t\tthis.relations = new Map(data.relations?.map(([a, b]) => [a, new Set(b)]))\n\t\t\tthis.contents = new Map(data.contents)\n\t\t}\n\t\tthis.isContent = config?.isContent ?? null\n\t\tif (config?.makeContentKey) {\n\t\t\tthis.makeContentKey = config.makeContentKey\n\t\t}\n\t\tif (config?.externalStore) {\n\t\t\tconst externalStore = config.externalStore\n\t\t\tthis.has = (a, b) => externalStore.has(a, b)\n\t\t\tthis.addRelation = (a, b) => {\n\t\t\t\texternalStore.addRelation(a, b)\n\t\t\t}\n\t\t\tthis.deleteRelation = (a, b) => {\n\t\t\t\texternalStore.deleteRelation(a, b)\n\t\t\t}\n\t\t\tthis.replaceRelationsSafely = (a, bs) => {\n\t\t\t\texternalStore.replaceRelationsSafely(a, bs)\n\t\t\t}\n\t\t\tthis.replaceRelationsUnsafely = (a, bs) => {\n\t\t\t\texternalStore.replaceRelationsUnsafely(a, bs)\n\t\t\t}\n\t\t\tthis.getRelatedKeys = (key) => externalStore.getRelatedKeys(key)\n\t\t\tif (externalStore.getContent) {\n\t\t\t\tthis.getContentInternal = (contentKey) => {\n\t\t\t\t\treturn externalStore.getContent(contentKey) as any\n\t\t\t\t}\n\t\t\t\tthis.setContent = (contentKey, content) => {\n\t\t\t\t\texternalStore.setContent(contentKey, content as any)\n\t\t\t\t}\n\t\t\t\tthis.deleteContent = (contentKey) => {\n\t\t\t\t\texternalStore.deleteContent(contentKey)\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const [x, ys] of data.relations ?? []) {\n\t\t\t\tfor (const y of ys) this.addRelation(x, y)\n\t\t\t}\n\t\t\tfor (const [contentKey, content] of data.contents ?? []) {\n\t\t\t\tthis.setContent(contentKey, content)\n\t\t\t}\n\t\t}\n\t}\n\tpublic toJSON(): JunctionJSON<ASide, BSide, Content> {\n\t\treturn {\n\t\t\tbetween: [this.a, this.b],\n\t\t\tcardinality: this.cardinality,\n\t\t\trelations: [...this.relations.entries()].map(([a, b]) => [a, [...b]]),\n\t\t\tcontents: [...this.contents.entries()],\n\t\t}\n\t}\n\n\tpublic set(\n\t\ta: string,\n\t\t...rest: Content extends null ? [b: string] : [b: string, content: Content]\n\t): this\n\tpublic set(\n\t\trelation: { [Key in ASide | BSide]: string },\n\t\t...rest: Content extends null ? [] | [b?: undefined] : [content: Content]\n\t): this\n\tpublic set(\n\t\ta: string | { [Key in ASide | BSide]: string },\n\t\t...rest: Content extends null\n\t\t\t? [] | [b?: string | undefined]\n\t\t\t: [b: string, content: Content] | [content: Content]\n\t): this {\n\t\tconst b: string =\n\t\t\ttypeof rest[0] === `string`\n\t\t\t\t? rest[0]\n\t\t\t\t: (a[this.b as keyof typeof a] as string)\n\t\tconst content: Content | undefined =\n\t\t\trest[1] ?? typeof rest[0] === `string` ? undefined : (rest[0] as Content)\n\t\ta = typeof a === `string` ? a : a[this.a]\n\t\tswitch (this.cardinality) {\n\t\t\t// biome-ignore lint/suspicious/noFallthroughSwitchClause: perfect here\n\t\t\tcase `1:1`: {\n\t\t\t\tconst bPrev = this.getRelatedKey(a)\n\t\t\t\tif (bPrev && bPrev !== b) this.delete(bPrev, a)\n\t\t\t}\n\t\t\tcase `1:n`: {\n\t\t\t\tconst aPrev = this.getRelatedKey(b)\n\t\t\t\tif (aPrev && aPrev !== a) this.delete(aPrev, b)\n\t\t\t}\n\t\t}\n\t\tif (content) {\n\t\t\tconst contentKey = this.makeContentKey(a, b)\n\t\t\tthis.setContent(contentKey, content)\n\t\t}\n\t\tthis.addRelation(a, b)\n\t\treturn this\n\t}\n\n\tpublic delete(a: string, b?: string): this\n\tpublic delete(\n\t\trelation:\n\t\t\t| Record<ASide | BSide, string>\n\t\t\t| Record<ASide, string>\n\t\t\t| Record<BSide, string>,\n\t\tb?: undefined,\n\t): this\n\tpublic delete(\n\t\tx:\n\t\t\t| Record<ASide | BSide, string>\n\t\t\t| Record<ASide, string>\n\t\t\t| Record<BSide, string>\n\t\t\t| string,\n\t\tb?: string | undefined,\n\t): this {\n\t\t// @ts-expect-error we deduce that this.b may index x\n\t\tb = typeof b === `string` ? b : (x[this.b] as string | undefined)\n\t\t// @ts-expect-error we deduce that this.a may index x\n\t\tconst a = typeof x === `string` ? x : (x[this.a] as string | undefined)\n\n\t\tif (a === undefined && typeof b === `string`) {\n\t\t\tconst bRelations = this.getRelatedKeys(b)\n\t\t\tif (bRelations) {\n\t\t\t\tfor (const a of bRelations) {\n\t\t\t\t\tthis.delete(a, b)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (typeof a === `string` && b === undefined) {\n\t\t\tconst aRelations = this.getRelatedKeys(a)\n\t\t\tif (aRelations) {\n\t\t\t\tfor (const b of aRelations) {\n\t\t\t\t\tthis.delete(a, b)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (typeof a === `string` && typeof b === `string`) {\n\t\t\tthis.deleteRelation(a, b)\n\t\t\tconst contentKey = this.makeContentKey(a, b)\n\t\t\tthis.deleteContent(contentKey)\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic getRelatedKey(key: string): string | undefined {\n\t\tconst relations = this.getRelatedKeys(key)\n\t\tif (relations) {\n\t\t\tif (relations.size > 1) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`${relations.size} related keys were found for key \"${key}\": (${[\n\t\t\t\t\t\t...relations,\n\t\t\t\t\t]\n\t\t\t\t\t\t.map((k) => `\"${k}\"`)\n\t\t\t\t\t\t.join(`, `)}). Only one related key was expected.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tfor (const relation of relations) {\n\t\t\t\treturn relation\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic replaceRelations(\n\t\ta: string,\n\t\trelations: Content extends null ? string[] : Record<string, Content>,\n\t\tconfig?: { reckless: boolean },\n\t): this {\n\t\tconst hasContent = !Array.isArray(relations)\n\t\tconst bs = hasContent ? Object.keys(relations) : relations\n\t\tif (config?.reckless) {\n\t\t\tthis.replaceRelationsUnsafely(a, bs)\n\t\t} else {\n\t\t\tthis.replaceRelationsSafely(a, bs)\n\t\t}\n\t\tif (hasContent) {\n\t\t\tfor (const b of bs) {\n\t\t\t\tconst contentKey = this.makeContentKey(a, b)\n\t\t\t\tconst content = relations[b] as Content\n\t\t\t\tthis.setContent(contentKey, content)\n\t\t\t}\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic getContent(a: string, b: string): Content | undefined {\n\t\tconst contentKey = this.makeContentKey(a, b)\n\t\treturn this.getContentInternal(contentKey)\n\t}\n\n\tpublic getRelationEntries(\n\t\tinput: Record<ASide, string> | Record<BSide, string>,\n\t): [string, Content][] {\n\t\tconst a: string | undefined = (input as any)[this.a]\n\t\tconst b: string | undefined = (input as any)[this.b]\n\t\tif (a !== undefined && b === undefined) {\n\t\t\tconst aRelations = this.getRelatedKeys(a)\n\t\t\tif (aRelations) {\n\t\t\t\treturn [...aRelations].map((b) => {\n\t\t\t\t\treturn [b, this.getContent(a, b) ?? (null as Content)]\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tif (a === undefined && b !== undefined) {\n\t\t\tconst bRelations = this.getRelatedKeys(b)\n\t\t\tif (bRelations) {\n\t\t\t\treturn [...bRelations].map((a) => {\n\t\t\t\t\treturn [a, this.getContent(a, b) ?? (null as Content)]\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\treturn []\n\t}\n\n\tpublic has(a: string, b?: string): boolean {\n\t\tif (b) {\n\t\t\tconst setA = this.getRelatedKeys(a)\n\t\t\treturn setA?.has(b) ?? false\n\t\t}\n\t\treturn this.relations.has(a)\n\t}\n}\n","import { 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 type { MutableAtom, Tracker, Transceiver } 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\n// export type StoreCore = Pick<\n// \tStore,\n// \t| `atoms`\n// \t| `atomsThatAreDefault`\n// \t| `families`\n// \t| `operation`\n// \t| `readonlySelectors`\n// \t| `selectorAtoms`\n// \t| `selectorGraph`\n// \t| `selectors`\n// \t| `timelineAtoms`\n// \t| `timelines`\n// \t| `trackers`\n// \t| `transactions`\n// \t| `valueMap`\n// >\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>()\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 subject = {\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>(),\n\t\ttransactionApplying: new StatefulSubject<TransactionMeta<ƒn> | null>(null),\n\t\toperationStatus: 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\n\t\t\tfor (const [, atom] of store.atoms) {\n\t\t\t\tatom.install(this)\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\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\tReadonlySelectorToken,\n\tSelectorToken,\n\tStateToken,\n\tTimelineToken,\n\tTransactionToken,\n\tƒn,\n} from \"atom.io\"\n\nimport type { Atom } from \"../atom\"\nimport { newest } from \"../lineage\"\nimport type { ReadonlySelector, Selector } from \"../selector\"\nimport type { Timeline } from \"../timeline\"\nimport type { Transaction } from \"../transaction\"\nimport type { Store } from \"./store\"\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: StateToken<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: ReadonlySelectorToken<T> | StateToken<T>,\n\tstore: Store,\n): Atom<T> | ReadonlySelector<T> | Selector<T> | undefined\nexport function withdraw<T>(\n\ttoken: TimelineToken,\n\tstore: Store,\n): Timeline | undefined\nexport function withdraw<T>(\n\ttoken:\n\t\t| ReadonlySelectorToken<T>\n\t\t| StateToken<T>\n\t\t| TimelineToken\n\t\t| TransactionToken<T>,\n\tstore: Store,\n):\n\t| Atom<T>\n\t| ReadonlySelector<T>\n\t| Selector<T>\n\t| Timeline\n\t| Transaction<T extends ƒn ? T : never>\n\t| undefined {\n\tconst target = newest(store)\n\tconst state =\n\t\ttarget.atoms.get(token.key) ??\n\t\ttarget.selectors.get(token.key) ??\n\t\ttarget.readonlySelectors.get(token.key) ??\n\t\ttarget.transactions.get(token.key) ??\n\t\ttarget.timelines.get(token.key)\n\tif (state) {\n\t\treturn state\n\t}\n\t// if (target.transactionMeta?.phase === `applying`) {\n\n\t// \tstate =\n\t// \t\ttarget.atoms.get(token.key) ??\n\t// \t\tcore.selectors.get(token.key) ??\n\t// \t\tcore.readonlySelectors.get(token.key) ??\n\t// \t\tcore.transactions.get(token.key) ??\n\t// \t\tcore.timelines.get(token.key)\n\n\t// \tif (state) {\n\t// \t\tstore.logger.info(\n\t// \t\t\t`🛠️`,\n\t// \t\t\ttoken.type,\n\t// \t\t\ttoken.key,\n\t// \t\t\t`add ${token.type} \"${token.key}\"`,\n\t// \t\t)\n\t// \t\tswitch (state.type) {\n\t// \t\t\tcase `atom`: {\n\t// \t\t\t\tstore.atoms.set(token.key, state)\n\t// \t\t\t\tstore.valueMap.set(token.key, state.default)\n\t// \t\t\t\tconst stateKey = state.key\n\t// \t\t\t\tconst familyKey = state.family?.key\n\t// \t\t\t\tlet timelineKey = core.timelineAtoms.getRelatedKey(stateKey)\n\t// \t\t\t\tif (timelineKey === undefined && typeof familyKey === `string`) {\n\t// \t\t\t\t\ttimelineKey = core.timelineAtoms.getRelatedKey(familyKey)\n\t// \t\t\t\t}\n\t// \t\t\t\tconst timeline =\n\t// \t\t\t\t\ttypeof timelineKey === `string`\n\t// \t\t\t\t\t\t? store.timelines.get(timelineKey)\n\t// \t\t\t\t\t\t: undefined\n\n\t// \t\t\t\tif (timeline) {\n\t// \t\t\t\t\taddAtomToTimeline(state, timeline, store)\n\t// \t\t\t\t}\n\t// \t\t\t\tbreak\n\t// \t\t\t}\n\t// \t\t\tcase `selector`:\n\t// \t\t\t\tcore.selectors.set(token.key, state)\n\t// \t\t\t\tbreak\n\t// \t\t\tcase `readonly_selector`:\n\t// \t\t\t\tcore.readonlySelectors.set(token.key, state)\n\t// \t\t\t\tbreak\n\t// \t\t\tcase `transaction`:\n\t// \t\t\t\tcore.transactions.set(token.key, state)\n\t// \t\t\t\tbreak\n\t// \t\t\tcase `timeline`:\n\t// \t\t\t\tcore.timelines.set(token.key, state)\n\t// \t\t\t\tbreak\n\t// \t\t}\n\t// \t\treturn state\n\t// \t}\n\t// }\n\treturn undefined\n}\n","import type {\n\tAtomToken,\n\tReadonlySelectorToken,\n\tSelectorToken,\n\tStateToken,\n} from \"atom.io\"\nimport type { Atom, ReadonlySelector, Selector, 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: StateToken<T>,\n\tstore: Store,\n): Atom<T> | Selector<T> | undefined\nexport function withdrawNewFamilyMember<T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\tstore: Store,\n): Atom<T> | ReadonlySelector<T> | Selector<T> | undefined\nexport function withdrawNewFamilyMember<T>(\n\ttoken:\n\t\t| AtomToken<T>\n\t\t| ReadonlySelectorToken<T>\n\t\t| SelectorToken<T>\n\t\t| StateToken<T>,\n\tstore: Store,\n): Atom<T> | ReadonlySelector<T> | Selector<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, StateToken } 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> | StateToken<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 { Transactors } 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\t\tconst alreadyRegistered = target.selectorGraph\n\t\t\t.getRelationEntries({ downstreamSelectorKey: selectorKey })\n\t\t\t.some(([_, { source }]) => source === dependency.key)\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\tif (!alreadyRegistered) {\n\t\t\ttarget.selectorGraph.set(\n\t\t\t\t{\n\t\t\t\t\tupstreamSelectorKey: dependency.key,\n\t\t\t\t\tdownstreamSelectorKey: selectorKey,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tsource: dependency.key,\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t\tupdateSelectorAtoms(selectorKey, dependency, store)\n\t\treturn dependencyValue\n\t},\n\tset: (stateToken, newValue) => {\n\t\tconst state = withdraw(stateToken, store)\n\t\tif (state === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`State \"${stateToken.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})\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\n\tconst { get, set } = registerSelector(options.key, store)\n\tconst getSelf = () => {\n\t\tconst value = options.get({ get })\n\t\tcacheValue(options.key, value, subject, 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\t// store.logger.info(`📝 set \"${options.key}\" (`, oldValue, `->`, newValue, `)`)\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({ get, set }, 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.subject.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 } = registerSelector(options.key, store)\n\tconst getSelf = () => {\n\t\tconst value = options.get({ get })\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.subject.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. (Ignore if you are in development using hot module replacement.)`,\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 { 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 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 = store.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, store)\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, store)\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 { ReadonlySelectorToken, StateToken, UpdateHandler } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { subscribeToRootAtoms, withdraw } from \"atom.io/internal\"\n\nexport function subscribeToState<T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\thandleUpdate: UpdateHandler<T>,\n\tkey: string,\n\tstore: Store,\n): () => void {\n\tconst state = withdraw<T>(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 { TimelineToken, TimelineUpdate } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { withdraw } from \"atom.io/internal\"\n\nexport const subscribeToTimeline = (\n\ttoken: TimelineToken,\n\thandleUpdate: (update: TimelineUpdate | `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 { 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 { createAtom, deleteAtom } 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\tdeleteAtom({ type: `atom`, key: latestUpdateStateKey }, store)\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 = createAtom<\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\n\t\treturn latestUpdateState\n\t}\n\n\tprivate unsubscribeFromInnerValue: (() => void) | null = null\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\tconst unsubscribe = store.subject.operationStatus.subscribe(\n\t\t\t\t\tmutableState.key,\n\t\t\t\t\t() => {\n\t\t\t\t\t\tunsubscribe()\n\t\t\t\t\t\tsetState(latestUpdateState, update, store)\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t},\n\t\t)\n\t\tsubscribeToState(\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\tconst unsubscribe = store.subject.operationStatus.subscribe(\n\t\t\t\t\t\t\t\tmutableState.key,\n\t\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\t\tunsubscribe()\n\t\t\t\t\t\t\t\t\tsetState(latestUpdateState, update, store)\n\t\t\t\t\t\t\t\t},\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.subject.operationStatus.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\tconst updateNumber = 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 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}\n}\n","import type { MutableAtomOptions, MutableAtomToken } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\nimport { selectJson } from \"atom.io/json\"\n\nimport { createAtom } 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\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 = createAtom<Core>(options, undefined, 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","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<Json.Serializable>,\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 { 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 { 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\nexport const isSelectorDefault = (key: string, store: Store): boolean => {\n\tconst rootKeys = traceAllSelectorAtoms(key, store)\n\treturn rootKeys.every((rootKey) => isAtomDefault(rootKey, store))\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 { 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 type Atom<T> = {\n\tkey: string\n\ttype: `atom`\n\tfamily?: FamilyMetadata\n\tinstall: (store: Store) => void\n\tsubject: Subject<{ newValue: T; oldValue: T }>\n\tdefault: T | (() => T)\n\tcleanup?: () => void\n}\n\nexport function createAtom<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\t`(Ignore if you are in development using hot module replacement.)`,\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, store)\n\t\t\t\t: createAtom(options, undefined, store)\n\t\t},\n\t\tsubject,\n\t\t...(family && { family }),\n\t} as const\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, store)\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.subject.atomCreation.next(token)\n\treturn token as AtomToken<T>\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 { ReadonlySelectorToken, StateToken } from \"atom.io\"\n\nimport type { Store } from \"./store\"\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\n\nfunction prettyPrintTokenType(\n\ttoken: ReadonlySelectorToken<any> | StateToken<any>,\n) {\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(\n\t\ttoken: ReadonlySelectorToken<any> | StateToken<any>,\n\t\tstore: Store,\n\t) {\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 { KeyedStateUpdate, TimelineToken, TransactionUpdate } from \"atom.io\"\nimport { setState } from \"atom.io\"\n\nimport type { Store } from \"../store\"\n\nexport const timeTravel = (\n\tdirection: `backward` | `forward`,\n\ttoken: TimelineToken,\n\tstore: Store,\n): void => {\n\tconst action = direction === `forward` ? `redo` : `undo`\n\tstore.logger.info(\n\t\tdirection === `forward` ? `⏩` : `⏪`,\n\t\t`timeline`,\n\t\ttoken.key,\n\t\taction,\n\t)\n\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\n\tif (\n\t\t(direction === `forward` &&\n\t\t\ttimelineData.at === timelineData.history.length) ||\n\t\t(direction === `backward` && 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\tdirection === `forward` ? `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 =\n\t\tdirection === `forward` ? `into_future` : `into_past`\n\tif (direction === `backward`) {\n\t\t--timelineData.at\n\t}\n\n\tconst update = timelineData.history[timelineData.at]\n\tconst updateValues = (atomUpdate: KeyedStateUpdate<any>) => {\n\t\tconst { key, newValue, oldValue } = atomUpdate\n\t\tconst value = direction === `forward` ? newValue : oldValue\n\t\tsetState({ key, type: `atom` }, value, store)\n\t}\n\tconst updateValuesFromTransactionUpdate = (\n\t\ttransactionUpdate: TransactionUpdate<any>,\n\t) => {\n\t\tconst updates =\n\t\t\tdirection === `forward`\n\t\t\t\t? transactionUpdate.updates\n\t\t\t\t: [...transactionUpdate.updates].reverse()\n\t\tfor (const updateFromTransaction of updates) {\n\t\t\tif (`newValue` in updateFromTransaction) {\n\t\t\t\tupdateValues(updateFromTransaction)\n\t\t\t} else {\n\t\t\t\tupdateValuesFromTransactionUpdate(updateFromTransaction)\n\t\t\t}\n\t\t}\n\t}\n\n\tswitch (update.type) {\n\t\tcase `atom_update`: {\n\t\t\tupdateValues(update)\n\t\t\tbreak\n\t\t}\n\t\tcase `selector_update`: {\n\t\t\tconst updates =\n\t\t\t\tdirection === `forward`\n\t\t\t\t\t? update.atomUpdates\n\t\t\t\t\t: [...update.atomUpdates].reverse()\n\t\t\tfor (const atomUpdate of updates) {\n\t\t\t\tupdateValues(atomUpdate)\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcase `transaction_update`: {\n\t\t\tupdateValuesFromTransactionUpdate(update)\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif (direction === `forward`) {\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 type { Store } from \"atom.io/internal\"\nimport { IMPLICIT } from \"atom.io/internal\"\nimport * as React from \"react\"\n\nexport const StoreContext = React.createContext<Store>(IMPLICIT.STORE)\n\nexport const StoreProvider: React.FC<{\n\tchildren: React.ReactNode\n\tstore?: Store\n}> = ({ children, store = IMPLICIT.STORE }) => (\n\t<StoreContext.Provider value={store}>{children}</StoreContext.Provider>\n)\n","import * as React from \"react\"\n\nimport { getState, redo, setState, undo } from \"atom.io\"\nimport type {\n\tMutableAtomToken,\n\tReadonlySelectorToken,\n\tStateToken,\n\tTimelineToken,\n} from \"atom.io\"\n\nimport {\n\tgetJsonToken,\n\tsubscribeToState,\n\tsubscribeToTimeline,\n\twithdraw,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { StoreContext } from \"./store-context\"\n\nexport function useI<T>(\n\ttoken: StateToken<T>,\n): <New extends T>(next: New | ((old: T) => New)) => void {\n\tconst store = React.useContext(StoreContext)\n\tconst setter: React.MutableRefObject<\n\t\t(<New extends T>(next: New | ((old: T) => New)) => void) | null\n\t> = React.useRef(null)\n\tif (setter.current === null) {\n\t\tsetter.current = (next) => setState(token, next, store)\n\t}\n\treturn setter.current\n}\n\nexport function useO<T>(token: ReadonlySelectorToken<T> | StateToken<T>): T {\n\tconst store = React.useContext(StoreContext)\n\tconst id = React.useId()\n\treturn React.useSyncExternalStore<T>(\n\t\t(dispatch) => subscribeToState(token, dispatch, `use-o:${id}`, store),\n\t\t() => getState(token, store),\n\t\t() => getState(token, store),\n\t)\n}\n\nexport function useJSON<Serializable extends Json.Serializable>(\n\ttoken: MutableAtomToken<any, Serializable>,\n): Serializable {\n\tconst jsonToken = getJsonToken(token)\n\treturn useO(jsonToken)\n}\n\nexport type TimelineMeta = {\n\tat: number\n\tlength: number\n\tundo: () => void\n\tredo: () => void\n}\n\nexport function useTL(token: TimelineToken): TimelineMeta {\n\tconst store = React.useContext(StoreContext)\n\tconst id = React.useId()\n\tconst timeline = withdraw(token, store)\n\tif (timeline === undefined) {\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 use timeline because it does not exist`,\n\t\t)\n\t\treturn {\n\t\t\tat: NaN,\n\t\t\tlength: NaN,\n\t\t\tundo: () => {},\n\t\t\tredo: () => {},\n\t\t}\n\t}\n\tconst meta = React.useRef<TimelineMeta>({\n\t\tat: timeline.at,\n\t\tlength: timeline.history.length,\n\t\tundo: () => undo(token),\n\t\tredo: () => redo(token),\n\t})\n\tconst retrieve = React.useCallback(() => {\n\t\tmeta.current.at = timeline.at\n\t\tmeta.current.length = timeline.history.length\n\t\treturn meta.current\n\t}, [meta])\n\treturn React.useSyncExternalStore<TimelineMeta>(\n\t\t(dispatch) => subscribeToTimeline(token, dispatch, `use-tl:${id}`, store),\n\t\tretrieve,\n\t\tretrieve,\n\t)\n}\n"]}
|