atom.io 0.15.0 → 0.15.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/dist/index.cjs +25 -15
- package/data/dist/index.cjs.map +1 -1
- package/data/dist/index.d.ts +24 -14
- package/data/dist/index.js +25 -15
- package/data/dist/index.js.map +1 -1
- package/data/src/join.ts +71 -39
- package/dist/{chunk-S7R5MU6A.js → chunk-K22LR3V6.js} +3 -2
- package/dist/chunk-K22LR3V6.js.map +1 -0
- package/dist/index.cjs +2 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +1 -1
- package/internal/dist/index.cjs +113 -93
- package/internal/dist/index.cjs.map +1 -1
- package/internal/dist/index.d.ts +7 -4
- package/internal/dist/index.js +113 -93
- package/internal/dist/index.js.map +1 -1
- package/internal/src/caching.ts +9 -7
- package/internal/src/families/create-readonly-selector-family.ts +3 -1
- package/internal/src/index.ts +5 -0
- package/internal/src/mutable/tracker.ts +35 -17
- package/internal/src/read-or-compute-value.ts +8 -12
- package/internal/src/set-state/copy-mutable-in-transaction.ts +4 -4
- package/internal/src/set-state/set-atom-or-selector.ts +7 -4
- package/internal/src/transaction/apply-transaction.ts +1 -0
- package/package.json +5 -5
- package/react-devtools/dist/index.d.ts +2 -0
- package/realtime-client/dist/index.cjs +3 -0
- package/realtime-client/dist/index.cjs.map +1 -1
- package/realtime-client/dist/index.d.ts +3 -3
- package/realtime-client/dist/index.js +3 -0
- package/realtime-client/dist/index.js.map +1 -1
- package/realtime-client/src/index.ts +6 -6
- package/realtime-client/src/{use-pull-family-member.ts → pull-family-member.ts} +1 -1
- package/realtime-client/src/{use-pull-mutable-family-member.ts → pull-mutable-family-member.ts} +1 -1
- package/realtime-client/src/{use-pull-mutable.ts → pull-mutable.ts} +1 -1
- package/realtime-client/src/{use-server-action.ts → server-action.ts} +3 -0
- package/realtime-react/dist/index.cjs +31 -17
- package/realtime-react/dist/index.cjs.map +1 -1
- package/realtime-react/dist/index.d.ts +4 -4
- package/realtime-react/dist/index.js +31 -17
- package/realtime-react/dist/index.js.map +1 -1
- package/realtime-react/src/realtime-context.tsx +2 -3
- package/realtime-react/src/use-pull-family-member.ts +6 -2
- package/realtime-react/src/use-pull-mutable-family-member.ts +6 -5
- package/realtime-react/src/use-pull-mutable.ts +6 -2
- package/realtime-react/src/use-pull.ts +5 -1
- package/realtime-react/src/use-push.ts +5 -4
- package/realtime-react/src/use-server-action.ts +5 -4
- package/src/index.ts +5 -0
- package/src/set-state.ts +3 -1
- package/transceivers/set-rtx/dist/index.cjs +8 -5
- package/transceivers/set-rtx/dist/index.cjs.map +1 -1
- package/transceivers/set-rtx/dist/index.js +8 -5
- package/transceivers/set-rtx/dist/index.js.map +1 -1
- package/transceivers/set-rtx/src/set-rtx.ts +8 -5
- package/dist/chunk-S7R5MU6A.js.map +0 -1
- /package/realtime-client/src/{use-pull.ts → pull.ts} +0 -0
- /package/realtime-client/src/{use-push.ts → push.ts} +0 -0
package/data/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dict.ts","../src/join.ts","../src/struct.ts","../src/struct-family.ts","../src/until.ts"],"names":["IMPLICIT","a","b","createSelector","capitalize","createRegularAtomFamily","createSelectorFamily"],"mappings":"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","sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, createSelector } from \"atom.io/internal\"\nimport type { Json, Stringified } from \"atom.io/json\"\n\nexport function dict<State, Key extends Json.Serializable>(\n\tfindState:\n\t\t| AtomIO.AtomFamily<State, Key>\n\t\t| AtomIO.ReadonlySelectorFamily<State, Key>\n\t\t| AtomIO.SelectorFamily<State, Key>,\n\tindex:\n\t\t| AtomIO.AtomToken<Key[]>\n\t\t| AtomIO.ReadonlySelectorToken<Key[]>\n\t\t| AtomIO.SelectorToken<Key[]>,\n\tstore: Store = IMPLICIT.STORE,\n): AtomIO.ReadonlySelectorToken<{ [K in Stringified<Key>]: State }> {\n\treturn createSelector(\n\t\t{\n\t\t\tkey: `${findState.key}Dict`,\n\t\t\tget: ({ get }) => {\n\t\t\t\tconst keys = get(index)\n\t\t\t\treturn keys.reduce((acc, key) => {\n\t\t\t\t\tacc[key] = get(findState(key))\n\t\t\t\t\treturn acc\n\t\t\t\t}, {} as any)\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t\tstore,\n\t)\n}\n","/* eslint-disable @typescript-eslint/ban-types */\nimport type {\n\tAtomFamily,\n\tRead,\n\tSelectorFamily,\n\tTransactors,\n\tWrite,\n} from \"atom.io\"\nimport { dispose, getState, setState } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tcreateMutableAtomFamily,\n\tcreateRegularAtomFamily,\n\tcreateSelectorFamily,\n\tgetJsonFamily,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport { SetRTX } from \"atom.io/transceivers/set-rtx\"\n\nimport type {\n\tBaseExternalStoreConfiguration,\n\tExternalStoreConfiguration,\n\tJunctionEntries,\n\tJunctionSchema,\n} from \"~/packages/rel8/junction/src\"\nimport { Junction } from \"~/packages/rel8/junction/src\"\nimport type * as Rel8 from \"~/packages/rel8/types/src\"\n\nconst TRANSACTORS: Transactors = { get: getState, set: setState }\n\nfunction capitalize<S extends string>(string: S): Capitalize<S> {\n\treturn (string[0].toUpperCase() + string.slice(1)) as Capitalize<S>\n}\n\nexport interface JoinOptions<\n\tASide extends string,\n\tBSide extends string,\n\tCardinality extends Rel8.Cardinality,\n\tContent extends Json.Object | null,\n> extends Json.Object,\n\t\tJunctionSchema<ASide, BSide>,\n\t\tPartial<JunctionEntries<Content>> {\n\treadonly key: string\n\treadonly cardinality: Cardinality\n}\n\nexport type JoinState<\n\tASide extends string,\n\tBSide extends string,\n\tCardinality extends Rel8.Cardinality,\n\tContent extends Json.Object | null,\n> = Cardinality extends `1:1`\n\t? (Content extends Json.Object\n\t\t\t? {\n\t\t\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t\t\t? `${AB}EntryOf${Capitalize<BSide>}`\n\t\t\t\t\t\t: `${AB}EntryOf${Capitalize<ASide>}`]: SelectorFamily<\n\t\t\t\t\t\t[string, Content] | undefined,\n\t\t\t\t\t\tstring\n\t\t\t\t\t>\n\t\t\t }\n\t\t\t: {}) & {\n\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t? `${AB}KeyOf${Capitalize<BSide>}`\n\t\t\t\t: `${AB}KeyOf${Capitalize<ASide>}`]: SelectorFamily<\n\t\t\t\tstring | undefined,\n\t\t\t\tstring\n\t\t\t>\n\t }\n\t: Cardinality extends `1:n`\n\t ? (Content extends Json.Object\n\t\t\t\t? {\n\t\t\t\t\t\treadonly [A in ASide as `${A}EntryOf${Capitalize<BSide>}`]: SelectorFamily<\n\t\t\t\t\t\t\t[string, Content] | undefined,\n\t\t\t\t\t\t\tstring\n\t\t\t\t\t\t>\n\t\t\t\t } & {\n\t\t\t\t\t\treadonly [B in BSide as `${B}EntriesOf${Capitalize<ASide>}`]: SelectorFamily<\n\t\t\t\t\t\t\t[string, Content][],\n\t\t\t\t\t\t\tstring\n\t\t\t\t\t\t>\n\t\t\t\t }\n\t\t\t\t: {}) & {\n\t\t\t\treadonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: SelectorFamily<\n\t\t\t\t\tstring | undefined,\n\t\t\t\t\tstring\n\t\t\t\t>\n\t\t } & {\n\t\t\t\treadonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: SelectorFamily<\n\t\t\t\t\tstring[],\n\t\t\t\t\tstring\n\t\t\t\t>\n\t\t }\n\t : Cardinality extends `n:n`\n\t\t ? (Content extends Json.Object\n\t\t\t\t\t? {\n\t\t\t\t\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t\t\t\t\t? `${AB}EntriesOf${Capitalize<BSide>}`\n\t\t\t\t\t\t\t\t: `${AB}EntriesOf${Capitalize<ASide>}`]: SelectorFamily<\n\t\t\t\t\t\t\t\t[string, Content][],\n\t\t\t\t\t\t\t\tstring\n\t\t\t\t\t\t\t>\n\t\t\t\t\t }\n\t\t\t\t\t: {}) & {\n\t\t\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t\t\t? `${AB}KeysOf${Capitalize<BSide>}`\n\t\t\t\t\t\t: `${AB}KeysOf${Capitalize<ASide>}`]: SelectorFamily<\n\t\t\t\t\t\tstring[],\n\t\t\t\t\t\tstring\n\t\t\t\t\t>\n\t\t\t }\n\t\t : never\n\nexport class Join<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Cardinality extends `1:1` | `1:n` | `n:n`,\n\tconst Content extends Json.Object | null = null,\n> {\n\tprivate transactors: Transactors = TRANSACTORS\n\tpublic relations: Junction<ASide, BSide, Content>\n\tpublic findState: JoinState<ASide, BSide, Cardinality, Content>\n\tpublic transact(\n\t\ttransactors: Transactors,\n\t\trun: (join: Join<ASide, BSide, Cardinality, Content>) => void,\n\t): void {\n\t\tthis.transactors = transactors\n\t\trun(this)\n\t\tthis.transactors = TRANSACTORS\n\t}\n\tpublic constructor(\n\t\toptions: JoinOptions<ASide, BSide, Cardinality, Content>,\n\t\tdefaultContent: Content | undefined,\n\t\tstore: Store = IMPLICIT.STORE,\n\t) {\n\t\tconst a: ASide = options.between[0]\n\t\tconst b: BSide = options.between[1]\n\t\tconst findRelatedKeysState = createMutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tstring[],\n\t\t\tstring\n\t\t>(\n\t\t\t{\n\t\t\t\tkey: `${options.key}/relatedKeys`,\n\t\t\t\tdefault: () => new SetRTX(),\n\t\t\t\tmutable: true,\n\t\t\t\tfromJson: (json) => new SetRTX(json),\n\t\t\t\ttoJson: (set) => [...set],\n\t\t\t},\n\t\t\tstore,\n\t\t)\n\t\tconst getRelatedKeys: Read<(key: string) => SetRTX<string>> = (\n\t\t\t{ get },\n\t\t\tkey,\n\t\t) => get(findRelatedKeysState(key))\n\t\tconst addRelation: Write<(a: string, b: string) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tb,\n\t\t) => {\n\t\t\tconst aKeys = getRelatedKeys(transactors, a)\n\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\ttransactors.set(findRelatedKeysState(a), aKeys.add(b))\n\t\t\ttransactors.set(findRelatedKeysState(b), bKeys.add(a))\n\t\t}\n\t\tconst deleteRelation: Write<(a: string, b: string) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tb,\n\t\t) => {\n\t\t\tconst aKeys = getRelatedKeys(transactors, a)\n\t\t\taKeys.delete(b)\n\t\t\tif (aKeys.size === 0) {\n\t\t\t\tdispose(findRelatedKeysState(a))\n\t\t\t}\n\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\tbKeys.delete(a)\n\t\t\tif (bKeys.size === 0) {\n\t\t\t\tdispose(findRelatedKeysState(b))\n\t\t\t}\n\t\t}\n\t\tconst replaceRelationsSafely: Write<(a: string, bs: string[]) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tbs,\n\t\t) => {\n\t\t\tconst aRelations = getRelatedKeys(transactors, a)\n\t\t\tfor (const b of aRelations) {\n\t\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\t\tif (bKeys) {\n\t\t\t\t\tbKeys.delete(a)\n\t\t\t\t\tif (bKeys.size === 0) {\n\t\t\t\t\t\tdispose(findRelatedKeysState(b))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttransactors.set(findRelatedKeysState(a), new SetRTX(bs))\n\t\t\tfor (const b of bs) {\n\t\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\t\tbKeys.add(a)\n\t\t\t}\n\t\t}\n\t\tconst replaceRelationsUnsafely: Write<(a: string, bs: string[]) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tbs,\n\t\t) => {\n\t\t\ttransactors.set(findRelatedKeysState(a), new SetRTX(bs))\n\t\t\tfor (const b of bs) {\n\t\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\t\tbKeys.add(a)\n\t\t\t}\n\t\t}\n\t\tconst has: Read<(a: string, b?: string) => boolean> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tb,\n\t\t) => {\n\t\t\tconst aKeys = getRelatedKeys(transactors, a)\n\t\t\treturn b ? aKeys.has(b) : aKeys.size > 0\n\t\t}\n\t\tconst baseExternalStoreConfiguration: BaseExternalStoreConfiguration = {\n\t\t\tgetRelatedKeys: (key) => getRelatedKeys(this.transactors, key),\n\t\t\taddRelation: (a, b) => addRelation(this.transactors, a, b),\n\t\t\tdeleteRelation: (a, b) => deleteRelation(this.transactors, a, b),\n\t\t\treplaceRelationsSafely: (a, bs) =>\n\t\t\t\treplaceRelationsSafely(this.transactors, a, bs),\n\t\t\treplaceRelationsUnsafely: (a, bs) =>\n\t\t\t\treplaceRelationsUnsafely(this.transactors, a, bs),\n\t\t\thas: (a, b) => has(this.transactors, a, b),\n\t\t}\n\t\tlet externalStore: ExternalStoreConfiguration<Content>\n\t\tlet findContentState: AtomFamily<Content, string>\n\t\tif (defaultContent) {\n\t\t\tfindContentState = createRegularAtomFamily<Content, string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/content`,\n\t\t\t\t\tdefault: defaultContent,\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tconst getContent: Read<(key: string) => Content | undefined> = (\n\t\t\t\t{ get },\n\t\t\t\tkey,\n\t\t\t) => get(findContentState(key))\n\t\t\tconst setContent: Write<(key: string, content: Content) => void> = (\n\t\t\t\ttransactors,\n\t\t\t\tkey,\n\t\t\t\tcontent,\n\t\t\t) => transactors.set(findContentState(key), content)\n\t\t\tconst deleteContent: Write<(key: string) => void> = (_, key) =>\n\t\t\t\tdispose(findContentState(key))\n\t\t\tconst externalStoreWithContentConfiguration = {\n\t\t\t\tgetContent: (contentKey: string) => {\n\t\t\t\t\tconst content = getContent(this.transactors, contentKey)\n\t\t\t\t\treturn content\n\t\t\t\t},\n\t\t\t\tsetContent: (contentKey: string, content: Content) => {\n\t\t\t\t\tsetContent(this.transactors, contentKey, content)\n\t\t\t\t},\n\t\t\t\tdeleteContent: (contentKey: string) => {\n\t\t\t\t\tdeleteContent(this.transactors, contentKey)\n\t\t\t\t},\n\t\t\t}\n\t\t\texternalStore = Object.assign(\n\t\t\t\tbaseExternalStoreConfiguration,\n\t\t\t\texternalStoreWithContentConfiguration,\n\t\t\t) as ExternalStoreConfiguration<Content>\n\t\t} else {\n\t\t\texternalStore =\n\t\t\t\tbaseExternalStoreConfiguration as ExternalStoreConfiguration<Content>\n\t\t}\n\t\tconst relations = new Junction<ASide, BSide, Content>(options, {\n\t\t\texternalStore,\n\t\t\tmakeContentKey: (...args) => args.sort().join(`:`),\n\t\t})\n\n\t\tconst createSingleKeyStateFamily = () =>\n\t\t\tcreateSelectorFamily<string | undefined, string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/singleRelatedKey`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst relatedKeys = get(findRelatedKeysState(key))\n\t\t\t\t\t\t\tfor (const relatedKey of relatedKeys) {\n\t\t\t\t\t\t\t\treturn relatedKey\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\tconst getMultipleKeyStateFamily = () =>\n\t\t\tgetJsonFamily(findRelatedKeysState, store)\n\t\tconst createSingleEntryStateFamily = () =>\n\t\t\tcreateSelectorFamily<[string, Content] | undefined, string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/singleRelatedEntry`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst relatedKeys = get(findRelatedKeysState(key))\n\t\t\t\t\t\t\tfor (const relatedKey of relatedKeys) {\n\t\t\t\t\t\t\t\tconst contentKey = relations.makeContentKey(key, relatedKey)\n\t\t\t\t\t\t\t\treturn [relatedKey, get(findContentState(contentKey))]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\tconst getMultipleEntryStateFamily = () =>\n\t\t\tcreateSelectorFamily<[string, Content][], string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/multipleRelatedEntries`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst relatedKeys = get(findRelatedKeysState(key))\n\t\t\t\t\t\t\treturn [...relatedKeys].map((relatedKey) => {\n\t\t\t\t\t\t\t\tconst contentKey = relations.makeContentKey(key, relatedKey)\n\t\t\t\t\t\t\t\treturn [relatedKey, get(findContentState(contentKey))]\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\n\t\tswitch (options.cardinality) {\n\t\t\tcase `1:1`: {\n\t\t\t\tconst findSingleRelatedKeyState = createSingleKeyStateFamily()\n\t\t\t\tconst stateKeyA = `${a}KeyOf${capitalize(b)}` as const\n\t\t\t\tconst stateKeyB = `${b}KeyOf${capitalize(a)}` as const\n\t\t\t\tconst findStateBase = {\n\t\t\t\t\t[stateKeyA]: findSingleRelatedKeyState,\n\t\t\t\t\t[stateKeyB]: findSingleRelatedKeyState,\n\t\t\t\t} as JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tlet findState: JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tif (defaultContent) {\n\t\t\t\t\tconst findSingleRelatedEntryState = createSingleEntryStateFamily()\n\t\t\t\t\tconst entriesStateKeyA = `${a}EntryOf${capitalize(b)}` as const\n\t\t\t\t\tconst entriesStateKeyB = `${b}EntryOf${capitalize(a)}` as const\n\t\t\t\t\tconst findStateWithContent = {\n\t\t\t\t\t\t[entriesStateKeyA]: findSingleRelatedEntryState,\n\t\t\t\t\t\t[entriesStateKeyB]: findSingleRelatedEntryState,\n\t\t\t\t\t}\n\t\t\t\t\tfindState = Object.assign(findStateBase, findStateWithContent)\n\t\t\t\t} else {\n\t\t\t\t\tfindState = findStateBase\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.findState = findState\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase `1:n`: {\n\t\t\t\tconst findSingleRelatedKeyState = createSingleKeyStateFamily()\n\t\t\t\tconst findMultipleRelatedKeysState = getMultipleKeyStateFamily()\n\t\t\t\tconst stateKeyA = `${a}KeyOf${capitalize(b)}` as const\n\t\t\t\tconst stateKeyB = `${b}KeysOf${capitalize(a)}` as const\n\t\t\t\tconst findStateBase = {\n\t\t\t\t\t[stateKeyA]: findSingleRelatedKeyState,\n\t\t\t\t\t[stateKeyB]: findMultipleRelatedKeysState,\n\t\t\t\t} as JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tlet findState: JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tif (defaultContent) {\n\t\t\t\t\tconst findSingleRelatedEntryState = createSingleEntryStateFamily()\n\t\t\t\t\tconst findMultipleRelatedEntriesState = getMultipleEntryStateFamily()\n\t\t\t\t\tconst entriesStateKeyA = `${a}EntryOf${capitalize(b)}` as const\n\t\t\t\t\tconst entriesStateKeyB = `${b}EntriesOf${capitalize(a)}` as const\n\t\t\t\t\tconst findStateWithContent = {\n\t\t\t\t\t\t[entriesStateKeyA]: findSingleRelatedEntryState,\n\t\t\t\t\t\t[entriesStateKeyB]: findMultipleRelatedEntriesState,\n\t\t\t\t\t}\n\t\t\t\t\tfindState = Object.assign(findStateBase, findStateWithContent)\n\t\t\t\t} else {\n\t\t\t\t\tfindState = findStateBase\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.findState = findState\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst findMultipleRelatedKeysState = getMultipleKeyStateFamily()\n\t\t\t\tconst stateKeyA = `${a}KeysOf${capitalize(b)}` as const\n\t\t\t\tconst stateKeyB = `${b}KeysOf${capitalize(a)}` as const\n\t\t\t\tconst findStateBase = {\n\t\t\t\t\t[stateKeyA]: findMultipleRelatedKeysState,\n\t\t\t\t\t[stateKeyB]: findMultipleRelatedKeysState,\n\t\t\t\t} as JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tlet findState: JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tif (defaultContent) {\n\t\t\t\t\tconst findMultipleRelatedEntriesState = getMultipleEntryStateFamily()\n\t\t\t\t\tconst entriesStateKeyA = `${a}EntriesOf${capitalize(b)}` as const\n\t\t\t\t\tconst entriesStateKeyB = `${b}EntriesOf${capitalize(a)}` as const\n\t\t\t\t\tconst findStateWithContent = {\n\t\t\t\t\t\t[entriesStateKeyA]: findMultipleRelatedEntriesState,\n\t\t\t\t\t\t[entriesStateKeyB]: findMultipleRelatedEntriesState,\n\t\t\t\t\t}\n\t\t\t\t\tfindState = Object.assign(findStateBase, findStateWithContent)\n\t\t\t\t} else {\n\t\t\t\t\tfindState = findStateBase\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.findState = findState\n\t\t\t}\n\t\t}\n\t}\n}\nexport function join<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Cardinality extends `1:1` | `1:n` | `n:n`,\n>(\n\toptions: JoinOptions<ASide, BSide, Cardinality, null>,\n\tdefaultContent?: undefined,\n\tstore?: Store,\n): {\n\trelations: Junction<ASide, BSide, null>\n\tfindState: JoinState<ASide, BSide, Cardinality, null>\n\ttransact: (\n\t\ttransactors: Transactors,\n\t\trun: (join: Join<ASide, BSide, Cardinality, null>) => void,\n\t) => void\n}\nexport function join<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Cardinality extends `1:1` | `1:n` | `n:n`,\n\tconst Content extends Json.Object,\n>(\n\toptions: JoinOptions<ASide, BSide, Cardinality, Content>,\n\tdefaultContent: Content,\n\tstore?: Store,\n): {\n\treadonly relations: Junction<ASide, BSide, Content>\n\treadonly findState: JoinState<ASide, BSide, Cardinality, Content>\n\treadonly transact: (\n\t\ttransactors: Transactors,\n\t\trun: (join: Join<ASide, BSide, Cardinality, Content>) => void,\n\t) => void\n}\nexport function join<\n\tASide extends string,\n\tBSide extends string,\n\tCardinality extends `1:1` | `1:n` | `n:n`,\n\tContent extends Json.Object,\n>(\n\toptions: JoinOptions<ASide, BSide, Cardinality, Content>,\n\tdefaultContent: Content | undefined,\n\tstore: Store = IMPLICIT.STORE,\n): Join<ASide, BSide, Cardinality, Content> {\n\treturn new Join(options, defaultContent, store)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { IMPLICIT } from \"atom.io/internal\"\n\nimport { createRegularAtom, createSelector } from \"atom.io/internal\"\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\n\nexport function struct<\n\tStruct extends { [key: string]: unknown },\n\tKey extends string,\n>(\n\toptions: {\n\t\tkey: Key\n\t\tdefault: Struct\n\t},\n\tstore: Store = IMPLICIT.STORE,\n): [\n\t{\n\t\t[K in keyof Struct as `${Key}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomToken<Struct[K]>\n\t},\n\tAtomIO.ReadonlySelectorToken<Struct>,\n] {\n\tconst atoms: {\n\t\t[K in keyof Struct as `${Key}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomToken<Struct[K]>\n\t} = Object.keys(options.default).reduce((acc, key) => {\n\t\tconst atomName = options.key + capitalize(key) + `State`\n\t\tacc[atomName] = createRegularAtom(\n\t\t\t{\n\t\t\t\tkey: `${options.key}.${key}`,\n\t\t\t\tdefault: options.default[key],\n\t\t\t},\n\t\t\tundefined,\n\t\t\tstore,\n\t\t)\n\t\treturn acc\n\t}, {} as any)\n\tconst structState = createSelector(\n\t\t{\n\t\t\tkey: options.key,\n\t\t\tget: ({ get }) => {\n\t\t\t\treturn Object.keys(options.default).reduce((acc, key) => {\n\t\t\t\t\tacc[key] = get(atoms[options.key + capitalize(key) + `State`])\n\t\t\t\t\treturn acc\n\t\t\t\t}, {} as any)\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t\tstore,\n\t)\n\treturn [atoms, structState]\n}\n","import type * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tcreateRegularAtomFamily,\n\tcreateSelectorFamily,\n} from \"atom.io/internal\"\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\nconst nameFamily = (topKey: string, subKey: string) =>\n\t`find` + capitalize(topKey) + capitalize(subKey) + `State`\n\nexport function structFamily<\n\tStruct extends object,\n\tKey extends string,\n>(options: {\n\tkey: Key\n\tdefault: Struct\n}): [\n\t{\n\t\t[K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomFamily<Struct[K], string>\n\t},\n\tAtomIO.ReadonlySelectorFamily<Struct>,\n] {\n\tconst atoms: {\n\t\t[K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomFamily<Struct[K], string>\n\t} = Object.keys(options.default).reduce((acc, subKey) => {\n\t\tconst atomFamilyName = nameFamily(options.key, subKey)\n\t\tacc[atomFamilyName] = createRegularAtomFamily(\n\t\t\t{\n\t\t\t\tkey: `${options.key}.${subKey}`,\n\t\t\t\tdefault: (options.default as any)[subKey],\n\t\t\t},\n\t\t\tIMPLICIT.STORE,\n\t\t)\n\t\treturn acc\n\t}, {} as any)\n\tconst findStructState = createSelectorFamily(\n\t\t{\n\t\t\tkey: options.key,\n\t\t\tget:\n\t\t\t\t(id) =>\n\t\t\t\t({ get }) => {\n\t\t\t\t\treturn Object.keys(options.default).reduce((acc, subKey) => {\n\t\t\t\t\t\tacc[subKey] = get(\n\t\t\t\t\t\t\t(atoms as any)[nameFamily(options.key, subKey)](id),\n\t\t\t\t\t\t)\n\t\t\t\t\t\treturn acc\n\t\t\t\t\t}, {} as any)\n\t\t\t\t},\n\t\t},\n\t\tIMPLICIT.STORE,\n\t)\n\treturn [atoms, findStructState]\n}\n","export type Loadable<T> = Promise<T> | T\nexport type Fated<T, E extends Error = Error> = Loadable<E | T>\n\n/**\n * Utility for handling loadable values\n * @param loadable Loadable value\n * @param fallback Fallback value until Loadable is resolved\n * @returns Fallback value if your loadable is a promise, otherwise the loadable's resolved value\n */\nexport function until<T>(loadable: Loadable<T>, fallback: T): T {\n\tif (loadable instanceof Promise) {\n\t\treturn fallback\n\t}\n\treturn loadable\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/dict.ts","../src/join.ts","../src/struct.ts","../src/struct-family.ts","../src/until.ts"],"names":["IMPLICIT","a","b","createSelector","capitalize","createRegularAtomFamily","createSelectorFamily"],"mappings":"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","sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, createSelector } from \"atom.io/internal\"\nimport type { Json, Stringified } from \"atom.io/json\"\n\nexport function dict<State, Key extends Json.Serializable>(\n\tfindState:\n\t\t| AtomIO.AtomFamily<State, Key>\n\t\t| AtomIO.ReadonlySelectorFamily<State, Key>\n\t\t| AtomIO.SelectorFamily<State, Key>,\n\tindex:\n\t\t| AtomIO.AtomToken<Key[]>\n\t\t| AtomIO.ReadonlySelectorToken<Key[]>\n\t\t| AtomIO.SelectorToken<Key[]>,\n\tstore: Store = IMPLICIT.STORE,\n): AtomIO.ReadonlySelectorToken<{ [K in Stringified<Key>]: State }> {\n\treturn createSelector(\n\t\t{\n\t\t\tkey: `${findState.key}Dict`,\n\t\t\tget: ({ get }) => {\n\t\t\t\tconst keys = get(index)\n\t\t\t\treturn keys.reduce((acc, key) => {\n\t\t\t\t\tacc[key] = get(findState(key))\n\t\t\t\t\treturn acc\n\t\t\t\t}, {} as any)\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t\tstore,\n\t)\n}\n","/* eslint-disable @typescript-eslint/ban-types */\nimport type {\n\tAtomFamily,\n\tMutableAtomFamily,\n\tRead,\n\tReadonlySelectorFamily,\n\tTransactors,\n\tWrite,\n} from \"atom.io\"\nimport { dispose, getState, setState } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tcreateMutableAtomFamily,\n\tcreateRegularAtomFamily,\n\tcreateSelectorFamily,\n\tgetJsonFamily,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { SetRTXJson } from \"atom.io/transceivers/set-rtx\"\nimport { SetRTX } from \"atom.io/transceivers/set-rtx\"\n\nimport type {\n\tBaseExternalStoreConfiguration,\n\tExternalStoreConfiguration,\n\tJunctionEntries,\n\tJunctionSchema,\n} from \"~/packages/rel8/junction/src\"\nimport { Junction } from \"~/packages/rel8/junction/src\"\nimport type * as Rel8 from \"~/packages/rel8/types/src\"\n\nconst TRANSACTORS: Transactors = { get: getState, set: setState }\n\nfunction capitalize<S extends string>(string: S): Capitalize<S> {\n\treturn (string[0].toUpperCase() + string.slice(1)) as Capitalize<S>\n}\n\nexport interface JoinOptions<\n\tASide extends string,\n\tBSide extends string,\n\tCardinality extends Rel8.Cardinality,\n\tContent extends Json.Object | null,\n> extends Json.Object,\n\t\tJunctionSchema<ASide, BSide>,\n\t\tPartial<JunctionEntries<Content>> {\n\treadonly key: string\n\treadonly cardinality: Cardinality\n}\n\nexport type JoinState<\n\tASide extends string,\n\tBSide extends string,\n\tCardinality extends Rel8.Cardinality,\n\tContent extends Json.Object | null,\n> = Cardinality extends `1:1`\n\t? (Content extends Json.Object\n\t\t\t? {\n\t\t\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t\t\t? `${AB}EntryOf${Capitalize<BSide>}`\n\t\t\t\t\t\t: `${AB}EntryOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\t\t[string, Content] | null,\n\t\t\t\t\t\tstring\n\t\t\t\t\t>\n\t\t\t }\n\t\t\t: {}) & {\n\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t? `${AB}KeyOf${Capitalize<BSide>}`\n\t\t\t\t: `${AB}KeyOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<\n\t\t\t\tstring | null,\n\t\t\t\tstring\n\t\t\t>\n\t }\n\t: Cardinality extends `1:n`\n\t ? (Content extends Json.Object\n\t\t\t\t? {\n\t\t\t\t\t\treadonly [A in ASide as `${A}EntryOf${Capitalize<BSide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\t\t\t[string, Content] | null,\n\t\t\t\t\t\t\tstring\n\t\t\t\t\t\t>\n\t\t\t\t } & {\n\t\t\t\t\t\treadonly [B in BSide as `${B}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\t\t\t[string, Content][],\n\t\t\t\t\t\t\tstring\n\t\t\t\t\t\t>\n\t\t\t\t }\n\t\t\t\t: {}) & {\n\t\t\t\treadonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\tstring | null,\n\t\t\t\t\tstring\n\t\t\t\t>\n\t\t } & {\n\t\t\t\treadonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\tstring[],\n\t\t\t\t\tstring\n\t\t\t\t>\n\t\t }\n\t : Cardinality extends `n:n`\n\t\t ? (Content extends Json.Object\n\t\t\t\t\t? {\n\t\t\t\t\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t\t\t\t\t? `${AB}EntriesOf${Capitalize<BSide>}`\n\t\t\t\t\t\t\t\t: `${AB}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\t\t\t\t[string, Content][],\n\t\t\t\t\t\t\t\tstring\n\t\t\t\t\t\t\t>\n\t\t\t\t\t }\n\t\t\t\t\t: {}) & {\n\t\t\t\t\treadonly [AB in ASide | BSide as AB extends ASide\n\t\t\t\t\t\t? `${AB}KeysOf${Capitalize<BSide>}`\n\t\t\t\t\t\t: `${AB}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<\n\t\t\t\t\t\tstring[],\n\t\t\t\t\t\tstring\n\t\t\t\t\t>\n\t\t\t }\n\t\t : never\n\nexport class Join<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Cardinality extends `1:1` | `1:n` | `n:n`,\n\tconst Content extends Json.Object | null = null,\n> {\n\tprivate transactors: Transactors = TRANSACTORS\n\tpublic relations: Junction<ASide, BSide, Content>\n\tpublic findState: JoinState<ASide, BSide, Cardinality, Content>\n\tpublic core: {\n\t\tfindRelatedKeysState: MutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>\n\t}\n\tpublic transact(\n\t\ttransactors: Transactors,\n\t\trun: (join: Join<ASide, BSide, Cardinality, Content>) => void,\n\t): void {\n\t\tthis.transactors = transactors\n\t\trun(this)\n\t\tthis.transactors = TRANSACTORS\n\t}\n\tpublic constructor(\n\t\toptions: JoinOptions<ASide, BSide, Cardinality, Content>,\n\t\tdefaultContent: Content | undefined,\n\t\tstore: Store = IMPLICIT.STORE,\n\t) {\n\t\tconst a: ASide = options.between[0]\n\t\tconst b: BSide = options.between[1]\n\t\tconst findRelatedKeysState = createMutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>(\n\t\t\t{\n\t\t\t\tkey: `${options.key}/relatedKeys`,\n\t\t\t\tdefault: () => new SetRTX(),\n\t\t\t\tmutable: true,\n\t\t\t\tfromJson: (json) => SetRTX.fromJSON(json),\n\t\t\t\ttoJson: (set) => set.toJSON(),\n\t\t\t},\n\t\t\tstore,\n\t\t)\n\t\tthis.core = { findRelatedKeysState }\n\t\tconst getRelatedKeys: Read<(key: string) => SetRTX<string>> = (\n\t\t\t{ get },\n\t\t\tkey,\n\t\t) => get(findRelatedKeysState(key))\n\t\tconst addRelation: Write<(a: string, b: string) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tb,\n\t\t) => {\n\t\t\tconst aKeysState = findRelatedKeysState(a)\n\t\t\tconst bKeysState = findRelatedKeysState(b)\n\t\t\ttransactors.set(aKeysState, (aKeys) => aKeys.add(b))\n\t\t\ttransactors.set(bKeysState, (bKeys) => bKeys.add(a))\n\t\t}\n\t\tconst deleteRelation: Write<(a: string, b: string) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tb,\n\t\t) => {\n\t\t\tconst aKeys = getRelatedKeys(transactors, a)\n\t\t\taKeys.delete(b)\n\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\tbKeys.delete(a)\n\t\t}\n\t\tconst replaceRelationsSafely: Write<(a: string, bs: string[]) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tbs,\n\t\t) => {\n\t\t\tconst aRelations = getRelatedKeys(transactors, a)\n\t\t\tfor (const b of aRelations) {\n\t\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\t\tif (bKeys) {\n\t\t\t\t\tbKeys.delete(a)\n\t\t\t\t\tif (bKeys.size === 0) {\n\t\t\t\t\t\tdispose(findRelatedKeysState(b))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttransactors.set(findRelatedKeysState(a), new SetRTX(bs))\n\t\t\tfor (const b of bs) {\n\t\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\t\tbKeys.add(a)\n\t\t\t}\n\t\t}\n\t\tconst replaceRelationsUnsafely: Write<(a: string, bs: string[]) => void> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tbs,\n\t\t) => {\n\t\t\ttransactors.set(findRelatedKeysState(a), new SetRTX(bs))\n\t\t\tfor (const b of bs) {\n\t\t\t\tconst bKeys = getRelatedKeys(transactors, b)\n\t\t\t\tbKeys.add(a)\n\t\t\t}\n\t\t}\n\t\tconst has: Read<(a: string, b?: string) => boolean> = (\n\t\t\ttransactors,\n\t\t\ta,\n\t\t\tb,\n\t\t) => {\n\t\t\tconst aKeys = getRelatedKeys(transactors, a)\n\t\t\treturn b ? aKeys.has(b) : aKeys.size > 0\n\t\t}\n\t\tconst baseExternalStoreConfiguration: BaseExternalStoreConfiguration = {\n\t\t\tgetRelatedKeys: (key) => getRelatedKeys(this.transactors, key),\n\t\t\taddRelation: (a, b) => addRelation(this.transactors, a, b),\n\t\t\tdeleteRelation: (a, b) => deleteRelation(this.transactors, a, b),\n\t\t\treplaceRelationsSafely: (a, bs) =>\n\t\t\t\treplaceRelationsSafely(this.transactors, a, bs),\n\t\t\treplaceRelationsUnsafely: (a, bs) =>\n\t\t\t\treplaceRelationsUnsafely(this.transactors, a, bs),\n\t\t\thas: (a, b) => has(this.transactors, a, b),\n\t\t}\n\t\tlet externalStore: ExternalStoreConfiguration<Content>\n\t\tlet findContentState: AtomFamily<Content, string>\n\t\tif (defaultContent) {\n\t\t\tfindContentState = createRegularAtomFamily<Content, string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/content`,\n\t\t\t\t\tdefault: defaultContent,\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tconst getContent: Read<(key: string) => Content | null> = ({ get }, key) =>\n\t\t\t\tget(findContentState(key))\n\t\t\tconst setContent: Write<(key: string, content: Content) => void> = (\n\t\t\t\ttransactors,\n\t\t\t\tkey,\n\t\t\t\tcontent,\n\t\t\t) => transactors.set(findContentState(key), content)\n\t\t\tconst deleteContent: Write<(key: string) => void> = (_, key) =>\n\t\t\t\tdispose(findContentState(key))\n\t\t\tconst externalStoreWithContentConfiguration = {\n\t\t\t\tgetContent: (contentKey: string) => {\n\t\t\t\t\tconst content = getContent(this.transactors, contentKey)\n\t\t\t\t\treturn content\n\t\t\t\t},\n\t\t\t\tsetContent: (contentKey: string, content: Content) => {\n\t\t\t\t\tsetContent(this.transactors, contentKey, content)\n\t\t\t\t},\n\t\t\t\tdeleteContent: (contentKey: string) => {\n\t\t\t\t\tdeleteContent(this.transactors, contentKey)\n\t\t\t\t},\n\t\t\t}\n\t\t\texternalStore = Object.assign(\n\t\t\t\tbaseExternalStoreConfiguration,\n\t\t\t\texternalStoreWithContentConfiguration,\n\t\t\t) as ExternalStoreConfiguration<Content>\n\t\t} else {\n\t\t\texternalStore =\n\t\t\t\tbaseExternalStoreConfiguration as ExternalStoreConfiguration<Content>\n\t\t}\n\t\tconst relations = new Junction<ASide, BSide, Content>(options, {\n\t\t\texternalStore,\n\t\t\tmakeContentKey: (...args) => args.sort().join(`:`),\n\t\t})\n\n\t\tconst createSingleKeyStateFamily = () =>\n\t\t\tcreateSelectorFamily<string | null, string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/singleRelatedKey`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst relatedKeys = get(findRelatedKeysState(key))\n\t\t\t\t\t\t\tfor (const relatedKey of relatedKeys) {\n\t\t\t\t\t\t\t\treturn relatedKey\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\tconst getMultipleKeyStateFamily = () => {\n\t\t\treturn createSelectorFamily<string[], string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/multipleRelatedKeys`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst jsonFamily = getJsonFamily(findRelatedKeysState, store)\n\t\t\t\t\t\t\tconst json = get(jsonFamily(key))\n\t\t\t\t\t\t\treturn json.members\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\t}\n\t\tconst createSingleEntryStateFamily = () =>\n\t\t\tcreateSelectorFamily<[string, Content] | null, string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/singleRelatedEntry`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst relatedKeys = get(findRelatedKeysState(key))\n\t\t\t\t\t\t\tfor (const relatedKey of relatedKeys) {\n\t\t\t\t\t\t\t\tconst contentKey = relations.makeContentKey(key, relatedKey)\n\t\t\t\t\t\t\t\treturn [relatedKey, get(findContentState(contentKey))]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\tconst getMultipleEntryStateFamily = () =>\n\t\t\tcreateSelectorFamily<[string, Content][], string>(\n\t\t\t\t{\n\t\t\t\t\tkey: `${options.key}/multipleRelatedEntries`,\n\t\t\t\t\tget:\n\t\t\t\t\t\t(key) =>\n\t\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\t\tconst jsonFamily = getJsonFamily(findRelatedKeysState, store)\n\t\t\t\t\t\t\tconst json = get(jsonFamily(key))\n\t\t\t\t\t\t\treturn json.members.map((relatedKey) => {\n\t\t\t\t\t\t\t\tconst contentKey = relations.makeContentKey(key, relatedKey)\n\t\t\t\t\t\t\t\treturn [relatedKey, get(findContentState(contentKey))]\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\n\t\tswitch (options.cardinality) {\n\t\t\tcase `1:1`: {\n\t\t\t\tconst findSingleRelatedKeyState = createSingleKeyStateFamily()\n\t\t\t\tconst stateKeyA = `${a}KeyOf${capitalize(b)}` as const\n\t\t\t\tconst stateKeyB = `${b}KeyOf${capitalize(a)}` as const\n\t\t\t\tconst findStateBase = {\n\t\t\t\t\t[stateKeyA]: findSingleRelatedKeyState,\n\t\t\t\t\t[stateKeyB]: findSingleRelatedKeyState,\n\t\t\t\t} as JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tlet findState: JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tif (defaultContent) {\n\t\t\t\t\tconst findSingleRelatedEntryState = createSingleEntryStateFamily()\n\t\t\t\t\tconst entriesStateKeyA = `${a}EntryOf${capitalize(b)}` as const\n\t\t\t\t\tconst entriesStateKeyB = `${b}EntryOf${capitalize(a)}` as const\n\t\t\t\t\tconst findStateWithContent = {\n\t\t\t\t\t\t[entriesStateKeyA]: findSingleRelatedEntryState,\n\t\t\t\t\t\t[entriesStateKeyB]: findSingleRelatedEntryState,\n\t\t\t\t\t}\n\t\t\t\t\tfindState = Object.assign(findStateBase, findStateWithContent)\n\t\t\t\t} else {\n\t\t\t\t\tfindState = findStateBase\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.findState = findState\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase `1:n`: {\n\t\t\t\tconst findSingleRelatedKeyState = createSingleKeyStateFamily()\n\t\t\t\tconst findMultipleRelatedKeysState = getMultipleKeyStateFamily()\n\t\t\t\tconst stateKeyA = `${a}KeyOf${capitalize(b)}` as const\n\t\t\t\tconst stateKeyB = `${b}KeysOf${capitalize(a)}` as const\n\t\t\t\tconst findStateBase = {\n\t\t\t\t\t[stateKeyA]: findSingleRelatedKeyState,\n\t\t\t\t\t[stateKeyB]: findMultipleRelatedKeysState,\n\t\t\t\t} as JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tlet findState: JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tif (defaultContent) {\n\t\t\t\t\tconst findSingleRelatedEntryState = createSingleEntryStateFamily()\n\t\t\t\t\tconst findMultipleRelatedEntriesState = getMultipleEntryStateFamily()\n\t\t\t\t\tconst entriesStateKeyA = `${a}EntryOf${capitalize(b)}` as const\n\t\t\t\t\tconst entriesStateKeyB = `${b}EntriesOf${capitalize(a)}` as const\n\t\t\t\t\tconst findStateWithContent = {\n\t\t\t\t\t\t[entriesStateKeyA]: findSingleRelatedEntryState,\n\t\t\t\t\t\t[entriesStateKeyB]: findMultipleRelatedEntriesState,\n\t\t\t\t\t}\n\t\t\t\t\tfindState = Object.assign(findStateBase, findStateWithContent)\n\t\t\t\t} else {\n\t\t\t\t\tfindState = findStateBase\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.findState = findState\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst findMultipleRelatedKeysState = getMultipleKeyStateFamily()\n\t\t\t\tconst stateKeyA = `${a}KeysOf${capitalize(b)}` as const\n\t\t\t\tconst stateKeyB = `${b}KeysOf${capitalize(a)}` as const\n\t\t\t\tconst findStateBase = {\n\t\t\t\t\t[stateKeyA]: findMultipleRelatedKeysState,\n\t\t\t\t\t[stateKeyB]: findMultipleRelatedKeysState,\n\t\t\t\t} as JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tlet findState: JoinState<ASide, BSide, Cardinality, Content>\n\t\t\t\tif (defaultContent) {\n\t\t\t\t\tconst findMultipleRelatedEntriesState = getMultipleEntryStateFamily()\n\t\t\t\t\tconst entriesStateKeyA = `${a}EntriesOf${capitalize(b)}` as const\n\t\t\t\t\tconst entriesStateKeyB = `${b}EntriesOf${capitalize(a)}` as const\n\t\t\t\t\tconst findStateWithContent = {\n\t\t\t\t\t\t[entriesStateKeyA]: findMultipleRelatedEntriesState,\n\t\t\t\t\t\t[entriesStateKeyB]: findMultipleRelatedEntriesState,\n\t\t\t\t\t}\n\t\t\t\t\tfindState = Object.assign(findStateBase, findStateWithContent)\n\t\t\t\t} else {\n\t\t\t\t\tfindState = findStateBase\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.findState = findState\n\t\t\t}\n\t\t}\n\t}\n}\nexport function join<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Cardinality extends `1:1` | `1:n` | `n:n`,\n>(\n\toptions: JoinOptions<ASide, BSide, Cardinality, null>,\n\tdefaultContent?: undefined,\n\tstore?: Store,\n): {\n\treadonly relations: Junction<ASide, BSide, null>\n\treadonly findState: JoinState<ASide, BSide, Cardinality, null>\n\treadonly transact: (\n\t\ttransactors: Transactors,\n\t\trun: (join: Join<ASide, BSide, Cardinality, null>) => void,\n\t) => void\n\treadonly core: {\n\t\treadonly findRelatedKeysState: MutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>\n\t}\n}\nexport function join<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Cardinality extends `1:1` | `1:n` | `n:n`,\n\tconst Content extends Json.Object,\n>(\n\toptions: JoinOptions<ASide, BSide, Cardinality, Content>,\n\tdefaultContent: Content,\n\tstore?: Store,\n): {\n\treadonly relations: Junction<ASide, BSide, Content>\n\treadonly findState: JoinState<ASide, BSide, Cardinality, Content>\n\treadonly transact: (\n\t\ttransactors: Transactors,\n\t\trun: (join: Join<ASide, BSide, Cardinality, Content>) => void,\n\t) => void\n\treadonly core: {\n\t\treadonly findRelatedKeysState: MutableAtomFamily<\n\t\t\tSetRTX<string>,\n\t\t\tSetRTXJson<string>,\n\t\t\tstring\n\t\t>\n\t}\n}\nexport function join<\n\tASide extends string,\n\tBSide extends string,\n\tCardinality extends `1:1` | `1:n` | `n:n`,\n\tContent extends Json.Object,\n>(\n\toptions: JoinOptions<ASide, BSide, Cardinality, Content>,\n\tdefaultContent: Content | undefined,\n\tstore: Store = IMPLICIT.STORE,\n): Join<ASide, BSide, Cardinality, Content> {\n\treturn new Join(options, defaultContent, store)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { IMPLICIT } from \"atom.io/internal\"\n\nimport { createRegularAtom, createSelector } from \"atom.io/internal\"\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\n\nexport function struct<\n\tStruct extends { [key: string]: unknown },\n\tKey extends string,\n>(\n\toptions: {\n\t\tkey: Key\n\t\tdefault: Struct\n\t},\n\tstore: Store = IMPLICIT.STORE,\n): [\n\t{\n\t\t[K in keyof Struct as `${Key}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomToken<Struct[K]>\n\t},\n\tAtomIO.ReadonlySelectorToken<Struct>,\n] {\n\tconst atoms: {\n\t\t[K in keyof Struct as `${Key}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomToken<Struct[K]>\n\t} = Object.keys(options.default).reduce((acc, key) => {\n\t\tconst atomName = options.key + capitalize(key) + `State`\n\t\tacc[atomName] = createRegularAtom(\n\t\t\t{\n\t\t\t\tkey: `${options.key}.${key}`,\n\t\t\t\tdefault: options.default[key],\n\t\t\t},\n\t\t\tundefined,\n\t\t\tstore,\n\t\t)\n\t\treturn acc\n\t}, {} as any)\n\tconst structState = createSelector(\n\t\t{\n\t\t\tkey: options.key,\n\t\t\tget: ({ get }) => {\n\t\t\t\treturn Object.keys(options.default).reduce((acc, key) => {\n\t\t\t\t\tacc[key] = get(atoms[options.key + capitalize(key) + `State`])\n\t\t\t\t\treturn acc\n\t\t\t\t}, {} as any)\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t\tstore,\n\t)\n\treturn [atoms, structState]\n}\n","import type * as AtomIO from \"atom.io\"\nimport {\n\tIMPLICIT,\n\tcreateRegularAtomFamily,\n\tcreateSelectorFamily,\n} from \"atom.io/internal\"\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\nconst nameFamily = (topKey: string, subKey: string) =>\n\t`find` + capitalize(topKey) + capitalize(subKey) + `State`\n\nexport function structFamily<\n\tStruct extends object,\n\tKey extends string,\n>(options: {\n\tkey: Key\n\tdefault: Struct\n}): [\n\t{\n\t\t[K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomFamily<Struct[K], string>\n\t},\n\tAtomIO.ReadonlySelectorFamily<Struct>,\n] {\n\tconst atoms: {\n\t\t[K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<\n\t\t\tK & string\n\t\t>}State`]: AtomIO.AtomFamily<Struct[K], string>\n\t} = Object.keys(options.default).reduce((acc, subKey) => {\n\t\tconst atomFamilyName = nameFamily(options.key, subKey)\n\t\tacc[atomFamilyName] = createRegularAtomFamily(\n\t\t\t{\n\t\t\t\tkey: `${options.key}.${subKey}`,\n\t\t\t\tdefault: (options.default as any)[subKey],\n\t\t\t},\n\t\t\tIMPLICIT.STORE,\n\t\t)\n\t\treturn acc\n\t}, {} as any)\n\tconst findStructState = createSelectorFamily(\n\t\t{\n\t\t\tkey: options.key,\n\t\t\tget:\n\t\t\t\t(id) =>\n\t\t\t\t({ get }) => {\n\t\t\t\t\treturn Object.keys(options.default).reduce((acc, subKey) => {\n\t\t\t\t\t\tacc[subKey] = get(\n\t\t\t\t\t\t\t(atoms as any)[nameFamily(options.key, subKey)](id),\n\t\t\t\t\t\t)\n\t\t\t\t\t\treturn acc\n\t\t\t\t\t}, {} as any)\n\t\t\t\t},\n\t\t},\n\t\tIMPLICIT.STORE,\n\t)\n\treturn [atoms, findStructState]\n}\n","export type Loadable<T> = Promise<T> | T\nexport type Fated<T, E extends Error = Error> = Loadable<E | T>\n\n/**\n * Utility for handling loadable values\n * @param loadable Loadable value\n * @param fallback Fallback value until Loadable is resolved\n * @returns Fallback value if your loadable is a promise, otherwise the loadable's resolved value\n */\nexport function until<T>(loadable: Loadable<T>, fallback: T): T {\n\tif (loadable instanceof Promise) {\n\t\treturn fallback\n\t}\n\treturn loadable\n}\n"]}
|
package/data/src/join.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/ban-types */
|
|
2
2
|
import type {
|
|
3
3
|
AtomFamily,
|
|
4
|
+
MutableAtomFamily,
|
|
4
5
|
Read,
|
|
5
|
-
|
|
6
|
+
ReadonlySelectorFamily,
|
|
6
7
|
Transactors,
|
|
7
8
|
Write,
|
|
8
9
|
} from "atom.io"
|
|
@@ -16,6 +17,7 @@ import {
|
|
|
16
17
|
getJsonFamily,
|
|
17
18
|
} from "atom.io/internal"
|
|
18
19
|
import type { Json } from "atom.io/json"
|
|
20
|
+
import type { SetRTXJson } from "atom.io/transceivers/set-rtx"
|
|
19
21
|
import { SetRTX } from "atom.io/transceivers/set-rtx"
|
|
20
22
|
|
|
21
23
|
import type {
|
|
@@ -55,39 +57,39 @@ export type JoinState<
|
|
|
55
57
|
? {
|
|
56
58
|
readonly [AB in ASide | BSide as AB extends ASide
|
|
57
59
|
? `${AB}EntryOf${Capitalize<BSide>}`
|
|
58
|
-
: `${AB}EntryOf${Capitalize<ASide>}`]:
|
|
59
|
-
[string, Content] |
|
|
60
|
+
: `${AB}EntryOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<
|
|
61
|
+
[string, Content] | null,
|
|
60
62
|
string
|
|
61
63
|
>
|
|
62
64
|
}
|
|
63
65
|
: {}) & {
|
|
64
66
|
readonly [AB in ASide | BSide as AB extends ASide
|
|
65
67
|
? `${AB}KeyOf${Capitalize<BSide>}`
|
|
66
|
-
: `${AB}KeyOf${Capitalize<ASide>}`]:
|
|
67
|
-
string |
|
|
68
|
+
: `${AB}KeyOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<
|
|
69
|
+
string | null,
|
|
68
70
|
string
|
|
69
71
|
>
|
|
70
72
|
}
|
|
71
73
|
: Cardinality extends `1:n`
|
|
72
74
|
? (Content extends Json.Object
|
|
73
75
|
? {
|
|
74
|
-
readonly [A in ASide as `${A}EntryOf${Capitalize<BSide>}`]:
|
|
75
|
-
[string, Content] |
|
|
76
|
+
readonly [A in ASide as `${A}EntryOf${Capitalize<BSide>}`]: ReadonlySelectorFamily<
|
|
77
|
+
[string, Content] | null,
|
|
76
78
|
string
|
|
77
79
|
>
|
|
78
80
|
} & {
|
|
79
|
-
readonly [B in BSide as `${B}EntriesOf${Capitalize<ASide>}`]:
|
|
81
|
+
readonly [B in BSide as `${B}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<
|
|
80
82
|
[string, Content][],
|
|
81
83
|
string
|
|
82
84
|
>
|
|
83
85
|
}
|
|
84
86
|
: {}) & {
|
|
85
|
-
readonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]:
|
|
86
|
-
string |
|
|
87
|
+
readonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: ReadonlySelectorFamily<
|
|
88
|
+
string | null,
|
|
87
89
|
string
|
|
88
90
|
>
|
|
89
91
|
} & {
|
|
90
|
-
readonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]:
|
|
92
|
+
readonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<
|
|
91
93
|
string[],
|
|
92
94
|
string
|
|
93
95
|
>
|
|
@@ -97,7 +99,7 @@ export type JoinState<
|
|
|
97
99
|
? {
|
|
98
100
|
readonly [AB in ASide | BSide as AB extends ASide
|
|
99
101
|
? `${AB}EntriesOf${Capitalize<BSide>}`
|
|
100
|
-
: `${AB}EntriesOf${Capitalize<ASide>}`]:
|
|
102
|
+
: `${AB}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<
|
|
101
103
|
[string, Content][],
|
|
102
104
|
string
|
|
103
105
|
>
|
|
@@ -105,7 +107,7 @@ export type JoinState<
|
|
|
105
107
|
: {}) & {
|
|
106
108
|
readonly [AB in ASide | BSide as AB extends ASide
|
|
107
109
|
? `${AB}KeysOf${Capitalize<BSide>}`
|
|
108
|
-
: `${AB}KeysOf${Capitalize<ASide>}`]:
|
|
110
|
+
: `${AB}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorFamily<
|
|
109
111
|
string[],
|
|
110
112
|
string
|
|
111
113
|
>
|
|
@@ -121,6 +123,13 @@ export class Join<
|
|
|
121
123
|
private transactors: Transactors = TRANSACTORS
|
|
122
124
|
public relations: Junction<ASide, BSide, Content>
|
|
123
125
|
public findState: JoinState<ASide, BSide, Cardinality, Content>
|
|
126
|
+
public core: {
|
|
127
|
+
findRelatedKeysState: MutableAtomFamily<
|
|
128
|
+
SetRTX<string>,
|
|
129
|
+
SetRTXJson<string>,
|
|
130
|
+
string
|
|
131
|
+
>
|
|
132
|
+
}
|
|
124
133
|
public transact(
|
|
125
134
|
transactors: Transactors,
|
|
126
135
|
run: (join: Join<ASide, BSide, Cardinality, Content>) => void,
|
|
@@ -138,18 +147,19 @@ export class Join<
|
|
|
138
147
|
const b: BSide = options.between[1]
|
|
139
148
|
const findRelatedKeysState = createMutableAtomFamily<
|
|
140
149
|
SetRTX<string>,
|
|
141
|
-
string
|
|
150
|
+
SetRTXJson<string>,
|
|
142
151
|
string
|
|
143
152
|
>(
|
|
144
153
|
{
|
|
145
154
|
key: `${options.key}/relatedKeys`,
|
|
146
155
|
default: () => new SetRTX(),
|
|
147
156
|
mutable: true,
|
|
148
|
-
fromJson: (json) =>
|
|
149
|
-
toJson: (set) =>
|
|
157
|
+
fromJson: (json) => SetRTX.fromJSON(json),
|
|
158
|
+
toJson: (set) => set.toJSON(),
|
|
150
159
|
},
|
|
151
160
|
store,
|
|
152
161
|
)
|
|
162
|
+
this.core = { findRelatedKeysState }
|
|
153
163
|
const getRelatedKeys: Read<(key: string) => SetRTX<string>> = (
|
|
154
164
|
{ get },
|
|
155
165
|
key,
|
|
@@ -159,10 +169,10 @@ export class Join<
|
|
|
159
169
|
a,
|
|
160
170
|
b,
|
|
161
171
|
) => {
|
|
162
|
-
const
|
|
163
|
-
const
|
|
164
|
-
transactors.set(
|
|
165
|
-
transactors.set(
|
|
172
|
+
const aKeysState = findRelatedKeysState(a)
|
|
173
|
+
const bKeysState = findRelatedKeysState(b)
|
|
174
|
+
transactors.set(aKeysState, (aKeys) => aKeys.add(b))
|
|
175
|
+
transactors.set(bKeysState, (bKeys) => bKeys.add(a))
|
|
166
176
|
}
|
|
167
177
|
const deleteRelation: Write<(a: string, b: string) => void> = (
|
|
168
178
|
transactors,
|
|
@@ -171,14 +181,8 @@ export class Join<
|
|
|
171
181
|
) => {
|
|
172
182
|
const aKeys = getRelatedKeys(transactors, a)
|
|
173
183
|
aKeys.delete(b)
|
|
174
|
-
if (aKeys.size === 0) {
|
|
175
|
-
dispose(findRelatedKeysState(a))
|
|
176
|
-
}
|
|
177
184
|
const bKeys = getRelatedKeys(transactors, b)
|
|
178
185
|
bKeys.delete(a)
|
|
179
|
-
if (bKeys.size === 0) {
|
|
180
|
-
dispose(findRelatedKeysState(b))
|
|
181
|
-
}
|
|
182
186
|
}
|
|
183
187
|
const replaceRelationsSafely: Write<(a: string, bs: string[]) => void> = (
|
|
184
188
|
transactors,
|
|
@@ -240,10 +244,8 @@ export class Join<
|
|
|
240
244
|
},
|
|
241
245
|
store,
|
|
242
246
|
)
|
|
243
|
-
const getContent: Read<(key: string) => Content |
|
|
244
|
-
|
|
245
|
-
key,
|
|
246
|
-
) => get(findContentState(key))
|
|
247
|
+
const getContent: Read<(key: string) => Content | null> = ({ get }, key) =>
|
|
248
|
+
get(findContentState(key))
|
|
247
249
|
const setContent: Write<(key: string, content: Content) => void> = (
|
|
248
250
|
transactors,
|
|
249
251
|
key,
|
|
@@ -277,7 +279,7 @@ export class Join<
|
|
|
277
279
|
})
|
|
278
280
|
|
|
279
281
|
const createSingleKeyStateFamily = () =>
|
|
280
|
-
createSelectorFamily<string |
|
|
282
|
+
createSelectorFamily<string | null, string>(
|
|
281
283
|
{
|
|
282
284
|
key: `${options.key}/singleRelatedKey`,
|
|
283
285
|
get:
|
|
@@ -287,14 +289,28 @@ export class Join<
|
|
|
287
289
|
for (const relatedKey of relatedKeys) {
|
|
288
290
|
return relatedKey
|
|
289
291
|
}
|
|
292
|
+
return null
|
|
290
293
|
},
|
|
291
294
|
},
|
|
292
295
|
store,
|
|
293
296
|
)
|
|
294
|
-
const getMultipleKeyStateFamily = () =>
|
|
295
|
-
|
|
297
|
+
const getMultipleKeyStateFamily = () => {
|
|
298
|
+
return createSelectorFamily<string[], string>(
|
|
299
|
+
{
|
|
300
|
+
key: `${options.key}/multipleRelatedKeys`,
|
|
301
|
+
get:
|
|
302
|
+
(key) =>
|
|
303
|
+
({ get }) => {
|
|
304
|
+
const jsonFamily = getJsonFamily(findRelatedKeysState, store)
|
|
305
|
+
const json = get(jsonFamily(key))
|
|
306
|
+
return json.members
|
|
307
|
+
},
|
|
308
|
+
},
|
|
309
|
+
store,
|
|
310
|
+
)
|
|
311
|
+
}
|
|
296
312
|
const createSingleEntryStateFamily = () =>
|
|
297
|
-
createSelectorFamily<[string, Content] |
|
|
313
|
+
createSelectorFamily<[string, Content] | null, string>(
|
|
298
314
|
{
|
|
299
315
|
key: `${options.key}/singleRelatedEntry`,
|
|
300
316
|
get:
|
|
@@ -305,6 +321,7 @@ export class Join<
|
|
|
305
321
|
const contentKey = relations.makeContentKey(key, relatedKey)
|
|
306
322
|
return [relatedKey, get(findContentState(contentKey))]
|
|
307
323
|
}
|
|
324
|
+
return null
|
|
308
325
|
},
|
|
309
326
|
},
|
|
310
327
|
store,
|
|
@@ -316,8 +333,9 @@ export class Join<
|
|
|
316
333
|
get:
|
|
317
334
|
(key) =>
|
|
318
335
|
({ get }) => {
|
|
319
|
-
const
|
|
320
|
-
|
|
336
|
+
const jsonFamily = getJsonFamily(findRelatedKeysState, store)
|
|
337
|
+
const json = get(jsonFamily(key))
|
|
338
|
+
return json.members.map((relatedKey) => {
|
|
321
339
|
const contentKey = relations.makeContentKey(key, relatedKey)
|
|
322
340
|
return [relatedKey, get(findContentState(contentKey))]
|
|
323
341
|
})
|
|
@@ -415,12 +433,19 @@ export function join<
|
|
|
415
433
|
defaultContent?: undefined,
|
|
416
434
|
store?: Store,
|
|
417
435
|
): {
|
|
418
|
-
relations: Junction<ASide, BSide, null>
|
|
419
|
-
findState: JoinState<ASide, BSide, Cardinality, null>
|
|
420
|
-
transact: (
|
|
436
|
+
readonly relations: Junction<ASide, BSide, null>
|
|
437
|
+
readonly findState: JoinState<ASide, BSide, Cardinality, null>
|
|
438
|
+
readonly transact: (
|
|
421
439
|
transactors: Transactors,
|
|
422
440
|
run: (join: Join<ASide, BSide, Cardinality, null>) => void,
|
|
423
441
|
) => void
|
|
442
|
+
readonly core: {
|
|
443
|
+
readonly findRelatedKeysState: MutableAtomFamily<
|
|
444
|
+
SetRTX<string>,
|
|
445
|
+
SetRTXJson<string>,
|
|
446
|
+
string
|
|
447
|
+
>
|
|
448
|
+
}
|
|
424
449
|
}
|
|
425
450
|
export function join<
|
|
426
451
|
const ASide extends string,
|
|
@@ -438,6 +463,13 @@ export function join<
|
|
|
438
463
|
transactors: Transactors,
|
|
439
464
|
run: (join: Join<ASide, BSide, Cardinality, Content>) => void,
|
|
440
465
|
) => void
|
|
466
|
+
readonly core: {
|
|
467
|
+
readonly findRelatedKeysState: MutableAtomFamily<
|
|
468
|
+
SetRTX<string>,
|
|
469
|
+
SetRTXJson<string>,
|
|
470
|
+
string
|
|
471
|
+
>
|
|
472
|
+
}
|
|
441
473
|
}
|
|
442
474
|
export function join<
|
|
443
475
|
ASide extends string,
|
|
@@ -70,11 +70,12 @@ function selectorFamily(options) {
|
|
|
70
70
|
return createSelectorFamily(options, IMPLICIT.STORE);
|
|
71
71
|
}
|
|
72
72
|
function setState(token, value, store = Internal3.IMPLICIT.STORE) {
|
|
73
|
+
var _a;
|
|
73
74
|
const rejection = Internal3.openOperation(token, store);
|
|
74
75
|
if (rejection) {
|
|
75
76
|
return;
|
|
76
77
|
}
|
|
77
|
-
const state = Internal3.withdraw(token, store);
|
|
78
|
+
const state = (_a = Internal3.withdraw(token, store)) != null ? _a : Internal3.withdrawNewFamilyMember(token, store);
|
|
78
79
|
if (state === void 0) {
|
|
79
80
|
throw new Internal3.NotFoundError(token, store);
|
|
80
81
|
}
|
|
@@ -134,4 +135,4 @@ var runTransaction = (token, store = IMPLICIT.STORE) => (...parameters) => {
|
|
|
134
135
|
|
|
135
136
|
export { AtomIOLogger, LOG_LEVELS, Silo, atom, atomFamily, dispose, getState, redo, runTransaction, selector, selectorFamily, setState, simpleLog, simpleLogger, subscribe, timeline, transaction, undo };
|
|
136
137
|
//# sourceMappingURL=out.js.map
|
|
137
|
-
//# sourceMappingURL=chunk-
|
|
138
|
+
//# sourceMappingURL=chunk-K22LR3V6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/atom.ts","../src/dispose.ts","../src/get-state.ts","../src/logger.ts","../src/selector.ts","../src/set-state.ts","../src/silo.ts","../src/subscribe.ts","../src/timeline.ts","../src/transaction.ts"],"names":["Internal","IMPLICIT","createAtom","createAtomFamily","createSelector","createSelectorFamily","createTimeline","timeTravel","timeline","createTransaction","withdraw"],"mappings":"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","sourcesContent":["import type { Store, Subject, Transceiver } from \"atom.io/internal\"\nimport { IMPLICIT, createAtom, createAtomFamily } 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) | 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(\n\toptions: AtomOptions<any> | MutableAtomOptions<any, any>,\n): AtomToken<any> {\n\treturn createAtom(options, undefined, IMPLICIT.STORE)\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\tmutable?: boolean\n\tinstall: (store: Store) => void\n}\n\n// biome-ignore format: intersection\nexport type MutableAtomFamilyOptions<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = \n\t& 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}`\n\t\t\ttype: `atom_family`\n\t\t\tsubject: Subject<MutableAtomToken<Core, SerializableCore>>\n\t\t\tmutable: true\n\t\t\tinstall: (store: Store) => void\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\treturn createAtomFamily(options, IMPLICIT.STORE)\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { ReadonlySelectorToken, StateToken } from \".\"\n\nexport function dispose(\n\ttoken: ReadonlySelectorToken<any> | StateToken<any>,\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): void {\n\tswitch (token.type) {\n\t\tcase `atom`:\n\t\t\tInternal.deleteAtom(token, store)\n\t\t\tbreak\n\t\tcase `selector`:\n\t\tcase `readonly_selector`:\n\t\t\tInternal.deleteSelector(token, store)\n\t\t\tbreak\n\t}\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { ReadonlySelectorToken, StateToken } from \".\"\n\nexport function getState<T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): T {\n\tconst state =\n\t\tInternal.withdraw(token, store) ??\n\t\tInternal.withdrawNewFamilyMember(token, store)\n\tif (state === undefined) {\n\t\tthrow new Internal.NotFoundError(token, store)\n\t}\n\treturn Internal.readOrComputeValue(state, store)\n}\n","const LoggerIconDictionary = {\n\t\"⌛\": `Timeline event fully captured`,\n\t\"⏩\": `Timeline redo`,\n\t\"⏪\": `Timeline undo`,\n\t\"⏭️\": `Transaction redo`,\n\t\"⏮️\": `Transaction undo`,\n\t\"⏳\": `Timeline event partially captured`,\n\t\"⏹️\": `Time-travel complete`,\n\t\"💁\": `Notice`,\n\t\"🔄\": `Realtime transaction synchronized`,\n\t\"✅\": `Realtime transaction success`,\n\t\"✨\": `Computation complete`,\n\t\"❌\": `Conflict prevents attempted action`,\n\t\"⭕\": `Operation start`,\n\t\"🐞\": `Possible bug in AtomIO`,\n\t\"👀\": `Subscription added`,\n\t\"👪\": `Family member added`,\n\t\"📁\": `Stow update`,\n\t\"📃\": `Copy mutable`,\n\t\"📖\": `Read state`,\n\t\"📝\": `Write state`,\n\t\"📢\": `Notify subscribers`,\n\t\"🔌\": `Register dependency`,\n\t\"🔍\": `Discover root`,\n\t\"🔥\": `Delete state`,\n\t\"🔧\": `Create mutable atom`,\n\t\"🔨\": `Create immutable atom`,\n\t\"🔴\": `Operation complete`,\n\t\"🗑\": `Evict cached value`,\n\t\"💥\": `Caught`,\n\t\"🙈\": `Subscription canceled`,\n\t\"🛄\": `Apply transaction`,\n\t\"🛠️\": `Install atom into store`,\n\t\"🛫\": `Begin transaction`,\n\t\"🛬\": `Complete transaction`,\n\t\"🧮\": `Computing selector`,\n\t\"🧹\": `Prepare to evict`,\n\t\"🪂\": `Abort transaction`,\n} as const\nexport type LoggerIcon = keyof typeof LoggerIconDictionary\n\nexport const LOG_LEVELS = [`info`, `warn`, `error`] as const\nexport type LogLevel = (typeof LOG_LEVELS)[number]\n\nexport type LogFn = (\n\ticon: LoggerIcon,\n\ttokenType:\n\t\t| `atom`\n\t\t| `readonly_selector`\n\t\t| `selector`\n\t\t| `state`\n\t\t| `timeline`\n\t\t| `transaction`\n\t\t| `unknown`,\n\ttokenKey: string,\n\tmessage: string,\n\t...rest: unknown[]\n) => void\nexport type LogFilter = (...params: Parameters<LogFn>) => boolean\n\nexport type Logger = Record<LogLevel, LogFn>\n\nexport const simpleLog =\n\t(logLevel: keyof Logger): LogFn =>\n\t(icon, tokenType, tokenKey, message, ...rest) => {\n\t\tconsole[logLevel](`${icon} ${tokenType} \"${tokenKey}\" ${message}`, ...rest)\n\t}\nexport const simpleLogger: Logger = {\n\terror: simpleLog(`error`),\n\tinfo: simpleLog(`info`),\n\twarn: simpleLog(`warn`),\n}\n\nexport class AtomIOLogger implements Logger {\n\tpublic constructor(\n\t\tpublic logLevel: `error` | `info` | `warn` | null,\n\t\tprivate readonly filter?: LogFilter,\n\t\tprivate readonly logger: Logger = simpleLogger,\n\t) {}\n\n\tpublic error: LogFn = (...args) => {\n\t\tif ((this.filter?.(...args) ?? true) && this.logLevel !== null) {\n\t\t\tthis.logger.error(...args)\n\t\t}\n\t}\n\tpublic info: LogFn = (...args) => {\n\t\tif ((this.filter?.(...args) ?? true) && this.logLevel === `info`) {\n\t\t\tthis.logger.info(...args)\n\t\t}\n\t}\n\tpublic warn: LogFn = (...args) => {\n\t\tif (\n\t\t\t(this.filter?.(...args) ?? true) &&\n\t\t\tthis.logLevel !== `error` &&\n\t\t\tthis.logLevel !== null\n\t\t) {\n\t\t\tthis.logger.warn(...args)\n\t\t}\n\t}\n}\n","import type { Store, Subject } from \"atom.io/internal\"\nimport { IMPLICIT, 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, undefined, IMPLICIT.STORE)\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\tinstall: (store: Store) => void\n}\n\nexport type ReadonlySelectorFamily<\n\tT,\n\tK extends Json.Serializable = Json.Serializable,\n> = ((key: K) => ReadonlySelectorToken<T>) & {\n\tkey: string\n\ttype: `readonly_selector_family`\n\tsubject: Subject<ReadonlySelectorToken<T>>\n\tinstall: (store: Store) => void\n}\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, IMPLICIT.STORE)\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { StateToken } from \".\"\n\nexport function setState<T, New extends T>(\n\ttoken: StateToken<T>,\n\tvalue: New | ((oldValue: T) => New),\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): void {\n\tconst rejection = Internal.openOperation(token, store)\n\tif (rejection) {\n\t\treturn\n\t}\n\tconst state =\n\t\tInternal.withdraw(token, store) ??\n\t\tInternal.withdrawNewFamilyMember(token, store)\n\tif (state === undefined) {\n\t\tthrow new Internal.NotFoundError(token, store)\n\t}\n\tInternal.setAtomOrSelector(state, value, store)\n\tInternal.closeOperation(store)\n}\n","import {\n\tStore,\n\tcreateAtom,\n\tcreateAtomFamily,\n\tcreateSelector,\n\tcreateSelectorFamily,\n\tcreateTimeline,\n\tcreateTransaction,\n\ttimeTravel,\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) => createAtom(options, undefined, s)\n\t\tthis.atomFamily = (options) => createAtomFamily(options, s)\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) => createTransaction(options, s)\n\t\tthis.timeline = (options) => createTimeline(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) => timeTravel(`backward`, token, s)\n\t\tthis.redo = (token) => timeTravel(`forward`, token, s)\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tsubscribeToState,\n\tsubscribeToTimeline,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\n\nimport type {\n\tFamilyMetadata,\n\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 type TransactionUpdateHandler<ƒ extends ƒn> = (\n\tdata: TransactionUpdate<ƒ>,\n) => void\n\nexport function subscribe<T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\thandleUpdate: UpdateHandler<T>,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe<ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\thandleUpdate: TransactionUpdateHandler<ƒ>,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe(\n\ttoken: TimelineToken,\n\thandleUpdate: (update: TimelineUpdate | `redo` | `undo`) => void,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe(\n\ttoken:\n\t\t| ReadonlySelectorToken<any>\n\t\t| StateToken<any>\n\t\t| TimelineToken\n\t\t| TransactionToken<any>,\n\thandleUpdate: (update: any) => void,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore = IMPLICIT.STORE,\n): () => void {\n\tswitch (token.type) {\n\t\tcase `atom`:\n\t\tcase `readonly_selector`:\n\t\tcase `selector`:\n\t\t\treturn subscribeToState(token, handleUpdate, key, store)\n\t\tcase `transaction`:\n\t\t\treturn subscribeToTransaction(token, handleUpdate, key, store)\n\t\tcase `timeline`:\n\t\t\treturn subscribeToTimeline(token, handleUpdate, key, store)\n\t}\n}\n","import type {\n\tTimeline,\n\tTimelineAtomUpdate,\n\tTimelineSelectorUpdate,\n\tTimelineTransactionUpdate,\n} from \"atom.io/internal\"\nimport { IMPLICIT, createTimeline, timeTravel } from \"atom.io/internal\"\n\nimport type { AtomFamily, AtomToken } from \".\"\n\nexport type TimelineToken = {\n\tkey: string\n\ttype: `timeline`\n}\n\nexport type TimelineOptions = {\n\tkey: string\n\tatoms: (AtomFamily<any, any> | AtomToken<any>)[]\n\tshouldCapture?: (update: TimelineUpdate, timeline: Timeline) => boolean\n}\n\nexport type TimelineUpdate =\n\t| TimelineAtomUpdate\n\t| TimelineSelectorUpdate\n\t| TimelineTransactionUpdate\n\nexport const timeline = (options: TimelineOptions): TimelineToken => {\n\treturn createTimeline(options, IMPLICIT.STORE)\n}\n\nexport const redo = (timeline: TimelineToken): void => {\n\ttimeTravel(`forward`, timeline, IMPLICIT.STORE)\n}\n\nexport const undo = (timeline: TimelineToken): void => {\n\ttimeTravel(`backward`, timeline, IMPLICIT.STORE)\n}\n","import type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, createTransaction, 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\tupdates: (KeyedStateUpdate<unknown> | TransactionUpdate<ƒn>)[]\n\tparams: Parameters<ƒ>\n\toutput: ReturnType<ƒ>\n}\n\nexport type Transactors = Readonly<{\n\tget: <S>(state: ReadonlySelectorToken<S> | StateToken<S>) => S\n\tset: <S, New extends S>(\n\t\tstate: StateToken<S>,\n\t\tnewValue: New | ((oldValue: S) => New),\n\t) => void\n}>\nexport type TransactorsWithRun = Readonly<{\n\tget: <S>(state: ReadonlySelectorToken<S> | StateToken<S>) => S\n\tset: <S, New extends S>(\n\t\tstate: StateToken<S>,\n\t\tnewValue: New | ((oldValue: S) => New),\n\t) => void\n\trun: typeof runTransaction\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 Transact<ƒ extends ƒn> = (\n\ttransactors: TransactorsWithRun,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type TransactionOptions<ƒ extends ƒn> = {\n\tkey: string\n\tdo: Transact<ƒ>\n}\n\nexport type TransactionIO<Token extends TransactionToken<any>> =\n\tToken extends TransactionToken<infer ƒ> ? ƒ : never\n\nexport function transaction<ƒ extends ƒn>(\n\toptions: TransactionOptions<ƒ>,\n): TransactionToken<ƒ> {\n\treturn createTransaction(options, IMPLICIT.STORE)\n}\n\nexport const runTransaction =\n\t<ƒ extends ƒn>(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.cjs
CHANGED
|
@@ -91,11 +91,12 @@ function selectorFamily(options) {
|
|
|
91
91
|
return Internal3.createSelectorFamily(options, Internal3.IMPLICIT.STORE);
|
|
92
92
|
}
|
|
93
93
|
function setState(token, value, store = Internal3__namespace.IMPLICIT.STORE) {
|
|
94
|
+
var _a;
|
|
94
95
|
const rejection = Internal3__namespace.openOperation(token, store);
|
|
95
96
|
if (rejection) {
|
|
96
97
|
return;
|
|
97
98
|
}
|
|
98
|
-
const state = Internal3__namespace.withdraw(token, store);
|
|
99
|
+
const state = (_a = Internal3__namespace.withdraw(token, store)) != null ? _a : Internal3__namespace.withdrawNewFamilyMember(token, store);
|
|
99
100
|
if (state === void 0) {
|
|
100
101
|
throw new Internal3__namespace.NotFoundError(token, store);
|
|
101
102
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/atom.ts","../src/dispose.ts","../src/get-state.ts","../src/logger.ts","../src/selector.ts","../src/set-state.ts","../src/silo.ts","../src/subscribe.ts","../src/timeline.ts","../src/transaction.ts"],"names":["Internal","IMPLICIT","createAtom","createAtomFamily","createSelector","createSelectorFamily","createTimeline","timeTravel","timeline","createTransaction","withdraw"],"mappings":"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","sourcesContent":["import type { Store, Subject, Transceiver } from \"atom.io/internal\"\nimport { IMPLICIT, createAtom, createAtomFamily } 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) | 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(\n\toptions: AtomOptions<any> | MutableAtomOptions<any, any>,\n): AtomToken<any> {\n\treturn createAtom(options, undefined, IMPLICIT.STORE)\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\tmutable?: boolean\n\tinstall: (store: Store) => void\n}\n\n// biome-ignore format: intersection\nexport type MutableAtomFamilyOptions<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = \n\t& 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}`\n\t\t\ttype: `atom_family`\n\t\t\tsubject: Subject<MutableAtomToken<Core, SerializableCore>>\n\t\t\tmutable: true\n\t\t\tinstall: (store: Store) => void\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\treturn createAtomFamily(options, IMPLICIT.STORE)\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { ReadonlySelectorToken, StateToken } from \".\"\n\nexport function dispose(\n\ttoken: ReadonlySelectorToken<any> | StateToken<any>,\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): void {\n\tswitch (token.type) {\n\t\tcase `atom`:\n\t\t\tInternal.deleteAtom(token, store)\n\t\t\tbreak\n\t\tcase `selector`:\n\t\tcase `readonly_selector`:\n\t\t\tInternal.deleteSelector(token, store)\n\t\t\tbreak\n\t}\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { ReadonlySelectorToken, StateToken } from \".\"\n\nexport function getState<T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): T {\n\tconst state =\n\t\tInternal.withdraw(token, store) ??\n\t\tInternal.withdrawNewFamilyMember(token, store)\n\tif (state === undefined) {\n\t\tthrow new Internal.NotFoundError(token, store)\n\t}\n\treturn Internal.readOrComputeValue(state, store)\n}\n","const LoggerIconDictionary = {\n\t\"⌛\": `Timeline event fully captured`,\n\t\"⏩\": `Timeline redo`,\n\t\"⏪\": `Timeline undo`,\n\t\"⏭️\": `Transaction redo`,\n\t\"⏮️\": `Transaction undo`,\n\t\"⏳\": `Timeline event partially captured`,\n\t\"⏹️\": `Time-travel complete`,\n\t\"💁\": `Notice`,\n\t\"🔄\": `Realtime transaction synchronized`,\n\t\"✅\": `Realtime transaction success`,\n\t\"✨\": `Computation complete`,\n\t\"❌\": `Conflict prevents attempted action`,\n\t\"⭕\": `Operation start`,\n\t\"🐞\": `Possible bug in AtomIO`,\n\t\"👀\": `Subscription added`,\n\t\"👪\": `Family member added`,\n\t\"📁\": `Stow update`,\n\t\"📃\": `Copy mutable`,\n\t\"📖\": `Read state`,\n\t\"📝\": `Write state`,\n\t\"📢\": `Notify subscribers`,\n\t\"🔌\": `Register dependency`,\n\t\"🔍\": `Discover root`,\n\t\"🔥\": `Delete state`,\n\t\"🔧\": `Create mutable atom`,\n\t\"🔨\": `Create immutable atom`,\n\t\"🔴\": `Operation complete`,\n\t\"🗑\": `Evict cached value`,\n\t\"💥\": `Caught`,\n\t\"🙈\": `Subscription canceled`,\n\t\"🛄\": `Apply transaction`,\n\t\"🛠️\": `Install atom into store`,\n\t\"🛫\": `Begin transaction`,\n\t\"🛬\": `Complete transaction`,\n\t\"🧮\": `Computing selector`,\n\t\"🧹\": `Prepare to evict`,\n\t\"🪂\": `Abort transaction`,\n} as const\nexport type LoggerIcon = keyof typeof LoggerIconDictionary\n\nexport const LOG_LEVELS = [`info`, `warn`, `error`] as const\nexport type LogLevel = (typeof LOG_LEVELS)[number]\n\nexport type LogFn = (\n\ticon: LoggerIcon,\n\ttokenType:\n\t\t| `atom`\n\t\t| `readonly_selector`\n\t\t| `selector`\n\t\t| `state`\n\t\t| `timeline`\n\t\t| `transaction`\n\t\t| `unknown`,\n\ttokenKey: string,\n\tmessage: string,\n\t...rest: unknown[]\n) => void\nexport type LogFilter = (...params: Parameters<LogFn>) => boolean\n\nexport type Logger = Record<LogLevel, LogFn>\n\nexport const simpleLog =\n\t(logLevel: keyof Logger): LogFn =>\n\t(icon, tokenType, tokenKey, message, ...rest) => {\n\t\tconsole[logLevel](`${icon} ${tokenType} \"${tokenKey}\" ${message}`, ...rest)\n\t}\nexport const simpleLogger: Logger = {\n\terror: simpleLog(`error`),\n\tinfo: simpleLog(`info`),\n\twarn: simpleLog(`warn`),\n}\n\nexport class AtomIOLogger implements Logger {\n\tpublic constructor(\n\t\tpublic logLevel: `error` | `info` | `warn` | null,\n\t\tprivate readonly filter?: LogFilter,\n\t\tprivate readonly logger: Logger = simpleLogger,\n\t) {}\n\n\tpublic error: LogFn = (...args) => {\n\t\tif ((this.filter?.(...args) ?? true) && this.logLevel !== null) {\n\t\t\tthis.logger.error(...args)\n\t\t}\n\t}\n\tpublic info: LogFn = (...args) => {\n\t\tif ((this.filter?.(...args) ?? true) && this.logLevel === `info`) {\n\t\t\tthis.logger.info(...args)\n\t\t}\n\t}\n\tpublic warn: LogFn = (...args) => {\n\t\tif (\n\t\t\t(this.filter?.(...args) ?? true) &&\n\t\t\tthis.logLevel !== `error` &&\n\t\t\tthis.logLevel !== null\n\t\t) {\n\t\t\tthis.logger.warn(...args)\n\t\t}\n\t}\n}\n","import type { Store, Subject } from \"atom.io/internal\"\nimport { IMPLICIT, 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, undefined, IMPLICIT.STORE)\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\tinstall: (store: Store) => void\n}\n\nexport type ReadonlySelectorFamily<\n\tT,\n\tK extends Json.Serializable = Json.Serializable,\n> = ((key: K) => ReadonlySelectorToken<T>) & {\n\tkey: string\n\ttype: `readonly_selector_family`\n\tsubject: Subject<ReadonlySelectorToken<T>>\n\tinstall: (store: Store) => void\n}\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, IMPLICIT.STORE)\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { StateToken } from \".\"\n\nexport function setState<T, New extends T>(\n\ttoken: StateToken<T>,\n\tvalue: New | ((oldValue: T) => New),\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): void {\n\tconst rejection = Internal.openOperation(token, store)\n\tif (rejection) {\n\t\treturn\n\t}\n\tconst state = Internal.withdraw(token, store)\n\tif (state === undefined) {\n\t\tthrow new Internal.NotFoundError(token, store)\n\t}\n\tInternal.setAtomOrSelector(state, value, store)\n\tInternal.closeOperation(store)\n}\n","import {\n\tStore,\n\tcreateAtom,\n\tcreateAtomFamily,\n\tcreateSelector,\n\tcreateSelectorFamily,\n\tcreateTimeline,\n\tcreateTransaction,\n\ttimeTravel,\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) => createAtom(options, undefined, s)\n\t\tthis.atomFamily = (options) => createAtomFamily(options, s)\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) => createTransaction(options, s)\n\t\tthis.timeline = (options) => createTimeline(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) => timeTravel(`backward`, token, s)\n\t\tthis.redo = (token) => timeTravel(`forward`, token, s)\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tsubscribeToState,\n\tsubscribeToTimeline,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\n\nimport type {\n\tFamilyMetadata,\n\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 type TransactionUpdateHandler<ƒ extends ƒn> = (\n\tdata: TransactionUpdate<ƒ>,\n) => void\n\nexport function subscribe<T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\thandleUpdate: UpdateHandler<T>,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe<ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\thandleUpdate: TransactionUpdateHandler<ƒ>,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe(\n\ttoken: TimelineToken,\n\thandleUpdate: (update: TimelineUpdate | `redo` | `undo`) => void,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe(\n\ttoken:\n\t\t| ReadonlySelectorToken<any>\n\t\t| StateToken<any>\n\t\t| TimelineToken\n\t\t| TransactionToken<any>,\n\thandleUpdate: (update: any) => void,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore = IMPLICIT.STORE,\n): () => void {\n\tswitch (token.type) {\n\t\tcase `atom`:\n\t\tcase `readonly_selector`:\n\t\tcase `selector`:\n\t\t\treturn subscribeToState(token, handleUpdate, key, store)\n\t\tcase `transaction`:\n\t\t\treturn subscribeToTransaction(token, handleUpdate, key, store)\n\t\tcase `timeline`:\n\t\t\treturn subscribeToTimeline(token, handleUpdate, key, store)\n\t}\n}\n","import type {\n\tTimeline,\n\tTimelineAtomUpdate,\n\tTimelineSelectorUpdate,\n\tTimelineTransactionUpdate,\n} from \"atom.io/internal\"\nimport { IMPLICIT, createTimeline, timeTravel } from \"atom.io/internal\"\n\nimport type { AtomFamily, AtomToken } from \".\"\n\nexport type TimelineToken = {\n\tkey: string\n\ttype: `timeline`\n}\n\nexport type TimelineOptions = {\n\tkey: string\n\tatoms: (AtomFamily<any, any> | AtomToken<any>)[]\n\tshouldCapture?: (update: TimelineUpdate, timeline: Timeline) => boolean\n}\n\nexport type TimelineUpdate =\n\t| TimelineAtomUpdate\n\t| TimelineSelectorUpdate\n\t| TimelineTransactionUpdate\n\nexport const timeline = (options: TimelineOptions): TimelineToken => {\n\treturn createTimeline(options, IMPLICIT.STORE)\n}\n\nexport const redo = (timeline: TimelineToken): void => {\n\ttimeTravel(`forward`, timeline, IMPLICIT.STORE)\n}\n\nexport const undo = (timeline: TimelineToken): void => {\n\ttimeTravel(`backward`, timeline, IMPLICIT.STORE)\n}\n","import type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, createTransaction, 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\tupdates: (KeyedStateUpdate<unknown> | TransactionUpdate<ƒn>)[]\n\tparams: Parameters<ƒ>\n\toutput: ReturnType<ƒ>\n}\n\nexport type Transactors = Readonly<{\n\tget: <S>(state: ReadonlySelectorToken<S> | StateToken<S>) => S\n\tset: <S, New extends S>(\n\t\tstate: StateToken<S>,\n\t\tnewValue: New | ((oldValue: S) => New),\n\t) => void\n}>\nexport type TransactorsWithRun = Readonly<{\n\tget: <S>(state: ReadonlySelectorToken<S> | StateToken<S>) => S\n\tset: <S, New extends S>(\n\t\tstate: StateToken<S>,\n\t\tnewValue: New | ((oldValue: S) => New),\n\t) => void\n\trun: typeof runTransaction\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 Transact<ƒ extends ƒn> = (\n\ttransactors: TransactorsWithRun,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type TransactionOptions<ƒ extends ƒn> = {\n\tkey: string\n\tdo: Transact<ƒ>\n}\n\nexport type TransactionIO<Token extends TransactionToken<any>> =\n\tToken extends TransactionToken<infer ƒ> ? ƒ : never\n\nexport function transaction<ƒ extends ƒn>(\n\toptions: TransactionOptions<ƒ>,\n): TransactionToken<ƒ> {\n\treturn createTransaction(options, IMPLICIT.STORE)\n}\n\nexport const runTransaction =\n\t<ƒ extends ƒn>(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/atom.ts","../src/dispose.ts","../src/get-state.ts","../src/logger.ts","../src/selector.ts","../src/set-state.ts","../src/silo.ts","../src/subscribe.ts","../src/timeline.ts","../src/transaction.ts"],"names":["Internal","IMPLICIT","createAtom","createAtomFamily","createSelector","createSelectorFamily","createTimeline","timeTravel","timeline","createTransaction","withdraw"],"mappings":"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","sourcesContent":["import type { Store, Subject, Transceiver } from \"atom.io/internal\"\nimport { IMPLICIT, createAtom, createAtomFamily } 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) | 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(\n\toptions: AtomOptions<any> | MutableAtomOptions<any, any>,\n): AtomToken<any> {\n\treturn createAtom(options, undefined, IMPLICIT.STORE)\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\tmutable?: boolean\n\tinstall: (store: Store) => void\n}\n\n// biome-ignore format: intersection\nexport type MutableAtomFamilyOptions<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = \n\t& 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}`\n\t\t\ttype: `atom_family`\n\t\t\tsubject: Subject<MutableAtomToken<Core, SerializableCore>>\n\t\t\tmutable: true\n\t\t\tinstall: (store: Store) => void\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\treturn createAtomFamily(options, IMPLICIT.STORE)\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { ReadonlySelectorToken, StateToken } from \".\"\n\nexport function dispose(\n\ttoken: ReadonlySelectorToken<any> | StateToken<any>,\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): void {\n\tswitch (token.type) {\n\t\tcase `atom`:\n\t\t\tInternal.deleteAtom(token, store)\n\t\t\tbreak\n\t\tcase `selector`:\n\t\tcase `readonly_selector`:\n\t\t\tInternal.deleteSelector(token, store)\n\t\t\tbreak\n\t}\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { ReadonlySelectorToken, StateToken } from \".\"\n\nexport function getState<T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): T {\n\tconst state =\n\t\tInternal.withdraw(token, store) ??\n\t\tInternal.withdrawNewFamilyMember(token, store)\n\tif (state === undefined) {\n\t\tthrow new Internal.NotFoundError(token, store)\n\t}\n\treturn Internal.readOrComputeValue(state, store)\n}\n","const LoggerIconDictionary = {\n\t\"⌛\": `Timeline event fully captured`,\n\t\"⏩\": `Timeline redo`,\n\t\"⏪\": `Timeline undo`,\n\t\"⏭️\": `Transaction redo`,\n\t\"⏮️\": `Transaction undo`,\n\t\"⏳\": `Timeline event partially captured`,\n\t\"⏹️\": `Time-travel complete`,\n\t\"💁\": `Notice`,\n\t\"🔄\": `Realtime transaction synchronized`,\n\t\"✅\": `Realtime transaction success`,\n\t\"✨\": `Computation complete`,\n\t\"❌\": `Conflict prevents attempted action`,\n\t\"⭕\": `Operation start`,\n\t\"🐞\": `Possible bug in AtomIO`,\n\t\"👀\": `Subscription added`,\n\t\"👪\": `Family member added`,\n\t\"📁\": `Stow update`,\n\t\"📃\": `Copy mutable`,\n\t\"📖\": `Read state`,\n\t\"📝\": `Write state`,\n\t\"📢\": `Notify subscribers`,\n\t\"🔌\": `Register dependency`,\n\t\"🔍\": `Discover root`,\n\t\"🔥\": `Delete state`,\n\t\"🔧\": `Create mutable atom`,\n\t\"🔨\": `Create immutable atom`,\n\t\"🔴\": `Operation complete`,\n\t\"🗑\": `Evict cached value`,\n\t\"💥\": `Caught`,\n\t\"🙈\": `Subscription canceled`,\n\t\"🛄\": `Apply transaction`,\n\t\"🛠️\": `Install atom into store`,\n\t\"🛫\": `Begin transaction`,\n\t\"🛬\": `Complete transaction`,\n\t\"🧮\": `Computing selector`,\n\t\"🧹\": `Prepare to evict`,\n\t\"🪂\": `Abort transaction`,\n} as const\nexport type LoggerIcon = keyof typeof LoggerIconDictionary\n\nexport const LOG_LEVELS = [`info`, `warn`, `error`] as const\nexport type LogLevel = (typeof LOG_LEVELS)[number]\n\nexport type LogFn = (\n\ticon: LoggerIcon,\n\ttokenType:\n\t\t| `atom`\n\t\t| `readonly_selector`\n\t\t| `selector`\n\t\t| `state`\n\t\t| `timeline`\n\t\t| `transaction`\n\t\t| `unknown`,\n\ttokenKey: string,\n\tmessage: string,\n\t...rest: unknown[]\n) => void\nexport type LogFilter = (...params: Parameters<LogFn>) => boolean\n\nexport type Logger = Record<LogLevel, LogFn>\n\nexport const simpleLog =\n\t(logLevel: keyof Logger): LogFn =>\n\t(icon, tokenType, tokenKey, message, ...rest) => {\n\t\tconsole[logLevel](`${icon} ${tokenType} \"${tokenKey}\" ${message}`, ...rest)\n\t}\nexport const simpleLogger: Logger = {\n\terror: simpleLog(`error`),\n\tinfo: simpleLog(`info`),\n\twarn: simpleLog(`warn`),\n}\n\nexport class AtomIOLogger implements Logger {\n\tpublic constructor(\n\t\tpublic logLevel: `error` | `info` | `warn` | null,\n\t\tprivate readonly filter?: LogFilter,\n\t\tprivate readonly logger: Logger = simpleLogger,\n\t) {}\n\n\tpublic error: LogFn = (...args) => {\n\t\tif ((this.filter?.(...args) ?? true) && this.logLevel !== null) {\n\t\t\tthis.logger.error(...args)\n\t\t}\n\t}\n\tpublic info: LogFn = (...args) => {\n\t\tif ((this.filter?.(...args) ?? true) && this.logLevel === `info`) {\n\t\t\tthis.logger.info(...args)\n\t\t}\n\t}\n\tpublic warn: LogFn = (...args) => {\n\t\tif (\n\t\t\t(this.filter?.(...args) ?? true) &&\n\t\t\tthis.logLevel !== `error` &&\n\t\t\tthis.logLevel !== null\n\t\t) {\n\t\t\tthis.logger.warn(...args)\n\t\t}\n\t}\n}\n","import type { Store, Subject } from \"atom.io/internal\"\nimport { IMPLICIT, 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, undefined, IMPLICIT.STORE)\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\tinstall: (store: Store) => void\n}\n\nexport type ReadonlySelectorFamily<\n\tT,\n\tK extends Json.Serializable = Json.Serializable,\n> = ((key: K) => ReadonlySelectorToken<T>) & {\n\tkey: string\n\ttype: `readonly_selector_family`\n\tsubject: Subject<ReadonlySelectorToken<T>>\n\tinstall: (store: Store) => void\n}\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, IMPLICIT.STORE)\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { StateToken } from \".\"\n\nexport function setState<T, New extends T>(\n\ttoken: StateToken<T>,\n\tvalue: New | ((oldValue: T) => New),\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): void {\n\tconst rejection = Internal.openOperation(token, store)\n\tif (rejection) {\n\t\treturn\n\t}\n\tconst state =\n\t\tInternal.withdraw(token, store) ??\n\t\tInternal.withdrawNewFamilyMember(token, store)\n\tif (state === undefined) {\n\t\tthrow new Internal.NotFoundError(token, store)\n\t}\n\tInternal.setAtomOrSelector(state, value, store)\n\tInternal.closeOperation(store)\n}\n","import {\n\tStore,\n\tcreateAtom,\n\tcreateAtomFamily,\n\tcreateSelector,\n\tcreateSelectorFamily,\n\tcreateTimeline,\n\tcreateTransaction,\n\ttimeTravel,\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) => createAtom(options, undefined, s)\n\t\tthis.atomFamily = (options) => createAtomFamily(options, s)\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) => createTransaction(options, s)\n\t\tthis.timeline = (options) => createTimeline(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) => timeTravel(`backward`, token, s)\n\t\tthis.redo = (token) => timeTravel(`forward`, token, s)\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tsubscribeToState,\n\tsubscribeToTimeline,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\n\nimport type {\n\tFamilyMetadata,\n\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 type TransactionUpdateHandler<ƒ extends ƒn> = (\n\tdata: TransactionUpdate<ƒ>,\n) => void\n\nexport function subscribe<T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\thandleUpdate: UpdateHandler<T>,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe<ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\thandleUpdate: TransactionUpdateHandler<ƒ>,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe(\n\ttoken: TimelineToken,\n\thandleUpdate: (update: TimelineUpdate | `redo` | `undo`) => void,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe(\n\ttoken:\n\t\t| ReadonlySelectorToken<any>\n\t\t| StateToken<any>\n\t\t| TimelineToken\n\t\t| TransactionToken<any>,\n\thandleUpdate: (update: any) => void,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore = IMPLICIT.STORE,\n): () => void {\n\tswitch (token.type) {\n\t\tcase `atom`:\n\t\tcase `readonly_selector`:\n\t\tcase `selector`:\n\t\t\treturn subscribeToState(token, handleUpdate, key, store)\n\t\tcase `transaction`:\n\t\t\treturn subscribeToTransaction(token, handleUpdate, key, store)\n\t\tcase `timeline`:\n\t\t\treturn subscribeToTimeline(token, handleUpdate, key, store)\n\t}\n}\n","import type {\n\tTimeline,\n\tTimelineAtomUpdate,\n\tTimelineSelectorUpdate,\n\tTimelineTransactionUpdate,\n} from \"atom.io/internal\"\nimport { IMPLICIT, createTimeline, timeTravel } from \"atom.io/internal\"\n\nimport type { AtomFamily, AtomToken } from \".\"\n\nexport type TimelineToken = {\n\tkey: string\n\ttype: `timeline`\n}\n\nexport type TimelineOptions = {\n\tkey: string\n\tatoms: (AtomFamily<any, any> | AtomToken<any>)[]\n\tshouldCapture?: (update: TimelineUpdate, timeline: Timeline) => boolean\n}\n\nexport type TimelineUpdate =\n\t| TimelineAtomUpdate\n\t| TimelineSelectorUpdate\n\t| TimelineTransactionUpdate\n\nexport const timeline = (options: TimelineOptions): TimelineToken => {\n\treturn createTimeline(options, IMPLICIT.STORE)\n}\n\nexport const redo = (timeline: TimelineToken): void => {\n\ttimeTravel(`forward`, timeline, IMPLICIT.STORE)\n}\n\nexport const undo = (timeline: TimelineToken): void => {\n\ttimeTravel(`backward`, timeline, IMPLICIT.STORE)\n}\n","import type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, createTransaction, 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\tupdates: (KeyedStateUpdate<unknown> | TransactionUpdate<ƒn>)[]\n\tparams: Parameters<ƒ>\n\toutput: ReturnType<ƒ>\n}\n\nexport type Transactors = Readonly<{\n\tget: <S>(state: ReadonlySelectorToken<S> | StateToken<S>) => S\n\tset: <S, New extends S>(\n\t\tstate: StateToken<S>,\n\t\tnewValue: New | ((oldValue: S) => New),\n\t) => void\n}>\nexport type TransactorsWithRun = Readonly<{\n\tget: <S>(state: ReadonlySelectorToken<S> | StateToken<S>) => S\n\tset: <S, New extends S>(\n\t\tstate: StateToken<S>,\n\t\tnewValue: New | ((oldValue: S) => New),\n\t) => void\n\trun: typeof runTransaction\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 Transact<ƒ extends ƒn> = (\n\ttransactors: TransactorsWithRun,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type TransactionOptions<ƒ extends ƒn> = {\n\tkey: string\n\tdo: Transact<ƒ>\n}\n\nexport type TransactionIO<Token extends TransactionToken<any>> =\n\tToken extends TransactionToken<infer ƒ> ? ƒ : never\n\nexport function transaction<ƒ extends ƒn>(\n\toptions: TransactionOptions<ƒ>,\n): TransactionToken<ƒ> {\n\treturn createTransaction(options, IMPLICIT.STORE)\n}\n\nexport const runTransaction =\n\t<ƒ extends ƒn>(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.d.ts
CHANGED
|
@@ -237,7 +237,12 @@ type SelectorToken<_> = {
|
|
|
237
237
|
family?: FamilyMetadata;
|
|
238
238
|
__brand?: _;
|
|
239
239
|
};
|
|
240
|
+
/**
|
|
241
|
+
* @deprecated Prefer `WritableToken`.
|
|
242
|
+
*/
|
|
240
243
|
type StateToken<T> = AtomToken<T> | SelectorToken<T>;
|
|
244
|
+
type WritableToken<T> = AtomToken<T> | SelectorToken<T>;
|
|
245
|
+
type ReadableToken<T> = ReadonlySelectorToken<T> | WritableToken<T>;
|
|
241
246
|
type ReadonlySelectorToken<_> = {
|
|
242
247
|
key: string;
|
|
243
248
|
type: `readonly_selector`;
|
|
@@ -249,4 +254,4 @@ type FamilyMetadata = {
|
|
|
249
254
|
subKey: string;
|
|
250
255
|
};
|
|
251
256
|
|
|
252
|
-
export { type AtomEffect, type AtomFamily, type AtomFamilyOptions, AtomIOLogger, type AtomOptions, type AtomToken, type Effectors, type FamilyMetadata, type KeyedStateUpdate, LOG_LEVELS, type LogFilter, type LogFn, type LogLevel, type Logger, type LoggerIcon, type MutableAtomFamily, type MutableAtomFamilyOptions, type MutableAtomOptions, type MutableAtomToken, type Read, type ReadonlySelectorFamily, type ReadonlySelectorFamilyOptions, type ReadonlySelectorOptions, type ReadonlySelectorToken, type ReadonlyTransactors, type SelectorFamily, type SelectorFamilyOptions, type SelectorOptions, type SelectorToken, Silo, type StateToken, type StateUpdate, type TimelineOptions, type TimelineToken, type TimelineUpdate, type Transact, type TransactionIO, type TransactionOptions, type TransactionToken, type TransactionUpdate, type TransactionUpdateHandler, type Transactors, type TransactorsWithRun, type UpdateHandler, type Write, atom, atomFamily, dispose, getState, redo, runTransaction, selector, selectorFamily, setState, simpleLog, simpleLogger, subscribe, timeline, transaction, undo, type ƒn };
|
|
257
|
+
export { type AtomEffect, type AtomFamily, type AtomFamilyOptions, AtomIOLogger, type AtomOptions, type AtomToken, type Effectors, type FamilyMetadata, type KeyedStateUpdate, LOG_LEVELS, type LogFilter, type LogFn, type LogLevel, type Logger, type LoggerIcon, type MutableAtomFamily, type MutableAtomFamilyOptions, type MutableAtomOptions, type MutableAtomToken, type Read, type ReadableToken, type ReadonlySelectorFamily, type ReadonlySelectorFamilyOptions, type ReadonlySelectorOptions, type ReadonlySelectorToken, type ReadonlyTransactors, type SelectorFamily, type SelectorFamilyOptions, type SelectorOptions, type SelectorToken, Silo, type StateToken, type StateUpdate, type TimelineOptions, type TimelineToken, type TimelineUpdate, type Transact, type TransactionIO, type TransactionOptions, type TransactionToken, type TransactionUpdate, type TransactionUpdateHandler, type Transactors, type TransactorsWithRun, type UpdateHandler, type WritableToken, type Write, atom, atomFamily, dispose, getState, redo, runTransaction, selector, selectorFamily, setState, simpleLog, simpleLogger, subscribe, timeline, transaction, undo, type ƒn };
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { AtomIOLogger, LOG_LEVELS, Silo, atom, atomFamily, dispose, getState, redo, runTransaction, selector, selectorFamily, setState, simpleLog, simpleLogger, subscribe, timeline, transaction, undo } from './chunk-
|
|
1
|
+
export { AtomIOLogger, LOG_LEVELS, Silo, atom, atomFamily, dispose, getState, redo, runTransaction, selector, selectorFamily, setState, simpleLog, simpleLogger, subscribe, timeline, transaction, undo } from './chunk-K22LR3V6.js';
|
|
2
2
|
import './chunk-PZLG2HP3.js';
|
|
3
3
|
//# sourceMappingURL=out.js.map
|
|
4
4
|
//# sourceMappingURL=index.js.map
|