atom.io 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/internal/dist/index.d.mts +26 -4
- package/internal/dist/index.d.ts +26 -4
- package/internal/dist/index.js +40 -7
- package/internal/dist/index.js.map +1 -1
- package/internal/dist/index.mjs +40 -8
- package/internal/dist/index.mjs.map +1 -1
- package/internal/src/atom/create-atom.ts +1 -1
- package/internal/src/caching.ts +18 -1
- package/internal/src/future.ts +39 -0
- package/internal/src/index.ts +1 -0
- package/internal/src/selector/create-read-write-selector.ts +2 -2
- package/internal/src/selector/create-readonly-selector.ts +1 -1
- package/internal/src/set-state/set-atom-state.ts +1 -1
- package/package.json +9 -9
- package/react-devtools/dist/index.js +19 -5
- package/react-devtools/dist/index.js.map +1 -1
- package/react-devtools/dist/index.mjs +15 -1
- package/react-devtools/dist/index.mjs.map +1 -1
- package/react-devtools/src/index.ts +1 -1
- package/src/index.ts +2 -8
package/dist/index.d.mts
CHANGED
|
@@ -182,4 +182,4 @@ declare const getState: <T>(token: ReadonlySelectorToken<T> | StateToken<T>, sto
|
|
|
182
182
|
declare const setState: <T, New extends T>(token: StateToken<T>, value: New | ((oldValue: T) => New), store?: Store) => void;
|
|
183
183
|
declare const isDefault: (token: ReadonlySelectorToken<unknown> | StateToken<unknown>, store?: Store) => boolean;
|
|
184
184
|
|
|
185
|
-
export { AtomEffect, AtomFamily, AtomFamilyOptions, AtomOptions, AtomToken, Effectors, FamilyMetadata, KeyedStateUpdate, LOG_LEVELS, Logger, MutableAtomFamily, MutableAtomFamilyOptions, MutableAtomOptions, MutableAtomToken, NO_OP, Read, ReadonlySelectorFamily, ReadonlySelectorFamilyOptions, ReadonlySelectorOptions, ReadonlySelectorToken, ReadonlyTransactors, SelectorFamily, SelectorFamilyOptions, SelectorOptions, SelectorToken, Silo, StateToken, StateUpdate, TimelineOptions, TimelineToken, TimelineUpdate, TransactionIO, TransactionOptions, TransactionToken, TransactionUpdate, Transactors, UpdateHandler, Write, atom, atomFamily, capitalize, getState, isDefault, redo, runTransaction, selector, selectorFamily, setLogLevel, setState, subscribe, subscribeToTimeline, subscribeToTransaction, timeline, transaction, undo, useLogger, ƒn };
|
|
185
|
+
export { AtomEffect, AtomFamily, AtomFamilyOptions, AtomOptions, AtomToken, Effectors, FamilyMetadata, KeyedStateUpdate, LOG_LEVELS, Logger, MutableAtomFamily, MutableAtomFamilyOptions, MutableAtomOptions, MutableAtomToken, NO_OP, Read, ReadonlySelectorFamily, ReadonlySelectorFamilyOptions, ReadonlySelectorOptions, ReadonlySelectorToken, ReadonlyTransactors, SelectorFamily, SelectorFamilyOptions, SelectorOptions, SelectorToken, Silo, StateToken, StateUpdate, TimelineOptions, TimelineToken, TimelineUpdate, TransactionIO, TransactionOptions, TransactionToken, TransactionUpdate, TransactionUpdateHandler, Transactors, UpdateHandler, Write, atom, atomFamily, capitalize, getState, isDefault, redo, runTransaction, selector, selectorFamily, setLogLevel, setState, subscribe, subscribeToTimeline, subscribeToTransaction, timeline, transaction, undo, useLogger, ƒn };
|
package/dist/index.d.ts
CHANGED
|
@@ -182,4 +182,4 @@ declare const getState: <T>(token: ReadonlySelectorToken<T> | StateToken<T>, sto
|
|
|
182
182
|
declare const setState: <T, New extends T>(token: StateToken<T>, value: New | ((oldValue: T) => New), store?: Store) => void;
|
|
183
183
|
declare const isDefault: (token: ReadonlySelectorToken<unknown> | StateToken<unknown>, store?: Store) => boolean;
|
|
184
184
|
|
|
185
|
-
export { AtomEffect, AtomFamily, AtomFamilyOptions, AtomOptions, AtomToken, Effectors, FamilyMetadata, KeyedStateUpdate, LOG_LEVELS, Logger, MutableAtomFamily, MutableAtomFamilyOptions, MutableAtomOptions, MutableAtomToken, NO_OP, Read, ReadonlySelectorFamily, ReadonlySelectorFamilyOptions, ReadonlySelectorOptions, ReadonlySelectorToken, ReadonlyTransactors, SelectorFamily, SelectorFamilyOptions, SelectorOptions, SelectorToken, Silo, StateToken, StateUpdate, TimelineOptions, TimelineToken, TimelineUpdate, TransactionIO, TransactionOptions, TransactionToken, TransactionUpdate, Transactors, UpdateHandler, Write, atom, atomFamily, capitalize, getState, isDefault, redo, runTransaction, selector, selectorFamily, setLogLevel, setState, subscribe, subscribeToTimeline, subscribeToTransaction, timeline, transaction, undo, useLogger, ƒn };
|
|
185
|
+
export { AtomEffect, AtomFamily, AtomFamilyOptions, AtomOptions, AtomToken, Effectors, FamilyMetadata, KeyedStateUpdate, LOG_LEVELS, Logger, MutableAtomFamily, MutableAtomFamilyOptions, MutableAtomOptions, MutableAtomToken, NO_OP, Read, ReadonlySelectorFamily, ReadonlySelectorFamilyOptions, ReadonlySelectorOptions, ReadonlySelectorToken, ReadonlyTransactors, SelectorFamily, SelectorFamilyOptions, SelectorOptions, SelectorToken, Silo, StateToken, StateUpdate, TimelineOptions, TimelineToken, TimelineUpdate, TransactionIO, TransactionOptions, TransactionToken, TransactionUpdate, TransactionUpdateHandler, Transactors, UpdateHandler, Write, atom, atomFamily, capitalize, getState, isDefault, redo, runTransaction, selector, selectorFamily, setLogLevel, setState, subscribe, subscribeToTimeline, subscribeToTransaction, timeline, transaction, undo, useLogger, ƒn };
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/atom.ts","../src/logger.ts","../src/selector.ts","../src/silo.ts","../src/subscribe.ts","../src/timeline.ts","../src/transaction.ts"],"names":["_a","createAtom","createAtomFamily","createMutableAtom","createMutableAtomFamily","createSelector","createSelectorFamily","IMPLICIT","redo__INTERNAL","timeline__INTERNAL","undo__INTERNAL","transaction__INTERNAL","withdraw"],"mappings":"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","sourcesContent":["import * as IO from \"atom.io/internal\"\nimport type { Store, Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nexport * from \"./atom\"\nexport * from \"./logger\"\nexport * from \"./selector\"\nexport * from \"./silo\"\nexport {\n\tsubscribe,\n\tsubscribeToTimeline,\n\tsubscribeToTransaction,\n\tKeyedStateUpdate,\n\tStateUpdate,\n\tUpdateHandler,\n} from \"./subscribe\"\nexport * from \"./timeline\"\nexport * from \"./transaction\"\n\nexport type ƒn = (...parameters: any[]) => any\n\nexport type AtomToken<_> = {\n\tkey: string\n\ttype: `atom`\n\tfamily?: FamilyMetadata\n\t__brand?: _\n}\nexport interface MutableAtomToken<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n> extends AtomToken<T> {\n\t__asJSON?: J\n\t__update?: T extends Transceiver<infer Update> ? Update : never\n}\nexport type SelectorToken<_> = {\n\tkey: string\n\ttype: `selector`\n\tfamily?: FamilyMetadata\n\t__brand?: _\n}\nexport type StateToken<T> = AtomToken<T> | SelectorToken<T>\n\nexport type ReadonlySelectorToken<_> = {\n\tkey: string\n\ttype: `readonly_selector`\n\tfamily?: FamilyMetadata\n\t__brand?: _\n}\n\nexport type FamilyMetadata = {\n\tkey: string\n\tsubKey: string\n}\n\nexport const capitalize = (str: string): string =>\n\tstr[0].toUpperCase() + str.slice(1)\n\nexport const getState = <T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\tstore: Store = IO.IMPLICIT.STORE,\n): T => {\n\tconst state =\n\t\tIO.withdraw(token, store) ?? IO.withdrawNewFamilyMember(token, store)\n\tif (state === null) {\n\t\tthrow new Error(\n\t\t\t`${capitalize(token.type)} \"${token.key}\" not found in store \"${\n\t\t\t\tstore.config.name\n\t\t\t}\".`,\n\t\t)\n\t}\n\treturn IO.getState__INTERNAL(state, store)\n}\n\nexport const setState = <T, New extends T>(\n\ttoken: StateToken<T>,\n\tvalue: New | ((oldValue: T) => New),\n\tstore: Store = IO.IMPLICIT.STORE,\n): void => {\n\ttry {\n\t\tIO.openOperation(token, store)\n\t} catch (thrown) {\n\t\tif (!(typeof thrown === `symbol`)) {\n\t\t\tthrow thrown\n\t\t}\n\t\treturn\n\t}\n\tconst state =\n\t\tIO.withdraw(token, store) ?? IO.withdrawNewFamilyMember(token, store)\n\tif (state === null) {\n\t\tthrow new Error(\n\t\t\t`${capitalize(token.type)} \"${token.key}\" not found in store \"${\n\t\t\t\tstore.config.name\n\t\t\t}\".`,\n\t\t)\n\t}\n\tIO.setState__INTERNAL(state, value, store)\n\tIO.closeOperation(store)\n}\n\nexport const isDefault = (\n\ttoken: ReadonlySelectorToken<unknown> | StateToken<unknown>,\n\tstore: Store = IO.IMPLICIT.STORE,\n): boolean =>\n\ttoken.type === `atom`\n\t\t? IO.isAtomDefault(token.key, store)\n\t\t: IO.isSelectorDefault(token.key, store)\n","import type { Subject, Transceiver } from \"atom.io/internal\"\nimport {\n\tcreateAtom,\n\tcreateAtomFamily,\n\tcreateMutableAtom,\n\tcreateMutableAtomFamily,\n} from \"atom.io/internal\"\nimport type { Json, JsonInterface } from \"atom.io/json\"\n\nimport type { AtomToken, MutableAtomToken } 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\n\nexport type AtomOptions<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<AtomOptions<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: AtomOptions<T>): AtomToken<T>\nexport function atom<T>(\n\toptions: AtomOptions<any> | MutableAtomOptions<any, any>,\n): AtomToken<any> {\n\tif (`mutable` in options) {\n\t\treturn createMutableAtom(options)\n\t}\n\treturn createAtom<T>(options)\n}\n\nexport type AtomFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tdefault: T | ((key: K) => T)\n\teffects?: (key: K) => AtomEffect<T>[]\n}\n\nexport type AtomFamily<T, K extends Json.Serializable = Json.Serializable> = ((\n\tkey: K,\n) => AtomToken<T>) & {\n\tkey: string\n\ttype: `atom_family`\n\tsubject: Subject<AtomToken<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& AtomFamilyOptions<T, K>\n\t& JsonInterface<T, J>\n\t& { mutable: true }\n\n// biome-ignore format: intersection\nexport type MutableAtomFamily<\n\tCore extends Transceiver<any>,\n\tSerializableCore extends Json.Serializable,\n\tKey extends Json.Serializable,\n> = \n\t& JsonInterface<Core, SerializableCore>\n\t& ((key: Key) => MutableAtomToken<Core, SerializableCore>) \n\t& {\n\t\t\tkey: `${string}::mutable`\n\t\t\ttype: `atom_family`\n\t\t\tsubject: Subject<MutableAtomToken<Core, SerializableCore>>\n\t\t}\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: AtomFamilyOptions<T, K>,\n): AtomFamily<T, K>\nexport function atomFamily<T, K extends Json.Serializable>(\n\toptions: AtomFamilyOptions<T, K> | MutableAtomFamilyOptions<any, any, any>,\n): AtomFamily<T, K> | MutableAtomFamily<any, any, any> {\n\tif (`mutable` in options) {\n\t\treturn createMutableAtomFamily(options)\n\t}\n\treturn createAtomFamily<T, K>(options)\n}\n","import { IMPLICIT } from \"atom.io/internal\"\nimport type { Store } from \"atom.io/internal\"\n\nexport const NO_OP = (): void => undefined\n\nexport type Logger = Pick<Console, `error` | `info` | `warn`>\nexport const LOG_LEVELS: ReadonlyArray<keyof Logger> = [\n\t`info`,\n\t`warn`,\n\t`error`,\n] as const\n\nexport const setLogLevel = (\n\tpreferredLevel: `error` | `info` | `warn` | null,\n\tstore: Store = IMPLICIT.STORE,\n): void => {\n\tconst { logger__INTERNAL } = store.config\n\tif (preferredLevel === null) {\n\t\tstore.config.logger = null\n\t} else {\n\t\tstore.config.logger = { ...console }\n\t\tLOG_LEVELS.forEach((logLevel) => {\n\t\t\tif (LOG_LEVELS.indexOf(logLevel) < LOG_LEVELS.indexOf(preferredLevel)) {\n\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: we just set it\n\t\t\t\tstore.config.logger![logLevel] = NO_OP\n\t\t\t} else {\n\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: we just set it\n\t\t\t\tstore.config.logger![logLevel] = logger__INTERNAL[logLevel]\n\t\t\t}\n\t\t})\n\t}\n}\n\nexport const useLogger = (\n\tlogger: Logger,\n\tstore: Store = IMPLICIT.STORE,\n): void => {\n\tconst currentLogLevel =\n\t\tstore.config.logger === null\n\t\t\t? null\n\t\t\t: LOG_LEVELS.find(\n\t\t\t\t\t(logLevel) => store.config.logger?.[logLevel] !== NO_OP,\n\t\t\t ) ?? null\n\tstore.config.logger__INTERNAL = { ...logger }\n\tsetLogLevel(currentLogLevel, store)\n}\n","import type { Subject } from \"atom.io/internal\"\nimport { createSelector, createSelectorFamily } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ReadonlySelectorToken, SelectorToken } from \".\"\nimport type { Read, Write } from \"./transaction\"\n\nexport type SelectorOptions<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>(options: SelectorOptions<T>): SelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T>,\n): ReadonlySelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T> | SelectorOptions<T>,\n): ReadonlySelectorToken<T> | SelectorToken<T> {\n\treturn createSelector(options)\n}\n\nexport type SelectorFamilyOptions<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 SelectorFamily<\n\tT,\n\tK extends Json.Serializable = Json.Serializable,\n> = ((key: K) => SelectorToken<T>) & {\n\tkey: string\n\ttype: `selector_family`\n\tsubject: Subject<SelectorToken<T>>\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}\n\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: SelectorFamilyOptions<T, K>,\n): SelectorFamily<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: ReadonlySelectorFamilyOptions<T, K> | SelectorFamilyOptions<T, K>,\n): ReadonlySelectorFamily<T, K> | SelectorFamily<T, K> {\n\treturn createSelectorFamily(options)\n}\n","import {\n\tStore,\n\tcreateAtom,\n\tcreateAtomFamily,\n\tcreateMutableAtom,\n\tcreateMutableAtomFamily,\n\tcreateSelector,\n\tcreateSelectorFamily,\n\tredo__INTERNAL,\n\ttimeline__INTERNAL,\n\ttransaction__INTERNAL,\n\tundo__INTERNAL,\n} from \"atom.io/internal\"\n\nimport type { redo, timeline, undo } from \".\"\nimport { getState, setState, 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\tthis.store = s\n\t\tthis.atom = (options) => {\n\t\t\tif (`mutable` in options) {\n\t\t\t\treturn createMutableAtom(options, s)\n\t\t\t}\n\t\t\treturn createAtom(options, undefined, s)\n\t\t}\n\t\tthis.atomFamily = (options) => {\n\t\t\tif (`mutable` in options) {\n\t\t\t\treturn createMutableAtomFamily(options, s) as any\n\t\t\t}\n\t\t\treturn createAtomFamily(options, s)\n\t\t}\n\t\tthis.selector = (options) => createSelector(options, undefined, s) as any\n\t\tthis.selectorFamily = (options) => createSelectorFamily(options, s) as any\n\t\tthis.transaction = (options) => transaction__INTERNAL(options, s)\n\t\tthis.timeline = (options) => timeline__INTERNAL(options, s)\n\t\tthis.getState = (token) => getState(token, s)\n\t\tthis.setState = (token, newValue) => setState(token, newValue, s)\n\t\tthis.subscribe = (token, handler, key) => subscribe(token, handler, key, s)\n\t\tthis.undo = (token) => undo__INTERNAL(token, s)\n\t\tthis.redo = (token) => redo__INTERNAL(token, s)\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, subscribeToRootAtoms, withdraw } from \"atom.io/internal\"\n\nimport type {\n\tFamilyMetadata,\n\tReadonlySelectorToken,\n\tStateToken,\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 function subscribe<T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\thandleUpdate: UpdateHandler<T>,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore: Store = IMPLICIT.STORE,\n): () => void {\n\tconst state = withdraw<T>(token, store)\n\tif (state === null) {\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.config.logger?.info(`👀 adding subscription \"${key}\" to \"${state.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.config.logger?.info(`🙈 unsubscribe from \"${state.key}\"`)\n\t\t\t\t\tunsubFunction()\n\t\t\t }\n\t\t\t: () => {\n\t\t\t\t\tstore.config.logger?.info(\n\t\t\t\t\t\t`🙈 unsubscribe from \"${state.key}\" and its dependencies`,\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\nexport type TransactionUpdateHandler<ƒ extends ƒn> = (\n\tdata: TransactionUpdate<ƒ>,\n) => void\n\nexport const subscribeToTransaction = <ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\thandleUpdate: TransactionUpdateHandler<ƒ>,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore = IMPLICIT.STORE,\n): (() => void) => {\n\tconst tx = withdraw(token, store)\n\tif (tx === null) {\n\t\tthrow new Error(\n\t\t\t`Cannot subscribe to transaction \"${token.key}\": transaction not found in store \"${store.config.name}\".`,\n\t\t)\n\t}\n\tstore.config.logger?.info(`👀 subscribe to transaction \"${token.key}\"`)\n\tconst unsubscribe = tx.subject.subscribe(key, handleUpdate)\n\treturn () => {\n\t\tstore.config.logger?.info(`🙈 unsubscribe from transaction \"${token.key}\"`)\n\t\tunsubscribe()\n\t}\n}\n\nexport const subscribeToTimeline = (\n\ttoken: TimelineToken,\n\thandleUpdate: (update: TimelineUpdate | `redo` | `undo`) => void,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore = IMPLICIT.STORE,\n): (() => void) => {\n\tconst tl = withdraw(token, store)\n\tif (tl === null) {\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.config.logger?.info(`👀 subscribe to timeline \"${token.key}\"`)\n\tconst unsubscribe = tl.subject.subscribe(key, handleUpdate)\n\treturn () => {\n\t\tstore.config.logger?.info(`🙈 unsubscribe from timeline \"${token.key}\"`)\n\t\tunsubscribe()\n\t}\n}\n","import type {\n\tTimelineAtomUpdate,\n\tTimelineSelectorUpdate,\n\tTimelineTransactionUpdate,\n} from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tredo__INTERNAL,\n\ttimeline__INTERNAL,\n\tundo__INTERNAL,\n} 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}\n\nexport type TimelineUpdate =\n\t| TimelineAtomUpdate\n\t| TimelineSelectorUpdate\n\t| TimelineTransactionUpdate\n\nexport const timeline = (options: TimelineOptions): TimelineToken => {\n\treturn timeline__INTERNAL(options)\n}\n\nexport const redo = (token: TimelineToken): void => {\n\tredo__INTERNAL(token, IMPLICIT.STORE)\n}\n\nexport const undo = (token: TimelineToken): void => {\n\tundo__INTERNAL(token, IMPLICIT.STORE)\n}\n","import type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, transaction__INTERNAL, withdraw } from \"atom.io/internal\"\n\nimport type { KeyedStateUpdate, ReadonlySelectorToken, StateToken, ƒn } from \".\"\n\nexport type TransactionToken<_> = {\n\tkey: string\n\ttype: `transaction`\n\t__brand?: _\n}\n\nexport type TransactionUpdate<ƒ extends ƒn> = {\n\tkey: string\n\tatomUpdates: KeyedStateUpdate<unknown>[]\n\tparams: Parameters<ƒ>\n\toutput: ReturnType<ƒ>\n}\n\nexport type Transactors = {\n\tget: <S>(state: ReadonlySelectorToken<S> | StateToken<S>) => S\n\tset: <S>(state: StateToken<S>, newValue: S | ((oldValue: S) => S)) => void\n}\nexport type ReadonlyTransactors = Pick<Transactors, `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 TransactionOptions<ƒ extends ƒn> = {\n\tkey: string\n\tdo: Write<ƒ>\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 transaction__INTERNAL(options)\n}\n\nexport const runTransaction =\n\t<ƒ extends ƒn>(token: TransactionToken<ƒ>, store: Store = IMPLICIT.STORE) =>\n\t(...parameters: Parameters<ƒ>): ReturnType<ƒ> => {\n\t\tconst tx = withdraw(token, store)\n\t\tif (tx) {\n\t\t\treturn tx.run(...parameters)\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/atom.ts","../src/logger.ts","../src/selector.ts","../src/silo.ts","../src/subscribe.ts","../src/timeline.ts","../src/transaction.ts"],"names":["_a","createAtom","createAtomFamily","createMutableAtom","createMutableAtomFamily","createSelector","createSelectorFamily","IMPLICIT","redo__INTERNAL","timeline__INTERNAL","undo__INTERNAL","transaction__INTERNAL","withdraw"],"mappings":"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","sourcesContent":["import * as IO from \"atom.io/internal\"\nimport type { Store, Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nexport * from \"./atom\"\nexport * from \"./logger\"\nexport * from \"./selector\"\nexport * from \"./silo\"\nexport { subscribe } from \"./subscribe\"\nexport * from \"./subscribe\"\nexport * from \"./timeline\"\nexport * from \"./transaction\"\n\nexport type ƒn = (...parameters: any[]) => any\n\nexport type AtomToken<_> = {\n\tkey: string\n\ttype: `atom`\n\tfamily?: FamilyMetadata\n\t__brand?: _\n}\nexport interface MutableAtomToken<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n> extends AtomToken<T> {\n\t__asJSON?: J\n\t__update?: T extends Transceiver<infer Update> ? Update : never\n}\nexport type SelectorToken<_> = {\n\tkey: string\n\ttype: `selector`\n\tfamily?: FamilyMetadata\n\t__brand?: _\n}\nexport type StateToken<T> = AtomToken<T> | SelectorToken<T>\n\nexport type ReadonlySelectorToken<_> = {\n\tkey: string\n\ttype: `readonly_selector`\n\tfamily?: FamilyMetadata\n\t__brand?: _\n}\n\nexport type FamilyMetadata = {\n\tkey: string\n\tsubKey: string\n}\n\nexport const capitalize = (str: string): string =>\n\tstr[0].toUpperCase() + str.slice(1)\n\nexport const getState = <T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\tstore: Store = IO.IMPLICIT.STORE,\n): T => {\n\tconst state =\n\t\tIO.withdraw(token, store) ?? IO.withdrawNewFamilyMember(token, store)\n\tif (state === null) {\n\t\tthrow new Error(\n\t\t\t`${capitalize(token.type)} \"${token.key}\" not found in store \"${\n\t\t\t\tstore.config.name\n\t\t\t}\".`,\n\t\t)\n\t}\n\treturn IO.getState__INTERNAL(state, store)\n}\n\nexport const setState = <T, New extends T>(\n\ttoken: StateToken<T>,\n\tvalue: New | ((oldValue: T) => New),\n\tstore: Store = IO.IMPLICIT.STORE,\n): void => {\n\ttry {\n\t\tIO.openOperation(token, store)\n\t} catch (thrown) {\n\t\tif (!(typeof thrown === `symbol`)) {\n\t\t\tthrow thrown\n\t\t}\n\t\treturn\n\t}\n\tconst state =\n\t\tIO.withdraw(token, store) ?? IO.withdrawNewFamilyMember(token, store)\n\tif (state === null) {\n\t\tthrow new Error(\n\t\t\t`${capitalize(token.type)} \"${token.key}\" not found in store \"${\n\t\t\t\tstore.config.name\n\t\t\t}\".`,\n\t\t)\n\t}\n\tIO.setState__INTERNAL(state, value, store)\n\tIO.closeOperation(store)\n}\n\nexport const isDefault = (\n\ttoken: ReadonlySelectorToken<unknown> | StateToken<unknown>,\n\tstore: Store = IO.IMPLICIT.STORE,\n): boolean =>\n\ttoken.type === `atom`\n\t\t? IO.isAtomDefault(token.key, store)\n\t\t: IO.isSelectorDefault(token.key, store)\n","import type { Subject, Transceiver } from \"atom.io/internal\"\nimport {\n\tcreateAtom,\n\tcreateAtomFamily,\n\tcreateMutableAtom,\n\tcreateMutableAtomFamily,\n} from \"atom.io/internal\"\nimport type { Json, JsonInterface } from \"atom.io/json\"\n\nimport type { AtomToken, MutableAtomToken } 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\n\nexport type AtomOptions<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<AtomOptions<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: AtomOptions<T>): AtomToken<T>\nexport function atom<T>(\n\toptions: AtomOptions<any> | MutableAtomOptions<any, any>,\n): AtomToken<any> {\n\tif (`mutable` in options) {\n\t\treturn createMutableAtom(options)\n\t}\n\treturn createAtom<T>(options)\n}\n\nexport type AtomFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tdefault: T | ((key: K) => T)\n\teffects?: (key: K) => AtomEffect<T>[]\n}\n\nexport type AtomFamily<T, K extends Json.Serializable = Json.Serializable> = ((\n\tkey: K,\n) => AtomToken<T>) & {\n\tkey: string\n\ttype: `atom_family`\n\tsubject: Subject<AtomToken<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& AtomFamilyOptions<T, K>\n\t& JsonInterface<T, J>\n\t& { mutable: true }\n\n// biome-ignore format: intersection\nexport type MutableAtomFamily<\n\tCore extends Transceiver<any>,\n\tSerializableCore extends Json.Serializable,\n\tKey extends Json.Serializable,\n> = \n\t& JsonInterface<Core, SerializableCore>\n\t& ((key: Key) => MutableAtomToken<Core, SerializableCore>) \n\t& {\n\t\t\tkey: `${string}::mutable`\n\t\t\ttype: `atom_family`\n\t\t\tsubject: Subject<MutableAtomToken<Core, SerializableCore>>\n\t\t}\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: AtomFamilyOptions<T, K>,\n): AtomFamily<T, K>\nexport function atomFamily<T, K extends Json.Serializable>(\n\toptions: AtomFamilyOptions<T, K> | MutableAtomFamilyOptions<any, any, any>,\n): AtomFamily<T, K> | MutableAtomFamily<any, any, any> {\n\tif (`mutable` in options) {\n\t\treturn createMutableAtomFamily(options)\n\t}\n\treturn createAtomFamily<T, K>(options)\n}\n","import { IMPLICIT } from \"atom.io/internal\"\nimport type { Store } from \"atom.io/internal\"\n\nexport const NO_OP = (): void => undefined\n\nexport type Logger = Pick<Console, `error` | `info` | `warn`>\nexport const LOG_LEVELS: ReadonlyArray<keyof Logger> = [\n\t`info`,\n\t`warn`,\n\t`error`,\n] as const\n\nexport const setLogLevel = (\n\tpreferredLevel: `error` | `info` | `warn` | null,\n\tstore: Store = IMPLICIT.STORE,\n): void => {\n\tconst { logger__INTERNAL } = store.config\n\tif (preferredLevel === null) {\n\t\tstore.config.logger = null\n\t} else {\n\t\tstore.config.logger = { ...console }\n\t\tLOG_LEVELS.forEach((logLevel) => {\n\t\t\tif (LOG_LEVELS.indexOf(logLevel) < LOG_LEVELS.indexOf(preferredLevel)) {\n\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: we just set it\n\t\t\t\tstore.config.logger![logLevel] = NO_OP\n\t\t\t} else {\n\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: we just set it\n\t\t\t\tstore.config.logger![logLevel] = logger__INTERNAL[logLevel]\n\t\t\t}\n\t\t})\n\t}\n}\n\nexport const useLogger = (\n\tlogger: Logger,\n\tstore: Store = IMPLICIT.STORE,\n): void => {\n\tconst currentLogLevel =\n\t\tstore.config.logger === null\n\t\t\t? null\n\t\t\t: LOG_LEVELS.find(\n\t\t\t\t\t(logLevel) => store.config.logger?.[logLevel] !== NO_OP,\n\t\t\t ) ?? null\n\tstore.config.logger__INTERNAL = { ...logger }\n\tsetLogLevel(currentLogLevel, store)\n}\n","import type { Subject } from \"atom.io/internal\"\nimport { createSelector, createSelectorFamily } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ReadonlySelectorToken, SelectorToken } from \".\"\nimport type { Read, Write } from \"./transaction\"\n\nexport type SelectorOptions<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>(options: SelectorOptions<T>): SelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T>,\n): ReadonlySelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T> | SelectorOptions<T>,\n): ReadonlySelectorToken<T> | SelectorToken<T> {\n\treturn createSelector(options)\n}\n\nexport type SelectorFamilyOptions<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 SelectorFamily<\n\tT,\n\tK extends Json.Serializable = Json.Serializable,\n> = ((key: K) => SelectorToken<T>) & {\n\tkey: string\n\ttype: `selector_family`\n\tsubject: Subject<SelectorToken<T>>\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}\n\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: SelectorFamilyOptions<T, K>,\n): SelectorFamily<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: ReadonlySelectorFamilyOptions<T, K> | SelectorFamilyOptions<T, K>,\n): ReadonlySelectorFamily<T, K> | SelectorFamily<T, K> {\n\treturn createSelectorFamily(options)\n}\n","import {\n\tStore,\n\tcreateAtom,\n\tcreateAtomFamily,\n\tcreateMutableAtom,\n\tcreateMutableAtomFamily,\n\tcreateSelector,\n\tcreateSelectorFamily,\n\tredo__INTERNAL,\n\ttimeline__INTERNAL,\n\ttransaction__INTERNAL,\n\tundo__INTERNAL,\n} from \"atom.io/internal\"\n\nimport type { redo, timeline, undo } from \".\"\nimport { getState, setState, 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\tthis.store = s\n\t\tthis.atom = (options) => {\n\t\t\tif (`mutable` in options) {\n\t\t\t\treturn createMutableAtom(options, s)\n\t\t\t}\n\t\t\treturn createAtom(options, undefined, s)\n\t\t}\n\t\tthis.atomFamily = (options) => {\n\t\t\tif (`mutable` in options) {\n\t\t\t\treturn createMutableAtomFamily(options, s) as any\n\t\t\t}\n\t\t\treturn createAtomFamily(options, s)\n\t\t}\n\t\tthis.selector = (options) => createSelector(options, undefined, s) as any\n\t\tthis.selectorFamily = (options) => createSelectorFamily(options, s) as any\n\t\tthis.transaction = (options) => transaction__INTERNAL(options, s)\n\t\tthis.timeline = (options) => timeline__INTERNAL(options, s)\n\t\tthis.getState = (token) => getState(token, s)\n\t\tthis.setState = (token, newValue) => setState(token, newValue, s)\n\t\tthis.subscribe = (token, handler, key) => subscribe(token, handler, key, s)\n\t\tthis.undo = (token) => undo__INTERNAL(token, s)\n\t\tthis.redo = (token) => redo__INTERNAL(token, s)\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, subscribeToRootAtoms, withdraw } from \"atom.io/internal\"\n\nimport type {\n\tFamilyMetadata,\n\tReadonlySelectorToken,\n\tStateToken,\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 function subscribe<T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\thandleUpdate: UpdateHandler<T>,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore: Store = IMPLICIT.STORE,\n): () => void {\n\tconst state = withdraw<T>(token, store)\n\tif (state === null) {\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.config.logger?.info(`👀 adding subscription \"${key}\" to \"${state.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.config.logger?.info(`🙈 unsubscribe from \"${state.key}\"`)\n\t\t\t\t\tunsubFunction()\n\t\t\t }\n\t\t\t: () => {\n\t\t\t\t\tstore.config.logger?.info(\n\t\t\t\t\t\t`🙈 unsubscribe from \"${state.key}\" and its dependencies`,\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\nexport type TransactionUpdateHandler<ƒ extends ƒn> = (\n\tdata: TransactionUpdate<ƒ>,\n) => void\n\nexport const subscribeToTransaction = <ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\thandleUpdate: TransactionUpdateHandler<ƒ>,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore = IMPLICIT.STORE,\n): (() => void) => {\n\tconst tx = withdraw(token, store)\n\tif (tx === null) {\n\t\tthrow new Error(\n\t\t\t`Cannot subscribe to transaction \"${token.key}\": transaction not found in store \"${store.config.name}\".`,\n\t\t)\n\t}\n\tstore.config.logger?.info(`👀 subscribe to transaction \"${token.key}\"`)\n\tconst unsubscribe = tx.subject.subscribe(key, handleUpdate)\n\treturn () => {\n\t\tstore.config.logger?.info(`🙈 unsubscribe from transaction \"${token.key}\"`)\n\t\tunsubscribe()\n\t}\n}\n\nexport const subscribeToTimeline = (\n\ttoken: TimelineToken,\n\thandleUpdate: (update: TimelineUpdate | `redo` | `undo`) => void,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore = IMPLICIT.STORE,\n): (() => void) => {\n\tconst tl = withdraw(token, store)\n\tif (tl === null) {\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.config.logger?.info(`👀 subscribe to timeline \"${token.key}\"`)\n\tconst unsubscribe = tl.subject.subscribe(key, handleUpdate)\n\treturn () => {\n\t\tstore.config.logger?.info(`🙈 unsubscribe from timeline \"${token.key}\"`)\n\t\tunsubscribe()\n\t}\n}\n","import type {\n\tTimelineAtomUpdate,\n\tTimelineSelectorUpdate,\n\tTimelineTransactionUpdate,\n} from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tredo__INTERNAL,\n\ttimeline__INTERNAL,\n\tundo__INTERNAL,\n} 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}\n\nexport type TimelineUpdate =\n\t| TimelineAtomUpdate\n\t| TimelineSelectorUpdate\n\t| TimelineTransactionUpdate\n\nexport const timeline = (options: TimelineOptions): TimelineToken => {\n\treturn timeline__INTERNAL(options)\n}\n\nexport const redo = (token: TimelineToken): void => {\n\tredo__INTERNAL(token, IMPLICIT.STORE)\n}\n\nexport const undo = (token: TimelineToken): void => {\n\tundo__INTERNAL(token, IMPLICIT.STORE)\n}\n","import type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, transaction__INTERNAL, withdraw } from \"atom.io/internal\"\n\nimport type { KeyedStateUpdate, ReadonlySelectorToken, StateToken, ƒn } from \".\"\n\nexport type TransactionToken<_> = {\n\tkey: string\n\ttype: `transaction`\n\t__brand?: _\n}\n\nexport type TransactionUpdate<ƒ extends ƒn> = {\n\tkey: string\n\tatomUpdates: KeyedStateUpdate<unknown>[]\n\tparams: Parameters<ƒ>\n\toutput: ReturnType<ƒ>\n}\n\nexport type Transactors = {\n\tget: <S>(state: ReadonlySelectorToken<S> | StateToken<S>) => S\n\tset: <S>(state: StateToken<S>, newValue: S | ((oldValue: S) => S)) => void\n}\nexport type ReadonlyTransactors = Pick<Transactors, `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 TransactionOptions<ƒ extends ƒn> = {\n\tkey: string\n\tdo: Write<ƒ>\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 transaction__INTERNAL(options)\n}\n\nexport const runTransaction =\n\t<ƒ extends ƒn>(token: TransactionToken<ƒ>, store: Store = IMPLICIT.STORE) =>\n\t(...parameters: Parameters<ƒ>): ReturnType<ƒ> => {\n\t\tconst tx = withdraw(token, store)\n\t\tif (tx) {\n\t\t\treturn tx.run(...parameters)\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"]}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/atom.ts","../src/logger.ts","../src/selector.ts","../src/silo.ts","../src/subscribe.ts","../src/timeline.ts","../src/transaction.ts"],"names":["_a","createAtom","createAtomFamily","createMutableAtom","createMutableAtomFamily","createSelector","createSelectorFamily","IMPLICIT","redo__INTERNAL","timeline__INTERNAL","undo__INTERNAL","transaction__INTERNAL","withdraw"],"mappings":"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","sourcesContent":["import * as IO from \"atom.io/internal\"\nimport type { Store, Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nexport * from \"./atom\"\nexport * from \"./logger\"\nexport * from \"./selector\"\nexport * from \"./silo\"\nexport {\n\tsubscribe,\n\tsubscribeToTimeline,\n\tsubscribeToTransaction,\n\tKeyedStateUpdate,\n\tStateUpdate,\n\tUpdateHandler,\n} from \"./subscribe\"\nexport * from \"./timeline\"\nexport * from \"./transaction\"\n\nexport type ƒn = (...parameters: any[]) => any\n\nexport type AtomToken<_> = {\n\tkey: string\n\ttype: `atom`\n\tfamily?: FamilyMetadata\n\t__brand?: _\n}\nexport interface MutableAtomToken<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n> extends AtomToken<T> {\n\t__asJSON?: J\n\t__update?: T extends Transceiver<infer Update> ? Update : never\n}\nexport type SelectorToken<_> = {\n\tkey: string\n\ttype: `selector`\n\tfamily?: FamilyMetadata\n\t__brand?: _\n}\nexport type StateToken<T> = AtomToken<T> | SelectorToken<T>\n\nexport type ReadonlySelectorToken<_> = {\n\tkey: string\n\ttype: `readonly_selector`\n\tfamily?: FamilyMetadata\n\t__brand?: _\n}\n\nexport type FamilyMetadata = {\n\tkey: string\n\tsubKey: string\n}\n\nexport const capitalize = (str: string): string =>\n\tstr[0].toUpperCase() + str.slice(1)\n\nexport const getState = <T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\tstore: Store = IO.IMPLICIT.STORE,\n): T => {\n\tconst state =\n\t\tIO.withdraw(token, store) ?? IO.withdrawNewFamilyMember(token, store)\n\tif (state === null) {\n\t\tthrow new Error(\n\t\t\t`${capitalize(token.type)} \"${token.key}\" not found in store \"${\n\t\t\t\tstore.config.name\n\t\t\t}\".`,\n\t\t)\n\t}\n\treturn IO.getState__INTERNAL(state, store)\n}\n\nexport const setState = <T, New extends T>(\n\ttoken: StateToken<T>,\n\tvalue: New | ((oldValue: T) => New),\n\tstore: Store = IO.IMPLICIT.STORE,\n): void => {\n\ttry {\n\t\tIO.openOperation(token, store)\n\t} catch (thrown) {\n\t\tif (!(typeof thrown === `symbol`)) {\n\t\t\tthrow thrown\n\t\t}\n\t\treturn\n\t}\n\tconst state =\n\t\tIO.withdraw(token, store) ?? IO.withdrawNewFamilyMember(token, store)\n\tif (state === null) {\n\t\tthrow new Error(\n\t\t\t`${capitalize(token.type)} \"${token.key}\" not found in store \"${\n\t\t\t\tstore.config.name\n\t\t\t}\".`,\n\t\t)\n\t}\n\tIO.setState__INTERNAL(state, value, store)\n\tIO.closeOperation(store)\n}\n\nexport const isDefault = (\n\ttoken: ReadonlySelectorToken<unknown> | StateToken<unknown>,\n\tstore: Store = IO.IMPLICIT.STORE,\n): boolean =>\n\ttoken.type === `atom`\n\t\t? IO.isAtomDefault(token.key, store)\n\t\t: IO.isSelectorDefault(token.key, store)\n","import type { Subject, Transceiver } from \"atom.io/internal\"\nimport {\n\tcreateAtom,\n\tcreateAtomFamily,\n\tcreateMutableAtom,\n\tcreateMutableAtomFamily,\n} from \"atom.io/internal\"\nimport type { Json, JsonInterface } from \"atom.io/json\"\n\nimport type { AtomToken, MutableAtomToken } 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\n\nexport type AtomOptions<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<AtomOptions<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: AtomOptions<T>): AtomToken<T>\nexport function atom<T>(\n\toptions: AtomOptions<any> | MutableAtomOptions<any, any>,\n): AtomToken<any> {\n\tif (`mutable` in options) {\n\t\treturn createMutableAtom(options)\n\t}\n\treturn createAtom<T>(options)\n}\n\nexport type AtomFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tdefault: T | ((key: K) => T)\n\teffects?: (key: K) => AtomEffect<T>[]\n}\n\nexport type AtomFamily<T, K extends Json.Serializable = Json.Serializable> = ((\n\tkey: K,\n) => AtomToken<T>) & {\n\tkey: string\n\ttype: `atom_family`\n\tsubject: Subject<AtomToken<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& AtomFamilyOptions<T, K>\n\t& JsonInterface<T, J>\n\t& { mutable: true }\n\n// biome-ignore format: intersection\nexport type MutableAtomFamily<\n\tCore extends Transceiver<any>,\n\tSerializableCore extends Json.Serializable,\n\tKey extends Json.Serializable,\n> = \n\t& JsonInterface<Core, SerializableCore>\n\t& ((key: Key) => MutableAtomToken<Core, SerializableCore>) \n\t& {\n\t\t\tkey: `${string}::mutable`\n\t\t\ttype: `atom_family`\n\t\t\tsubject: Subject<MutableAtomToken<Core, SerializableCore>>\n\t\t}\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: AtomFamilyOptions<T, K>,\n): AtomFamily<T, K>\nexport function atomFamily<T, K extends Json.Serializable>(\n\toptions: AtomFamilyOptions<T, K> | MutableAtomFamilyOptions<any, any, any>,\n): AtomFamily<T, K> | MutableAtomFamily<any, any, any> {\n\tif (`mutable` in options) {\n\t\treturn createMutableAtomFamily(options)\n\t}\n\treturn createAtomFamily<T, K>(options)\n}\n","import { IMPLICIT } from \"atom.io/internal\"\nimport type { Store } from \"atom.io/internal\"\n\nexport const NO_OP = (): void => undefined\n\nexport type Logger = Pick<Console, `error` | `info` | `warn`>\nexport const LOG_LEVELS: ReadonlyArray<keyof Logger> = [\n\t`info`,\n\t`warn`,\n\t`error`,\n] as const\n\nexport const setLogLevel = (\n\tpreferredLevel: `error` | `info` | `warn` | null,\n\tstore: Store = IMPLICIT.STORE,\n): void => {\n\tconst { logger__INTERNAL } = store.config\n\tif (preferredLevel === null) {\n\t\tstore.config.logger = null\n\t} else {\n\t\tstore.config.logger = { ...console }\n\t\tLOG_LEVELS.forEach((logLevel) => {\n\t\t\tif (LOG_LEVELS.indexOf(logLevel) < LOG_LEVELS.indexOf(preferredLevel)) {\n\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: we just set it\n\t\t\t\tstore.config.logger![logLevel] = NO_OP\n\t\t\t} else {\n\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: we just set it\n\t\t\t\tstore.config.logger![logLevel] = logger__INTERNAL[logLevel]\n\t\t\t}\n\t\t})\n\t}\n}\n\nexport const useLogger = (\n\tlogger: Logger,\n\tstore: Store = IMPLICIT.STORE,\n): void => {\n\tconst currentLogLevel =\n\t\tstore.config.logger === null\n\t\t\t? null\n\t\t\t: LOG_LEVELS.find(\n\t\t\t\t\t(logLevel) => store.config.logger?.[logLevel] !== NO_OP,\n\t\t\t ) ?? null\n\tstore.config.logger__INTERNAL = { ...logger }\n\tsetLogLevel(currentLogLevel, store)\n}\n","import type { Subject } from \"atom.io/internal\"\nimport { createSelector, createSelectorFamily } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ReadonlySelectorToken, SelectorToken } from \".\"\nimport type { Read, Write } from \"./transaction\"\n\nexport type SelectorOptions<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>(options: SelectorOptions<T>): SelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T>,\n): ReadonlySelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T> | SelectorOptions<T>,\n): ReadonlySelectorToken<T> | SelectorToken<T> {\n\treturn createSelector(options)\n}\n\nexport type SelectorFamilyOptions<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 SelectorFamily<\n\tT,\n\tK extends Json.Serializable = Json.Serializable,\n> = ((key: K) => SelectorToken<T>) & {\n\tkey: string\n\ttype: `selector_family`\n\tsubject: Subject<SelectorToken<T>>\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}\n\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: SelectorFamilyOptions<T, K>,\n): SelectorFamily<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: ReadonlySelectorFamilyOptions<T, K> | SelectorFamilyOptions<T, K>,\n): ReadonlySelectorFamily<T, K> | SelectorFamily<T, K> {\n\treturn createSelectorFamily(options)\n}\n","import {\n\tStore,\n\tcreateAtom,\n\tcreateAtomFamily,\n\tcreateMutableAtom,\n\tcreateMutableAtomFamily,\n\tcreateSelector,\n\tcreateSelectorFamily,\n\tredo__INTERNAL,\n\ttimeline__INTERNAL,\n\ttransaction__INTERNAL,\n\tundo__INTERNAL,\n} from \"atom.io/internal\"\n\nimport type { redo, timeline, undo } from \".\"\nimport { getState, setState, 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\tthis.store = s\n\t\tthis.atom = (options) => {\n\t\t\tif (`mutable` in options) {\n\t\t\t\treturn createMutableAtom(options, s)\n\t\t\t}\n\t\t\treturn createAtom(options, undefined, s)\n\t\t}\n\t\tthis.atomFamily = (options) => {\n\t\t\tif (`mutable` in options) {\n\t\t\t\treturn createMutableAtomFamily(options, s) as any\n\t\t\t}\n\t\t\treturn createAtomFamily(options, s)\n\t\t}\n\t\tthis.selector = (options) => createSelector(options, undefined, s) as any\n\t\tthis.selectorFamily = (options) => createSelectorFamily(options, s) as any\n\t\tthis.transaction = (options) => transaction__INTERNAL(options, s)\n\t\tthis.timeline = (options) => timeline__INTERNAL(options, s)\n\t\tthis.getState = (token) => getState(token, s)\n\t\tthis.setState = (token, newValue) => setState(token, newValue, s)\n\t\tthis.subscribe = (token, handler, key) => subscribe(token, handler, key, s)\n\t\tthis.undo = (token) => undo__INTERNAL(token, s)\n\t\tthis.redo = (token) => redo__INTERNAL(token, s)\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, subscribeToRootAtoms, withdraw } from \"atom.io/internal\"\n\nimport type {\n\tFamilyMetadata,\n\tReadonlySelectorToken,\n\tStateToken,\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 function subscribe<T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\thandleUpdate: UpdateHandler<T>,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore: Store = IMPLICIT.STORE,\n): () => void {\n\tconst state = withdraw<T>(token, store)\n\tif (state === null) {\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.config.logger?.info(`👀 adding subscription \"${key}\" to \"${state.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.config.logger?.info(`🙈 unsubscribe from \"${state.key}\"`)\n\t\t\t\t\tunsubFunction()\n\t\t\t }\n\t\t\t: () => {\n\t\t\t\t\tstore.config.logger?.info(\n\t\t\t\t\t\t`🙈 unsubscribe from \"${state.key}\" and its dependencies`,\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\nexport type TransactionUpdateHandler<ƒ extends ƒn> = (\n\tdata: TransactionUpdate<ƒ>,\n) => void\n\nexport const subscribeToTransaction = <ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\thandleUpdate: TransactionUpdateHandler<ƒ>,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore = IMPLICIT.STORE,\n): (() => void) => {\n\tconst tx = withdraw(token, store)\n\tif (tx === null) {\n\t\tthrow new Error(\n\t\t\t`Cannot subscribe to transaction \"${token.key}\": transaction not found in store \"${store.config.name}\".`,\n\t\t)\n\t}\n\tstore.config.logger?.info(`👀 subscribe to transaction \"${token.key}\"`)\n\tconst unsubscribe = tx.subject.subscribe(key, handleUpdate)\n\treturn () => {\n\t\tstore.config.logger?.info(`🙈 unsubscribe from transaction \"${token.key}\"`)\n\t\tunsubscribe()\n\t}\n}\n\nexport const subscribeToTimeline = (\n\ttoken: TimelineToken,\n\thandleUpdate: (update: TimelineUpdate | `redo` | `undo`) => void,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore = IMPLICIT.STORE,\n): (() => void) => {\n\tconst tl = withdraw(token, store)\n\tif (tl === null) {\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.config.logger?.info(`👀 subscribe to timeline \"${token.key}\"`)\n\tconst unsubscribe = tl.subject.subscribe(key, handleUpdate)\n\treturn () => {\n\t\tstore.config.logger?.info(`🙈 unsubscribe from timeline \"${token.key}\"`)\n\t\tunsubscribe()\n\t}\n}\n","import type {\n\tTimelineAtomUpdate,\n\tTimelineSelectorUpdate,\n\tTimelineTransactionUpdate,\n} from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tredo__INTERNAL,\n\ttimeline__INTERNAL,\n\tundo__INTERNAL,\n} 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}\n\nexport type TimelineUpdate =\n\t| TimelineAtomUpdate\n\t| TimelineSelectorUpdate\n\t| TimelineTransactionUpdate\n\nexport const timeline = (options: TimelineOptions): TimelineToken => {\n\treturn timeline__INTERNAL(options)\n}\n\nexport const redo = (token: TimelineToken): void => {\n\tredo__INTERNAL(token, IMPLICIT.STORE)\n}\n\nexport const undo = (token: TimelineToken): void => {\n\tundo__INTERNAL(token, IMPLICIT.STORE)\n}\n","import type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, transaction__INTERNAL, withdraw } from \"atom.io/internal\"\n\nimport type { KeyedStateUpdate, ReadonlySelectorToken, StateToken, ƒn } from \".\"\n\nexport type TransactionToken<_> = {\n\tkey: string\n\ttype: `transaction`\n\t__brand?: _\n}\n\nexport type TransactionUpdate<ƒ extends ƒn> = {\n\tkey: string\n\tatomUpdates: KeyedStateUpdate<unknown>[]\n\tparams: Parameters<ƒ>\n\toutput: ReturnType<ƒ>\n}\n\nexport type Transactors = {\n\tget: <S>(state: ReadonlySelectorToken<S> | StateToken<S>) => S\n\tset: <S>(state: StateToken<S>, newValue: S | ((oldValue: S) => S)) => void\n}\nexport type ReadonlyTransactors = Pick<Transactors, `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 TransactionOptions<ƒ extends ƒn> = {\n\tkey: string\n\tdo: Write<ƒ>\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 transaction__INTERNAL(options)\n}\n\nexport const runTransaction =\n\t<ƒ extends ƒn>(token: TransactionToken<ƒ>, store: Store = IMPLICIT.STORE) =>\n\t(...parameters: Parameters<ƒ>): ReturnType<ƒ> => {\n\t\tconst tx = withdraw(token, store)\n\t\tif (tx) {\n\t\t\treturn tx.run(...parameters)\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/atom.ts","../src/logger.ts","../src/selector.ts","../src/silo.ts","../src/subscribe.ts","../src/timeline.ts","../src/transaction.ts"],"names":["_a","createAtom","createAtomFamily","createMutableAtom","createMutableAtomFamily","createSelector","createSelectorFamily","IMPLICIT","redo__INTERNAL","timeline__INTERNAL","undo__INTERNAL","transaction__INTERNAL","withdraw"],"mappings":"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","sourcesContent":["import * as IO from \"atom.io/internal\"\nimport type { Store, Transceiver } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nexport * from \"./atom\"\nexport * from \"./logger\"\nexport * from \"./selector\"\nexport * from \"./silo\"\nexport { subscribe } from \"./subscribe\"\nexport * from \"./subscribe\"\nexport * from \"./timeline\"\nexport * from \"./transaction\"\n\nexport type ƒn = (...parameters: any[]) => any\n\nexport type AtomToken<_> = {\n\tkey: string\n\ttype: `atom`\n\tfamily?: FamilyMetadata\n\t__brand?: _\n}\nexport interface MutableAtomToken<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n> extends AtomToken<T> {\n\t__asJSON?: J\n\t__update?: T extends Transceiver<infer Update> ? Update : never\n}\nexport type SelectorToken<_> = {\n\tkey: string\n\ttype: `selector`\n\tfamily?: FamilyMetadata\n\t__brand?: _\n}\nexport type StateToken<T> = AtomToken<T> | SelectorToken<T>\n\nexport type ReadonlySelectorToken<_> = {\n\tkey: string\n\ttype: `readonly_selector`\n\tfamily?: FamilyMetadata\n\t__brand?: _\n}\n\nexport type FamilyMetadata = {\n\tkey: string\n\tsubKey: string\n}\n\nexport const capitalize = (str: string): string =>\n\tstr[0].toUpperCase() + str.slice(1)\n\nexport const getState = <T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\tstore: Store = IO.IMPLICIT.STORE,\n): T => {\n\tconst state =\n\t\tIO.withdraw(token, store) ?? IO.withdrawNewFamilyMember(token, store)\n\tif (state === null) {\n\t\tthrow new Error(\n\t\t\t`${capitalize(token.type)} \"${token.key}\" not found in store \"${\n\t\t\t\tstore.config.name\n\t\t\t}\".`,\n\t\t)\n\t}\n\treturn IO.getState__INTERNAL(state, store)\n}\n\nexport const setState = <T, New extends T>(\n\ttoken: StateToken<T>,\n\tvalue: New | ((oldValue: T) => New),\n\tstore: Store = IO.IMPLICIT.STORE,\n): void => {\n\ttry {\n\t\tIO.openOperation(token, store)\n\t} catch (thrown) {\n\t\tif (!(typeof thrown === `symbol`)) {\n\t\t\tthrow thrown\n\t\t}\n\t\treturn\n\t}\n\tconst state =\n\t\tIO.withdraw(token, store) ?? IO.withdrawNewFamilyMember(token, store)\n\tif (state === null) {\n\t\tthrow new Error(\n\t\t\t`${capitalize(token.type)} \"${token.key}\" not found in store \"${\n\t\t\t\tstore.config.name\n\t\t\t}\".`,\n\t\t)\n\t}\n\tIO.setState__INTERNAL(state, value, store)\n\tIO.closeOperation(store)\n}\n\nexport const isDefault = (\n\ttoken: ReadonlySelectorToken<unknown> | StateToken<unknown>,\n\tstore: Store = IO.IMPLICIT.STORE,\n): boolean =>\n\ttoken.type === `atom`\n\t\t? IO.isAtomDefault(token.key, store)\n\t\t: IO.isSelectorDefault(token.key, store)\n","import type { Subject, Transceiver } from \"atom.io/internal\"\nimport {\n\tcreateAtom,\n\tcreateAtomFamily,\n\tcreateMutableAtom,\n\tcreateMutableAtomFamily,\n} from \"atom.io/internal\"\nimport type { Json, JsonInterface } from \"atom.io/json\"\n\nimport type { AtomToken, MutableAtomToken } 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\n\nexport type AtomOptions<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<AtomOptions<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: AtomOptions<T>): AtomToken<T>\nexport function atom<T>(\n\toptions: AtomOptions<any> | MutableAtomOptions<any, any>,\n): AtomToken<any> {\n\tif (`mutable` in options) {\n\t\treturn createMutableAtom(options)\n\t}\n\treturn createAtom<T>(options)\n}\n\nexport type AtomFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tdefault: T | ((key: K) => T)\n\teffects?: (key: K) => AtomEffect<T>[]\n}\n\nexport type AtomFamily<T, K extends Json.Serializable = Json.Serializable> = ((\n\tkey: K,\n) => AtomToken<T>) & {\n\tkey: string\n\ttype: `atom_family`\n\tsubject: Subject<AtomToken<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& AtomFamilyOptions<T, K>\n\t& JsonInterface<T, J>\n\t& { mutable: true }\n\n// biome-ignore format: intersection\nexport type MutableAtomFamily<\n\tCore extends Transceiver<any>,\n\tSerializableCore extends Json.Serializable,\n\tKey extends Json.Serializable,\n> = \n\t& JsonInterface<Core, SerializableCore>\n\t& ((key: Key) => MutableAtomToken<Core, SerializableCore>) \n\t& {\n\t\t\tkey: `${string}::mutable`\n\t\t\ttype: `atom_family`\n\t\t\tsubject: Subject<MutableAtomToken<Core, SerializableCore>>\n\t\t}\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: AtomFamilyOptions<T, K>,\n): AtomFamily<T, K>\nexport function atomFamily<T, K extends Json.Serializable>(\n\toptions: AtomFamilyOptions<T, K> | MutableAtomFamilyOptions<any, any, any>,\n): AtomFamily<T, K> | MutableAtomFamily<any, any, any> {\n\tif (`mutable` in options) {\n\t\treturn createMutableAtomFamily(options)\n\t}\n\treturn createAtomFamily<T, K>(options)\n}\n","import { IMPLICIT } from \"atom.io/internal\"\nimport type { Store } from \"atom.io/internal\"\n\nexport const NO_OP = (): void => undefined\n\nexport type Logger = Pick<Console, `error` | `info` | `warn`>\nexport const LOG_LEVELS: ReadonlyArray<keyof Logger> = [\n\t`info`,\n\t`warn`,\n\t`error`,\n] as const\n\nexport const setLogLevel = (\n\tpreferredLevel: `error` | `info` | `warn` | null,\n\tstore: Store = IMPLICIT.STORE,\n): void => {\n\tconst { logger__INTERNAL } = store.config\n\tif (preferredLevel === null) {\n\t\tstore.config.logger = null\n\t} else {\n\t\tstore.config.logger = { ...console }\n\t\tLOG_LEVELS.forEach((logLevel) => {\n\t\t\tif (LOG_LEVELS.indexOf(logLevel) < LOG_LEVELS.indexOf(preferredLevel)) {\n\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: we just set it\n\t\t\t\tstore.config.logger![logLevel] = NO_OP\n\t\t\t} else {\n\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: we just set it\n\t\t\t\tstore.config.logger![logLevel] = logger__INTERNAL[logLevel]\n\t\t\t}\n\t\t})\n\t}\n}\n\nexport const useLogger = (\n\tlogger: Logger,\n\tstore: Store = IMPLICIT.STORE,\n): void => {\n\tconst currentLogLevel =\n\t\tstore.config.logger === null\n\t\t\t? null\n\t\t\t: LOG_LEVELS.find(\n\t\t\t\t\t(logLevel) => store.config.logger?.[logLevel] !== NO_OP,\n\t\t\t ) ?? null\n\tstore.config.logger__INTERNAL = { ...logger }\n\tsetLogLevel(currentLogLevel, store)\n}\n","import type { Subject } from \"atom.io/internal\"\nimport { createSelector, createSelectorFamily } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ReadonlySelectorToken, SelectorToken } from \".\"\nimport type { Read, Write } from \"./transaction\"\n\nexport type SelectorOptions<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>(options: SelectorOptions<T>): SelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T>,\n): ReadonlySelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T> | SelectorOptions<T>,\n): ReadonlySelectorToken<T> | SelectorToken<T> {\n\treturn createSelector(options)\n}\n\nexport type SelectorFamilyOptions<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 SelectorFamily<\n\tT,\n\tK extends Json.Serializable = Json.Serializable,\n> = ((key: K) => SelectorToken<T>) & {\n\tkey: string\n\ttype: `selector_family`\n\tsubject: Subject<SelectorToken<T>>\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}\n\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: SelectorFamilyOptions<T, K>,\n): SelectorFamily<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: ReadonlySelectorFamilyOptions<T, K> | SelectorFamilyOptions<T, K>,\n): ReadonlySelectorFamily<T, K> | SelectorFamily<T, K> {\n\treturn createSelectorFamily(options)\n}\n","import {\n\tStore,\n\tcreateAtom,\n\tcreateAtomFamily,\n\tcreateMutableAtom,\n\tcreateMutableAtomFamily,\n\tcreateSelector,\n\tcreateSelectorFamily,\n\tredo__INTERNAL,\n\ttimeline__INTERNAL,\n\ttransaction__INTERNAL,\n\tundo__INTERNAL,\n} from \"atom.io/internal\"\n\nimport type { redo, timeline, undo } from \".\"\nimport { getState, setState, 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\tthis.store = s\n\t\tthis.atom = (options) => {\n\t\t\tif (`mutable` in options) {\n\t\t\t\treturn createMutableAtom(options, s)\n\t\t\t}\n\t\t\treturn createAtom(options, undefined, s)\n\t\t}\n\t\tthis.atomFamily = (options) => {\n\t\t\tif (`mutable` in options) {\n\t\t\t\treturn createMutableAtomFamily(options, s) as any\n\t\t\t}\n\t\t\treturn createAtomFamily(options, s)\n\t\t}\n\t\tthis.selector = (options) => createSelector(options, undefined, s) as any\n\t\tthis.selectorFamily = (options) => createSelectorFamily(options, s) as any\n\t\tthis.transaction = (options) => transaction__INTERNAL(options, s)\n\t\tthis.timeline = (options) => timeline__INTERNAL(options, s)\n\t\tthis.getState = (token) => getState(token, s)\n\t\tthis.setState = (token, newValue) => setState(token, newValue, s)\n\t\tthis.subscribe = (token, handler, key) => subscribe(token, handler, key, s)\n\t\tthis.undo = (token) => undo__INTERNAL(token, s)\n\t\tthis.redo = (token) => redo__INTERNAL(token, s)\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, subscribeToRootAtoms, withdraw } from \"atom.io/internal\"\n\nimport type {\n\tFamilyMetadata,\n\tReadonlySelectorToken,\n\tStateToken,\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 function subscribe<T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\thandleUpdate: UpdateHandler<T>,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore: Store = IMPLICIT.STORE,\n): () => void {\n\tconst state = withdraw<T>(token, store)\n\tif (state === null) {\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.config.logger?.info(`👀 adding subscription \"${key}\" to \"${state.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.config.logger?.info(`🙈 unsubscribe from \"${state.key}\"`)\n\t\t\t\t\tunsubFunction()\n\t\t\t }\n\t\t\t: () => {\n\t\t\t\t\tstore.config.logger?.info(\n\t\t\t\t\t\t`🙈 unsubscribe from \"${state.key}\" and its dependencies`,\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\nexport type TransactionUpdateHandler<ƒ extends ƒn> = (\n\tdata: TransactionUpdate<ƒ>,\n) => void\n\nexport const subscribeToTransaction = <ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\thandleUpdate: TransactionUpdateHandler<ƒ>,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore = IMPLICIT.STORE,\n): (() => void) => {\n\tconst tx = withdraw(token, store)\n\tif (tx === null) {\n\t\tthrow new Error(\n\t\t\t`Cannot subscribe to transaction \"${token.key}\": transaction not found in store \"${store.config.name}\".`,\n\t\t)\n\t}\n\tstore.config.logger?.info(`👀 subscribe to transaction \"${token.key}\"`)\n\tconst unsubscribe = tx.subject.subscribe(key, handleUpdate)\n\treturn () => {\n\t\tstore.config.logger?.info(`🙈 unsubscribe from transaction \"${token.key}\"`)\n\t\tunsubscribe()\n\t}\n}\n\nexport const subscribeToTimeline = (\n\ttoken: TimelineToken,\n\thandleUpdate: (update: TimelineUpdate | `redo` | `undo`) => void,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore = IMPLICIT.STORE,\n): (() => void) => {\n\tconst tl = withdraw(token, store)\n\tif (tl === null) {\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.config.logger?.info(`👀 subscribe to timeline \"${token.key}\"`)\n\tconst unsubscribe = tl.subject.subscribe(key, handleUpdate)\n\treturn () => {\n\t\tstore.config.logger?.info(`🙈 unsubscribe from timeline \"${token.key}\"`)\n\t\tunsubscribe()\n\t}\n}\n","import type {\n\tTimelineAtomUpdate,\n\tTimelineSelectorUpdate,\n\tTimelineTransactionUpdate,\n} from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tredo__INTERNAL,\n\ttimeline__INTERNAL,\n\tundo__INTERNAL,\n} 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}\n\nexport type TimelineUpdate =\n\t| TimelineAtomUpdate\n\t| TimelineSelectorUpdate\n\t| TimelineTransactionUpdate\n\nexport const timeline = (options: TimelineOptions): TimelineToken => {\n\treturn timeline__INTERNAL(options)\n}\n\nexport const redo = (token: TimelineToken): void => {\n\tredo__INTERNAL(token, IMPLICIT.STORE)\n}\n\nexport const undo = (token: TimelineToken): void => {\n\tundo__INTERNAL(token, IMPLICIT.STORE)\n}\n","import type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, transaction__INTERNAL, withdraw } from \"atom.io/internal\"\n\nimport type { KeyedStateUpdate, ReadonlySelectorToken, StateToken, ƒn } from \".\"\n\nexport type TransactionToken<_> = {\n\tkey: string\n\ttype: `transaction`\n\t__brand?: _\n}\n\nexport type TransactionUpdate<ƒ extends ƒn> = {\n\tkey: string\n\tatomUpdates: KeyedStateUpdate<unknown>[]\n\tparams: Parameters<ƒ>\n\toutput: ReturnType<ƒ>\n}\n\nexport type Transactors = {\n\tget: <S>(state: ReadonlySelectorToken<S> | StateToken<S>) => S\n\tset: <S>(state: StateToken<S>, newValue: S | ((oldValue: S) => S)) => void\n}\nexport type ReadonlyTransactors = Pick<Transactors, `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 TransactionOptions<ƒ extends ƒn> = {\n\tkey: string\n\tdo: Write<ƒ>\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 transaction__INTERNAL(options)\n}\n\nexport const runTransaction =\n\t<ƒ extends ƒn>(token: TransactionToken<ƒ>, store: Store = IMPLICIT.STORE) =>\n\t(...parameters: Parameters<ƒ>): ReturnType<ƒ> => {\n\t\tconst tx = withdraw(token, store)\n\t\tif (tx) {\n\t\t\treturn tx.run(...parameters)\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"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as AtomIO from 'atom.io';
|
|
2
|
-
import { AtomToken, ReadonlySelectorToken, SelectorToken, Transactors, FamilyMetadata, SelectorOptions, ReadonlySelectorOptions, StateToken, ƒn, TransactionUpdate, TransactionOptions, TransactionToken, MutableAtomToken, StateUpdate, TimelineUpdate, TimelineOptions, TimelineToken, AtomFamily, ReadonlySelectorFamily, SelectorFamily, Logger, AtomOptions, MutableAtomOptions, AtomFamilyOptions, ReadonlySelectorFamilyOptions, SelectorFamilyOptions } from 'atom.io';
|
|
2
|
+
import { AtomToken, ReadonlySelectorToken, SelectorToken, Transactors, FamilyMetadata, SelectorOptions, ReadonlySelectorOptions, StateToken, ƒn, TransactionUpdate, TransactionOptions, TransactionToken, MutableAtomToken, StateUpdate as StateUpdate$1, TimelineUpdate, TimelineOptions, TimelineToken, AtomFamily, ReadonlySelectorFamily, SelectorFamily, Logger, AtomOptions, MutableAtomOptions, AtomFamilyOptions, ReadonlySelectorFamilyOptions, SelectorFamilyOptions } from 'atom.io';
|
|
3
3
|
import { Json } from 'atom.io/json';
|
|
4
4
|
|
|
5
5
|
declare const lookupSelectorSources: (key: string, store: Store) => (AtomToken<unknown> | ReadonlySelectorToken<unknown> | SelectorToken<unknown>)[];
|
|
@@ -210,7 +210,7 @@ declare const closeOperation: (store: Store) => void;
|
|
|
210
210
|
declare const isDone: (key: string, store?: Store) => boolean;
|
|
211
211
|
declare const markDone: (key: string, store?: Store) => void;
|
|
212
212
|
|
|
213
|
-
type TimelineAtomUpdate = StateUpdate<unknown> & {
|
|
213
|
+
type TimelineAtomUpdate = StateUpdate$1<unknown> & {
|
|
214
214
|
key: string;
|
|
215
215
|
type: `atom_update`;
|
|
216
216
|
timestamp: number;
|
|
@@ -319,7 +319,12 @@ declare const markAtomAsDefault: (key: string, store?: Store) => void;
|
|
|
319
319
|
declare const markAtomAsNotDefault: (key: string, store?: Store) => void;
|
|
320
320
|
declare const isSelectorDefault: (key: string, store?: Store) => boolean;
|
|
321
321
|
|
|
322
|
-
|
|
322
|
+
type StateUpdate<T> = {
|
|
323
|
+
newValue: T;
|
|
324
|
+
oldValue: T;
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
declare const cacheValue: (key: string, value: unknown, subject: Subject<StateUpdate<unknown>>, store?: Store) => void;
|
|
323
328
|
declare const readCachedValue: <T>(key: string, store?: Store) => T;
|
|
324
329
|
declare const isValueCached: (key: string, store?: Store) => boolean;
|
|
325
330
|
|
|
@@ -330,6 +335,23 @@ declare function createReadonlySelectorFamily<T, K extends Json.Serializable>(op
|
|
|
330
335
|
declare function createSelectorFamily<T, K extends Json.Serializable>(options: SelectorFamilyOptions<T, K>, store?: Store): SelectorFamily<T, K>;
|
|
331
336
|
declare function createSelectorFamily<T, K extends Json.Serializable>(options: ReadonlySelectorFamilyOptions<T, K>, store?: Store): ReadonlySelectorFamily<T, K>;
|
|
332
337
|
|
|
338
|
+
type Eventual<T> = Promise<T> | T;
|
|
339
|
+
type Fated<T, E extends Error = Error> = Eventual<E | T>;
|
|
340
|
+
/**
|
|
341
|
+
* A Promise that can be canceled.
|
|
342
|
+
* @internal
|
|
343
|
+
* @private
|
|
344
|
+
* @typeParam T The type of the value that the promise will resolve to.
|
|
345
|
+
*
|
|
346
|
+
* @remarks
|
|
347
|
+
* Can be constructed like a Promise, or from an existing Promise.
|
|
348
|
+
*/
|
|
349
|
+
declare class Future<T> extends Promise<T> {
|
|
350
|
+
private isCanceled;
|
|
351
|
+
constructor(executor: Promise<T> | ((resolve: (value: T) => void, reject: (reason?: any) => void) => void));
|
|
352
|
+
cancel(): void;
|
|
353
|
+
}
|
|
354
|
+
|
|
333
355
|
declare const getState__INTERNAL: <T>(state: Atom<T> | ReadonlySelector<T> | Selector<T>, store?: Store) => T;
|
|
334
356
|
|
|
335
357
|
type Modify<T> = (thing: T) => T;
|
|
@@ -339,4 +361,4 @@ declare const setState__INTERNAL: <T>(state: Atom<T> | Selector<T>, value: T | (
|
|
|
339
361
|
|
|
340
362
|
declare const subscribeToRootAtoms: <T>(state: ReadonlySelector<T> | Selector<T>, store: Store) => (() => void)[] | null;
|
|
341
363
|
|
|
342
|
-
export { Atom, FamilyTracker, IMPLICIT, Modify, MutableAtom, OperationProgress, ReadonlySelector, Selector, Signal, Store, StoreCore, Subject, TRANSACTION_PHASES, Timeline, TimelineAtomUpdate, TimelineSelectorUpdate, TimelineTransactionUpdate, Tracker, Transaction, TransactionIdle, TransactionPhase, TransactionStatus, TransactionUpdateInProgress, Transceiver, TransceiverMode, abortTransaction, addAtomToTimeline, applyTransaction, become, buildTransaction, cacheValue, clearStore, closeOperation, createAtom, createAtomFamily, createMutableAtom, createMutableAtomFamily, createReadonlySelectorFamily, createSelector, createSelectorFamily, deleteAtom, deposit, getJsonToken, getState__INTERNAL, getUpdateToken, isAtomDefault, isAtomMutable, isAtomTokenMutable, isDone, isSelectorDefault, isTransceiver, isValueCached, lookup, lookupSelectorSources, markAtomAsDefault, markAtomAsNotDefault, markDone, openOperation, readCachedValue, redoTransactionUpdate, redo__INTERNAL, registerSelector, setState__INTERNAL, subscribeToRootAtoms, target, timeline__INTERNAL, traceAllSelectorAtoms, traceSelectorAtoms, transaction__INTERNAL, undoTransactionUpdate, undo__INTERNAL, updateSelectorAtoms, withdraw, withdrawNewFamilyMember };
|
|
364
|
+
export { Atom, Eventual, FamilyTracker, Fated, Future, IMPLICIT, Modify, MutableAtom, OperationProgress, ReadonlySelector, Selector, Signal, Store, StoreCore, Subject, TRANSACTION_PHASES, Timeline, TimelineAtomUpdate, TimelineSelectorUpdate, TimelineTransactionUpdate, Tracker, Transaction, TransactionIdle, TransactionPhase, TransactionStatus, TransactionUpdateInProgress, Transceiver, TransceiverMode, abortTransaction, addAtomToTimeline, applyTransaction, become, buildTransaction, cacheValue, clearStore, closeOperation, createAtom, createAtomFamily, createMutableAtom, createMutableAtomFamily, createReadonlySelectorFamily, createSelector, createSelectorFamily, deleteAtom, deposit, getJsonToken, getState__INTERNAL, getUpdateToken, isAtomDefault, isAtomMutable, isAtomTokenMutable, isDone, isSelectorDefault, isTransceiver, isValueCached, lookup, lookupSelectorSources, markAtomAsDefault, markAtomAsNotDefault, markDone, openOperation, readCachedValue, redoTransactionUpdate, redo__INTERNAL, registerSelector, setState__INTERNAL, subscribeToRootAtoms, target, timeline__INTERNAL, traceAllSelectorAtoms, traceSelectorAtoms, transaction__INTERNAL, undoTransactionUpdate, undo__INTERNAL, updateSelectorAtoms, withdraw, withdrawNewFamilyMember };
|
package/internal/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as AtomIO from 'atom.io';
|
|
2
|
-
import { AtomToken, ReadonlySelectorToken, SelectorToken, Transactors, FamilyMetadata, SelectorOptions, ReadonlySelectorOptions, StateToken, ƒn, TransactionUpdate, TransactionOptions, TransactionToken, MutableAtomToken, StateUpdate, TimelineUpdate, TimelineOptions, TimelineToken, AtomFamily, ReadonlySelectorFamily, SelectorFamily, Logger, AtomOptions, MutableAtomOptions, AtomFamilyOptions, ReadonlySelectorFamilyOptions, SelectorFamilyOptions } from 'atom.io';
|
|
2
|
+
import { AtomToken, ReadonlySelectorToken, SelectorToken, Transactors, FamilyMetadata, SelectorOptions, ReadonlySelectorOptions, StateToken, ƒn, TransactionUpdate, TransactionOptions, TransactionToken, MutableAtomToken, StateUpdate as StateUpdate$1, TimelineUpdate, TimelineOptions, TimelineToken, AtomFamily, ReadonlySelectorFamily, SelectorFamily, Logger, AtomOptions, MutableAtomOptions, AtomFamilyOptions, ReadonlySelectorFamilyOptions, SelectorFamilyOptions } from 'atom.io';
|
|
3
3
|
import { Json } from 'atom.io/json';
|
|
4
4
|
|
|
5
5
|
declare const lookupSelectorSources: (key: string, store: Store) => (AtomToken<unknown> | ReadonlySelectorToken<unknown> | SelectorToken<unknown>)[];
|
|
@@ -210,7 +210,7 @@ declare const closeOperation: (store: Store) => void;
|
|
|
210
210
|
declare const isDone: (key: string, store?: Store) => boolean;
|
|
211
211
|
declare const markDone: (key: string, store?: Store) => void;
|
|
212
212
|
|
|
213
|
-
type TimelineAtomUpdate = StateUpdate<unknown> & {
|
|
213
|
+
type TimelineAtomUpdate = StateUpdate$1<unknown> & {
|
|
214
214
|
key: string;
|
|
215
215
|
type: `atom_update`;
|
|
216
216
|
timestamp: number;
|
|
@@ -319,7 +319,12 @@ declare const markAtomAsDefault: (key: string, store?: Store) => void;
|
|
|
319
319
|
declare const markAtomAsNotDefault: (key: string, store?: Store) => void;
|
|
320
320
|
declare const isSelectorDefault: (key: string, store?: Store) => boolean;
|
|
321
321
|
|
|
322
|
-
|
|
322
|
+
type StateUpdate<T> = {
|
|
323
|
+
newValue: T;
|
|
324
|
+
oldValue: T;
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
declare const cacheValue: (key: string, value: unknown, subject: Subject<StateUpdate<unknown>>, store?: Store) => void;
|
|
323
328
|
declare const readCachedValue: <T>(key: string, store?: Store) => T;
|
|
324
329
|
declare const isValueCached: (key: string, store?: Store) => boolean;
|
|
325
330
|
|
|
@@ -330,6 +335,23 @@ declare function createReadonlySelectorFamily<T, K extends Json.Serializable>(op
|
|
|
330
335
|
declare function createSelectorFamily<T, K extends Json.Serializable>(options: SelectorFamilyOptions<T, K>, store?: Store): SelectorFamily<T, K>;
|
|
331
336
|
declare function createSelectorFamily<T, K extends Json.Serializable>(options: ReadonlySelectorFamilyOptions<T, K>, store?: Store): ReadonlySelectorFamily<T, K>;
|
|
332
337
|
|
|
338
|
+
type Eventual<T> = Promise<T> | T;
|
|
339
|
+
type Fated<T, E extends Error = Error> = Eventual<E | T>;
|
|
340
|
+
/**
|
|
341
|
+
* A Promise that can be canceled.
|
|
342
|
+
* @internal
|
|
343
|
+
* @private
|
|
344
|
+
* @typeParam T The type of the value that the promise will resolve to.
|
|
345
|
+
*
|
|
346
|
+
* @remarks
|
|
347
|
+
* Can be constructed like a Promise, or from an existing Promise.
|
|
348
|
+
*/
|
|
349
|
+
declare class Future<T> extends Promise<T> {
|
|
350
|
+
private isCanceled;
|
|
351
|
+
constructor(executor: Promise<T> | ((resolve: (value: T) => void, reject: (reason?: any) => void) => void));
|
|
352
|
+
cancel(): void;
|
|
353
|
+
}
|
|
354
|
+
|
|
333
355
|
declare const getState__INTERNAL: <T>(state: Atom<T> | ReadonlySelector<T> | Selector<T>, store?: Store) => T;
|
|
334
356
|
|
|
335
357
|
type Modify<T> = (thing: T) => T;
|
|
@@ -339,4 +361,4 @@ declare const setState__INTERNAL: <T>(state: Atom<T> | Selector<T>, value: T | (
|
|
|
339
361
|
|
|
340
362
|
declare const subscribeToRootAtoms: <T>(state: ReadonlySelector<T> | Selector<T>, store: Store) => (() => void)[] | null;
|
|
341
363
|
|
|
342
|
-
export { Atom, FamilyTracker, IMPLICIT, Modify, MutableAtom, OperationProgress, ReadonlySelector, Selector, Signal, Store, StoreCore, Subject, TRANSACTION_PHASES, Timeline, TimelineAtomUpdate, TimelineSelectorUpdate, TimelineTransactionUpdate, Tracker, Transaction, TransactionIdle, TransactionPhase, TransactionStatus, TransactionUpdateInProgress, Transceiver, TransceiverMode, abortTransaction, addAtomToTimeline, applyTransaction, become, buildTransaction, cacheValue, clearStore, closeOperation, createAtom, createAtomFamily, createMutableAtom, createMutableAtomFamily, createReadonlySelectorFamily, createSelector, createSelectorFamily, deleteAtom, deposit, getJsonToken, getState__INTERNAL, getUpdateToken, isAtomDefault, isAtomMutable, isAtomTokenMutable, isDone, isSelectorDefault, isTransceiver, isValueCached, lookup, lookupSelectorSources, markAtomAsDefault, markAtomAsNotDefault, markDone, openOperation, readCachedValue, redoTransactionUpdate, redo__INTERNAL, registerSelector, setState__INTERNAL, subscribeToRootAtoms, target, timeline__INTERNAL, traceAllSelectorAtoms, traceSelectorAtoms, transaction__INTERNAL, undoTransactionUpdate, undo__INTERNAL, updateSelectorAtoms, withdraw, withdrawNewFamilyMember };
|
|
364
|
+
export { Atom, Eventual, FamilyTracker, Fated, Future, IMPLICIT, Modify, MutableAtom, OperationProgress, ReadonlySelector, Selector, Signal, Store, StoreCore, Subject, TRANSACTION_PHASES, Timeline, TimelineAtomUpdate, TimelineSelectorUpdate, TimelineTransactionUpdate, Tracker, Transaction, TransactionIdle, TransactionPhase, TransactionStatus, TransactionUpdateInProgress, Transceiver, TransceiverMode, abortTransaction, addAtomToTimeline, applyTransaction, become, buildTransaction, cacheValue, clearStore, closeOperation, createAtom, createAtomFamily, createMutableAtom, createMutableAtomFamily, createReadonlySelectorFamily, createSelector, createSelectorFamily, deleteAtom, deposit, getJsonToken, getState__INTERNAL, getUpdateToken, isAtomDefault, isAtomMutable, isAtomTokenMutable, isDone, isSelectorDefault, isTransceiver, isValueCached, lookup, lookupSelectorSources, markAtomAsDefault, markAtomAsNotDefault, markDone, openOperation, readCachedValue, redoTransactionUpdate, redo__INTERNAL, registerSelector, setState__INTERNAL, subscribeToRootAtoms, target, timeline__INTERNAL, traceAllSelectorAtoms, traceSelectorAtoms, transaction__INTERNAL, undoTransactionUpdate, undo__INTERNAL, updateSelectorAtoms, withdraw, withdrawNewFamilyMember };
|
package/internal/dist/index.js
CHANGED
|
@@ -43,6 +43,25 @@ var __spreadValues = (a, b) => {
|
|
|
43
43
|
};
|
|
44
44
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
45
45
|
|
|
46
|
+
// src/future.ts
|
|
47
|
+
var Future = class extends Promise {
|
|
48
|
+
constructor(executor) {
|
|
49
|
+
super((resolve, reject) => {
|
|
50
|
+
const pass = (value) => this.isCanceled ? reject(`canceled`) : resolve(value);
|
|
51
|
+
const fail = (reason) => this.isCanceled ? reject(`canceled`) : reject(reason);
|
|
52
|
+
if (typeof executor === `function`) {
|
|
53
|
+
executor(pass, fail);
|
|
54
|
+
} else {
|
|
55
|
+
executor.then(pass, fail);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
this.isCanceled = false;
|
|
59
|
+
}
|
|
60
|
+
cancel() {
|
|
61
|
+
this.isCanceled = true;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
46
65
|
// src/store/deposit.ts
|
|
47
66
|
function deposit(state) {
|
|
48
67
|
const token = {
|
|
@@ -900,8 +919,21 @@ function withdrawNewFamilyMember(token, store) {
|
|
|
900
919
|
}
|
|
901
920
|
|
|
902
921
|
// src/caching.ts
|
|
903
|
-
var cacheValue = (key, value, store = IMPLICIT.STORE) => {
|
|
904
|
-
target(store).valueMap.
|
|
922
|
+
var cacheValue = (key, value, subject, store = IMPLICIT.STORE) => {
|
|
923
|
+
const currentValue = target(store).valueMap.get(key);
|
|
924
|
+
if (currentValue instanceof Future) {
|
|
925
|
+
currentValue.cancel();
|
|
926
|
+
}
|
|
927
|
+
if (value instanceof Promise) {
|
|
928
|
+
const future = new Future(value);
|
|
929
|
+
target(store).valueMap.set(key, future);
|
|
930
|
+
future.then((value2) => {
|
|
931
|
+
cacheValue(key, value2, subject, store);
|
|
932
|
+
subject.next({ newValue: value2, oldValue: value2 });
|
|
933
|
+
});
|
|
934
|
+
} else {
|
|
935
|
+
target(store).valueMap.set(key, value);
|
|
936
|
+
}
|
|
905
937
|
};
|
|
906
938
|
var readCachedValue = (key, store = IMPLICIT.STORE) => target(store).valueMap.get(key);
|
|
907
939
|
var isValueCached = (key, store = IMPLICIT.STORE) => target(store).valueMap.has(key);
|
|
@@ -1303,7 +1335,7 @@ var setAtomState = (atom, next, store = IMPLICIT.STORE) => {
|
|
|
1303
1335
|
let newValue = copyMutableIfWithinTransaction(atom, store);
|
|
1304
1336
|
newValue = become(next)(newValue);
|
|
1305
1337
|
(_a = store.config.logger) == null ? void 0 : _a.info(`<< setting atom "${atom.key}" to`, newValue);
|
|
1306
|
-
cacheValue(atom.key, newValue, store);
|
|
1338
|
+
cacheValue(atom.key, newValue, atom.subject, store);
|
|
1307
1339
|
if (isAtomDefault(atom.key, store)) {
|
|
1308
1340
|
markAtomAsNotDefault(atom.key, store);
|
|
1309
1341
|
}
|
|
@@ -1449,7 +1481,7 @@ var createReadWriteSelector = (options, family, store, core) => {
|
|
|
1449
1481
|
const { get, set } = registerSelector(options.key, store);
|
|
1450
1482
|
const getSelf = () => {
|
|
1451
1483
|
const value = options.get({ get });
|
|
1452
|
-
cacheValue(options.key, value, store);
|
|
1484
|
+
cacheValue(options.key, value, subject, store);
|
|
1453
1485
|
return value;
|
|
1454
1486
|
};
|
|
1455
1487
|
const setSelf = (next) => {
|
|
@@ -1463,7 +1495,7 @@ var createReadWriteSelector = (options, family, store, core) => {
|
|
|
1463
1495
|
`)`
|
|
1464
1496
|
);
|
|
1465
1497
|
const newValue = become(next)(oldValue);
|
|
1466
|
-
cacheValue(options.key, newValue, store);
|
|
1498
|
+
cacheValue(options.key, newValue, subject, store);
|
|
1467
1499
|
markDone(options.key, store);
|
|
1468
1500
|
if (store.transactionStatus.phase === `idle`) {
|
|
1469
1501
|
subject.next({ newValue, oldValue });
|
|
@@ -1498,7 +1530,7 @@ var createReadonlySelector = (options, family, store, core) => {
|
|
|
1498
1530
|
const { get } = registerSelector(options.key, store);
|
|
1499
1531
|
const getSelf = () => {
|
|
1500
1532
|
const value = options.get({ get });
|
|
1501
|
-
cacheValue(options.key, value, store);
|
|
1533
|
+
cacheValue(options.key, value, subject, store);
|
|
1502
1534
|
return value;
|
|
1503
1535
|
};
|
|
1504
1536
|
const readonlySelector = __spreadValues(__spreadProps(__spreadValues({}, options), {
|
|
@@ -1744,7 +1776,7 @@ function createAtom(options, family, store = IMPLICIT.STORE) {
|
|
|
1744
1776
|
const initialValue = options.default instanceof Function ? options.default() : options.default;
|
|
1745
1777
|
core.atoms.set(newAtom.key, newAtom);
|
|
1746
1778
|
markAtomAsDefault(options.key, store);
|
|
1747
|
-
cacheValue(options.key, initialValue, store);
|
|
1779
|
+
cacheValue(options.key, initialValue, subject, store);
|
|
1748
1780
|
const token = deposit(newAtom);
|
|
1749
1781
|
for (const effect of (_e = options.effects) != null ? _e : []) {
|
|
1750
1782
|
effect({
|
|
@@ -1815,6 +1847,7 @@ var subscribeToRootAtoms = (state, store) => {
|
|
|
1815
1847
|
};
|
|
1816
1848
|
|
|
1817
1849
|
exports.FamilyTracker = FamilyTracker;
|
|
1850
|
+
exports.Future = Future;
|
|
1818
1851
|
exports.IMPLICIT = IMPLICIT;
|
|
1819
1852
|
exports.Store = Store;
|
|
1820
1853
|
exports.Subject = Subject;
|