atom.io 0.17.0 → 0.18.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 +62 -40
- package/data/dist/index.cjs.map +1 -1
- package/data/dist/index.d.ts +8 -2
- package/data/dist/index.js +64 -42
- package/data/dist/index.js.map +1 -1
- package/data/src/dict.ts +8 -4
- package/data/src/join.ts +74 -33
- package/data/src/struct-family.ts +18 -17
- package/dist/chunk-IZHOMSXA.js +331 -0
- package/dist/chunk-IZHOMSXA.js.map +1 -0
- package/dist/chunk-JDUNWJFB.js +18 -0
- package/dist/chunk-JDUNWJFB.js.map +1 -0
- package/dist/index.cjs +4 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +66 -51
- package/dist/index.js +5 -11
- package/dist/index.js.map +1 -1
- package/internal/dist/index.cjs +187 -58
- package/internal/dist/index.cjs.map +1 -1
- package/internal/dist/index.d.ts +95 -71
- package/internal/dist/index.js +179 -53
- package/internal/dist/index.js.map +1 -1
- package/internal/src/arbitrary.ts +3 -0
- package/internal/src/atom/delete-atom.ts +7 -6
- package/internal/src/caching.ts +6 -4
- package/internal/src/families/find-in-store.ts +16 -0
- package/internal/src/get-environment-data.ts +4 -7
- package/internal/src/index.ts +6 -5
- package/internal/src/ingest-updates/ingest-atom-update.ts +6 -2
- package/internal/src/ingest-updates/ingest-transaction-update.ts +0 -1
- package/internal/src/selector/create-standalone-selector.ts +0 -2
- package/internal/src/set-state/copy-mutable-if-needed.ts +5 -0
- package/internal/src/set-state/emit-update.ts +25 -11
- package/internal/src/set-state/set-atom.ts +15 -18
- package/internal/src/store/store.ts +14 -2
- package/internal/src/store/withdraw.ts +72 -2
- package/internal/src/subscribe/subscribe-to-timeline.ts +2 -2
- package/internal/src/subscribe/subscribe-to-transaction.ts +2 -2
- package/internal/src/timeline/create-timeline.ts +12 -1
- package/internal/src/transaction/act-upon-store.ts +19 -0
- package/internal/src/transaction/apply-transaction.ts +6 -1
- package/internal/src/transaction/assign-transaction-to-continuity.ts +18 -0
- package/internal/src/transaction/build-transaction.ts +7 -6
- package/internal/src/transaction/create-transaction.ts +1 -1
- package/internal/src/transaction/get-epoch-number.ts +40 -0
- package/internal/src/transaction/index.ts +10 -1
- package/internal/src/transaction/set-epoch-number.ts +30 -0
- package/introspection/dist/index.cjs.map +1 -1
- package/introspection/dist/index.d.ts +3 -3
- package/introspection/dist/index.js.map +1 -1
- package/introspection/src/attach-introspection-states.ts +6 -2
- package/introspection/src/attach-timeline-family.ts +5 -2
- package/introspection/src/attach-transaction-logs.ts +2 -2
- package/json/dist/index.d.ts +3 -1
- package/json/src/index.ts +4 -0
- package/package.json +241 -230
- package/react/dist/index.cjs.map +1 -1
- package/react/dist/index.d.ts +1 -1
- package/react/dist/index.js.map +1 -1
- package/react/src/use-json.ts +1 -1
- package/react-devtools/dist/index.cjs +131 -134
- package/react-devtools/dist/index.cjs.map +1 -1
- package/react-devtools/dist/index.css +2 -2
- package/react-devtools/dist/index.css.map +1 -1
- package/react-devtools/dist/index.d.ts +3 -3
- package/react-devtools/dist/index.js +91 -108
- package/react-devtools/dist/index.js.map +1 -1
- package/react-devtools/src/StateEditor.tsx +4 -4
- package/react-devtools/src/StateIndex.tsx +1 -4
- package/react-devtools/src/TimelineIndex.tsx +3 -3
- package/react-devtools/src/TransactionIndex.tsx +9 -8
- package/react-devtools/src/index.ts +2 -2
- package/realtime/dist/index.cjs +120 -0
- package/realtime/dist/index.cjs.map +1 -0
- package/realtime/dist/index.d.ts +146 -0
- package/realtime/dist/index.js +111 -0
- package/realtime/dist/index.js.map +1 -0
- package/realtime/package.json +16 -0
- package/realtime/src/index.ts +2 -0
- package/realtime/src/realtime-continuity.ts +162 -0
- package/realtime/src/shared-room-store.ts +48 -0
- package/realtime-client/dist/index.cjs +424 -170
- package/realtime-client/dist/index.cjs.map +1 -1
- package/realtime-client/dist/index.d.ts +15 -11
- package/realtime-client/dist/index.js +96 -177
- package/realtime-client/dist/index.js.map +1 -1
- package/realtime-client/src/index.ts +8 -7
- package/realtime-client/src/{pull-family-member.ts → pull-atom-family-member.ts} +2 -2
- package/realtime-client/src/{pull-state.ts → pull-atom.ts} +2 -2
- package/realtime-client/src/{pull-mutable-family-member.ts → pull-mutable-atom-family-member.ts} +6 -6
- package/realtime-client/src/{pull-mutable.ts → pull-mutable-atom.ts} +1 -1
- package/realtime-client/src/pull-selector-family-member.ts +42 -0
- package/realtime-client/src/pull-selector.ts +38 -0
- package/realtime-client/src/realtime-client-stores/client-main-store.ts +12 -2
- package/realtime-client/src/realtime-client-stores/client-sync-store.ts +7 -7
- package/realtime-client/src/sync-continuity.ts +368 -0
- package/realtime-react/dist/index.cjs +367 -27
- package/realtime-react/dist/index.cjs.map +1 -1
- package/realtime-react/dist/index.d.ts +24 -8
- package/realtime-react/dist/index.js +38 -22
- package/realtime-react/dist/index.js.map +1 -1
- package/realtime-react/src/index.ts +6 -5
- package/realtime-react/src/use-pull-atom-family-member.ts +21 -0
- package/realtime-react/src/{use-sync.ts → use-pull-atom.ts} +4 -4
- package/realtime-react/src/{use-pull-mutable.ts → use-pull-mutable-atom.ts} +4 -3
- package/realtime-react/src/use-pull-mutable-family-member.ts +9 -4
- package/realtime-react/src/use-pull-selector-family-member.ts +21 -0
- package/realtime-react/src/{use-pull.ts → use-pull-selector.ts} +7 -5
- package/realtime-react/src/use-push.ts +3 -2
- package/realtime-react/src/use-server-action.ts +3 -2
- package/realtime-react/src/use-sync-continuity.ts +12 -0
- package/realtime-server/dist/index.cjs +769 -371
- package/realtime-server/dist/index.cjs.map +1 -1
- package/realtime-server/dist/index.d.ts +130 -60
- package/realtime-server/dist/index.js +753 -361
- package/realtime-server/dist/index.js.map +1 -1
- package/realtime-server/src/index.ts +17 -3
- package/realtime-server/src/ipc-sockets/child-socket.ts +135 -0
- package/realtime-server/src/ipc-sockets/custom-socket.ts +90 -0
- package/realtime-server/src/ipc-sockets/index.ts +3 -0
- package/realtime-server/src/ipc-sockets/parent-socket.ts +185 -0
- package/realtime-server/src/realtime-action-receiver.ts +8 -5
- package/realtime-server/src/realtime-continuity-synchronizer.ts +376 -0
- package/realtime-server/src/realtime-family-provider.ts +30 -71
- package/realtime-server/src/realtime-mutable-family-provider.ts +24 -86
- package/realtime-server/src/realtime-server-stores/index.ts +4 -1
- package/realtime-server/src/realtime-server-stores/realtime-continuity-store.ts +109 -0
- package/realtime-server/src/realtime-server-stores/server-room-external-actions.ts +64 -0
- package/realtime-server/src/realtime-server-stores/server-room-external-store.ts +42 -0
- package/realtime-server/src/realtime-server-stores/server-sync-store.ts +51 -98
- package/realtime-server/src/realtime-server-stores/server-user-store.ts +14 -29
- package/realtime-server/src/realtime-state-receiver.ts +0 -1
- package/realtime-testing/dist/index.cjs +34 -32
- package/realtime-testing/dist/index.cjs.map +1 -1
- package/realtime-testing/dist/index.d.ts +1 -0
- package/realtime-testing/dist/index.js +33 -31
- package/realtime-testing/dist/index.js.map +1 -1
- package/realtime-testing/src/setup-realtime-test.tsx +44 -32
- package/src/atom.ts +49 -31
- package/src/logger.ts +14 -5
- package/src/selector.ts +44 -25
- package/src/subscribe.ts +2 -1
- package/src/timeline.ts +4 -4
- package/src/transaction.ts +13 -17
- package/src/validators.ts +15 -9
- package/dist/chunk-H4Q5FTPZ.js +0 -11
- package/dist/chunk-H4Q5FTPZ.js.map +0 -1
- package/internal/src/set-state/copy-mutable-in-transaction.ts +0 -19
- package/realtime-client/src/sync-server-action.ts +0 -170
- package/realtime-client/src/sync-state.ts +0 -19
- package/realtime-react/src/use-pull-family-member.ts +0 -16
- package/realtime-react/src/use-sync-server-action.ts +0 -16
- package/realtime-server/src/realtime-action-synchronizer.ts +0 -152
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/atom.ts","../src/dispose.ts","../src/find-state.ts","../src/get-state.ts","../src/logger.ts","../src/selector.ts","../src/set-state.ts","../src/silo.ts","../src/subscribe.ts","../src/timeline.ts","../src/transaction.ts","../src/validators.ts"],"names":["IMPLICIT","Internal","createAtomFamily","createSelectorFamily","createStandaloneAtom","createStandaloneSelector","getFromStore","setIntoStore","createTimeline","timeTravel","timeline","createTransaction"],"mappings":"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","sourcesContent":["import type { Store, Subject, Transceiver } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tcreateAtomFamily,\n\tcreateStandaloneAtom,\n} from \"atom.io/internal\"\nimport type { Json, JsonInterface } from \"atom.io/json\"\n\nimport type { AtomToken, MutableAtomToken, RegularAtomToken } from \".\"\n\nexport type Effectors<T> = {\n\tsetSelf: <V extends T>(next: V | ((oldValue: T) => V)) => void\n\tonSet: (callback: (options: { newValue: T; oldValue: T }) => void) => void\n}\n\nexport type AtomEffect<T> = (tools: Effectors<T>) => (() => void) | void\n\nexport type RegularAtomOptions<T> = {\n\tkey: string\n\tdefault: T | (() => T)\n\teffects?: AtomEffect<T>[]\n}\n// biome-ignore format: complex intersection\nexport type MutableAtomOptions<T extends Transceiver<any>, J extends Json.Serializable> = \n\t& JsonInterface<T, J>\n\t& Omit<RegularAtomOptions<T>, `default`> \n\t& { \n\t\t\tdefault: ()\t=> T\n\t\t\tmutable: true\n\t\t}\n\nexport function atom<T extends Transceiver<any>, J extends Json.Serializable>(\n\toptions: MutableAtomOptions<T, J>,\n): MutableAtomToken<T, J>\nexport function atom<T>(options: RegularAtomOptions<T>): RegularAtomToken<T>\nexport function atom(\n\toptions: MutableAtomOptions<any, any> | RegularAtomOptions<any>,\n): AtomToken<any> {\n\treturn createStandaloneAtom(options, IMPLICIT.STORE)\n}\n\nexport type RegularAtomFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tdefault: T | ((key: K) => T)\n\teffects?: (key: K) => AtomEffect<T>[]\n}\n\nexport type RegularAtomFamily<\n\tT,\n\tK extends Json.Serializable = Json.Serializable,\n> = ((key: K) => RegularAtomToken<T>) & {\n\tkey: string\n\ttype: `atom_family`\n\tsubject: Subject<RegularAtomToken<T>>\n\tinstall: (store: Store) => void\n\t__T?: T\n\t__K?: K\n}\nexport type RegularAtomFamilyToken<T, K extends Json.Serializable> = {\n\tkey: string\n\ttype: `atom_family`\n\t__T?: T\n\t__K?: K\n}\n\n// biome-ignore format: intersection\nexport type MutableAtomFamilyOptions<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = \n\t& JsonInterface<T, J>\n\t& { \n\t\tkey: string\n\t\tdefault: (key: K) => T\n\t\teffects?: (key: K) => AtomEffect<T>[]\n\t\tmutable: true,\n\t}\n\n// biome-ignore format: intersection\nexport type MutableAtomFamily<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = \n\t& JsonInterface<T, J>\n\t& ((key: K) => MutableAtomToken<T, J>) \n\t& {\n\t\t\tkey: string\n\t\t\ttype: `mutable_atom_family`\n\t\t\tsubject: Subject<MutableAtomToken<T, J>>\n\t\t\tinstall: (store: Store) => void\n\t\t\t__T?: T\n\t\t\t__J?: J\n\t\t\t__K?: K\n\t\t}\nexport type MutableAtomFamilyToken<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = {\n\tkey: string\n\ttype: `mutable_atom_family`\n\t__T?: T\n\t__J?: J\n\t__K?: K\n}\n\nexport type AtomFamily<T, K extends Json.Serializable = Json.Serializable> =\n\t| MutableAtomFamily<T extends Transceiver<any> ? T : never, any, K>\n\t| RegularAtomFamily<T, K>\nexport type AtomFamilyToken<T, K extends Json.Serializable = Json.Serializable> =\n\t| MutableAtomFamilyToken<T extends Transceiver<any> ? T : never, any, K>\n\t| RegularAtomFamilyToken<T, K>\n\nexport function atomFamily<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n>(options: MutableAtomFamilyOptions<T, J, K>): MutableAtomFamily<T, J, K>\nexport function atomFamily<T, K extends Json.Serializable>(\n\toptions: RegularAtomFamilyOptions<T, K>,\n): RegularAtomFamily<T, K>\nexport function atomFamily<T, K extends Json.Serializable>(\n\toptions:\n\t\t| MutableAtomFamilyOptions<any, any, any>\n\t\t| RegularAtomFamilyOptions<T, K>,\n): MutableAtomFamily<any, any, any> | RegularAtomFamily<T, K> {\n\treturn createAtomFamily(options, IMPLICIT.STORE)\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { ReadableToken } from \".\"\n\nexport function dispose(\n\ttoken: ReadableToken<any>,\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): void {\n\tswitch (token.type) {\n\t\tcase `atom`:\n\t\t\tInternal.deleteAtom(token, store)\n\t\t\tbreak\n\t\tcase `selector`:\n\t\tcase `readonly_selector`:\n\t\t\tInternal.deleteSelector(token, store)\n\t\t\tbreak\n\t}\n}\n","import type {\n\tMutableAtomFamilyToken,\n\tMutableAtomToken,\n\tReadableFamilyToken,\n\tReadableToken,\n\tReadonlySelectorFamilyToken,\n\tReadonlySelectorToken,\n\tRegularAtomFamilyToken,\n\tRegularAtomToken,\n\tWritableFamilyToken,\n\tWritableSelectorFamilyToken,\n\tWritableSelectorToken,\n\tWritableToken,\n} from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport { IMPLICIT, findInStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nexport function findState<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n\tKey extends K,\n>(token: MutableAtomFamilyToken<T, J, K>, key: Key): MutableAtomToken<T, J>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: RegularAtomFamilyToken<T, K>,\n\tkey: Key,\n): RegularAtomToken<T>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: WritableSelectorFamilyToken<T, K>,\n\tkey: Key,\n): WritableSelectorToken<T>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: ReadonlySelectorFamilyToken<T, K>,\n\tkey: Key,\n): ReadonlySelectorToken<T>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: WritableFamilyToken<T, K>,\n\tkey: Key,\n): WritableToken<T>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: ReadableFamilyToken<T, K>,\n\tkey: Key,\n): ReadableToken<T>\n\nexport function findState(\n\ttoken: ReadableFamilyToken<any, any>,\n\tkey: Json.Serializable,\n): ReadableToken<any> {\n\tconst state = findInStore(token, key, IMPLICIT.STORE)\n\treturn state\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { ReadableToken } from \".\"\n\nexport function getState<T>(token: ReadableToken<T>): T {\n\treturn Internal.getFromStore(token, Internal.IMPLICIT.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\t\"🚀\": `Performance measure`,\n} as const\nexport type LoggerIcon = keyof typeof LoggerIconDictionary\nexport type TokenDenomination =\n\t| `atom`\n\t| `mutable_atom`\n\t| `readonly_selector`\n\t| `realtime_sync_group`\n\t| `selector`\n\t| `state`\n\t| `timeline`\n\t| `transaction`\n\t| `unknown`\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\tdenomination: TokenDenomination,\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, denomination, tokenKey, message, ...rest) => {\n\t\tconsole[logLevel](\n\t\t\t`${icon} ${denomination} \"${tokenKey}\" ${message}`,\n\t\t\t...rest,\n\t\t)\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 type { Store, Subject } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tcreateSelectorFamily,\n\tcreateStandaloneSelector,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ReadonlySelectorToken, WritableSelectorToken } from \".\"\nimport type { Read, Write } from \"./transaction\"\n\nexport type WritableSelectorOptions<T> = {\n\tkey: string\n\tget: Read<() => T>\n\tset: Write<(newValue: T) => void>\n}\nexport type ReadonlySelectorOptions<T> = {\n\tkey: string\n\tget: Read<() => T>\n}\n\nexport function selector<T>(\n\toptions: WritableSelectorOptions<T>,\n): WritableSelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T>,\n): ReadonlySelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T> | WritableSelectorOptions<T>,\n): ReadonlySelectorToken<T> | WritableSelectorToken<T> {\n\treturn createStandaloneSelector(options, IMPLICIT.STORE)\n}\n\nexport type WritableSelectorFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tget: (key: K) => Read<() => T>\n\tset: (key: K) => Write<(newValue: T) => void>\n}\nexport type ReadonlySelectorFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tget: (key: K) => Read<() => T>\n}\n\nexport type WritableSelectorFamily<\n\tT,\n\tK extends Json.Serializable = Json.Serializable,\n> = ((key: K) => WritableSelectorToken<T>) & {\n\tkey: string\n\ttype: `selector_family`\n\tsubject: Subject<WritableSelectorToken<T>>\n\tinstall: (store: Store) => void\n\t__T?: T\n\t__K?: K\n}\nexport type WritableSelectorFamilyToken<T, K extends Json.Serializable> = {\n\tkey: string\n\ttype: `selector_family`\n\t__T?: T\n\t__K?: K\n}\n\nexport type ReadonlySelectorFamily<\n\tT,\n\tK extends Json.Serializable = Json.Serializable,\n> = ((key: K) => ReadonlySelectorToken<T>) & {\n\tkey: string\n\ttype: `readonly_selector_family`\n\tsubject: Subject<ReadonlySelectorToken<T>>\n\tinstall: (store: Store) => void\n\t__T?: T\n\t__K?: K\n}\nexport type ReadonlySelectorFamilyToken<T, K extends Json.Serializable> = {\n\tkey: string\n\ttype: `readonly_selector_family`\n\t__T?: T\n\t__K?: K\n}\n\nexport type SelectorFamily<T, K extends Json.Serializable> =\n\t| ReadonlySelectorFamily<T, K>\n\t| WritableSelectorFamily<T, K>\nexport type SelectorFamilyToken<T, K extends Json.Serializable> =\n\t| ReadonlySelectorFamilyToken<T, K>\n\t| WritableSelectorFamilyToken<T, K>\n\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: WritableSelectorFamilyOptions<T, K>,\n): WritableSelectorFamily<T, K>\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: ReadonlySelectorFamilyOptions<T, K>,\n): ReadonlySelectorFamily<T, K>\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions:\n\t\t| ReadonlySelectorFamilyOptions<T, K>\n\t\t| WritableSelectorFamilyOptions<T, K>,\n): ReadonlySelectorFamily<T, K> | WritableSelectorFamily<T, K> {\n\treturn createSelectorFamily(options, IMPLICIT.STORE)\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { WritableToken } from \".\"\n\nexport function setState<T, New extends T>(\n\ttoken: WritableToken<T>,\n\tvalue: New | ((oldValue: T) => New),\n): void {\n\tInternal.setIntoStore(token, value, Internal.IMPLICIT.STORE)\n}\n","import type { Transceiver } from \"atom.io/internal\"\nimport {\n\tStore,\n\tcreateAtomFamily,\n\tcreateSelectorFamily,\n\tcreateStandaloneAtom,\n\tcreateStandaloneSelector,\n\tcreateTimeline,\n\tcreateTransaction,\n\tgetFromStore,\n\tsetIntoStore,\n\ttimeTravel,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type {\n\tAtomToken,\n\tMutableAtomFamily,\n\tMutableAtomFamilyOptions,\n\tMutableAtomOptions,\n\tMutableAtomToken,\n\tRegularAtomFamily,\n\tRegularAtomFamilyOptions,\n\tRegularAtomOptions,\n\tRegularAtomToken,\n\tgetState,\n\tredo,\n\tsetState,\n\ttimeline,\n\tundo,\n} from \".\"\nimport { subscribe } from \".\"\nimport type { atom, atomFamily } from \"./atom\"\nimport type { selector, selectorFamily } from \"./selector\"\nimport type { transaction } from \"./transaction\"\n\nexport class Silo {\n\tpublic store: Store\n\tpublic atom: typeof atom\n\tpublic atomFamily: typeof atomFamily\n\tpublic selector: typeof selector\n\tpublic selectorFamily: typeof selectorFamily\n\tpublic transaction: typeof transaction\n\tpublic timeline: typeof timeline\n\tpublic getState: typeof getState\n\tpublic setState: typeof setState\n\tpublic subscribe: typeof subscribe\n\tpublic undo: typeof undo\n\tpublic redo: typeof redo\n\tpublic constructor(name: string, fromStore: Store | null = null) {\n\t\tconst s = new Store(name, fromStore)\n\t\tfunction _atom<T>(options: RegularAtomOptions<T>): RegularAtomToken<T>\n\t\tfunction _atom<T extends Transceiver<any>, J extends Json.Serializable>(\n\t\t\toptions: MutableAtomOptions<T, J>,\n\t\t): MutableAtomToken<T, J>\n\t\tfunction _atom<T>(\n\t\t\toptions: MutableAtomOptions<any, any> | RegularAtomOptions<T>,\n\t\t): AtomToken<T> {\n\t\t\treturn createStandaloneAtom(options, s)\n\t\t}\n\t\tfunction _atomFamily<\n\t\t\tT extends Transceiver<any>,\n\t\t\tJ extends Json.Serializable,\n\t\t\tK extends Json.Serializable,\n\t\t>(options: MutableAtomFamilyOptions<T, J, K>): MutableAtomFamily<T, J, K>\n\t\tfunction _atomFamily<T, K extends Json.Serializable>(\n\t\t\toptions: RegularAtomFamilyOptions<T, K>,\n\t\t): RegularAtomFamily<T, K>\n\t\tfunction _atomFamily<T, K extends Json.Serializable>(\n\t\t\toptions:\n\t\t\t\t| MutableAtomFamilyOptions<any, any, any>\n\t\t\t\t| RegularAtomFamilyOptions<T, K>,\n\t\t): MutableAtomFamily<any, any, any> | RegularAtomFamily<T, K> {\n\t\t\treturn createAtomFamily(options, s)\n\t\t}\n\t\tthis.store = s\n\t\tthis.atom = _atom\n\t\tthis.atomFamily = _atomFamily\n\t\tthis.selector = (options) => createStandaloneSelector(options, s) as any\n\t\tthis.selectorFamily = (options) => createSelectorFamily(options, s) as any\n\t\tthis.transaction = (options) => createTransaction(options, s)\n\t\tthis.timeline = (options) => createTimeline(options, s)\n\t\tthis.getState = (token) => getFromStore(token, s)\n\t\tthis.setState = (token, newValue) => setIntoStore(token, newValue, s)\n\t\tthis.subscribe = (token, handler, key) => subscribe(token, handler, key, s)\n\t\tthis.undo = (token) => timeTravel(`undo`, token, s)\n\t\tthis.redo = (token) => timeTravel(`redo`, token, s)\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tsubscribeToState,\n\tsubscribeToTimeline,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\n\nimport type {\n\tFamilyMetadata,\n\tReadableToken,\n\tTimelineManageable,\n\tTimelineToken,\n\tTimelineUpdate,\n\tTransactionToken,\n\tTransactionUpdate,\n\tƒn,\n} from \".\"\n\nexport type StateUpdate<T> = { newValue: T; oldValue: T }\nexport type KeyedStateUpdate<T> = StateUpdate<T> & {\n\tkey: string\n\tfamily?: FamilyMetadata\n}\nexport type UpdateHandler<T> = (update: StateUpdate<T>) => void\n\nexport type TransactionUpdateHandler<ƒ extends ƒn> = (\n\tdata: TransactionUpdate<ƒ>,\n) => void\n\nexport function subscribe<T>(\n\ttoken: ReadableToken<T>,\n\thandleUpdate: UpdateHandler<T>,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe<ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\thandleUpdate: TransactionUpdateHandler<ƒ>,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe<M extends TimelineManageable>(\n\ttoken: TimelineToken<M>,\n\thandleUpdate: (update: TimelineUpdate<M> | `redo` | `undo`) => void,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe(\n\ttoken: ReadableToken<any> | TimelineToken<any> | TransactionToken<any>,\n\thandleUpdate: (update: any) => void,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore = IMPLICIT.STORE,\n): () => void {\n\tswitch (token.type) {\n\t\tcase `atom`:\n\t\tcase `mutable_atom`:\n\t\tcase `readonly_selector`:\n\t\tcase `selector`:\n\t\t\treturn subscribeToState(token, handleUpdate, key, store)\n\t\tcase `transaction`:\n\t\t\treturn subscribeToTransaction(token, handleUpdate, key, store)\n\t\tcase `timeline`:\n\t\t\treturn subscribeToTimeline(token, handleUpdate, key, store)\n\t}\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 TimelineManageable = AtomFamily<any, any> | AtomToken<any>\n\nexport type TimelineToken<_> = {\n\tkey: string\n\ttype: `timeline`\n\t__brand?: _\n}\n\nexport type TimelineOptions<ManagedAtom extends TimelineManageable> = {\n\tkey: string\n\tatoms: ManagedAtom[]\n\tshouldCapture?: (\n\t\tupdate: TimelineUpdate<ManagedAtom>,\n\t\ttimeline: Timeline<TimelineManageable>,\n\t) => boolean\n}\n\nexport type TimelineUpdate<ManagedAtom extends TimelineManageable> =\n\t| TimelineAtomUpdate<ManagedAtom>\n\t| TimelineSelectorUpdate<ManagedAtom>\n\t| TimelineTransactionUpdate\n\nexport const timeline = <ManagedAtom extends TimelineManageable>(\n\toptions: TimelineOptions<ManagedAtom>,\n): TimelineToken<ManagedAtom> => {\n\treturn createTimeline(options, IMPLICIT.STORE)\n}\n\nexport const redo = (timeline: TimelineToken<any>): void => {\n\ttimeTravel(`redo`, timeline, IMPLICIT.STORE)\n}\n\nexport const undo = (timeline: TimelineToken<any>): void => {\n\ttimeTravel(`undo`, timeline, IMPLICIT.STORE)\n}\n","import type { EnvironmentData, Store } from \"atom.io/internal\"\nimport { IMPLICIT, createTransaction, withdraw } from \"atom.io/internal\"\n\nimport type {\n\tKeyedStateUpdate,\n\tReadonlySelectorToken,\n\tWritableToken,\n\tfindState,\n\tƒn,\n} from \".\"\n\nexport type TransactionToken<F> = {\n\tkey: string\n\ttype: `transaction`\n\t__F?: F\n}\n\nexport type TransactionUpdateContent =\n\t| KeyedStateUpdate<unknown>\n\t| TransactionUpdate<ƒn>\n\nexport type TransactionUpdate<ƒ extends ƒn> = {\n\tkey: string\n\tid: string\n\tepoch: number\n\tupdates: TransactionUpdateContent[]\n\tparams: Parameters<ƒ>\n\toutput: ReturnType<ƒ>\n}\n\nexport type Transactors = Readonly<{\n\tget: <S>(state: ReadonlySelectorToken<S> | WritableToken<S>) => S\n\tset: <S, New extends S>(\n\t\tstate: WritableToken<S>,\n\t\tnewValue: New | ((oldValue: S) => New),\n\t) => void\n\tfind: typeof findState\n}>\nexport type TransactorsWithRunAndEnv = Readonly<{\n\tget: <S>(state: ReadonlySelectorToken<S> | WritableToken<S>) => S\n\tset: <S, New extends S>(\n\t\tstate: WritableToken<S>,\n\t\tnewValue: New | ((oldValue: S) => New),\n\t) => void\n\tfind: typeof findState\n\trun: typeof runTransaction\n\tenv: () => EnvironmentData\n}>\nexport type ReadonlyTransactors = Pick<Transactors, `find` | `get`>\n\nexport type Read<ƒ extends ƒn> = (\n\ttransactors: ReadonlyTransactors,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type Write<ƒ extends ƒn> = (\n\ttransactors: Transactors,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type Transact<ƒ extends ƒn> = (\n\ttransactors: TransactorsWithRunAndEnv,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type TransactionOptions<ƒ extends ƒn> = {\n\tkey: string\n\tdo: Transact<ƒ>\n}\n\nexport type TransactionIO<Token extends TransactionToken<any>> =\n\tToken extends TransactionToken<infer ƒ> ? ƒ : never\n\nexport function transaction<ƒ extends ƒn>(\n\toptions: TransactionOptions<ƒ>,\n): TransactionToken<ƒ> {\n\treturn createTransaction(options, IMPLICIT.STORE)\n}\n\nexport const runTransaction =\n\t<ƒ extends ƒn>(\n\t\ttoken: TransactionToken<ƒ>,\n\t\tid?: string,\n\t\tstore: Store = IMPLICIT.STORE,\n\t) =>\n\t(...parameters: Parameters<ƒ>): ReturnType<ƒ> => {\n\t\tconst tx = withdraw(token, store)\n\t\tif (tx) {\n\t\t\treturn tx.run(parameters, id)\n\t\t}\n\t\tthrow new Error(\n\t\t\t`Cannot run transaction \"${token.key}\": transaction not found in store \"${store.config.name}\".`,\n\t\t)\n\t}\n","import type {\n\tMutableAtomFamily,\n\tMutableAtomToken,\n\tReadableFamily,\n\tReadableToken,\n\tReadonlySelectorFamily,\n\tReadonlySelectorToken,\n\tRegularAtomFamily,\n\tRegularAtomToken,\n\tWritableFamily,\n\tWritableSelectorFamily,\n\tWritableSelectorToken,\n\tWritableToken,\n} from \"atom.io\"\n\nexport type TokenType<\n\tComparison extends ReadableFamily<any, any> | ReadableToken<any>,\n> = Comparison extends ReadableToken<infer RepresentedValue>\n\t? RepresentedValue\n\t: Comparison extends ReadableFamily<infer RepresentedValue, any>\n\t ? RepresentedValue\n\t : never\n\nexport function isToken<KnownToken extends RegularAtomToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is RegularAtomToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends MutableAtomToken<any, any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is MutableAtomToken<TokenType<KnownToken>, any>\nexport function isToken<KnownToken extends WritableSelectorToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is WritableSelectorToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends ReadonlySelectorToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadonlySelectorToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends WritableToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is WritableToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends ReadableToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadableToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends ReadableToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadableToken<TokenType<KnownToken>> {\n\treturn knownToken.key === unknownToken.key\n}\n\nexport function belongsTo<Family extends RegularAtomFamily<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is RegularAtomToken<TokenType<Family>>\nexport function belongsTo<Family extends MutableAtomFamily<any, any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is MutableAtomToken<TokenType<Family>, any>\nexport function belongsTo<Family extends WritableSelectorFamily<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is WritableSelectorToken<TokenType<Family>>\nexport function belongsTo<Family extends ReadonlySelectorFamily<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadonlySelectorToken<TokenType<Family>>\nexport function belongsTo<Family extends WritableFamily<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is WritableToken<TokenType<Family>>\nexport function belongsTo<Family extends ReadableFamily<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadableToken<TokenType<Family>>\nexport function belongsTo<Family extends ReadableFamily<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadableToken<TokenType<Family>> {\n\treturn family.key === unknownToken.family?.key\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/atom.ts","../src/dispose.ts","../src/find-state.ts","../src/get-state.ts","../src/logger.ts","../src/selector.ts","../src/set-state.ts","../src/silo.ts","../src/subscribe.ts","../src/timeline.ts","../src/transaction.ts","../src/validators.ts"],"names":["IMPLICIT","Internal","createAtomFamily","createSelectorFamily","createStandaloneAtom","createStandaloneSelector","getFromStore","setIntoStore","createTimeline","timeTravel","timeline","arbitrary","createTransaction"],"mappings":"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","sourcesContent":["import type { Store, Subject, Transceiver } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tcreateAtomFamily,\n\tcreateStandaloneAtom,\n} from \"atom.io/internal\"\nimport type { Json, JsonInterface } from \"atom.io/json\"\n\nimport type { AtomToken, MutableAtomToken, RegularAtomToken } from \".\"\n\nexport type Effectors<T> = {\n\tsetSelf: <V extends T>(next: V | ((oldValue: T) => V)) => void\n\tonSet: (callback: (options: { newValue: T; oldValue: T }) => void) => void\n}\n\nexport type AtomEffect<T> = (tools: Effectors<T>) => (() => void) | void\n\nexport type RegularAtomOptions<T> = {\n\tkey: string\n\tdefault: T | (() => T)\n\teffects?: AtomEffect<T>[]\n}\n// biome-ignore format: complex intersection\nexport type MutableAtomOptions<T extends Transceiver<any>, J extends Json.Serializable> = \n\t& JsonInterface<T, J>\n\t& Omit<RegularAtomOptions<T>, `default`> \n\t& { \n\t\t\tdefault: ()\t=> T\n\t\t\tmutable: true\n\t\t}\n\nexport function atom<T extends Transceiver<any>, J extends Json.Serializable>(\n\toptions: MutableAtomOptions<T, J>,\n): MutableAtomToken<T, J>\nexport function atom<T>(options: RegularAtomOptions<T>): RegularAtomToken<T>\nexport function atom(\n\toptions: MutableAtomOptions<any, any> | RegularAtomOptions<any>,\n): AtomToken<any> {\n\treturn createStandaloneAtom(options, IMPLICIT.STORE)\n}\n\nexport type RegularAtomFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tdefault: T | ((key: K) => T)\n\teffects?: (key: K) => AtomEffect<T>[]\n}\n\nexport type RegularAtomFamilyToken<T, K extends Json.Serializable> = {\n\tkey: string\n\ttype: `atom_family`\n\t__T?: T\n\t__K?: K\n}\n// biome-ignore format: intersection\nexport type RegularAtomFamilyTokenWithCall<\n\tT,\n\tK extends Json.Serializable,\n> = \n\t& RegularAtomFamilyToken<T, K>\n\t& {\n\t\t/** @deprecated Prefer the `findState`, `findInStore`, or `find` functions. */\n\t\t(key: K): RegularAtomToken<T>\n\t}\n// biome-ignore format: intersection\nexport type RegularAtomFamily<T, K extends Json.Serializable> = \n\t& RegularAtomFamilyToken<T, K>\n\t& {\n\t\t(key: K): RegularAtomToken<T>\n\t\tsubject: Subject<RegularAtomToken<T>>\n\t\tinstall: (store: Store) => void\n\t}\n\n// biome-ignore format: intersection\nexport type MutableAtomFamilyOptions<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = \n\t& JsonInterface<T, J>\n\t& { \n\t\tkey: string\n\t\tdefault: (key: K) => T\n\t\teffects?: (key: K) => AtomEffect<T>[]\n\t\tmutable: true,\n\t}\n\nexport type MutableAtomFamilyToken<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = {\n\tkey: string\n\ttype: `mutable_atom_family`\n\t__T?: T\n\t__J?: J\n\t__K?: K\n}\n// biome-ignore format: intersection\nexport type MutableAtomFamilyTokenWithCall<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = \n\t& MutableAtomFamilyToken<T, J, K>\n\t& {\n\t\t/** @deprecated Prefer the `findState`, `findInStore`, or `find` functions. */\n\t\t(key: K): MutableAtomToken<T, J>\n\t}\n// biome-ignore format: intersection\nexport type MutableAtomFamily<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = \n\t& JsonInterface<T, J>\n\t& MutableAtomFamilyToken<T, J, K>\n\t& {\n\t\t\t(key: K): MutableAtomToken<T, J>\n\t\t\tsubject: Subject<MutableAtomToken<T, J>>\n\t\t\tinstall: (store: Store) => void\n\t\t}\n\nexport type AtomFamily<T, K extends Json.Serializable = Json.Serializable> =\n\t| MutableAtomFamily<T extends Transceiver<any> ? T : never, any, K>\n\t| RegularAtomFamily<T, K>\nexport type AtomFamilyToken<T, K extends Json.Serializable = Json.Serializable> =\n\t| MutableAtomFamilyToken<T extends Transceiver<any> ? T : never, any, K>\n\t| RegularAtomFamilyToken<T, K>\n\nexport function atomFamily<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n>(\n\toptions: MutableAtomFamilyOptions<T, J, K>,\n): MutableAtomFamilyTokenWithCall<T, J, K>\nexport function atomFamily<T, K extends Json.Serializable>(\n\toptions: RegularAtomFamilyOptions<T, K>,\n): RegularAtomFamilyTokenWithCall<T, K>\nexport function atomFamily<T, K extends Json.Serializable>(\n\toptions:\n\t\t| MutableAtomFamilyOptions<any, any, any>\n\t\t| RegularAtomFamilyOptions<T, K>,\n):\n\t| MutableAtomFamilyTokenWithCall<any, any, any>\n\t| RegularAtomFamilyTokenWithCall<T, K> {\n\treturn createAtomFamily(options, IMPLICIT.STORE)\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { ReadableToken } from \".\"\n\nexport function dispose(\n\ttoken: ReadableToken<any>,\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): void {\n\tswitch (token.type) {\n\t\tcase `atom`:\n\t\t\tInternal.deleteAtom(token, store)\n\t\t\tbreak\n\t\tcase `selector`:\n\t\tcase `readonly_selector`:\n\t\t\tInternal.deleteSelector(token, store)\n\t\t\tbreak\n\t}\n}\n","import type {\n\tMutableAtomFamilyToken,\n\tMutableAtomToken,\n\tReadableFamilyToken,\n\tReadableToken,\n\tReadonlySelectorFamilyToken,\n\tReadonlySelectorToken,\n\tRegularAtomFamilyToken,\n\tRegularAtomToken,\n\tWritableFamilyToken,\n\tWritableSelectorFamilyToken,\n\tWritableSelectorToken,\n\tWritableToken,\n} from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport { IMPLICIT, findInStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nexport function findState<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n\tKey extends K,\n>(token: MutableAtomFamilyToken<T, J, K>, key: Key): MutableAtomToken<T, J>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: RegularAtomFamilyToken<T, K>,\n\tkey: Key,\n): RegularAtomToken<T>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: WritableSelectorFamilyToken<T, K>,\n\tkey: Key,\n): WritableSelectorToken<T>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: ReadonlySelectorFamilyToken<T, K>,\n\tkey: Key,\n): ReadonlySelectorToken<T>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: WritableFamilyToken<T, K>,\n\tkey: Key,\n): WritableToken<T>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: ReadableFamilyToken<T, K>,\n\tkey: Key,\n): ReadableToken<T>\n\nexport function findState(\n\ttoken: ReadableFamilyToken<any, any>,\n\tkey: Json.Serializable,\n): ReadableToken<any> {\n\tconst state = findInStore(token, key, IMPLICIT.STORE)\n\treturn state\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { ReadableToken } from \".\"\n\nexport function getState<T>(token: ReadableToken<T>): T {\n\treturn Internal.getFromStore(token, Internal.IMPLICIT.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\"✅\": `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\"👋\": `Greeting`,\n\t\"👍\": `Realtime acknowledgment`,\n\t\"👪\": `Family member added`,\n\t\"💁\": `Notice`,\n\t\"💥\": `Caught`,\n\t\"📁\": `Stow update`,\n\t\"📃\": `Copy mutable`,\n\t\"📖\": `Read state`,\n\t\"📝\": `Write state`,\n\t\"📢\": `Notify subscribers`,\n\t\"🔄\": `Realtime transaction synchronized`,\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\"🙈\": `Subscription canceled`,\n\t\"🚀\": `Performance measure`,\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\t\"🤞\": `Realtime optimistic update enqueued`,\n\t\"👈\": `Realtime confirmed update enqueued`,\n\t\"🧑⚖️\": `Realtime update beginning reconciliation`,\n\t\"🛎️\": `Realtime transaction received`,\n\t\"🔭\": `Determining realtime perspective`,\n\t\"🖌\": `Redacting realtime update`,\n\t\"👁\": `Determining perspective`,\n} as const\nexport type LoggerIcon = keyof typeof LoggerIconDictionary\nexport type TokenDenomination =\n\t| `atom`\n\t| `continuity`\n\t| `mutable_atom`\n\t| `readonly_selector`\n\t| `selector`\n\t| `state`\n\t| `timeline`\n\t| `transaction`\n\t| `unknown`\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\tdenomination: TokenDenomination,\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, denomination, tokenKey, message, ...rest) => {\n\t\tconsole[logLevel](\n\t\t\t`${icon} ${denomination} \"${tokenKey}\" ${message}`,\n\t\t\t...rest,\n\t\t)\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 type { Store, Subject } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tcreateSelectorFamily,\n\tcreateStandaloneSelector,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ReadonlySelectorToken, WritableSelectorToken } from \".\"\nimport type { Read, Write } from \"./transaction\"\n\nexport type WritableSelectorOptions<T> = {\n\tkey: string\n\tget: Read<() => T>\n\tset: Write<(newValue: T) => void>\n}\nexport type ReadonlySelectorOptions<T> = {\n\tkey: string\n\tget: Read<() => T>\n}\n\nexport function selector<T>(\n\toptions: WritableSelectorOptions<T>,\n): WritableSelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T>,\n): ReadonlySelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T> | WritableSelectorOptions<T>,\n): ReadonlySelectorToken<T> | WritableSelectorToken<T> {\n\treturn createStandaloneSelector(options, IMPLICIT.STORE)\n}\n\nexport type WritableSelectorFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tget: (key: K) => Read<() => T>\n\tset: (key: K) => Write<(newValue: T) => void>\n}\nexport type ReadonlySelectorFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tget: (key: K) => Read<() => T>\n}\n\nexport type WritableSelectorFamilyToken<T, K extends Json.Serializable> = {\n\tkey: string\n\ttype: `selector_family`\n\t__T?: T\n\t__K?: K\n}\n// biome-ignore format: intersection\nexport type WritableSelectorFamilyTokenWithCall<\n\tT,\n\tK extends Json.Serializable,\n> = \n\t& WritableSelectorFamilyToken<T, K>\n\t& {\n\t\t/** @deprecated Prefer the `findState`, `findInStore`, or `find` functions. */\n\t\t(key: K): WritableSelectorToken<T>\n\t}\n// biome-ignore format: intersection\nexport type WritableSelectorFamily<T, K extends Json.Serializable> = \n\t& WritableSelectorFamilyToken<T, K> \n\t& {\n\t\t(key: K): WritableSelectorToken<T>\n\t\tsubject: Subject<WritableSelectorToken<T>>\n\t\tinstall: (store: Store) => void\n\t}\n\nexport type ReadonlySelectorFamilyToken<T, K extends Json.Serializable> = {\n\tkey: string\n\ttype: `readonly_selector_family`\n\t__T?: T\n\t__K?: K\n}\n// biome-ignore format: intersection\nexport type ReadonlySelectorFamilyTokenWithCall<\n\tT,\n\tK extends Json.Serializable,\n> = \n\t& ReadonlySelectorFamilyToken<T, K>\n\t& {\n\t\t/** @deprecated Prefer the `findState`, `findInStore`, or `find` functions. */\n\t\t(key: K): ReadonlySelectorToken<T>\n\t}\n// biome-ignore format: intersection\nexport type ReadonlySelectorFamily<T, K extends Json.Serializable> = \n\t& ((key: K) => ReadonlySelectorToken<T>)\n\t& {\n\t\tkey: string\n\t\ttype: `readonly_selector_family`\n\t\tsubject: Subject<ReadonlySelectorToken<T>>\n\t\tinstall: (store: Store) => void\n\t\t__T?: T\n\t\t__K?: K\n\t}\n\nexport type SelectorFamily<T, K extends Json.Serializable> =\n\t| ReadonlySelectorFamily<T, K>\n\t| WritableSelectorFamily<T, K>\nexport type SelectorFamilyToken<T, K extends Json.Serializable> =\n\t| ReadonlySelectorFamilyToken<T, K>\n\t| WritableSelectorFamilyToken<T, K>\n\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: WritableSelectorFamilyOptions<T, K>,\n): WritableSelectorFamilyTokenWithCall<T, K>\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: ReadonlySelectorFamilyOptions<T, K>,\n): ReadonlySelectorFamilyTokenWithCall<T, K>\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions:\n\t\t| ReadonlySelectorFamilyOptions<T, K>\n\t\t| WritableSelectorFamilyOptions<T, K>,\n):\n\t| ReadonlySelectorFamilyTokenWithCall<T, K>\n\t| WritableSelectorFamilyTokenWithCall<T, K> {\n\treturn createSelectorFamily(options, IMPLICIT.STORE)\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { WritableToken } from \".\"\n\nexport function setState<T, New extends T>(\n\ttoken: WritableToken<T>,\n\tvalue: New | ((oldValue: T) => New),\n): void {\n\tInternal.setIntoStore(token, value, Internal.IMPLICIT.STORE)\n}\n","import type { Transceiver } from \"atom.io/internal\"\nimport {\n\tStore,\n\tcreateAtomFamily,\n\tcreateSelectorFamily,\n\tcreateStandaloneAtom,\n\tcreateStandaloneSelector,\n\tcreateTimeline,\n\tcreateTransaction,\n\tgetFromStore,\n\tsetIntoStore,\n\ttimeTravel,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type {\n\tAtomToken,\n\tMutableAtomFamily,\n\tMutableAtomFamilyOptions,\n\tMutableAtomOptions,\n\tMutableAtomToken,\n\tRegularAtomFamily,\n\tRegularAtomFamilyOptions,\n\tRegularAtomOptions,\n\tRegularAtomToken,\n\tgetState,\n\tredo,\n\tsetState,\n\ttimeline,\n\tundo,\n} from \".\"\nimport { subscribe } from \".\"\nimport type { atom, atomFamily } from \"./atom\"\nimport type { selector, selectorFamily } from \"./selector\"\nimport type { transaction } from \"./transaction\"\n\nexport class Silo {\n\tpublic store: Store\n\tpublic atom: typeof atom\n\tpublic atomFamily: typeof atomFamily\n\tpublic selector: typeof selector\n\tpublic selectorFamily: typeof selectorFamily\n\tpublic transaction: typeof transaction\n\tpublic timeline: typeof timeline\n\tpublic getState: typeof getState\n\tpublic setState: typeof setState\n\tpublic subscribe: typeof subscribe\n\tpublic undo: typeof undo\n\tpublic redo: typeof redo\n\tpublic constructor(name: string, fromStore: Store | null = null) {\n\t\tconst s = new Store(name, fromStore)\n\t\tfunction _atom<T>(options: RegularAtomOptions<T>): RegularAtomToken<T>\n\t\tfunction _atom<T extends Transceiver<any>, J extends Json.Serializable>(\n\t\t\toptions: MutableAtomOptions<T, J>,\n\t\t): MutableAtomToken<T, J>\n\t\tfunction _atom<T>(\n\t\t\toptions: MutableAtomOptions<any, any> | RegularAtomOptions<T>,\n\t\t): AtomToken<T> {\n\t\t\treturn createStandaloneAtom(options, s)\n\t\t}\n\t\tfunction _atomFamily<\n\t\t\tT extends Transceiver<any>,\n\t\t\tJ extends Json.Serializable,\n\t\t\tK extends Json.Serializable,\n\t\t>(options: MutableAtomFamilyOptions<T, J, K>): MutableAtomFamily<T, J, K>\n\t\tfunction _atomFamily<T, K extends Json.Serializable>(\n\t\t\toptions: RegularAtomFamilyOptions<T, K>,\n\t\t): RegularAtomFamily<T, K>\n\t\tfunction _atomFamily<T, K extends Json.Serializable>(\n\t\t\toptions:\n\t\t\t\t| MutableAtomFamilyOptions<any, any, any>\n\t\t\t\t| RegularAtomFamilyOptions<T, K>,\n\t\t): MutableAtomFamily<any, any, any> | RegularAtomFamily<T, K> {\n\t\t\treturn createAtomFamily(options, s)\n\t\t}\n\t\tthis.store = s\n\t\tthis.atom = _atom\n\t\tthis.atomFamily = _atomFamily\n\t\tthis.selector = (options) => createStandaloneSelector(options, s) as any\n\t\tthis.selectorFamily = (options) => createSelectorFamily(options, s) as any\n\t\tthis.transaction = (options) => createTransaction(options, s)\n\t\tthis.timeline = (options) => createTimeline(options, s)\n\t\tthis.getState = (token) => getFromStore(token, s)\n\t\tthis.setState = (token, newValue) => setIntoStore(token, newValue, s)\n\t\tthis.subscribe = (token, handler, key) => subscribe(token, handler, key, s)\n\t\tthis.undo = (token) => timeTravel(`undo`, token, s)\n\t\tthis.redo = (token) => timeTravel(`redo`, token, s)\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tarbitrary,\n\tsubscribeToState,\n\tsubscribeToTimeline,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\n\nimport type {\n\tFamilyMetadata,\n\tReadableToken,\n\tTimelineManageable,\n\tTimelineToken,\n\tTimelineUpdate,\n\tTransactionToken,\n\tTransactionUpdate,\n\tƒn,\n} from \".\"\n\nexport type StateUpdate<T> = { newValue: T; oldValue: T }\nexport type KeyedStateUpdate<T> = StateUpdate<T> & {\n\tkey: string\n\tfamily?: FamilyMetadata\n}\nexport type UpdateHandler<T> = (update: StateUpdate<T>) => void\n\nexport type TransactionUpdateHandler<ƒ extends ƒn> = (\n\tdata: TransactionUpdate<ƒ>,\n) => void\n\nexport function subscribe<T>(\n\ttoken: ReadableToken<T>,\n\thandleUpdate: UpdateHandler<T>,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe<ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\thandleUpdate: TransactionUpdateHandler<ƒ>,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe<M extends TimelineManageable>(\n\ttoken: TimelineToken<M>,\n\thandleUpdate: (update: TimelineUpdate<M> | `redo` | `undo`) => void,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe(\n\ttoken: ReadableToken<any> | TimelineToken<any> | TransactionToken<any>,\n\thandleUpdate: (update: any) => void,\n\tkey: string = arbitrary(),\n\tstore = IMPLICIT.STORE,\n): () => void {\n\tswitch (token.type) {\n\t\tcase `atom`:\n\t\tcase `mutable_atom`:\n\t\tcase `readonly_selector`:\n\t\tcase `selector`:\n\t\t\treturn subscribeToState(token, handleUpdate, key, store)\n\t\tcase `transaction`:\n\t\t\treturn subscribeToTransaction(token, handleUpdate, key, store)\n\t\tcase `timeline`:\n\t\t\treturn subscribeToTimeline(token, handleUpdate, key, store)\n\t}\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 { AtomFamilyToken, AtomToken } from \".\"\n\nexport type TimelineManageable = AtomFamilyToken<any, any> | AtomToken<any>\n\nexport type TimelineToken<M> = {\n\tkey: string\n\ttype: `timeline`\n\t__M?: M\n}\n\nexport type TimelineOptions<ManagedAtom extends TimelineManageable> = {\n\tkey: string\n\tatoms: ManagedAtom[]\n\tshouldCapture?: (\n\t\tupdate: TimelineUpdate<ManagedAtom>,\n\t\ttimeline: Timeline<TimelineManageable>,\n\t) => boolean\n}\n\nexport type TimelineUpdate<ManagedAtom extends TimelineManageable> =\n\t| TimelineAtomUpdate<ManagedAtom>\n\t| TimelineSelectorUpdate<ManagedAtom>\n\t| TimelineTransactionUpdate\n\nexport const timeline = <ManagedAtom extends TimelineManageable>(\n\toptions: TimelineOptions<ManagedAtom>,\n): TimelineToken<ManagedAtom> => {\n\treturn createTimeline(options, IMPLICIT.STORE)\n}\n\nexport const redo = (timeline: TimelineToken<any>): void => {\n\ttimeTravel(`redo`, timeline, IMPLICIT.STORE)\n}\n\nexport const undo = (timeline: TimelineToken<any>): void => {\n\ttimeTravel(`undo`, timeline, IMPLICIT.STORE)\n}\n","import type { EnvironmentData } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tactUponStore,\n\tarbitrary,\n\tcreateTransaction,\n} from \"atom.io/internal\"\n\nimport type {\n\tKeyedStateUpdate,\n\tReadonlySelectorToken,\n\tWritableToken,\n\tfindState,\n\tƒn,\n} from \".\"\n\nexport type TransactionToken<F> = {\n\tkey: string\n\ttype: `transaction`\n\t__F?: F\n}\n\nexport type TransactionUpdateContent =\n\t| KeyedStateUpdate<unknown>\n\t| TransactionUpdate<ƒn>\n\nexport type TransactionUpdate<ƒ extends ƒn> = {\n\tkey: string\n\tid: string\n\tepoch: number\n\tupdates: TransactionUpdateContent[]\n\tparams: Parameters<ƒ>\n\toutput: ReturnType<ƒ>\n}\n\nexport type Transactors = Readonly<{\n\tget: <S>(state: ReadonlySelectorToken<S> | WritableToken<S>) => S\n\tset: <S, New extends S>(\n\t\tstate: WritableToken<S>,\n\t\tnewValue: New | ((oldValue: S) => New),\n\t) => void\n\tfind: typeof findState\n}>\nexport type TransactorsWithRunAndEnv = Readonly<{\n\tget: <S>(state: ReadonlySelectorToken<S> | WritableToken<S>) => S\n\tset: <S, New extends S>(\n\t\tstate: WritableToken<S>,\n\t\tnewValue: New | ((oldValue: S) => New),\n\t) => void\n\tfind: typeof findState\n\trun: typeof runTransaction\n\tenv: () => EnvironmentData\n}>\nexport type ReadonlyTransactors = Pick<Transactors, `find` | `get`>\n\nexport type Read<ƒ extends ƒn> = (\n\ttransactors: ReadonlyTransactors,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type Write<ƒ extends ƒn> = (\n\ttransactors: Transactors,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type Transact<ƒ extends ƒn> = (\n\ttransactors: TransactorsWithRunAndEnv,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type TransactionOptions<ƒ extends ƒn> = {\n\tkey: string\n\tdo: Transact<ƒ>\n}\n\nexport type TransactionIO<Token extends TransactionToken<any>> =\n\tToken extends TransactionToken<infer ƒ> ? ƒ : never\n\nexport function transaction<ƒ extends ƒn>(\n\toptions: TransactionOptions<ƒ>,\n): TransactionToken<ƒ> {\n\treturn createTransaction(options, IMPLICIT.STORE)\n}\n\nexport function runTransaction<ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\tid = arbitrary(),\n): (...parameters: Parameters<ƒ>) => ReturnType<ƒ> {\n\treturn actUponStore(token, id, IMPLICIT.STORE)\n}\n","import type {\n\tMutableAtomFamily,\n\tMutableAtomFamilyToken,\n\tMutableAtomToken,\n\tReadableFamily,\n\tReadableFamilyToken,\n\tReadableToken,\n\tReadonlySelectorFamily,\n\tReadonlySelectorFamilyToken,\n\tReadonlySelectorToken,\n\tRegularAtomFamily,\n\tRegularAtomFamilyToken,\n\tRegularAtomToken,\n\tWritableFamily,\n\tWritableFamilyToken,\n\tWritableSelectorFamily,\n\tWritableSelectorFamilyToken,\n\tWritableSelectorToken,\n\tWritableToken,\n} from \"atom.io\"\n\nexport type TokenType<\n\tComparison extends ReadableFamilyToken<any, any> | ReadableToken<any>,\n> = Comparison extends ReadableToken<infer RepresentedValue>\n\t? RepresentedValue\n\t: Comparison extends ReadableFamilyToken<infer RepresentedValue, any>\n\t ? RepresentedValue\n\t : never\n\nexport function isToken<KnownToken extends RegularAtomToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is RegularAtomToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends MutableAtomToken<any, any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is MutableAtomToken<TokenType<KnownToken>, any>\nexport function isToken<KnownToken extends WritableSelectorToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is WritableSelectorToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends ReadonlySelectorToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadonlySelectorToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends WritableToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is WritableToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends ReadableToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadableToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends ReadableToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadableToken<TokenType<KnownToken>> {\n\treturn knownToken.key === unknownToken.key\n}\n\nexport function belongsTo<Family extends RegularAtomFamilyToken<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is RegularAtomToken<TokenType<Family>>\nexport function belongsTo<Family extends MutableAtomFamilyToken<any, any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is MutableAtomToken<TokenType<Family>, any>\nexport function belongsTo<Family extends WritableSelectorFamilyToken<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is WritableSelectorToken<TokenType<Family>>\nexport function belongsTo<Family extends ReadonlySelectorFamilyToken<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadonlySelectorToken<TokenType<Family>>\nexport function belongsTo<Family extends WritableFamilyToken<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is WritableToken<TokenType<Family>>\nexport function belongsTo<Family extends ReadableFamilyToken<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadableToken<TokenType<Family>>\nexport function belongsTo<Family extends ReadableFamilyToken<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadableToken<TokenType<Family>> {\n\treturn family.key === unknownToken.family?.key\n}\n"]}
|
package/internal/dist/index.cjs
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var json = require('atom.io/json');
|
|
4
4
|
var atom_io = require('atom.io');
|
|
5
|
-
var internal = require('atom.io/internal');
|
|
6
5
|
|
|
7
6
|
var __defProp = Object.defineProperty;
|
|
8
7
|
var __defProps = Object.defineProperties;
|
|
@@ -333,6 +332,14 @@ var StatefulSubject = class extends Subject {
|
|
|
333
332
|
}
|
|
334
333
|
};
|
|
335
334
|
|
|
335
|
+
// internal/src/transaction/is-root-store.ts
|
|
336
|
+
function isRootStore(store) {
|
|
337
|
+
return `epoch` in store.transactionMeta;
|
|
338
|
+
}
|
|
339
|
+
function isChildStore(store) {
|
|
340
|
+
return `phase` in store.transactionMeta;
|
|
341
|
+
}
|
|
342
|
+
|
|
336
343
|
// internal/src/store/store.ts
|
|
337
344
|
var Store = class {
|
|
338
345
|
constructor(name, store = null) {
|
|
@@ -376,7 +383,11 @@ var Store = class {
|
|
|
376
383
|
};
|
|
377
384
|
this.operation = { open: false };
|
|
378
385
|
this.transactionMeta = {
|
|
379
|
-
epoch:
|
|
386
|
+
epoch: /* @__PURE__ */ new Map(),
|
|
387
|
+
actionContinuities: new Junction({
|
|
388
|
+
between: [`continuity`, `action`],
|
|
389
|
+
cardinality: `1:n`
|
|
390
|
+
})
|
|
380
391
|
};
|
|
381
392
|
this.config = {
|
|
382
393
|
name: `IMPLICIT_STORE`
|
|
@@ -401,7 +412,14 @@ var Store = class {
|
|
|
401
412
|
if (store !== null) {
|
|
402
413
|
this.valueMap = new Map(store == null ? void 0 : store.valueMap);
|
|
403
414
|
this.operation = __spreadValues({}, store == null ? void 0 : store.operation);
|
|
404
|
-
|
|
415
|
+
if (isRootStore(store)) {
|
|
416
|
+
this.transactionMeta = {
|
|
417
|
+
epoch: new Map(store == null ? void 0 : store.transactionMeta.epoch),
|
|
418
|
+
actionContinuities: new Junction(
|
|
419
|
+
store == null ? void 0 : store.transactionMeta.actionContinuities.toJSON()
|
|
420
|
+
)
|
|
421
|
+
};
|
|
422
|
+
}
|
|
405
423
|
this.config = __spreadProps(__spreadValues({}, store == null ? void 0 : store.config), {
|
|
406
424
|
name
|
|
407
425
|
});
|
|
@@ -468,6 +486,12 @@ function withdraw(token, store) {
|
|
|
468
486
|
case `readonly_selector`:
|
|
469
487
|
withdrawn = target.readonlySelectors.get(token.key);
|
|
470
488
|
break;
|
|
489
|
+
case `atom_family`:
|
|
490
|
+
case `mutable_atom_family`:
|
|
491
|
+
case `selector_family`:
|
|
492
|
+
case `readonly_selector_family`:
|
|
493
|
+
withdrawn = target.families.get(token.key);
|
|
494
|
+
break;
|
|
471
495
|
case `timeline`:
|
|
472
496
|
withdrawn = target.timelines.get(token.key);
|
|
473
497
|
break;
|
|
@@ -527,6 +551,9 @@ function copyMutableIfNeeded(atom, origin, target) {
|
|
|
527
551
|
const originValue = origin.valueMap.get(atom.key);
|
|
528
552
|
const targetValue = target.valueMap.get(atom.key);
|
|
529
553
|
if (originValue === targetValue) {
|
|
554
|
+
if (originValue === void 0) {
|
|
555
|
+
return typeof atom.default === `function` ? atom.default() : atom.default;
|
|
556
|
+
}
|
|
530
557
|
origin.logger.info(`\u{1F4C3}`, `atom`, `${atom.key}`, `copying`);
|
|
531
558
|
const jsonValue = atom.toJson(originValue);
|
|
532
559
|
const copiedValue = atom.fromJson(jsonValue);
|
|
@@ -537,19 +564,6 @@ function copyMutableIfNeeded(atom, origin, target) {
|
|
|
537
564
|
return targetValue;
|
|
538
565
|
}
|
|
539
566
|
|
|
540
|
-
// internal/src/set-state/copy-mutable-in-transaction.ts
|
|
541
|
-
function copyMutableIfWithinTransaction(oldValue, atom, store) {
|
|
542
|
-
const target = newest(store);
|
|
543
|
-
const parent = target.parent;
|
|
544
|
-
if (parent !== null) {
|
|
545
|
-
if (atom.type === `mutable_atom`) {
|
|
546
|
-
const copiedValue = copyMutableIfNeeded(atom, parent, target);
|
|
547
|
-
return copiedValue;
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
return oldValue;
|
|
551
|
-
}
|
|
552
|
-
|
|
553
567
|
// internal/src/caching.ts
|
|
554
568
|
function cacheValue(key, value, subject, target) {
|
|
555
569
|
const currentValue = target.valueMap.get(key);
|
|
@@ -577,8 +591,10 @@ function cacheValue(key, value, subject, target) {
|
|
|
577
591
|
}
|
|
578
592
|
var readCachedValue = (token, target) => {
|
|
579
593
|
let value = target.valueMap.get(token.key);
|
|
580
|
-
if (token.type === `
|
|
581
|
-
|
|
594
|
+
if (token.type === `mutable_atom` && isChildStore(target)) {
|
|
595
|
+
const { parent } = target;
|
|
596
|
+
const copiedValue = copyMutableIfNeeded(token, parent, target);
|
|
597
|
+
value = copiedValue;
|
|
582
598
|
}
|
|
583
599
|
return value;
|
|
584
600
|
};
|
|
@@ -764,14 +780,6 @@ var become = (nextVersionOfThing) => (originalThing) => nextVersionOfThing insta
|
|
|
764
780
|
originalThing instanceof Function ? originalThing() : originalThing
|
|
765
781
|
) : nextVersionOfThing;
|
|
766
782
|
|
|
767
|
-
// internal/src/transaction/is-root-store.ts
|
|
768
|
-
function isRootStore(store) {
|
|
769
|
-
return `epoch` in store.transactionMeta;
|
|
770
|
-
}
|
|
771
|
-
function isChildStore(store) {
|
|
772
|
-
return `phase` in store.transactionMeta;
|
|
773
|
-
}
|
|
774
|
-
|
|
775
783
|
// internal/src/operation.ts
|
|
776
784
|
var openOperation = (token, store) => {
|
|
777
785
|
if (store.operation.open) {
|
|
@@ -836,17 +844,31 @@ var markDone = (key, store) => {
|
|
|
836
844
|
|
|
837
845
|
// internal/src/set-state/emit-update.ts
|
|
838
846
|
var emitUpdate = (state, update, store) => {
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
847
|
+
switch (state.type) {
|
|
848
|
+
case `mutable_atom`:
|
|
849
|
+
store.logger.info(
|
|
850
|
+
`\u{1F4E2}`,
|
|
851
|
+
state.type,
|
|
852
|
+
state.key,
|
|
853
|
+
`is now (`,
|
|
854
|
+
update.newValue,
|
|
855
|
+
`) subscribers:`,
|
|
856
|
+
state.subject.subscribers
|
|
857
|
+
);
|
|
858
|
+
break;
|
|
859
|
+
default:
|
|
860
|
+
store.logger.info(
|
|
861
|
+
`\u{1F4E2}`,
|
|
862
|
+
state.type,
|
|
863
|
+
state.key,
|
|
864
|
+
`went (`,
|
|
865
|
+
update.oldValue,
|
|
866
|
+
`->`,
|
|
867
|
+
update.newValue,
|
|
868
|
+
`) subscribers:`,
|
|
869
|
+
state.subject.subscribers
|
|
870
|
+
);
|
|
871
|
+
}
|
|
850
872
|
state.subject.next(update);
|
|
851
873
|
};
|
|
852
874
|
|
|
@@ -925,7 +947,12 @@ var stowUpdate = (state, update, store) => {
|
|
|
925
947
|
// internal/src/set-state/set-atom.ts
|
|
926
948
|
var setAtom = (atom, next, target) => {
|
|
927
949
|
const oldValue = readOrComputeValue(atom, target);
|
|
928
|
-
let newValue =
|
|
950
|
+
let newValue = oldValue;
|
|
951
|
+
if (atom.type === `mutable_atom` && isChildStore(target)) {
|
|
952
|
+
const { parent } = target;
|
|
953
|
+
const copiedValue = copyMutableIfNeeded(atom, parent, target);
|
|
954
|
+
newValue = copiedValue;
|
|
955
|
+
}
|
|
929
956
|
newValue = become(next)(newValue);
|
|
930
957
|
target.logger.info(`\u{1F4DD}`, `atom`, atom.key, `set to`, newValue);
|
|
931
958
|
newValue = cacheValue(atom.key, newValue, atom.subject, target);
|
|
@@ -943,18 +970,15 @@ var setAtom = (atom, next, target) => {
|
|
|
943
970
|
} else if (atom.key.startsWith(`*`)) {
|
|
944
971
|
const mutableKey = atom.key.slice(1);
|
|
945
972
|
const mutableAtom = target.atoms.get(mutableKey);
|
|
946
|
-
let
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
`\u274C`,
|
|
952
|
-
`mutable_atom`,
|
|
953
|
-
mutableKey,
|
|
954
|
-
`could not be updated.`,
|
|
955
|
-
typeof output === `number` ? `Expected update number ${mutable.cacheUpdateNumber + 1}, but got ${output}` : output
|
|
956
|
-
);
|
|
973
|
+
let transceiver = target.valueMap.get(mutableKey);
|
|
974
|
+
if (mutableAtom.type === `mutable_atom` && isChildStore(target)) {
|
|
975
|
+
const { parent } = target;
|
|
976
|
+
const copiedValue = copyMutableIfNeeded(mutableAtom, parent, target);
|
|
977
|
+
transceiver = copiedValue;
|
|
957
978
|
}
|
|
979
|
+
const accepted = transceiver.do(update.newValue) === null;
|
|
980
|
+
if (accepted)
|
|
981
|
+
evictDownStream(mutableAtom, target);
|
|
958
982
|
}
|
|
959
983
|
}
|
|
960
984
|
};
|
|
@@ -1322,8 +1346,10 @@ function subscribeToState(token, handleUpdate, key, store) {
|
|
|
1322
1346
|
};
|
|
1323
1347
|
return unsubscribe;
|
|
1324
1348
|
}
|
|
1349
|
+
|
|
1350
|
+
// internal/src/subscribe/subscribe-to-timeline.ts
|
|
1325
1351
|
var subscribeToTimeline = (token, handleUpdate, key, store) => {
|
|
1326
|
-
const tl =
|
|
1352
|
+
const tl = withdraw(token, store);
|
|
1327
1353
|
if (tl === void 0) {
|
|
1328
1354
|
throw new Error(
|
|
1329
1355
|
`Cannot subscribe to timeline "${token.key}": timeline not found in store "${store.config.name}".`
|
|
@@ -1341,8 +1367,10 @@ var subscribeToTimeline = (token, handleUpdate, key, store) => {
|
|
|
1341
1367
|
unsubscribe();
|
|
1342
1368
|
};
|
|
1343
1369
|
};
|
|
1370
|
+
|
|
1371
|
+
// internal/src/subscribe/subscribe-to-transaction.ts
|
|
1344
1372
|
var subscribeToTransaction = (token, handleUpdate, key, store) => {
|
|
1345
|
-
const tx =
|
|
1373
|
+
const tx = withdraw(token, store);
|
|
1346
1374
|
if (tx === void 0) {
|
|
1347
1375
|
throw new Error(
|
|
1348
1376
|
`Cannot subscribe to transaction "${token.key}": transaction not found in store "${store.config.name}".`
|
|
@@ -1825,13 +1853,23 @@ function deleteAtom(atomToken, store) {
|
|
|
1825
1853
|
target.selectorAtoms.delete(key);
|
|
1826
1854
|
target.atomsThatAreDefault.delete(key);
|
|
1827
1855
|
target.timelineAtoms.delete(key);
|
|
1856
|
+
if (atomToken.type === `mutable_atom`) {
|
|
1857
|
+
const updateToken = getUpdateToken(atomToken);
|
|
1858
|
+
deleteAtom(updateToken, store);
|
|
1859
|
+
}
|
|
1828
1860
|
store.logger.info(`\u{1F525}`, `atom`, `${key}`, `deleted`);
|
|
1829
1861
|
}
|
|
1830
1862
|
|
|
1863
|
+
// internal/src/arbitrary.ts
|
|
1864
|
+
function arbitrary(random = Math.random) {
|
|
1865
|
+
return random().toString(36).slice(2);
|
|
1866
|
+
}
|
|
1867
|
+
|
|
1831
1868
|
// internal/src/get-environment-data.ts
|
|
1832
1869
|
function getEnvironmentData(store) {
|
|
1833
1870
|
return {
|
|
1834
|
-
|
|
1871
|
+
window: typeof window === `undefined` ? void 0 : window,
|
|
1872
|
+
global: typeof global === `undefined` ? void 0 : global,
|
|
1835
1873
|
store
|
|
1836
1874
|
};
|
|
1837
1875
|
}
|
|
@@ -1850,7 +1888,11 @@ function getFromStore(token, store) {
|
|
|
1850
1888
|
function ingestAtomUpdate(applying, atomUpdate, store) {
|
|
1851
1889
|
const { key, newValue, oldValue } = atomUpdate;
|
|
1852
1890
|
const value = applying === `newValue` ? newValue : oldValue;
|
|
1853
|
-
|
|
1891
|
+
const token = { key, type: `atom` };
|
|
1892
|
+
if (atomUpdate.family) {
|
|
1893
|
+
Object.assign(token, { family: atomUpdate.family });
|
|
1894
|
+
}
|
|
1895
|
+
setIntoStore(token, value, store);
|
|
1854
1896
|
}
|
|
1855
1897
|
|
|
1856
1898
|
// internal/src/ingest-updates/ingest-selector-update.ts
|
|
@@ -2129,7 +2171,17 @@ function createTimeline(options, store, data) {
|
|
|
2129
2171
|
for (const tokenOrFamily of options.atoms) {
|
|
2130
2172
|
let atomKey = tokenOrFamily.key;
|
|
2131
2173
|
if (tokenOrFamily.type === `atom_family` || tokenOrFamily.type === `mutable_atom_family`) {
|
|
2132
|
-
const
|
|
2174
|
+
const familyToken = tokenOrFamily;
|
|
2175
|
+
const family = withdraw(familyToken, store);
|
|
2176
|
+
if (family === void 0) {
|
|
2177
|
+
store.logger.error(
|
|
2178
|
+
`\u274C`,
|
|
2179
|
+
`timeline`,
|
|
2180
|
+
options.key,
|
|
2181
|
+
`Failed to add family "${familyToken.key}" because it does not exist in the store`
|
|
2182
|
+
);
|
|
2183
|
+
continue;
|
|
2184
|
+
}
|
|
2133
2185
|
const familyKey = family.key;
|
|
2134
2186
|
target.timelineAtoms.set({ atomKey: familyKey, timelineKey });
|
|
2135
2187
|
family.subject.subscribe(`timeline:${options.key}`, (token2) => {
|
|
@@ -2282,6 +2334,35 @@ var abortTransaction = (store) => {
|
|
|
2282
2334
|
target.parent.child = null;
|
|
2283
2335
|
};
|
|
2284
2336
|
|
|
2337
|
+
// internal/src/transaction/act-upon-store.ts
|
|
2338
|
+
function actUponStore(token, id, store) {
|
|
2339
|
+
return (...parameters) => {
|
|
2340
|
+
const tx = withdraw(token, store);
|
|
2341
|
+
if (tx) {
|
|
2342
|
+
return tx.run(parameters, id);
|
|
2343
|
+
}
|
|
2344
|
+
throw new NotFoundError(token, store);
|
|
2345
|
+
};
|
|
2346
|
+
}
|
|
2347
|
+
|
|
2348
|
+
// internal/src/transaction/set-epoch-number.ts
|
|
2349
|
+
function setEpochNumberOfContinuity(continuityKey, newEpoch, store) {
|
|
2350
|
+
const isRoot = isRootStore(store);
|
|
2351
|
+
if (isRoot && continuityKey) {
|
|
2352
|
+
store.transactionMeta.epoch.set(continuityKey, newEpoch);
|
|
2353
|
+
}
|
|
2354
|
+
}
|
|
2355
|
+
function setEpochNumberOfAction(transactionKey, newEpoch, store) {
|
|
2356
|
+
const isRoot = isRootStore(store);
|
|
2357
|
+
if (!isRoot) {
|
|
2358
|
+
return;
|
|
2359
|
+
}
|
|
2360
|
+
const continuityKey = store.transactionMeta.actionContinuities.getRelatedKey(transactionKey);
|
|
2361
|
+
if (continuityKey !== void 0) {
|
|
2362
|
+
store.transactionMeta.epoch.set(continuityKey, newEpoch);
|
|
2363
|
+
}
|
|
2364
|
+
}
|
|
2365
|
+
|
|
2285
2366
|
// internal/src/transaction/apply-transaction.ts
|
|
2286
2367
|
var applyTransaction = (output, store) => {
|
|
2287
2368
|
var _a;
|
|
@@ -2330,7 +2411,11 @@ var applyTransaction = (output, store) => {
|
|
|
2330
2411
|
}
|
|
2331
2412
|
ingestTransactionUpdate(`newValue`, child.transactionMeta.update, parent);
|
|
2332
2413
|
if (isRootStore(parent)) {
|
|
2333
|
-
|
|
2414
|
+
setEpochNumberOfAction(
|
|
2415
|
+
child.transactionMeta.update.key,
|
|
2416
|
+
child.transactionMeta.update.epoch,
|
|
2417
|
+
parent
|
|
2418
|
+
);
|
|
2334
2419
|
const myTransaction = withdraw(
|
|
2335
2420
|
{ key: child.transactionMeta.update.key, type: `transaction` },
|
|
2336
2421
|
store
|
|
@@ -2347,6 +2432,21 @@ var applyTransaction = (output, store) => {
|
|
|
2347
2432
|
}
|
|
2348
2433
|
parent.on.transactionApplying.next(null);
|
|
2349
2434
|
};
|
|
2435
|
+
|
|
2436
|
+
// internal/src/transaction/assign-transaction-to-continuity.ts
|
|
2437
|
+
function assignTransactionToContinuity(continuityKey, transactionKey, store) {
|
|
2438
|
+
const isRoot = isRootStore(store);
|
|
2439
|
+
if (!isRoot) {
|
|
2440
|
+
return;
|
|
2441
|
+
}
|
|
2442
|
+
const { epoch, actionContinuities } = store.transactionMeta;
|
|
2443
|
+
actionContinuities.set(continuityKey, transactionKey);
|
|
2444
|
+
if (!epoch.has(continuityKey)) {
|
|
2445
|
+
epoch.set(continuityKey, -1);
|
|
2446
|
+
}
|
|
2447
|
+
}
|
|
2448
|
+
|
|
2449
|
+
// internal/src/transaction/build-transaction.ts
|
|
2350
2450
|
var buildTransaction = (key, params, store, id) => {
|
|
2351
2451
|
const parent = newest(store);
|
|
2352
2452
|
const childBase = {
|
|
@@ -2372,12 +2472,13 @@ var buildTransaction = (key, params, store, id) => {
|
|
|
2372
2472
|
selectors: new LazyMap(parent.selectors),
|
|
2373
2473
|
valueMap: new LazyMap(parent.valueMap)
|
|
2374
2474
|
};
|
|
2475
|
+
const epoch = getEpochNumberOfAction(key, store);
|
|
2375
2476
|
const transactionMeta = {
|
|
2376
2477
|
phase: `building`,
|
|
2377
2478
|
update: {
|
|
2378
2479
|
key,
|
|
2379
|
-
id
|
|
2380
|
-
epoch:
|
|
2480
|
+
id,
|
|
2481
|
+
epoch: epoch === void 0 ? NaN : epoch + 1,
|
|
2381
2482
|
updates: [],
|
|
2382
2483
|
params,
|
|
2383
2484
|
output: void 0
|
|
@@ -2385,7 +2486,7 @@ var buildTransaction = (key, params, store, id) => {
|
|
|
2385
2486
|
transactors: {
|
|
2386
2487
|
get: (token) => getFromStore(token, child),
|
|
2387
2488
|
set: (token, value) => setIntoStore(token, value, child),
|
|
2388
|
-
run: (token, id2) =>
|
|
2489
|
+
run: (token, id2 = arbitrary()) => actUponStore(token, id2, child),
|
|
2389
2490
|
find: (token, key2) => findInStore(token, key2, child),
|
|
2390
2491
|
env: () => getEnvironmentData(child)
|
|
2391
2492
|
}
|
|
@@ -2433,6 +2534,24 @@ function createTransaction(options, store) {
|
|
|
2433
2534
|
return token;
|
|
2434
2535
|
}
|
|
2435
2536
|
|
|
2537
|
+
// internal/src/transaction/get-epoch-number.ts
|
|
2538
|
+
function getContinuityKey(transactionKey, store) {
|
|
2539
|
+
const isRoot = isRootStore(store);
|
|
2540
|
+
const continuity = isRoot ? store.transactionMeta.actionContinuities.getRelatedKey(transactionKey) : void 0;
|
|
2541
|
+
return continuity;
|
|
2542
|
+
}
|
|
2543
|
+
function getEpochNumberOfContinuity(continuityKey, store) {
|
|
2544
|
+
const isRoot = isRootStore(store);
|
|
2545
|
+
const epoch = isRoot && continuityKey ? store.transactionMeta.epoch.get(continuityKey) : void 0;
|
|
2546
|
+
return epoch;
|
|
2547
|
+
}
|
|
2548
|
+
function getEpochNumberOfAction(transactionKey, store) {
|
|
2549
|
+
const isRoot = isRootStore(store);
|
|
2550
|
+
const continuity = isRoot ? store.transactionMeta.actionContinuities.getRelatedKey(transactionKey) : void 0;
|
|
2551
|
+
const epoch = isRoot && continuity !== void 0 ? store.transactionMeta.epoch.get(continuity) : void 0;
|
|
2552
|
+
return epoch;
|
|
2553
|
+
}
|
|
2554
|
+
|
|
2436
2555
|
// internal/src/transaction/index.ts
|
|
2437
2556
|
var TRANSACTION_PHASES = [`idle`, `building`, `applying`];
|
|
2438
2557
|
|
|
@@ -2447,8 +2566,11 @@ exports.Subject = Subject;
|
|
|
2447
2566
|
exports.TRANSACTION_PHASES = TRANSACTION_PHASES;
|
|
2448
2567
|
exports.Tracker = Tracker;
|
|
2449
2568
|
exports.abortTransaction = abortTransaction;
|
|
2569
|
+
exports.actUponStore = actUponStore;
|
|
2450
2570
|
exports.addAtomToTimeline = addAtomToTimeline;
|
|
2451
2571
|
exports.applyTransaction = applyTransaction;
|
|
2572
|
+
exports.arbitrary = arbitrary;
|
|
2573
|
+
exports.assignTransactionToContinuity = assignTransactionToContinuity;
|
|
2452
2574
|
exports.become = become;
|
|
2453
2575
|
exports.buildTransaction = buildTransaction;
|
|
2454
2576
|
exports.cacheValue = cacheValue;
|
|
@@ -2472,7 +2594,10 @@ exports.deleteSelector = deleteSelector;
|
|
|
2472
2594
|
exports.deposit = deposit;
|
|
2473
2595
|
exports.evictCachedValue = evictCachedValue;
|
|
2474
2596
|
exports.findInStore = findInStore;
|
|
2597
|
+
exports.getContinuityKey = getContinuityKey;
|
|
2475
2598
|
exports.getEnvironmentData = getEnvironmentData;
|
|
2599
|
+
exports.getEpochNumberOfAction = getEpochNumberOfAction;
|
|
2600
|
+
exports.getEpochNumberOfContinuity = getEpochNumberOfContinuity;
|
|
2476
2601
|
exports.getFromStore = getFromStore;
|
|
2477
2602
|
exports.getJsonFamily = getJsonFamily;
|
|
2478
2603
|
exports.getJsonToken = getJsonToken;
|
|
@@ -2483,9 +2608,11 @@ exports.ingestSelectorUpdate = ingestSelectorUpdate;
|
|
|
2483
2608
|
exports.ingestTransactionUpdate = ingestTransactionUpdate;
|
|
2484
2609
|
exports.isAtomDefault = isAtomDefault;
|
|
2485
2610
|
exports.isAtomKey = isAtomKey;
|
|
2611
|
+
exports.isChildStore = isChildStore;
|
|
2486
2612
|
exports.isDone = isDone;
|
|
2487
2613
|
exports.isMutable = isMutable;
|
|
2488
2614
|
exports.isReadonlySelectorKey = isReadonlySelectorKey;
|
|
2615
|
+
exports.isRootStore = isRootStore;
|
|
2489
2616
|
exports.isSelectorKey = isSelectorKey;
|
|
2490
2617
|
exports.isStateKey = isStateKey;
|
|
2491
2618
|
exports.isTransceiver = isTransceiver;
|
|
@@ -2498,6 +2625,8 @@ exports.readCachedValue = readCachedValue;
|
|
|
2498
2625
|
exports.readOrComputeValue = readOrComputeValue;
|
|
2499
2626
|
exports.registerSelector = registerSelector;
|
|
2500
2627
|
exports.setAtomOrSelector = setAtomOrSelector;
|
|
2628
|
+
exports.setEpochNumberOfAction = setEpochNumberOfAction;
|
|
2629
|
+
exports.setEpochNumberOfContinuity = setEpochNumberOfContinuity;
|
|
2501
2630
|
exports.setIntoStore = setIntoStore;
|
|
2502
2631
|
exports.subscribeToRootAtoms = subscribeToRootAtoms;
|
|
2503
2632
|
exports.subscribeToState = subscribeToState;
|