atom.io 0.18.1 → 0.18.3
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 +0 -2
- package/data/dist/index.js +2 -4
- package/dist/{chunk-JDUNWJFB.js → chunk-BWWVY5O5.js} +1 -3
- package/dist/{chunk-NYCVSXQB.js → chunk-CVBEVTM5.js} +0 -2
- package/dist/chunk-O47EQUM6.js +29 -0
- package/dist/{chunk-PZLG2HP3.js → chunk-U2IICNHQ.js} +0 -2
- package/dist/{chunk-XACXFU3B.js → chunk-VAE5OCKN.js} +0 -2
- package/dist/{chunk-NYTGCPHB.js → chunk-WX2NCOZR.js} +0 -2
- package/dist/{chunk-IZHOMSXA.js → chunk-YDOGCZ53.js} +0 -2
- package/dist/index.cjs +0 -2
- package/dist/index.js +1 -3
- package/internal/dist/index.cjs +46 -102
- package/internal/dist/index.d.ts +23 -23
- package/internal/dist/index.js +48 -104
- package/internal/src/families/create-regular-atom-family.ts +4 -4
- package/internal/src/get-state/get-from-store.ts +2 -5
- package/internal/src/mutable/create-mutable-atom-family.ts +4 -4
- package/internal/src/selector/register-selector.ts +3 -14
- package/internal/src/set-state/set-into-store.ts +2 -5
- package/internal/src/store/withdraw-new-family-member.ts +38 -28
- package/internal/src/store/withdraw.ts +20 -23
- package/internal/src/subscribe/subscribe-to-state.ts +2 -3
- package/internal/src/subscribe/subscribe-to-timeline.ts +0 -5
- package/internal/src/subscribe/subscribe-to-transaction.ts +0 -5
- package/internal/src/timeline/add-atom-to-timeline.ts +6 -15
- package/internal/src/timeline/create-timeline.ts +0 -27
- package/introspection/dist/index.cjs +0 -2
- package/introspection/dist/index.js +1 -3
- package/json/dist/index.cjs +0 -2
- package/json/dist/index.js +3 -5
- package/package.json +6 -5
- package/react/dist/index.cjs +2 -5
- package/react/dist/index.js +3 -6
- package/react/src/use-tl.ts +2 -2
- package/react-devtools/dist/index.cjs +1 -3
- package/react-devtools/dist/index.css +0 -1
- package/react-devtools/dist/index.js +4 -6
- package/realtime/dist/index.cjs +0 -2
- package/realtime/dist/index.js +1 -3
- package/realtime-client/dist/index.cjs +1 -3
- package/realtime-client/dist/index.js +15 -41
- package/realtime-react/dist/index.cjs +0 -2
- package/realtime-react/dist/index.js +2 -4
- package/realtime-server/dist/index.cjs +3 -5
- package/realtime-server/dist/index.js +4 -6
- package/realtime-server/src/ipc-sockets/parent-socket.ts +4 -3
- package/realtime-testing/dist/index.cjs +43 -7
- package/realtime-testing/dist/index.js +6 -9
- package/realtime-testing/src/setup-realtime-test.tsx +3 -5
- package/transceivers/set-rtx/dist/index.cjs +0 -2
- package/transceivers/set-rtx/dist/index.js +1 -3
- package/data/dist/index.cjs.map +0 -1
- package/data/dist/index.js.map +0 -1
- package/dist/chunk-IZHOMSXA.js.map +0 -1
- package/dist/chunk-JDUNWJFB.js.map +0 -1
- package/dist/chunk-NYCVSXQB.js.map +0 -1
- package/dist/chunk-NYTGCPHB.js.map +0 -1
- package/dist/chunk-PZLG2HP3.js.map +0 -1
- package/dist/chunk-XACXFU3B.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/internal/dist/index.cjs.map +0 -1
- package/internal/dist/index.js.map +0 -1
- package/introspection/dist/index.cjs.map +0 -1
- package/introspection/dist/index.js.map +0 -1
- package/json/dist/index.cjs.map +0 -1
- package/json/dist/index.js.map +0 -1
- package/react/dist/index.cjs.map +0 -1
- package/react/dist/index.js.map +0 -1
- package/react-devtools/dist/index.cjs.map +0 -1
- package/react-devtools/dist/index.css.map +0 -1
- package/react-devtools/dist/index.js.map +0 -1
- package/realtime/dist/index.cjs.map +0 -1
- package/realtime/dist/index.js.map +0 -1
- package/realtime-client/dist/index.cjs.map +0 -1
- package/realtime-client/dist/index.js.map +0 -1
- package/realtime-react/dist/index.cjs.map +0 -1
- package/realtime-react/dist/index.js.map +0 -1
- package/realtime-server/dist/index.cjs.map +0 -1
- package/realtime-server/dist/index.js.map +0 -1
- package/realtime-testing/dist/index.cjs.map +0 -1
- package/realtime-testing/dist/index.js.map +0 -1
- package/transceivers/set-rtx/dist/index.cjs.map +0 -1
- package/transceivers/set-rtx/dist/index.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import '../../../dist/chunk-
|
|
1
|
+
import '../../../dist/chunk-U2IICNHQ.js';
|
|
2
2
|
import { Subject } from 'atom.io/internal';
|
|
3
3
|
import { stringifyJson, parseJson } from 'atom.io/json';
|
|
4
4
|
|
|
@@ -213,5 +213,3 @@ var SetRTX = class _SetRTX extends Set {
|
|
|
213
213
|
};
|
|
214
214
|
|
|
215
215
|
export { SetRTX };
|
|
216
|
-
//# sourceMappingURL=out.js.map
|
|
217
|
-
//# sourceMappingURL=index.js.map
|
package/data/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dict.ts","../src/join.ts","../../../rel8/junction/src/junction.ts","../src/struct.ts","../src/struct-family.ts","../src/until.ts"],"names":["findState","IMPLICIT","findInStore","a","b","join","createStandaloneSelector","capitalize","createRegularAtomFamily","createSelectorFamily"],"mappings":"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","sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tcreateStandaloneSelector,\n\tfindInStore,\n} 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.ReadonlySelectorFamilyToken<State, Key>\n\t\t| AtomIO.RegularAtomFamilyToken<State, Key>\n\t\t| AtomIO.WritableSelectorFamily<State, Key>,\n\tindex:\n\t\t| AtomIO.ReadonlySelectorToken<Key[]>\n\t\t| AtomIO.RegularAtomToken<Key[]>\n\t\t| AtomIO.WritableSelectorToken<Key[]>,\n\tstore: Store = IMPLICIT.STORE,\n): AtomIO.ReadonlySelectorToken<{ [K in Stringified<Key>]: State }> {\n\treturn createStandaloneSelector(\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(findInStore(findState, key, store))\n\t\t\t\t\treturn acc\n\t\t\t\t}, {} as any)\n\t\t\t},\n\t\t},\n\t\tstore,\n\t)\n}\n","/* eslint-disable @typescript-eslint/ban-types */\nimport type {\n\tMutableAtomFamily,\n\tRead,\n\tReadonlySelectorFamily,\n\tRegularAtomFamily,\n\tTransactors,\n\tWrite,\n} from \"atom.io\"\nimport { dispose, findState, getState, setState } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tcreateMutableAtomFamily,\n\tcreateRegularAtomFamily,\n\tcreateSelectorFamily,\n\tfindInStore,\n\tgetFromStore,\n\tgetJsonFamily,\n\tsetIntoStore,\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 = {\n\tget: getState,\n\tset: setState,\n\tfind: findState,\n}\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 options: JoinOptions<ASide, BSide, Cardinality, Content>\n\tprivate defaultContent: Content | undefined\n\tprivate transactors: Transactors\n\tpublic relations: Junction<ASide, BSide, Content>\n\tpublic states: 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\tconst originalTransactors = this.transactors\n\t\tthis.transactors = transactors\n\t\trun(this)\n\t\tthis.transactors = originalTransactors\n\t}\n\n\tpublic alternates: Map<string, Join<ASide, BSide, Cardinality, Content>>\n\tpublic in(store: Store): Join<ASide, BSide, Cardinality, Content> {\n\t\tconst key = store.config.name\n\t\tconst alternate = this.alternates.get(key)\n\t\tif (alternate) {\n\t\t\treturn alternate\n\t\t}\n\t\tconst join = new Join(this.options, this.defaultContent, store)\n\t\tthis.alternates.set(key, join)\n\t\tjoin.alternates = this.alternates\n\t\treturn join\n\t}\n\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\tthis.options = options\n\t\tthis.defaultContent = defaultContent\n\t\tthis.alternates = new Map()\n\t\tthis.alternates.set(store.config.name, this)\n\t\tthis.transactors = {\n\t\t\tget: (token) => getFromStore(token, store),\n\t\t\tset: (token, value) => setIntoStore(token, value, store),\n\t\t\tfind: ((token, key) => findInStore(token, key, store)) as typeof findState,\n\t\t}\n\t\tconst a: ASide = options.between[0]\n\t\tconst b: BSide = options.between[1]\n\t\tconst relatedKeysAtoms = 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: relatedKeysAtoms }\n\t\tconst getRelatedKeys: Read<(key: string) => SetRTX<string>> = (\n\t\t\t{ find, get },\n\t\t\tkey,\n\t\t) => get(find(relatedKeysAtoms, 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 { set, find } = transactors\n\t\t\tconst aKeysState = find(relatedKeysAtoms, a)\n\t\t\tconst bKeysState = find(relatedKeysAtoms, b)\n\t\t\tset(aKeysState, (aKeys) => aKeys.add(b))\n\t\t\tset(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 { find, set } = transactors\n\t\t\tconst aKeysState = find(relatedKeysAtoms, a)\n\t\t\tconst bKeysState = find(relatedKeysAtoms, b)\n\t\t\tset(aKeysState, (aKeys) => (aKeys.delete(b), aKeys))\n\t\t\tset(bKeysState, (bKeys) => (bKeys.delete(a), bKeys))\n\t\t}\n\t\tconst replaceRelationsSafely: Write<\n\t\t\t(a: string, newRelationsOfA: string[]) => void\n\t\t> = (transactors, a, newRelationsOfA) => {\n\t\t\tconst { find, get, set } = transactors\n\t\t\tconst relationsOfAState = find(relatedKeysAtoms, a)\n\t\t\tconst currentRelationsOfA = get(relationsOfAState)\n\t\t\tfor (const currentRelationB of currentRelationsOfA) {\n\t\t\t\tconst remainsRelated = newRelationsOfA.includes(currentRelationB)\n\t\t\t\tif (remainsRelated) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst relationsOfBState = find(relatedKeysAtoms, currentRelationB)\n\t\t\t\tset(relationsOfBState, (relationsOfB) => {\n\t\t\t\t\trelationsOfB.delete(a)\n\t\t\t\t\treturn relationsOfB\n\t\t\t\t})\n\t\t\t}\n\t\t\tset(relationsOfAState, (relationsOfA) => {\n\t\t\t\trelationsOfA.transaction((nextRelationsOfA) => {\n\t\t\t\t\tnextRelationsOfA.clear()\n\t\t\t\t\tfor (const newRelationB of newRelationsOfA) {\n\t\t\t\t\t\tconst relationsOfB = getRelatedKeys(transactors, newRelationB)\n\t\t\t\t\t\tconst newRelationBIsAlreadyRelated = relationsOfB.has(a)\n\t\t\t\t\t\tif (this.relations.cardinality === `1:n`) {\n\t\t\t\t\t\t\tfor (const previousOwner of relationsOfB) {\n\t\t\t\t\t\t\t\tif (previousOwner === a) {\n\t\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst previousOwnerRelations = getRelatedKeys(\n\t\t\t\t\t\t\t\t\ttransactors,\n\t\t\t\t\t\t\t\t\tpreviousOwner,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tpreviousOwnerRelations.delete(newRelationB)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!newRelationBIsAlreadyRelated && relationsOfB.size > 0) {\n\t\t\t\t\t\t\t\trelationsOfB.clear()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!newRelationBIsAlreadyRelated) {\n\t\t\t\t\t\t\trelationsOfB.add(a)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnextRelationsOfA.add(newRelationB)\n\t\t\t\t\t}\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\treturn relationsOfA\n\t\t\t})\n\t\t}\n\t\tconst replaceRelationsUnsafely: Write<\n\t\t\t(a: string, newRelationsOfA: string[]) => void\n\t\t> = (transactors, a, newRelationsOfA) => {\n\t\t\tconst { find, set } = transactors\n\t\t\tconst relationsOfAState = find(relatedKeysAtoms, a)\n\t\t\tset(relationsOfAState, (relationsOfA) => {\n\t\t\t\trelationsOfA.transaction((nextRelationsOfA) => {\n\t\t\t\t\tfor (const newRelationB of newRelationsOfA) {\n\t\t\t\t\t\tnextRelationsOfA.add(newRelationB)\n\t\t\t\t\t}\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\treturn relationsOfA\n\t\t\t})\n\t\t\tfor (const newRelationB of newRelationsOfA) {\n\t\t\t\tconst newRelationsBState = find(relatedKeysAtoms, newRelationB)\n\t\t\t\tset(newRelationsBState, (newRelationsB) => {\n\t\t\t\t\tnewRelationsB.add(a)\n\t\t\t\t\treturn newRelationsB\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn true\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 contentAtoms: RegularAtomFamily<Content, string>\n\t\tif (defaultContent) {\n\t\t\tcontentAtoms = 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> = (\n\t\t\t\t{ find, get },\n\t\t\t\tkey,\n\t\t\t) => get(find(contentAtoms, key))\n\t\t\tconst setContent: Write<(key: string, content: Content) => void> = (\n\t\t\t\t{ find, set },\n\t\t\t\tkey,\n\t\t\t\tcontent,\n\t\t\t) => set(find(contentAtoms, key), content)\n\t\t\tconst deleteContent: Write<(key: string) => void> = ({ find }, key) =>\n\t\t\t\tdispose(find(contentAtoms, 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({ find, get }) => {\n\t\t\t\t\t\t\tconst relatedKeysState = find(relatedKeysAtoms, key)\n\t\t\t\t\t\t\tconst relatedKeys = get(relatedKeysState)\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({ find, get }) => {\n\t\t\t\t\t\t\tconst jsonFamily = getJsonFamily(relatedKeysAtoms, store)\n\t\t\t\t\t\t\tconst jsonState = find(jsonFamily, key)\n\t\t\t\t\t\t\tconst json = get(jsonState)\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({ find, get }) => {\n\t\t\t\t\t\t\tconst relatedKeysState = find(relatedKeysAtoms, key)\n\t\t\t\t\t\t\tconst relatedKeys = get(relatedKeysState)\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\tconst contentState = find(contentAtoms, contentKey)\n\t\t\t\t\t\t\t\tconst content = get(contentState)\n\t\t\t\t\t\t\t\treturn [relatedKey, content]\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({ find, get }) => {\n\t\t\t\t\t\t\tconst jsonFamily = getJsonFamily(relatedKeysAtoms, 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\tconst contentState = find(contentAtoms, contentKey)\n\t\t\t\t\t\t\t\tconst content = get(contentState)\n\t\t\t\t\t\t\t\treturn [relatedKey, content]\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 baseStates = {\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 states: 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 contentStates = {\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\tstates = Object.assign(baseStates, contentStates)\n\t\t\t\t} else {\n\t\t\t\t\tstates = baseStates\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.states = states\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 baseStates = {\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 states: 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 contentStates = {\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\tstates = Object.assign(baseStates, contentStates)\n\t\t\t\t} else {\n\t\t\t\t\tstates = baseStates\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.states = states\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 baseStates = {\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 states: 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 contentStates = {\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\tstates = Object.assign(baseStates, contentStates)\n\t\t\t\t} else {\n\t\t\t\t\tstates = baseStates\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.states = states\n\t\t\t}\n\t\t}\n\t}\n}\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 states: JoinState<ASide, BSide, Cardinality, null>\n\treadonly in: (store: Store) => Join<ASide, BSide, Cardinality>\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 states: JoinState<ASide, BSide, Cardinality, Content>\n\treadonly in: (store: Store) => Join<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 { Cardinality, Json, Refinement } from \"rel8\"\n\nexport interface JunctionEntries<Content extends Json.Object | null>\n\textends Json.Object {\n\treadonly relations: [string, string[]][]\n\treadonly contents: [string, Content][]\n}\nexport interface JunctionSchema<ASide extends string, BSide extends string>\n\textends Json.Object {\n\treadonly between: [a: ASide, b: BSide]\n\treadonly cardinality: Cardinality\n}\n\nexport type BaseExternalStoreConfiguration = {\n\taddRelation: (a: string, b: string) => void\n\tdeleteRelation: (a: string, b: string) => void\n\treplaceRelationsSafely: (a: string, bs: string[]) => void\n\treplaceRelationsUnsafely: (a: string, bs: string[]) => void\n\tgetRelatedKeys: (key: string) => Set<string> | undefined\n\thas: (a: string, b?: string) => boolean\n}\n\nexport type ExternalStoreWithContentConfiguration<Content extends Json.Object> =\n\t{\n\t\tgetContent: (contentKey: string) => Content | undefined\n\t\tsetContent: (contentKey: string, content: Content) => void\n\t\tdeleteContent: (contentKey: string) => void\n\t}\n\nexport type Empty<Obj extends object> = {\n\t[Key in keyof Obj]?: undefined\n}\n\nexport type ExternalStoreConfiguration<Content extends Json.Object | null> =\n\tContent extends Json.Object\n\t\t? BaseExternalStoreConfiguration &\n\t\t\t\tExternalStoreWithContentConfiguration<Content>\n\t\t: BaseExternalStoreConfiguration &\n\t\t\t\tEmpty<ExternalStoreWithContentConfiguration<Json.Object>>\n\nexport type JunctionAdvancedConfiguration<Content extends Json.Object | null> = {\n\texternalStore?: ExternalStoreConfiguration<Content>\n\tisContent?: Refinement<unknown, Content>\n\tmakeContentKey?: (a: string, b: string) => string\n}\n\nexport type JunctionJSON<\n\tASide extends string,\n\tBSide extends string,\n\tContent extends Json.Object | null,\n> = JunctionEntries<Content> & JunctionSchema<ASide, BSide>\n\nexport class Junction<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Content extends Json.Object | null = null,\n> {\n\tpublic readonly a: ASide\n\tpublic readonly b: BSide\n\tpublic readonly cardinality: Cardinality\n\tpublic readonly relations = new Map<string, Set<string>>()\n\tpublic readonly contents = new Map<string, Content>()\n\n\tpublic isContent: Refinement<unknown, Content> | null\n\tpublic makeContentKey = (a: string, b: string): string => `${a}:${b}`\n\n\tpublic getRelatedKeys(key: string): Set<string> | undefined {\n\t\treturn this.relations.get(key)\n\t}\n\tprotected addRelation(a: string, b: string): void {\n\t\tlet aRelations = this.relations.get(a)\n\t\tlet bRelations = this.relations.get(b)\n\t\tif (aRelations) {\n\t\t\taRelations.add(b)\n\t\t} else {\n\t\t\taRelations = new Set([b])\n\t\t\tthis.relations.set(a, aRelations)\n\t\t}\n\t\tif (bRelations) {\n\t\t\tbRelations.add(a)\n\t\t} else {\n\t\t\tbRelations = new Set([a])\n\t\t\tthis.relations.set(b, bRelations)\n\t\t}\n\t}\n\tprotected deleteRelation(a: string, b: string): void {\n\t\tconst aRelations = this.relations.get(a)\n\t\tif (aRelations) {\n\t\t\taRelations.delete(b)\n\t\t\tif (aRelations.size === 0) {\n\t\t\t\tthis.relations.delete(a)\n\t\t\t}\n\t\t\tconst bRelations = this.relations.get(b)\n\t\t\tif (bRelations) {\n\t\t\t\tbRelations.delete(a)\n\t\t\t\tif (bRelations.size === 0) {\n\t\t\t\t\tthis.relations.delete(b)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected replaceRelationsUnsafely(a: string, bs: string[]): void {\n\t\tthis.relations.set(a, new Set(bs))\n\t\tfor (const b of bs) {\n\t\t\tconst bRelations = new Set([a])\n\t\t\tthis.relations.set(b, bRelations)\n\t\t}\n\t}\n\tprotected replaceRelationsSafely(a: string, bs: string[]): void {\n\t\tconst aRelationsPrev = this.relations.get(a)\n\t\tif (aRelationsPrev) {\n\t\t\tfor (const b of aRelationsPrev) {\n\t\t\t\tconst bRelations = this.relations.get(b)\n\t\t\t\tif (bRelations) {\n\t\t\t\t\tif (bRelations.size === 1) {\n\t\t\t\t\t\tthis.relations.delete(b)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbRelations.delete(a)\n\t\t\t\t\t}\n\t\t\t\t\tthis.contents.delete(this.makeContentKey(a, b))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.relations.set(a, new Set(bs))\n\t\tfor (const b of bs) {\n\t\t\tlet bRelations = this.relations.get(b)\n\t\t\tif (bRelations) {\n\t\t\t\tbRelations.add(a)\n\t\t\t} else {\n\t\t\t\tbRelations = new Set([a])\n\t\t\t\tthis.relations.set(b, bRelations)\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected getContentInternal(contentKey: string): Content | undefined {\n\t\treturn this.contents.get(contentKey)\n\t}\n\tprotected setContent(contentKey: string, content: Content): void {\n\t\tthis.contents.set(contentKey, content)\n\t}\n\tprotected deleteContent(contentKey: string): void {\n\t\tthis.contents.delete(contentKey)\n\t}\n\n\tpublic constructor(\n\t\tdata: JunctionSchema<ASide, BSide> & Partial<JunctionEntries<Content>>,\n\t\tconfig?: JunctionAdvancedConfiguration<Content>,\n\t) {\n\t\tthis.a = data.between[0]\n\t\tthis.b = data.between[1]\n\n\t\tthis.cardinality = data.cardinality\n\t\tif (!config?.externalStore) {\n\t\t\tthis.relations = new Map(data.relations?.map(([a, b]) => [a, new Set(b)]))\n\t\t\tthis.contents = new Map(data.contents)\n\t\t}\n\t\tthis.isContent = config?.isContent ?? null\n\t\tif (config?.makeContentKey) {\n\t\t\tthis.makeContentKey = config.makeContentKey\n\t\t}\n\t\tif (config?.externalStore) {\n\t\t\tconst externalStore = config.externalStore\n\t\t\tthis.has = (a, b) => externalStore.has(a, b)\n\t\t\tthis.addRelation = (a, b) => {\n\t\t\t\texternalStore.addRelation(a, b)\n\t\t\t}\n\t\t\tthis.deleteRelation = (a, b) => {\n\t\t\t\texternalStore.deleteRelation(a, b)\n\t\t\t}\n\t\t\tthis.replaceRelationsSafely = (a, bs) => {\n\t\t\t\texternalStore.replaceRelationsSafely(a, bs)\n\t\t\t}\n\t\t\tthis.replaceRelationsUnsafely = (a, bs) => {\n\t\t\t\texternalStore.replaceRelationsUnsafely(a, bs)\n\t\t\t}\n\t\t\tthis.getRelatedKeys = (key) => externalStore.getRelatedKeys(key)\n\t\t\tif (externalStore.getContent) {\n\t\t\t\tthis.getContentInternal = (contentKey) => {\n\t\t\t\t\treturn externalStore.getContent(contentKey) as any\n\t\t\t\t}\n\t\t\t\tthis.setContent = (contentKey, content) => {\n\t\t\t\t\texternalStore.setContent(contentKey, content as any)\n\t\t\t\t}\n\t\t\t\tthis.deleteContent = (contentKey) => {\n\t\t\t\t\texternalStore.deleteContent(contentKey)\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const [x, ys] of data.relations ?? []) {\n\t\t\t\tfor (const y of ys) this.addRelation(x, y)\n\t\t\t}\n\t\t\tfor (const [contentKey, content] of data.contents ?? []) {\n\t\t\t\tthis.setContent(contentKey, content)\n\t\t\t}\n\t\t}\n\t}\n\tpublic toJSON(): JunctionJSON<ASide, BSide, Content> {\n\t\treturn {\n\t\t\tbetween: [this.a, this.b],\n\t\t\tcardinality: this.cardinality,\n\t\t\trelations: [...this.relations.entries()].map(([a, b]) => [a, [...b]]),\n\t\t\tcontents: [...this.contents.entries()],\n\t\t}\n\t}\n\n\tpublic set(\n\t\ta: string,\n\t\t...rest: Content extends null ? [b: string] : [b: string, content: Content]\n\t): this\n\tpublic set(\n\t\trelation: { [Key in ASide | BSide]: string },\n\t\t...rest: Content extends null ? [] | [b?: undefined] : [content: Content]\n\t): this\n\tpublic set(\n\t\ta: string | { [Key in ASide | BSide]: string },\n\t\t...rest: Content extends null\n\t\t\t? [] | [b?: string | undefined]\n\t\t\t: [b: string, content: Content] | [content: Content]\n\t): this {\n\t\tconst b: string =\n\t\t\ttypeof rest[0] === `string`\n\t\t\t\t? rest[0]\n\t\t\t\t: (a[this.b as keyof typeof a] as string)\n\t\tconst content: Content | undefined =\n\t\t\trest[1] ?? typeof rest[0] === `string` ? undefined : (rest[0] as Content)\n\t\ta = typeof a === `string` ? a : a[this.a]\n\t\tswitch (this.cardinality) {\n\t\t\t// biome-ignore lint/suspicious/noFallthroughSwitchClause: perfect here\n\t\t\tcase `1:1`: {\n\t\t\t\tconst bPrev = this.getRelatedKey(a)\n\t\t\t\tif (bPrev && bPrev !== b) this.delete(bPrev, a)\n\t\t\t}\n\t\t\tcase `1:n`: {\n\t\t\t\tconst aPrev = this.getRelatedKey(b)\n\t\t\t\tif (aPrev && aPrev !== a) this.delete(aPrev, b)\n\t\t\t}\n\t\t}\n\t\tif (content) {\n\t\t\tconst contentKey = this.makeContentKey(a, b)\n\t\t\tthis.setContent(contentKey, content)\n\t\t}\n\t\tthis.addRelation(a, b)\n\t\treturn this\n\t}\n\n\tpublic delete(a: string, b?: string): this\n\tpublic delete(\n\t\trelation:\n\t\t\t| Record<ASide | BSide, string>\n\t\t\t| Record<ASide, string>\n\t\t\t| Record<BSide, string>,\n\t\tb?: undefined,\n\t): this\n\tpublic delete(\n\t\tx:\n\t\t\t| Record<ASide | BSide, string>\n\t\t\t| Record<ASide, string>\n\t\t\t| Record<BSide, string>\n\t\t\t| string,\n\t\tb?: string | undefined,\n\t): this {\n\t\t// @ts-expect-error we deduce that this.b may index x\n\t\tb = typeof b === `string` ? b : (x[this.b] as string | undefined)\n\t\t// @ts-expect-error we deduce that this.a may index x\n\t\tconst a = typeof x === `string` ? x : (x[this.a] as string | undefined)\n\n\t\tif (a === undefined && typeof b === `string`) {\n\t\t\tconst bRelations = this.getRelatedKeys(b)\n\t\t\tif (bRelations) {\n\t\t\t\tfor (const a of bRelations) {\n\t\t\t\t\tthis.delete(a, b)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (typeof a === `string` && b === undefined) {\n\t\t\tconst aRelations = this.getRelatedKeys(a)\n\t\t\tif (aRelations) {\n\t\t\t\tfor (const b of aRelations) {\n\t\t\t\t\tthis.delete(a, b)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (typeof a === `string` && typeof b === `string`) {\n\t\t\tthis.deleteRelation(a, b)\n\t\t\tconst contentKey = this.makeContentKey(a, b)\n\t\t\tthis.deleteContent(contentKey)\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic getRelatedKey(key: string): string | undefined {\n\t\tconst relations = this.getRelatedKeys(key)\n\t\tif (relations) {\n\t\t\tif (relations.size > 1) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`${relations.size} related keys were found for key \"${key}\": (${[\n\t\t\t\t\t\t...relations,\n\t\t\t\t\t]\n\t\t\t\t\t\t.map((k) => `\"${k}\"`)\n\t\t\t\t\t\t.join(`, `)}). Only one related key was expected.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tfor (const relation of relations) {\n\t\t\t\treturn relation\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic replaceRelations(\n\t\ta: string,\n\t\trelations: Content extends null ? string[] : Record<string, Content>,\n\t\tconfig?: { reckless: boolean },\n\t): this {\n\t\tconst hasContent = !Array.isArray(relations)\n\t\tconst bs = hasContent ? Object.keys(relations) : relations\n\t\tif (config?.reckless) {\n\t\t\tthis.replaceRelationsUnsafely(a, bs)\n\t\t} else {\n\t\t\tthis.replaceRelationsSafely(a, bs)\n\t\t}\n\t\tif (hasContent) {\n\t\t\tfor (const b of bs) {\n\t\t\t\tconst contentKey = this.makeContentKey(a, b)\n\t\t\t\tconst content = relations[b] as Content\n\t\t\t\tthis.setContent(contentKey, content)\n\t\t\t}\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic getContent(a: string, b: string): Content | undefined {\n\t\tconst contentKey = this.makeContentKey(a, b)\n\t\treturn this.getContentInternal(contentKey)\n\t}\n\n\tpublic getRelationEntries(\n\t\tinput: Record<ASide, string> | Record<BSide, string>,\n\t): [string, Content][] {\n\t\tconst a: string | undefined = (input as any)[this.a]\n\t\tconst b: string | undefined = (input as any)[this.b]\n\t\tif (a !== undefined && b === undefined) {\n\t\t\tconst aRelations = this.getRelatedKeys(a)\n\t\t\tif (aRelations) {\n\t\t\t\treturn [...aRelations].map((b) => {\n\t\t\t\t\treturn [b, this.getContent(a, b) ?? (null as Content)]\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tif (a === undefined && b !== undefined) {\n\t\t\tconst bRelations = this.getRelatedKeys(b)\n\t\t\tif (bRelations) {\n\t\t\t\treturn [...bRelations].map((a) => {\n\t\t\t\t\treturn [a, this.getContent(a, b) ?? (null as Content)]\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\treturn []\n\t}\n\n\tpublic has(a: string, b?: string): boolean {\n\t\tif (b) {\n\t\t\tconst setA = this.getRelatedKeys(a)\n\t\t\treturn setA?.has(b) ?? false\n\t\t}\n\t\treturn this.relations.has(a)\n\t}\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { IMPLICIT } from \"atom.io/internal\"\n\nimport { createRegularAtom, createStandaloneSelector } 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.RegularAtomToken<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.RegularAtomToken<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 = createStandaloneSelector(\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\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.RegularAtomFamily<Struct[K], string>\n\t},\n\tAtomIO.ReadonlySelectorFamilyToken<Struct, string>,\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.RegularAtomFamily<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: AtomIO.ReadonlySelectorFamilyToken<Struct, string> =\n\t\tcreateSelectorFamily(\n\t\t\t{\n\t\t\t\tkey: options.key,\n\t\t\t\tget:\n\t\t\t\t\t(id) =>\n\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\treturn Object.keys(options.default).reduce((acc, subKey) => {\n\t\t\t\t\t\t\tacc[subKey] = get(\n\t\t\t\t\t\t\t\t(atoms as any)[nameFamily(options.key, subKey)](id),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn acc\n\t\t\t\t\t\t}, {} as any)\n\t\t\t\t\t},\n\t\t\t},\n\t\t\tIMPLICIT.STORE,\n\t\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/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dict.ts","../src/join.ts","../src/struct.ts","../src/struct-family.ts","../src/until.ts"],"names":["findState","IMPLICIT","findInStore","join","a","b","createStandaloneSelector","capitalize","createRegularAtomFamily","createSelectorFamily"],"mappings":"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","sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tcreateStandaloneSelector,\n\tfindInStore,\n} 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.ReadonlySelectorFamilyToken<State, Key>\n\t\t| AtomIO.RegularAtomFamilyToken<State, Key>\n\t\t| AtomIO.WritableSelectorFamily<State, Key>,\n\tindex:\n\t\t| AtomIO.ReadonlySelectorToken<Key[]>\n\t\t| AtomIO.RegularAtomToken<Key[]>\n\t\t| AtomIO.WritableSelectorToken<Key[]>,\n\tstore: Store = IMPLICIT.STORE,\n): AtomIO.ReadonlySelectorToken<{ [K in Stringified<Key>]: State }> {\n\treturn createStandaloneSelector(\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(findInStore(findState, key, store))\n\t\t\t\t\treturn acc\n\t\t\t\t}, {} as any)\n\t\t\t},\n\t\t},\n\t\tstore,\n\t)\n}\n","/* eslint-disable @typescript-eslint/ban-types */\nimport type {\n\tMutableAtomFamily,\n\tRead,\n\tReadonlySelectorFamily,\n\tRegularAtomFamily,\n\tTransactors,\n\tWrite,\n} from \"atom.io\"\nimport { dispose, findState, getState, setState } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tcreateMutableAtomFamily,\n\tcreateRegularAtomFamily,\n\tcreateSelectorFamily,\n\tfindInStore,\n\tgetFromStore,\n\tgetJsonFamily,\n\tsetIntoStore,\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 = {\n\tget: getState,\n\tset: setState,\n\tfind: findState,\n}\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 options: JoinOptions<ASide, BSide, Cardinality, Content>\n\tprivate defaultContent: Content | undefined\n\tprivate transactors: Transactors\n\tpublic relations: Junction<ASide, BSide, Content>\n\tpublic states: 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\tconst originalTransactors = this.transactors\n\t\tthis.transactors = transactors\n\t\trun(this)\n\t\tthis.transactors = originalTransactors\n\t}\n\n\tpublic alternates: Map<string, Join<ASide, BSide, Cardinality, Content>>\n\tpublic in(store: Store): Join<ASide, BSide, Cardinality, Content> {\n\t\tconst key = store.config.name\n\t\tconst alternate = this.alternates.get(key)\n\t\tif (alternate) {\n\t\t\treturn alternate\n\t\t}\n\t\tconst join = new Join(this.options, this.defaultContent, store)\n\t\tthis.alternates.set(key, join)\n\t\tjoin.alternates = this.alternates\n\t\treturn join\n\t}\n\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\tthis.options = options\n\t\tthis.defaultContent = defaultContent\n\t\tthis.alternates = new Map()\n\t\tthis.alternates.set(store.config.name, this)\n\t\tthis.transactors = {\n\t\t\tget: (token) => getFromStore(token, store),\n\t\t\tset: (token, value) => setIntoStore(token, value, store),\n\t\t\tfind: ((token, key) => findInStore(token, key, store)) as typeof findState,\n\t\t}\n\t\tconst a: ASide = options.between[0]\n\t\tconst b: BSide = options.between[1]\n\t\tconst relatedKeysAtoms = 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: relatedKeysAtoms }\n\t\tconst getRelatedKeys: Read<(key: string) => SetRTX<string>> = (\n\t\t\t{ find, get },\n\t\t\tkey,\n\t\t) => get(find(relatedKeysAtoms, 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 { set, find } = transactors\n\t\t\tconst aKeysState = find(relatedKeysAtoms, a)\n\t\t\tconst bKeysState = find(relatedKeysAtoms, b)\n\t\t\tset(aKeysState, (aKeys) => aKeys.add(b))\n\t\t\tset(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 { find, set } = transactors\n\t\t\tconst aKeysState = find(relatedKeysAtoms, a)\n\t\t\tconst bKeysState = find(relatedKeysAtoms, b)\n\t\t\tset(aKeysState, (aKeys) => (aKeys.delete(b), aKeys))\n\t\t\tset(bKeysState, (bKeys) => (bKeys.delete(a), bKeys))\n\t\t}\n\t\tconst replaceRelationsSafely: Write<\n\t\t\t(a: string, newRelationsOfA: string[]) => void\n\t\t> = (transactors, a, newRelationsOfA) => {\n\t\t\tconst { find, get, set } = transactors\n\t\t\tconst relationsOfAState = find(relatedKeysAtoms, a)\n\t\t\tconst currentRelationsOfA = get(relationsOfAState)\n\t\t\tfor (const currentRelationB of currentRelationsOfA) {\n\t\t\t\tconst remainsRelated = newRelationsOfA.includes(currentRelationB)\n\t\t\t\tif (remainsRelated) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst relationsOfBState = find(relatedKeysAtoms, currentRelationB)\n\t\t\t\tset(relationsOfBState, (relationsOfB) => {\n\t\t\t\t\trelationsOfB.delete(a)\n\t\t\t\t\treturn relationsOfB\n\t\t\t\t})\n\t\t\t}\n\t\t\tset(relationsOfAState, (relationsOfA) => {\n\t\t\t\trelationsOfA.transaction((nextRelationsOfA) => {\n\t\t\t\t\tnextRelationsOfA.clear()\n\t\t\t\t\tfor (const newRelationB of newRelationsOfA) {\n\t\t\t\t\t\tconst relationsOfB = getRelatedKeys(transactors, newRelationB)\n\t\t\t\t\t\tconst newRelationBIsAlreadyRelated = relationsOfB.has(a)\n\t\t\t\t\t\tif (this.relations.cardinality === `1:n`) {\n\t\t\t\t\t\t\tfor (const previousOwner of relationsOfB) {\n\t\t\t\t\t\t\t\tif (previousOwner === a) {\n\t\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst previousOwnerRelations = getRelatedKeys(\n\t\t\t\t\t\t\t\t\ttransactors,\n\t\t\t\t\t\t\t\t\tpreviousOwner,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tpreviousOwnerRelations.delete(newRelationB)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!newRelationBIsAlreadyRelated && relationsOfB.size > 0) {\n\t\t\t\t\t\t\t\trelationsOfB.clear()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!newRelationBIsAlreadyRelated) {\n\t\t\t\t\t\t\trelationsOfB.add(a)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnextRelationsOfA.add(newRelationB)\n\t\t\t\t\t}\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\treturn relationsOfA\n\t\t\t})\n\t\t}\n\t\tconst replaceRelationsUnsafely: Write<\n\t\t\t(a: string, newRelationsOfA: string[]) => void\n\t\t> = (transactors, a, newRelationsOfA) => {\n\t\t\tconst { find, set } = transactors\n\t\t\tconst relationsOfAState = find(relatedKeysAtoms, a)\n\t\t\tset(relationsOfAState, (relationsOfA) => {\n\t\t\t\trelationsOfA.transaction((nextRelationsOfA) => {\n\t\t\t\t\tfor (const newRelationB of newRelationsOfA) {\n\t\t\t\t\t\tnextRelationsOfA.add(newRelationB)\n\t\t\t\t\t}\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t\treturn relationsOfA\n\t\t\t})\n\t\t\tfor (const newRelationB of newRelationsOfA) {\n\t\t\t\tconst newRelationsBState = find(relatedKeysAtoms, newRelationB)\n\t\t\t\tset(newRelationsBState, (newRelationsB) => {\n\t\t\t\t\tnewRelationsB.add(a)\n\t\t\t\t\treturn newRelationsB\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn true\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 contentAtoms: RegularAtomFamily<Content, string>\n\t\tif (defaultContent) {\n\t\t\tcontentAtoms = 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> = (\n\t\t\t\t{ find, get },\n\t\t\t\tkey,\n\t\t\t) => get(find(contentAtoms, key))\n\t\t\tconst setContent: Write<(key: string, content: Content) => void> = (\n\t\t\t\t{ find, set },\n\t\t\t\tkey,\n\t\t\t\tcontent,\n\t\t\t) => set(find(contentAtoms, key), content)\n\t\t\tconst deleteContent: Write<(key: string) => void> = ({ find }, key) =>\n\t\t\t\tdispose(find(contentAtoms, 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({ find, get }) => {\n\t\t\t\t\t\t\tconst relatedKeysState = find(relatedKeysAtoms, key)\n\t\t\t\t\t\t\tconst relatedKeys = get(relatedKeysState)\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({ find, get }) => {\n\t\t\t\t\t\t\tconst jsonFamily = getJsonFamily(relatedKeysAtoms, store)\n\t\t\t\t\t\t\tconst jsonState = find(jsonFamily, key)\n\t\t\t\t\t\t\tconst json = get(jsonState)\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({ find, get }) => {\n\t\t\t\t\t\t\tconst relatedKeysState = find(relatedKeysAtoms, key)\n\t\t\t\t\t\t\tconst relatedKeys = get(relatedKeysState)\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\tconst contentState = find(contentAtoms, contentKey)\n\t\t\t\t\t\t\t\tconst content = get(contentState)\n\t\t\t\t\t\t\t\treturn [relatedKey, content]\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({ find, get }) => {\n\t\t\t\t\t\t\tconst jsonFamily = getJsonFamily(relatedKeysAtoms, 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\tconst contentState = find(contentAtoms, contentKey)\n\t\t\t\t\t\t\t\tconst content = get(contentState)\n\t\t\t\t\t\t\t\treturn [relatedKey, content]\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 baseStates = {\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 states: 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 contentStates = {\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\tstates = Object.assign(baseStates, contentStates)\n\t\t\t\t} else {\n\t\t\t\t\tstates = baseStates\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.states = states\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 baseStates = {\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 states: 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 contentStates = {\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\tstates = Object.assign(baseStates, contentStates)\n\t\t\t\t} else {\n\t\t\t\t\tstates = baseStates\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.states = states\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 baseStates = {\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 states: 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 contentStates = {\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\tstates = Object.assign(baseStates, contentStates)\n\t\t\t\t} else {\n\t\t\t\t\tstates = baseStates\n\t\t\t\t}\n\t\t\t\tthis.relations = relations\n\t\t\t\tthis.states = states\n\t\t\t}\n\t\t}\n\t}\n}\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 states: JoinState<ASide, BSide, Cardinality, null>\n\treadonly in: (store: Store) => Join<ASide, BSide, Cardinality>\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 states: JoinState<ASide, BSide, Cardinality, Content>\n\treadonly in: (store: Store) => Join<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, createStandaloneSelector } 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.RegularAtomToken<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.RegularAtomToken<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 = createStandaloneSelector(\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\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.RegularAtomFamily<Struct[K], string>\n\t},\n\tAtomIO.ReadonlySelectorFamilyToken<Struct, string>,\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.RegularAtomFamily<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: AtomIO.ReadonlySelectorFamilyToken<Struct, string> =\n\t\tcreateSelectorFamily(\n\t\t\t{\n\t\t\t\tkey: options.key,\n\t\t\t\tget:\n\t\t\t\t\t(id) =>\n\t\t\t\t\t({ get }) => {\n\t\t\t\t\t\treturn Object.keys(options.default).reduce((acc, subKey) => {\n\t\t\t\t\t\t\tacc[subKey] = get(\n\t\t\t\t\t\t\t\t(atoms as any)[nameFamily(options.key, subKey)](id),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn acc\n\t\t\t\t\t\t}, {} as any)\n\t\t\t\t\t},\n\t\t\t},\n\t\t\tIMPLICIT.STORE,\n\t\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 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../realtime-client/src/sync-continuity.ts"],"names":["confirmedUpdate"],"mappings":"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","sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { deleteAtom } from \"atom.io/internal\"\nimport {\n\tactUponStore,\n\tassignTransactionToContinuity,\n\tgetEpochNumberOfContinuity,\n\tgetFromStore,\n\tgetJsonToken,\n\tingestTransactionUpdate,\n\tisRootStore,\n\tsetEpochNumberOfContinuity,\n\tsetIntoStore,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\nimport type { ContinuityToken } from \"atom.io/realtime\"\nimport {\n\tconfirmedUpdateQueue,\n\toptimisticUpdateQueue,\n} from \"atom.io/realtime-client\"\nimport type { Socket } from \"socket.io-client\"\n\nexport function syncContinuity<ƒ extends AtomIO.ƒn>(\n\tcontinuity: ContinuityToken,\n\tsocket: Socket,\n\tstore: Store,\n): () => void {\n\tconst continuityKey = continuity.key\n\tconst optimisticUpdates = getFromStore(optimisticUpdateQueue, store)\n\tconst confirmedUpdates = getFromStore(confirmedUpdateQueue, store)\n\n\tconst initializeContinuity = (epoch: number, payload: Json.Array) => {\n\t\tsocket.off(`continuity-init:${continuityKey}`, initializeContinuity)\n\t\tlet i = 0\n\t\tlet k: any = ``\n\t\tlet v: any = null\n\t\tfor (const x of payload) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\tk = x\n\t\t\t} else {\n\t\t\t\tv = x\n\t\t\t\t// console.log(`❗❗❗❗❗`, k, v)\n\t\t\t\tif (`type` in k && k.type === `mutable_atom`) {\n\t\t\t\t\tk = getJsonToken(k)\n\t\t\t\t}\n\t\t\t\tsetIntoStore(k, v, store)\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t\tsetEpochNumberOfContinuity(continuityKey, epoch, store)\n\t}\n\tsocket.off(`continuity-init:${continuityKey}`)\n\tsocket.on(`continuity-init:${continuityKey}`, initializeContinuity)\n\n\tconst registerAndAttemptConfirmedUpdate = (\n\t\tconfirmedUpdate: AtomIO.TransactionUpdate<ƒ>,\n\t) => {\n\t\tfunction reconcileEpoch(\n\t\t\toptimisticUpdate: AtomIO.TransactionUpdate<any>,\n\t\t\tconfirmedUpdate: AtomIO.TransactionUpdate<any>,\n\t\t): void {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`reconciling updates`,\n\t\t\t)\n\t\t\tsetIntoStore(\n\t\t\t\toptimisticUpdateQueue,\n\t\t\t\t(queue) => {\n\t\t\t\t\tqueue.shift()\n\t\t\t\t\treturn queue\n\t\t\t\t},\n\t\t\t\tstore,\n\t\t\t)\n\t\t\tif (optimisticUpdate.id === confirmedUpdate.id) {\n\t\t\t\tconst clientResult = JSON.stringify(optimisticUpdate.updates)\n\t\t\t\tconst serverResult = JSON.stringify(confirmedUpdate.updates)\n\t\t\t\tif (clientResult === serverResult) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`✅`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`results for ${optimisticUpdate.id} match between client and server`,\n\t\t\t\t\t)\n\t\t\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// id mismatch\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`❌`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`thought update #${confirmedUpdate.epoch} was ${optimisticUpdate.key}:${optimisticUpdate.id}, but it was actually ${confirmedUpdate.key}:${confirmedUpdate.id}`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`updates do not match`,\n\t\t\t\toptimisticUpdate,\n\t\t\t\tconfirmedUpdate,\n\t\t\t)\n\t\t\tconst reversedOptimisticUpdates = optimisticUpdates.toReversed()\n\t\t\tfor (const subsequentOptimistic of reversedOptimisticUpdates) {\n\t\t\t\tingestTransactionUpdate(`oldValue`, subsequentOptimistic, store)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`⏪`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`undid optimistic updates:`,\n\t\t\t\treversedOptimisticUpdates,\n\t\t\t)\n\t\t\tingestTransactionUpdate(`oldValue`, optimisticUpdate, store)\n\t\t\tstore.logger.info(\n\t\t\t\t`⏪`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`undid zeroth optimistic update`,\n\t\t\t\toptimisticUpdate,\n\t\t\t)\n\t\t\tingestTransactionUpdate(`newValue`, confirmedUpdate, store)\n\t\t\tstore.logger.info(\n\t\t\t\t`⏩`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`applied confirmed update`,\n\t\t\t\tconfirmedUpdate,\n\t\t\t)\n\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\n\t\t\tfor (const subsequentOptimistic of optimisticUpdates) {\n\t\t\t\tconst token = {\n\t\t\t\t\ttype: `transaction`,\n\t\t\t\t\tkey: subsequentOptimistic.key,\n\t\t\t\t} as const\n\t\t\t\tconst { id, params } = subsequentOptimistic\n\t\t\t\tactUponStore(token, id, store)(...params)\n\t\t\t}\n\t\t\tstore.logger.info(\n\t\t\t\t`⏩`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`reapplied subsequent optimistic updates:`,\n\t\t\t\toptimisticUpdates,\n\t\t\t)\n\t\t}\n\n\t\tstore.logger.info(\n\t\t\t`🧑⚖️`,\n\t\t\t`continuity`,\n\t\t\tcontinuityKey,\n\t\t\t`integrating confirmed update`,\n\t\t\t{ confirmedUpdate, confirmedUpdates, optimisticUpdates },\n\t\t)\n\t\tconst zerothOptimisticUpdate = optimisticUpdates[0]\n\t\tif (zerothOptimisticUpdate) {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`has optimistic updates to reconcile`,\n\t\t\t)\n\t\t\tif (confirmedUpdate.epoch === zerothOptimisticUpdate.epoch) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`epoch of confirmed update #${confirmedUpdate.epoch} matches zeroth optimistic update`,\n\t\t\t\t)\n\t\t\t\treconcileEpoch(zerothOptimisticUpdate, confirmedUpdate)\n\t\t\t\tfor (const nextConfirmed of confirmedUpdates) {\n\t\t\t\t\tconst nextOptimistic = optimisticUpdates[0]\n\t\t\t\t\tif (nextConfirmed.epoch === nextOptimistic?.epoch) {\n\t\t\t\t\t\treconcileEpoch(nextOptimistic, nextConfirmed)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// epoch mismatch\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`epoch of confirmed update #${confirmedUpdate.epoch} does not match zeroth optimistic update #${zerothOptimisticUpdate.epoch}`,\n\t\t\t\t)\n\t\t\t\tconst confirmedUpdateIsAlreadyEnqueued = confirmedUpdates.some(\n\t\t\t\t\t(update) => update.epoch === confirmedUpdate.epoch,\n\t\t\t\t)\n\t\t\t\tif (!confirmedUpdateIsAlreadyEnqueued) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👈`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`pushing confirmed update to queue`,\n\t\t\t\t\t\tconfirmedUpdate,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(\n\t\t\t\t\t\tconfirmedUpdateQueue,\n\t\t\t\t\t\t(queue) => {\n\t\t\t\t\t\t\tqueue.push(confirmedUpdate)\n\t\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\treturn queue\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tstore.logger.info(\n\t\t\t\t`🧑⚖️`,\n\t\t\t\t`continuity`,\n\t\t\t\tcontinuityKey,\n\t\t\t\t`has no optimistic updates to deal with`,\n\t\t\t)\n\t\t\tconst continuityEpoch = getEpochNumberOfContinuity(continuityKey, store)\n\t\t\tconst isRoot = isRootStore(store)\n\n\t\t\tif (isRoot && continuityEpoch === confirmedUpdate.epoch - 1) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`✅`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`integrating update #${confirmedUpdate.epoch} (${confirmedUpdate.key} ${confirmedUpdate.id})`,\n\t\t\t\t)\n\t\t\t\tingestTransactionUpdate(`newValue`, confirmedUpdate, store)\n\t\t\t\tsocket.emit(`ack:${continuityKey}`, confirmedUpdate.epoch)\n\t\t\t\tsetEpochNumberOfContinuity(continuityKey, confirmedUpdate.epoch, store)\n\t\t\t} else if (isRoot && continuityEpoch !== undefined) {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🧑⚖️`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`received update #${\n\t\t\t\t\t\tconfirmedUpdate.epoch\n\t\t\t\t\t} but still waiting for update #${continuityEpoch + 1}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tclientEpoch: continuityEpoch,\n\t\t\t\t\t\tserverEpoch: confirmedUpdate.epoch,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\tconst confirmedUpdateIsAlreadyEnqueued = confirmedUpdates.some(\n\t\t\t\t\t(update) => update.epoch === confirmedUpdate.epoch,\n\t\t\t\t)\n\t\t\t\tif (confirmedUpdateIsAlreadyEnqueued) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👍`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`confirmed update #${confirmedUpdate.epoch} is already enqueued`,\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`👈`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`pushing confirmed update #${confirmedUpdate.epoch} to queue`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(\n\t\t\t\t\t\tconfirmedUpdateQueue,\n\t\t\t\t\t\t(queue) => {\n\t\t\t\t\t\t\tqueue.push(confirmedUpdate)\n\t\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\treturn queue\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tsocket.off(`tx-new:${continuityKey}`)\n\tsocket.on(`tx-new:${continuityKey}`, registerAndAttemptConfirmedUpdate)\n\n\tconst unsubscribeFunctions = continuity.actions.map((transaction) => {\n\t\tassignTransactionToContinuity(continuityKey, transaction.key, store)\n\t\tconst unsubscribeFromTransactionUpdates = subscribeToTransaction(\n\t\t\ttransaction,\n\t\t\t(clientUpdate) => {\n\t\t\t\tstore.logger.info(\n\t\t\t\t\t`🤞`,\n\t\t\t\t\t`continuity`,\n\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t`enqueuing optimistic update`,\n\t\t\t\t)\n\t\t\t\tconst optimisticUpdateIndex = optimisticUpdates.findIndex(\n\t\t\t\t\t(update) => update.id === clientUpdate.id,\n\t\t\t\t)\n\t\t\t\tif (optimisticUpdateIndex === -1) {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🤞`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`enqueuing new optimistic update`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(\n\t\t\t\t\t\toptimisticUpdateQueue,\n\t\t\t\t\t\t(queue) => {\n\t\t\t\t\t\t\tqueue.push(clientUpdate)\n\t\t\t\t\t\t\tqueue.sort((a, b) => a.epoch - b.epoch)\n\t\t\t\t\t\t\treturn queue\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🤞`,\n\t\t\t\t\t\t`continuity`,\n\t\t\t\t\t\tcontinuityKey,\n\t\t\t\t\t\t`replacing existing optimistic update at index ${optimisticUpdateIndex}`,\n\t\t\t\t\t)\n\t\t\t\t\tsetIntoStore(\n\t\t\t\t\t\toptimisticUpdateQueue,\n\t\t\t\t\t\t(queue) => {\n\t\t\t\t\t\t\tqueue[optimisticUpdateIndex] = clientUpdate\n\t\t\t\t\t\t\treturn queue\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstore,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tsocket.emit(`tx-run:${continuityKey}`, {\n\t\t\t\t\tid: clientUpdate.id,\n\t\t\t\t\tkey: transaction.key,\n\t\t\t\t\tparams: clientUpdate.params,\n\t\t\t\t})\n\t\t\t},\n\t\t\t`tx-run:${continuityKey}`,\n\t\t\tstore,\n\t\t)\n\t\treturn unsubscribeFromTransactionUpdates\n\t})\n\n\tsocket.on(`reveal:${continuityKey}`, (revealed: Json.Array) => {\n\t\tlet i = 0\n\t\tlet k: any = ``\n\t\tlet v: any = null\n\t\tfor (const x of revealed) {\n\t\t\tif (i % 2 === 0) {\n\t\t\t\tk = x\n\t\t\t} else {\n\t\t\t\tv = x\n\t\t\t\tsetIntoStore(k, v, store)\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t})\n\tsocket.on(\n\t\t`conceal:${continuityKey}`,\n\t\t(concealed: AtomIO.AtomToken<unknown>[]) => {\n\t\t\tfor (const token of concealed) {\n\t\t\t\tdeleteAtom(token, store)\n\t\t\t}\n\t\t},\n\t)\n\n\tsocket.emit(`get:${continuityKey}`)\n\treturn () => {\n\t\tsocket.off(`continuity-init:${continuityKey}`)\n\t\tsocket.off(`tx-new:${continuityKey}`)\n\t\tfor (const unsubscribe of unsubscribeFunctions) unsubscribe()\n\t\t// socket.emit(`unsub:${continuityKey}`)\n\t}\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../__unstable__/web-effects/src/storage.ts"],"names":[],"mappings":";AAQO,IAAM,cACZ,CAAI,YACJ,CAAC,EAAE,WAAW,MAAM,MACpB,CAAC,QACD,CAAC,EAAE,SAAS,MAAM,MAAM;AACvB,QAAM,aAAa,QAAQ,QAAQ,GAAG;AAEtC,MAAI,cAAc;AAAM,YAAQ,MAAM,UAAU,CAAC;AAEjD,QAAM,CAAC,EAAE,SAAS,MAAM;AACvB,QAAI,YAAY,MAAM;AACrB,cAAQ,WAAW,GAAG;AACtB;AAAA,IACD;AACA,YAAQ,QAAQ,KAAK,UAAU,QAAQ,CAAC;AAAA,EACzC,CAAC;AACF;AAEM,IAAM,yBAEQ,YAAY,YAAY,EAAE,IAAI","sourcesContent":["import type { AtomEffect } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nexport type StringInterface<T> = {\n\tstringify: (t: T) => string\n\tparse: (s: string) => T\n}\n\nexport const persistAtom =\n\t<T>(storage: Storage) =>\n\t({ stringify, parse }: StringInterface<T>) =>\n\t(key: string): AtomEffect<T> =>\n\t({ setSelf, onSet }) => {\n\t\tconst savedValue = storage.getItem(key)\n\n\t\tif (savedValue != null) setSelf(parse(savedValue))\n\n\t\tonSet(({ newValue }) => {\n\t\t\tif (newValue == null) {\n\t\t\t\tstorage.removeItem(key)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tstorage.setItem(key, stringify(newValue))\n\t\t})\n\t}\n\nexport const lazyLocalStorageEffect: <J extends Json.Serializable>(\n\tkey: string,\n) => AtomEffect<J> = persistAtom(localStorage)(JSON)\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../anvl/src/function/pipe.ts","../../anvl/src/function/index.ts","../../anvl/src/array/venn.ts","../../anvl/src/array/index.ts","../../anvl/src/nullish/index.ts","../../anvl/src/object/access.ts","../../anvl/src/object/entries.ts","../../anvl/src/object/mapObject.ts","../../anvl/src/object/refinement.ts","../../anvl/src/object/sprawl.ts","../../anvl/src/object/index.ts"],"names":["path","node","result"],"mappings":"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","sourcesContent":["/* ❤️ fp-ts */\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable prefer-rest-params */\n/* eslint-disable @typescript-eslint/ban-types */\n\nexport function pipe<A>(a: A): A\nexport function pipe<A, B>(a: A, ab: (a: A) => B): B\nexport function pipe<A, B, C>(a: A, ab: (a: A) => B, bc: (b: B) => C): C\nexport function pipe<A, B, C, D>(\n\ta: A,\n\tab: (a: A) => B,\n\tbc: (b: B) => C,\n\tcd: (c: C) => D,\n): D\nexport function pipe<A, B, C, D, E>(\n\ta: A,\n\tab: (a: A) => B,\n\tbc: (b: B) => C,\n\tcd: (c: C) => D,\n\tde: (d: D) => E,\n): E\nexport function pipe<A, B, C, D, E, F>(\n\ta: A,\n\tab: (a: A) => B,\n\tbc: (b: B) => C,\n\tcd: (c: C) => D,\n\tde: (d: D) => E,\n\tef: (e: E) => F,\n): F\nexport function pipe<A, B, C, D, E, F, G>(\n\ta: A,\n\tab: (a: A) => B,\n\tbc: (b: B) => C,\n\tcd: (c: C) => D,\n\tde: (d: D) => E,\n\tef: (e: E) => F,\n\tfg: (f: F) => G,\n): G\nexport function pipe<A, B, C, D, E, F, G, H>(\n\ta: A,\n\tab: (a: A) => B,\n\tbc: (b: B) => C,\n\tcd: (c: C) => D,\n\tde: (d: D) => E,\n\tef: (e: E) => F,\n\tfg: (f: F) => G,\n\tgh: (g: G) => H,\n): H\nexport function pipe<A, B, C, D, E, F, G, H, I>(\n\ta: A,\n\tab: (a: A) => B,\n\tbc: (b: B) => C,\n\tcd: (c: C) => D,\n\tde: (d: D) => E,\n\tef: (e: E) => F,\n\tfg: (f: F) => G,\n\tgh: (g: G) => H,\n\thi: (h: H) => I,\n): I\nexport function pipe<A, B, C, D, E, F, G, H, I, J>(\n\ta: A,\n\tab: (a: A) => B,\n\tbc: (b: B) => C,\n\tcd: (c: C) => D,\n\tde: (d: D) => E,\n\tef: (e: E) => F,\n\tfg: (f: F) => G,\n\tgh: (g: G) => H,\n\thi: (h: H) => I,\n\tij: (i: I) => J,\n): J\nexport function pipe<A, B, C, D, E, F, G, H, I, J, K>(\n\ta: A,\n\tab: (a: A) => B,\n\tbc: (b: B) => C,\n\tcd: (c: C) => D,\n\tde: (d: D) => E,\n\tef: (e: E) => F,\n\tfg: (f: F) => G,\n\tgh: (g: G) => H,\n\thi: (h: H) => I,\n\tij: (i: I) => J,\n\tjk: (j: J) => K,\n): K\nexport function pipe<A, B, C, D, E, F, G, H, I, J, K, L>(\n\ta: A,\n\tab: (a: A) => B,\n\tbc: (b: B) => C,\n\tcd: (c: C) => D,\n\tde: (d: D) => E,\n\tef: (e: E) => F,\n\tfg: (f: F) => G,\n\tgh: (g: G) => H,\n\thi: (h: H) => I,\n\tij: (i: I) => J,\n\tjk: (j: J) => K,\n\tkl: (k: K) => L,\n): L\nexport function pipe<A, B, C, D, E, F, G, H, I, J, K, L, M>(\n\ta: A,\n\tab: (a: A) => B,\n\tbc: (b: B) => C,\n\tcd: (c: C) => D,\n\tde: (d: D) => E,\n\tef: (e: E) => F,\n\tfg: (f: F) => G,\n\tgh: (g: G) => H,\n\thi: (h: H) => I,\n\tij: (i: I) => J,\n\tjk: (j: J) => K,\n\tkl: (k: K) => L,\n\tlm: (l: L) => M,\n): M\nexport function pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N>(\n\ta: A,\n\tab: (a: A) => B,\n\tbc: (b: B) => C,\n\tcd: (c: C) => D,\n\tde: (d: D) => E,\n\tef: (e: E) => F,\n\tfg: (f: F) => G,\n\tgh: (g: G) => H,\n\thi: (h: H) => I,\n\tij: (i: I) => J,\n\tjk: (j: J) => K,\n\tkl: (k: K) => L,\n\tlm: (l: L) => M,\n\tmn: (m: M) => N,\n): N\nexport function pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(\n\ta: A,\n\tab: (a: A) => B,\n\tbc: (b: B) => C,\n\tcd: (c: C) => D,\n\tde: (d: D) => E,\n\tef: (e: E) => F,\n\tfg: (f: F) => G,\n\tgh: (g: G) => H,\n\thi: (h: H) => I,\n\tij: (i: I) => J,\n\tjk: (j: J) => K,\n\tkl: (k: K) => L,\n\tlm: (l: L) => M,\n\tmn: (m: M) => N,\n\tno: (n: N) => O,\n): O\n\nexport function pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P>(\n\ta: A,\n\tab: (a: A) => B,\n\tbc: (b: B) => C,\n\tcd: (c: C) => D,\n\tde: (d: D) => E,\n\tef: (e: E) => F,\n\tfg: (f: F) => G,\n\tgh: (g: G) => H,\n\thi: (h: H) => I,\n\tij: (i: I) => J,\n\tjk: (j: J) => K,\n\tkl: (k: K) => L,\n\tlm: (l: L) => M,\n\tmn: (m: M) => N,\n\tno: (n: N) => O,\n\top: (o: O) => P,\n): P\n\nexport function pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q>(\n\ta: A,\n\tab: (a: A) => B,\n\tbc: (b: B) => C,\n\tcd: (c: C) => D,\n\tde: (d: D) => E,\n\tef: (e: E) => F,\n\tfg: (f: F) => G,\n\tgh: (g: G) => H,\n\thi: (h: H) => I,\n\tij: (i: I) => J,\n\tjk: (j: J) => K,\n\tkl: (k: K) => L,\n\tlm: (l: L) => M,\n\tmn: (m: M) => N,\n\tno: (n: N) => O,\n\top: (o: O) => P,\n\tpq: (p: P) => Q,\n): Q\n\nexport function pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R>(\n\ta: A,\n\tab: (a: A) => B,\n\tbc: (b: B) => C,\n\tcd: (c: C) => D,\n\tde: (d: D) => E,\n\tef: (e: E) => F,\n\tfg: (f: F) => G,\n\tgh: (g: G) => H,\n\thi: (h: H) => I,\n\tij: (i: I) => J,\n\tjk: (j: J) => K,\n\tkl: (k: K) => L,\n\tlm: (l: L) => M,\n\tmn: (m: M) => N,\n\tno: (n: N) => O,\n\top: (o: O) => P,\n\tpq: (p: P) => Q,\n\tqr: (q: Q) => R,\n): R\n\nexport function pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S>(\n\ta: A,\n\tab: (a: A) => B,\n\tbc: (b: B) => C,\n\tcd: (c: C) => D,\n\tde: (d: D) => E,\n\tef: (e: E) => F,\n\tfg: (f: F) => G,\n\tgh: (g: G) => H,\n\thi: (h: H) => I,\n\tij: (i: I) => J,\n\tjk: (j: J) => K,\n\tkl: (k: K) => L,\n\tlm: (l: L) => M,\n\tmn: (m: M) => N,\n\tno: (n: N) => O,\n\top: (o: O) => P,\n\tpq: (p: P) => Q,\n\tqr: (q: Q) => R,\n\trs: (r: R) => S,\n): S\n\nexport function pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T>(\n\ta: A,\n\tab: (a: A) => B,\n\tbc: (b: B) => C,\n\tcd: (c: C) => D,\n\tde: (d: D) => E,\n\tef: (e: E) => F,\n\tfg: (f: F) => G,\n\tgh: (g: G) => H,\n\thi: (h: H) => I,\n\tij: (i: I) => J,\n\tjk: (j: J) => K,\n\tkl: (k: K) => L,\n\tlm: (l: L) => M,\n\tmn: (m: M) => N,\n\tno: (n: N) => O,\n\top: (o: O) => P,\n\tpq: (p: P) => Q,\n\tqr: (q: Q) => R,\n\trs: (r: R) => S,\n\tst: (s: S) => T,\n): T\nexport function pipe(\n\ta: unknown,\n\tab?: Function,\n\tbc?: Function,\n\tcd?: Function,\n\tde?: Function,\n\tef?: Function,\n\tfg?: Function,\n\tgh?: Function,\n\thi?: Function,\n): unknown {\n\t// biome-ignore lint/style/noArguments: <explanation>\n\tswitch (arguments.length) {\n\t\tcase 1:\n\t\t\treturn a\n\t\tcase 2:\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: <explanation>\n\t\t\treturn ab!(a)\n\t\tcase 3:\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: <explanation>\n\t\t\treturn bc!(ab!(a))\n\t\tcase 4:\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: <explanation>\n\t\t\treturn cd!(bc!(ab!(a)))\n\t\tcase 5:\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: <explanation>\n\t\t\treturn de!(cd!(bc!(ab!(a))))\n\t\tcase 6:\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: <explanation>\n\t\t\treturn ef!(de!(cd!(bc!(ab!(a)))))\n\t\tcase 7:\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: <explanation>\n\t\t\treturn fg!(ef!(de!(cd!(bc!(ab!(a))))))\n\t\tcase 8:\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: <explanation>\n\t\t\treturn gh!(fg!(ef!(de!(cd!(bc!(ab!(a)))))))\n\t\tcase 9:\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: <explanation>\n\t\t\treturn hi!(gh!(fg!(ef!(de!(cd!(bc!(ab!(a))))))))\n\t\tdefault: {\n\t\t\t// biome-ignore lint/style/noArguments: <explanation>\n\t\t\tlet ret = arguments[0]\n\t\t\t// biome-ignore lint/style/noArguments: <explanation>\n\t\t\tfor (let i = 1; i < arguments.length; i++) {\n\t\t\t\t// biome-ignore lint/style/noArguments: <explanation>\n\t\t\t\tret = arguments[i](ret)\n\t\t\t}\n\t\t\treturn ret\n\t\t}\n\t}\n}\n","import type { Refinement } from \"../refinement\"\n\nexport * from \"./curry\"\nexport * from \"./pipe\"\n\nexport type ƒn = (...parameters: any[]) => any\n\nexport const doNothing = (): void => undefined\n\nexport const become =\n\t<T>(nextVersionOfThing: Modifier<T> | T) =>\n\t(originalThing: T | (() => T)): T =>\n\t\tnextVersionOfThing instanceof Function\n\t\t\t? nextVersionOfThing(\n\t\t\t\t\toriginalThing instanceof Function ? originalThing() : originalThing,\n\t\t\t )\n\t\t\t: nextVersionOfThing\n\nexport type Applicator<X, Y> = (next: Modifier<X> | X) => Modifier<Y>\nexport type Modifier<T> = (thing: T) => T\n\nexport type OneOrMany<T> = T | T[]\n\nexport const isModifier =\n\t<T>(validate: Refinement<unknown, T>) =>\n\t(sample: T): Refinement<unknown, Modifier<T>> => {\n\t\tconst sampleIsValid = validate(sample)\n\t\tif (!sampleIsValid) {\n\t\t\tthrow new Error(`Invalid test case: JSON.stringify(${sample})`)\n\t\t}\n\t\treturn (input: unknown): input is Modifier<T> => {\n\t\t\tif (typeof input !== `function`) return false\n\t\t\tconst testResult = input(sample)\n\t\t\treturn validate(testResult)\n\t\t}\n\t}\n\nexport const pass =\n\t<Params extends ReadonlyArray<any>, Out>(...params: Params) =>\n\t(fn: (...params: Params) => Out): Out =>\n\t\tfn(...params)\n\nexport const typeOf =\n\t<T>(input: unknown) =>\n\t(isType: Refinement<unknown, T>): boolean =>\n\t\tisType(input)\n\nexport const raiseError = (message: string): never => {\n\tthrow new Error(message)\n}\n\nexport type Encapsulate<T extends (...args: any[]) => any> = (\n\t...args: Parameters<T>\n) => void\n\nexport const attempt = (fn: () => void): boolean => {\n\ttry {\n\t\tfn()\n\t\treturn true\n\t} catch (_) {\n\t\treturn false\n\t}\n}\n\nexport const fallback = <T>(fn: () => T, fallbackValue: T): T => {\n\ttry {\n\t\treturn fn()\n\t} catch (_) {\n\t\treturn fallbackValue\n\t}\n}\n","export type VennCheck = (\n\titems: ReadonlyArray<unknown> | unknown[],\n) => (array: ReadonlyArray<unknown> | unknown[]) => boolean\n\nexport type VennTally = (\n\titems: ReadonlyArray<unknown> | unknown[],\n) => (array: ReadonlyArray<unknown> | unknown[]) => number\n\nexport const includesAll: VennCheck = (items) => (array) => {\n\tfor (const item of items) {\n\t\tif (!array.includes(item)) return false\n\t}\n\treturn true\n}\n\nexport const includesAny: VennCheck = (items) => (array) => {\n\tfor (const item of items) {\n\t\tif (array.includes(item)) return true\n\t}\n\treturn false\n}\n\nexport const excludesAll: VennCheck = (items) => (array) =>\n\t!includesAny(items)(array)\n\nexport const excludesAny: VennCheck = (items) => (array) =>\n\t!includesAll(items)(array)\n\nexport const comprises: VennCheck = (items) => (array) =>\n\tincludesAll(items)(array) && includesAll(array)(items)\n\nexport const overlaps: VennTally = (items) => (array) => {\n\tlet incidences = 0\n\tfor (const item of items) {\n\t\tif (array.includes(item)) incidences += 1\n\t}\n\treturn incidences\n}\n","import type { Refinement } from \"../refinement\"\n\nexport * from \"./match\"\nexport * from \"./venn\"\n\nexport const each =\n\t<T>(isType: Refinement<unknown, T>) =>\n\t(input: unknown): T[] =>\n\t\tisType(input) ? [input] : Array.isArray(input) ? input.filter(isType) : []\n\nexport const lastOf = <T>(input: ReadonlyArray<T>): T | undefined =>\n\tinput[input.length - 1]\n\nexport const isArray =\n\t<T>(isType: Refinement<unknown, T>) =>\n\t(input: unknown): input is T[] =>\n\t\tArray.isArray(input) && input.every((item) => isType(item))\n\nexport const at =\n\t<T>(index: number) =>\n\t(input: T[]): T | undefined =>\n\t\tinput.at(index)\n\nexport const content =\n\t<T>(isType: Refinement<unknown, T>) =>\n\t(input: unknown): input is T | T[] =>\n\t\tisType(input) || isArray(isType)(input)\n\nexport const join =\n\t(separator?: string) =>\n\t(a: string[]): string =>\n\t\ta.join(separator)\n\nexport const map =\n\t<I, O>(f: (value: I, index: number, array: I[]) => O) =>\n\t(a: I[]): O[] =>\n\t\ta.map(f)\n\nexport const reduce =\n\t<I, O>(f: (acc: O, value: I, index: number, array: I[]) => O, initial: O) =>\n\t(a: I[]): O =>\n\t\ta.reduce(f, initial)\n\nexport const slice =\n\t(start: number, end?: number) =>\n\t<I>(a: I[]): I[] =>\n\t\ta.slice(start, end)\n\nexport const using =\n\t<I, O>(a: I[]) =>\n\t(f: (acc: O, value: I, index: number, array: I[]) => O) =>\n\t(initial: O): O =>\n\t\ta.reduce(f, initial)\n\nexport const reduceRight =\n\t<I, O>(f: (acc: O, value: I, index: number, array: I[]) => O, initial: O) =>\n\t(a: I[]): O =>\n\t\ta.reduceRight(f, initial)\n\nexport const reverse = <I>(a: I[]): I[] => a.reverse()\n\nexport const sort =\n\t<I>(a: I[]) =>\n\t(f?: (x: I, y: I) => number): I[] =>\n\t\tf ? a.sort(f) : a.sort()\n\nexport const sortBy =\n\t<I>(f: (value: I) => number) =>\n\t(a: I[]): I[] =>\n\t\ta.sort((x, y) => f(x) - f(y))\n\nexport const sortByDesc =\n\t<I>(f: (value: I) => number) =>\n\t(a: I[]): I[] =>\n\t\ta.sort((x, y) => f(y) - f(x))\n\nexport const every =\n\t<I>(f: (value: I, index: number, array: I[]) => boolean = Boolean) =>\n\t(a: I[]): boolean =>\n\t\ta.every(f)\n\nexport const allTrue = every((x: boolean) => x === true)\n\nexport const addTo =\n\t<I>(a: I[]) =>\n\t(x: I): I[] =>\n\t\ta.includes(x) ? a : [...a, x]\n\nexport const isEmptyArray = (input: unknown): input is [] =>\n\tArray.isArray(input) && input.length === 0\n\nexport const isOneOf =\n\t<T>(...args: ReadonlyArray<T>) =>\n\t(input: unknown): input is T =>\n\t\targs.includes(input as T)\n\nexport const filter =\n\t<I, O extends I>(f: (value: I, index: number, array: I[]) => value is O) =>\n\t(a: I[]): O[] =>\n\t\ta.filter(f)\n","import type { Refinement } from \"../refinement\"\n\nexport const isUndefined = (input: unknown): input is undefined =>\n\tinput === undefined\n\nexport const ifDefined = <T>(\n\tvalidate: Refinement<unknown, T>,\n): Refinement<unknown, T | undefined> =>\n\t((input) => isUndefined(input) || validate(input)) as Refinement<\n\t\tunknown,\n\t\tT | undefined\n\t>\n\nexport const isNull = (input: unknown): input is null => input === null\n\nexport const isNullish = (input: unknown): input is null | undefined =>\n\tisUndefined(input) || isNull(input)\n\nexport type NullSafeUnion<Base, Extension> = Extension extends null\n\t? Base\n\t: Base & Extension\n\nexport type NullSafeRest<MaybeArg, IfArg = MaybeArg> = MaybeArg extends null\n\t? [] | [undefined]\n\t: [IfArg]\n\nexport interface Discard {\n\treadonly _discard: unique symbol\n}\n\nexport const ifNullish =\n\t<X, Y>(alt: Y) =>\n\t(input: X): Exclude<X, null | undefined> | Y =>\n\t\t(input ?? alt) as Exclude<X, null | undefined> | Y\n","export const key =\n\t<T extends object>(k: keyof T) =>\n\t(obj: Exclude<object, null>): unknown =>\n\t\t(obj as Record<keyof any, any>)[k]\n\nexport const access = <V, T extends Record<keyof any, V>>(\n\tk: keyof any,\n): {\n\t(obj: T): T[keyof T] | undefined\n\tin: (obj: T) => T[keyof T] | undefined\n} =>\n\tObject.assign((obj: T) => obj[k as keyof T], {\n\t\tin: (obj: T) => obj[k as keyof T],\n\t})\n","export type Entries<K extends keyof any, V> = [key: K, value: V][]\n\nexport const recordToEntries = <K extends keyof any, V>(\n\tobj: Record<K, V>,\n): Entries<K, V> => Object.entries(obj) as Entries<K, V>\n\nexport const entriesToRecord = <K extends keyof any, V>(\n\tentries: Entries<K, V>,\n): Record<K, V> => Object.fromEntries(entries) as Record<K, V>\n","import { pipe } from \"../function\"\n\nimport { map } from \"../array\"\nimport { entriesToRecord, recordToEntries } from \"./entries\"\n\nexport const mapObject = <K extends keyof any, I, O>(\n\tobj: Record<K, I>,\n\tfn: (val: I, key: K) => O,\n): Record<K, O> =>\n\tpipe(\n\t\tobj,\n\t\trecordToEntries,\n\t\tmap(([key, val]) => [key, fn(val, key)] as const),\n\t\tentriesToRecord,\n\t)\n\nexport const mob =\n\t<K extends keyof any, I, O>(fn: (val: I, key: K) => O) =>\n\t(obj: Record<K, I>): Record<K, O> =>\n\t\tmapObject(obj, fn)\n","import { pipe } from \"../function\"\nimport type { Refinement } from \"../refinement\"\n\nimport { allTrue, every } from \"../array\"\nimport { pass } from \"../function\"\nimport { ifNullish } from \"../nullish\"\nimport { access } from \"./access\"\nimport { recordToEntries } from \"./entries\"\nimport { mob } from \"./mapObject\"\n\nexport type PlainObject = Record<keyof any, unknown>\nexport type EmptyObject = Record<keyof any, never>\n\nexport const isNonNullObject = (input: unknown): input is object =>\n\ttypeof input === `object` && input !== null\n\nexport const isPlainObject = (input: unknown): input is PlainObject =>\n\tisNonNullObject(input) && Object.getPrototypeOf(input) === Object.prototype\n\nexport const isEmptyObject = (input: unknown): input is EmptyObject =>\n\tisPlainObject(input) && Object.keys(input).length === 0\n\nexport const isRecord =\n\t<KEY extends keyof any, VAL>(\n\t\tisKey: Refinement<keyof any, KEY>,\n\t\tisValue: Refinement<unknown, VAL>,\n\t) =>\n\t(input: unknown): input is Record<KEY, VAL> =>\n\t\tisPlainObject(input) &&\n\t\tObject.entries(input).every(([k, v]) => isKey(k) && isValue(v))\n\nexport type HasPropertiesOptions = {\n\treadonly allowExtraProperties?: boolean\n}\nexport const hasProperties = <OBJ extends object>(\n\tisValue: {\n\t\t[K in keyof OBJ]: Refinement<unknown, OBJ[K]>\n\t},\n\toptions: HasPropertiesOptions = { allowExtraProperties: false },\n): Refinement<unknown, OBJ> => {\n\tconst name = `{${recordToEntries(\n\t\tisValue as Record<keyof any, Refinement<any, any>>,\n\t)\n\t\t.map(([k, v]) => String(k) + `:` + v.name)\n\t\t.join(`,`)}}`\n\n\tconst _ = {\n\t\t[name]: (input: unknown): input is OBJ =>\n\t\t\tisPlainObject(input) &&\n\t\t\tpipe(\n\t\t\t\tisValue,\n\t\t\t\tObject.entries,\n\t\t\t\tevery(([key, val]) => key in input || val(undefined)),\n\t\t\t) &&\n\t\t\tpipe(\n\t\t\t\tinput,\n\t\t\t\tmob((val, key) =>\n\t\t\t\t\tpipe(\n\t\t\t\t\t\tisValue,\n\t\t\t\t\t\taccess(key),\n\t\t\t\t\t\tifNullish(() => options.allowExtraProperties),\n\t\t\t\t\t\tpass(val),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tObject.values,\n\t\t\t\tallTrue,\n\t\t\t),\n\t}\n\treturn _[name]\n}\n\nexport const ALLOW_EXTENSION = { allowExtraProperties: true }\nexport const doesExtend = <OBJ extends object>(\n\tisValue: {\n\t\t[K in keyof OBJ]: Refinement<unknown, OBJ[K]>\n\t},\n): Refinement<unknown, OBJ> => hasProperties(isValue, ALLOW_EXTENSION)\n\nexport const DO_NOT_ALLOW_EXTENSION = { allowExtraProperties: false }\nexport const hasExactProperties = <OBJ extends object>(\n\tisValue: {\n\t\t[K in keyof OBJ]: Refinement<unknown, OBJ[K]>\n\t},\n): Refinement<unknown, OBJ> => hasProperties(isValue, DO_NOT_ALLOW_EXTENSION)\n","import { isPlainObject } from \"./refinement\"\n\n// if you found what you were looking for, return true and break\nexport type InspectionResult = Partial<{\n\tpathComplete: true\n\tjobComplete: true\n}>\nexport type InspectNode = (\n\tpath: string[],\n\tnode: unknown,\n) => InspectionResult | void\n\nexport const sprawl = (\n\ttree: Array<unknown> | object,\n\tinspector: InspectNode,\n): void => {\n\tconst walk = (path: string[], node: unknown): InspectionResult => {\n\t\tconst inspect = (path: string[], node: unknown): InspectionResult | null => {\n\t\t\t// console.log(parent)\n\t\t\tconst result = inspector(path, node)\n\t\t\tif (result) return result\n\t\t\treturn null\n\t\t}\n\t\tconst result = inspect(path, node)\n\t\tif (result?.jobComplete || result?.pathComplete) {\n\t\t\treturn result\n\t\t}\n\t\tconst childEntries = Array.isArray(node)\n\t\t\t? node.map((v, i) => [i, v])\n\t\t\t: isPlainObject(node)\n\t\t\t ? Object.entries(node)\n\t\t\t : []\n\t\tfor (const [k, v] of childEntries) {\n\t\t\tconst subResult = walk([...path, k], v)\n\t\t\tif (subResult?.jobComplete) {\n\t\t\t\treturn subResult\n\t\t\t}\n\t\t}\n\t\treturn {}\n\t}\n\twalk([], tree)\n}\n","import { pipe } from \"../function\"\nimport type { Refinement } from \"../refinement\"\n\nimport { filter, includesAny, reduce } from \"../array\"\nimport { isUndefined } from \"../nullish\"\nimport { deepMob } from \"./deepMob\"\nimport { entriesToRecord, recordToEntries } from \"./entries\"\nimport { isPlainObject } from \"./refinement\"\n\nexport * from \"./access\"\nexport * from \"./deepMob\"\nexport * from \"./entries\"\nexport * from \"./mapObject\"\nexport * from \"./modify\"\nexport * from \"./patch\"\nexport * from \"./refinement\"\nexport * from \"./sprawl\"\n\nexport const redact =\n\t<K extends keyof any>(...args: K[]) =>\n\t<O extends Record<K, any>>(obj: O): Omit<O, K> =>\n\t\treduce<K, O>((acc, key) => (delete acc[key], acc), obj)(args)\n\nexport type Redacted<Holder, RedactProp extends keyof any> = Omit<\n\t{\n\t\t[K in keyof Holder]: Holder[K] extends (infer Item)[]\n\t\t\t? Redacted<Item, RedactProp>[]\n\t\t\t: Redacted<Omit<Holder[K], RedactProp>, RedactProp>\n\t},\n\tRedactProp\n>\nexport const redactDeep =\n\t<K extends keyof any>(...args: K[]) =>\n\t<O extends Record<K, any>>(base: O): Redacted<O, K> =>\n\t\tdeepMob(base, (node, path) =>\n\t\t\tincludesAny(args)(path)\n\t\t\t\t? {\n\t\t\t\t\t\tmeta: { pathComplete: true },\n\t\t\t\t }\n\t\t\t\t: {\n\t\t\t\t\t\tdata: isPlainObject(node)\n\t\t\t\t\t\t\t? redact(...args)(node as Record<keyof any, any>)\n\t\t\t\t\t\t\t: node,\n\t\t\t\t },\n\t\t)\n\nexport const select =\n\t<Key extends keyof any>(...args: Key[]) =>\n\t<Obj extends object>(\n\t\tobj: Obj,\n\t): {\n\t\t// @ts-expect-error fuk u\n\t\t[K in keyof Pick<Obj, Key>]: any extends Pick<Obj, Key>[K]\n\t\t\t? undefined\n\t\t\t: // @ts-expect-error fuk u\n\t\t\t Pick<Obj, Key>[K]\n\t} =>\n\t\t// @ts-expect-error fuk u ts\n\t\treduce<Key, Pick<Obj, Key>>(\n\t\t\t// @ts-expect-error i will fite u\n\t\t\t(acc, key) => (key in obj ? (acc[key] = obj[key as keyof Obj]) : acc, acc),\n\t\t\t// @ts-expect-error fuk u\n\t\t\t{} as Pick<Obj, Key>,\n\t\t)(args)\n\nexport const treeShake =\n\t(shouldDiscard: (val: unknown, key: keyof any) => boolean = isUndefined) =>\n\t<T extends object>(\n\t\tobj: T,\n\t): T extends Record<keyof any, unknown> ? T : Partial<T> => {\n\t\tconst newObj = {} as T\n\t\tconst entries = Object.entries(obj) as [keyof T, any][]\n\t\tfor (const [key, val] of entries) {\n\t\t\tif (!shouldDiscard(val, key)) {\n\t\t\t\tnewObj[key] = val\n\t\t\t}\n\t\t}\n\t\treturn newObj as T extends Record<keyof any, unknown> ? T : Partial<T>\n\t}\n\nexport type KeysExtending<T, V> = keyof {\n\t[K in keyof T]: T[K] extends V ? K : never\n}\n\nconst a: never | null = null\n\nexport const filterProperties =\n\t<DiscardVal, DiscardKey extends keyof any>(\n\t\tshouldDiscardVal: Refinement<unknown, DiscardVal>,\n\t\tshouldDiscardKey: Refinement<unknown, DiscardKey>,\n\t) =>\n\t<P extends Record<keyof any, any>>(\n\t\tprops: P,\n\t): DiscardVal extends never\n\t\t? DiscardKey extends never\n\t\t\t? P\n\t\t\t: Omit<P, DiscardKey>\n\t\t: Omit<P, DiscardKey | KeysExtending<P, DiscardVal>> =>\n\t\t// @ts-expect-error oh well\n\t\tpipe(\n\t\t\tprops,\n\t\t\trecordToEntries,\n\t\t\tfilter(\n\t\t\t\t(\n\t\t\t\t\tentry,\n\t\t\t\t): entry is [\n\t\t\t\t\tExclude<keyof P, DiscardKey>,\n\t\t\t\t\tExclude<P[keyof P], DiscardVal>,\n\t\t\t\t] => !shouldDiscardKey(entry[0]) || !shouldDiscardVal(entry[1]),\n\t\t\t),\n\t\t\tentriesToRecord,\n\t\t)\n\nexport const delve = (\n\tobj: Record<keyof any, any>,\n\tpath: ReadonlyArray<keyof any>,\n): Error | { found: unknown } => {\n\tconst found = path.reduce((acc, key) => acc?.[key], obj)\n\treturn found === undefined ? new Error(`Not found`) : { found }\n}\n\nexport const tweak = (\n\tobj: Record<keyof any, any>,\n\tpath: ReadonlyArray<keyof any>,\n\tvalue: unknown,\n): void =>\n\tpath.reduce((acc, key, i) => {\n\t\tif (i === path.length - 1) {\n\t\t\tacc[key] = value\n\t\t}\n\t\tif (acc[key] === undefined) {\n\t\t\tacc[key] = typeof key === `number` ? [] : {}\n\t\t}\n\t\treturn acc[key]\n\t}, obj)\n\nexport type RequireAtLeastOne<T> = {\n\t[K in keyof T]-?: Partial<Pick<T, Exclude<keyof T, K>>> & Required<Pick<T, K>>\n}[keyof T]\n\nexport type RequireExactlyOne<T> = {\n\t[K in keyof T]-?: Required<Pick<T, K>>\n}[keyof T]\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../rel8/junction/src/junction.ts"],"names":["a","b"],"mappings":"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","sourcesContent":["import type { Cardinality, Json, Refinement } from \"rel8\"\n\nexport interface JunctionEntries<Content extends Json.Object | null>\n\textends Json.Object {\n\treadonly relations: [string, string[]][]\n\treadonly contents: [string, Content][]\n}\nexport interface JunctionSchema<ASide extends string, BSide extends string>\n\textends Json.Object {\n\treadonly between: [a: ASide, b: BSide]\n\treadonly cardinality: Cardinality\n}\n\nexport type BaseExternalStoreConfiguration = {\n\taddRelation: (a: string, b: string) => void\n\tdeleteRelation: (a: string, b: string) => void\n\treplaceRelationsSafely: (a: string, bs: string[]) => void\n\treplaceRelationsUnsafely: (a: string, bs: string[]) => void\n\tgetRelatedKeys: (key: string) => Set<string> | undefined\n\thas: (a: string, b?: string) => boolean\n}\n\nexport type ExternalStoreWithContentConfiguration<Content extends Json.Object> =\n\t{\n\t\tgetContent: (contentKey: string) => Content | undefined\n\t\tsetContent: (contentKey: string, content: Content) => void\n\t\tdeleteContent: (contentKey: string) => void\n\t}\n\nexport type Empty<Obj extends object> = {\n\t[Key in keyof Obj]?: undefined\n}\n\nexport type ExternalStoreConfiguration<Content extends Json.Object | null> =\n\tContent extends Json.Object\n\t\t? BaseExternalStoreConfiguration &\n\t\t\t\tExternalStoreWithContentConfiguration<Content>\n\t\t: BaseExternalStoreConfiguration &\n\t\t\t\tEmpty<ExternalStoreWithContentConfiguration<Json.Object>>\n\nexport type JunctionAdvancedConfiguration<Content extends Json.Object | null> = {\n\texternalStore?: ExternalStoreConfiguration<Content>\n\tisContent?: Refinement<unknown, Content>\n\tmakeContentKey?: (a: string, b: string) => string\n}\n\nexport type JunctionJSON<\n\tASide extends string,\n\tBSide extends string,\n\tContent extends Json.Object | null,\n> = JunctionEntries<Content> & JunctionSchema<ASide, BSide>\n\nexport class Junction<\n\tconst ASide extends string,\n\tconst BSide extends string,\n\tconst Content extends Json.Object | null = null,\n> {\n\tpublic readonly a: ASide\n\tpublic readonly b: BSide\n\tpublic readonly cardinality: Cardinality\n\tpublic readonly relations = new Map<string, Set<string>>()\n\tpublic readonly contents = new Map<string, Content>()\n\n\tpublic isContent: Refinement<unknown, Content> | null\n\tpublic makeContentKey = (a: string, b: string): string => `${a}:${b}`\n\n\tpublic getRelatedKeys(key: string): Set<string> | undefined {\n\t\treturn this.relations.get(key)\n\t}\n\tprotected addRelation(a: string, b: string): void {\n\t\tlet aRelations = this.relations.get(a)\n\t\tlet bRelations = this.relations.get(b)\n\t\tif (aRelations) {\n\t\t\taRelations.add(b)\n\t\t} else {\n\t\t\taRelations = new Set([b])\n\t\t\tthis.relations.set(a, aRelations)\n\t\t}\n\t\tif (bRelations) {\n\t\t\tbRelations.add(a)\n\t\t} else {\n\t\t\tbRelations = new Set([a])\n\t\t\tthis.relations.set(b, bRelations)\n\t\t}\n\t}\n\tprotected deleteRelation(a: string, b: string): void {\n\t\tconst aRelations = this.relations.get(a)\n\t\tif (aRelations) {\n\t\t\taRelations.delete(b)\n\t\t\tif (aRelations.size === 0) {\n\t\t\t\tthis.relations.delete(a)\n\t\t\t}\n\t\t\tconst bRelations = this.relations.get(b)\n\t\t\tif (bRelations) {\n\t\t\t\tbRelations.delete(a)\n\t\t\t\tif (bRelations.size === 0) {\n\t\t\t\t\tthis.relations.delete(b)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected replaceRelationsUnsafely(a: string, bs: string[]): void {\n\t\tthis.relations.set(a, new Set(bs))\n\t\tfor (const b of bs) {\n\t\t\tconst bRelations = new Set([a])\n\t\t\tthis.relations.set(b, bRelations)\n\t\t}\n\t}\n\tprotected replaceRelationsSafely(a: string, bs: string[]): void {\n\t\tconst aRelationsPrev = this.relations.get(a)\n\t\tif (aRelationsPrev) {\n\t\t\tfor (const b of aRelationsPrev) {\n\t\t\t\tconst bRelations = this.relations.get(b)\n\t\t\t\tif (bRelations) {\n\t\t\t\t\tif (bRelations.size === 1) {\n\t\t\t\t\t\tthis.relations.delete(b)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbRelations.delete(a)\n\t\t\t\t\t}\n\t\t\t\t\tthis.contents.delete(this.makeContentKey(a, b))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.relations.set(a, new Set(bs))\n\t\tfor (const b of bs) {\n\t\t\tlet bRelations = this.relations.get(b)\n\t\t\tif (bRelations) {\n\t\t\t\tbRelations.add(a)\n\t\t\t} else {\n\t\t\t\tbRelations = new Set([a])\n\t\t\t\tthis.relations.set(b, bRelations)\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected getContentInternal(contentKey: string): Content | undefined {\n\t\treturn this.contents.get(contentKey)\n\t}\n\tprotected setContent(contentKey: string, content: Content): void {\n\t\tthis.contents.set(contentKey, content)\n\t}\n\tprotected deleteContent(contentKey: string): void {\n\t\tthis.contents.delete(contentKey)\n\t}\n\n\tpublic constructor(\n\t\tdata: JunctionSchema<ASide, BSide> & Partial<JunctionEntries<Content>>,\n\t\tconfig?: JunctionAdvancedConfiguration<Content>,\n\t) {\n\t\tthis.a = data.between[0]\n\t\tthis.b = data.between[1]\n\n\t\tthis.cardinality = data.cardinality\n\t\tif (!config?.externalStore) {\n\t\t\tthis.relations = new Map(data.relations?.map(([a, b]) => [a, new Set(b)]))\n\t\t\tthis.contents = new Map(data.contents)\n\t\t}\n\t\tthis.isContent = config?.isContent ?? null\n\t\tif (config?.makeContentKey) {\n\t\t\tthis.makeContentKey = config.makeContentKey\n\t\t}\n\t\tif (config?.externalStore) {\n\t\t\tconst externalStore = config.externalStore\n\t\t\tthis.has = (a, b) => externalStore.has(a, b)\n\t\t\tthis.addRelation = (a, b) => {\n\t\t\t\texternalStore.addRelation(a, b)\n\t\t\t}\n\t\t\tthis.deleteRelation = (a, b) => {\n\t\t\t\texternalStore.deleteRelation(a, b)\n\t\t\t}\n\t\t\tthis.replaceRelationsSafely = (a, bs) => {\n\t\t\t\texternalStore.replaceRelationsSafely(a, bs)\n\t\t\t}\n\t\t\tthis.replaceRelationsUnsafely = (a, bs) => {\n\t\t\t\texternalStore.replaceRelationsUnsafely(a, bs)\n\t\t\t}\n\t\t\tthis.getRelatedKeys = (key) => externalStore.getRelatedKeys(key)\n\t\t\tif (externalStore.getContent) {\n\t\t\t\tthis.getContentInternal = (contentKey) => {\n\t\t\t\t\treturn externalStore.getContent(contentKey) as any\n\t\t\t\t}\n\t\t\t\tthis.setContent = (contentKey, content) => {\n\t\t\t\t\texternalStore.setContent(contentKey, content as any)\n\t\t\t\t}\n\t\t\t\tthis.deleteContent = (contentKey) => {\n\t\t\t\t\texternalStore.deleteContent(contentKey)\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const [x, ys] of data.relations ?? []) {\n\t\t\t\tfor (const y of ys) this.addRelation(x, y)\n\t\t\t}\n\t\t\tfor (const [contentKey, content] of data.contents ?? []) {\n\t\t\t\tthis.setContent(contentKey, content)\n\t\t\t}\n\t\t}\n\t}\n\tpublic toJSON(): JunctionJSON<ASide, BSide, Content> {\n\t\treturn {\n\t\t\tbetween: [this.a, this.b],\n\t\t\tcardinality: this.cardinality,\n\t\t\trelations: [...this.relations.entries()].map(([a, b]) => [a, [...b]]),\n\t\t\tcontents: [...this.contents.entries()],\n\t\t}\n\t}\n\n\tpublic set(\n\t\ta: string,\n\t\t...rest: Content extends null ? [b: string] : [b: string, content: Content]\n\t): this\n\tpublic set(\n\t\trelation: { [Key in ASide | BSide]: string },\n\t\t...rest: Content extends null ? [] | [b?: undefined] : [content: Content]\n\t): this\n\tpublic set(\n\t\ta: string | { [Key in ASide | BSide]: string },\n\t\t...rest: Content extends null\n\t\t\t? [] | [b?: string | undefined]\n\t\t\t: [b: string, content: Content] | [content: Content]\n\t): this {\n\t\tconst b: string =\n\t\t\ttypeof rest[0] === `string`\n\t\t\t\t? rest[0]\n\t\t\t\t: (a[this.b as keyof typeof a] as string)\n\t\tconst content: Content | undefined =\n\t\t\trest[1] ?? typeof rest[0] === `string` ? undefined : (rest[0] as Content)\n\t\ta = typeof a === `string` ? a : a[this.a]\n\t\tswitch (this.cardinality) {\n\t\t\t// biome-ignore lint/suspicious/noFallthroughSwitchClause: perfect here\n\t\t\tcase `1:1`: {\n\t\t\t\tconst bPrev = this.getRelatedKey(a)\n\t\t\t\tif (bPrev && bPrev !== b) this.delete(bPrev, a)\n\t\t\t}\n\t\t\tcase `1:n`: {\n\t\t\t\tconst aPrev = this.getRelatedKey(b)\n\t\t\t\tif (aPrev && aPrev !== a) this.delete(aPrev, b)\n\t\t\t}\n\t\t}\n\t\tif (content) {\n\t\t\tconst contentKey = this.makeContentKey(a, b)\n\t\t\tthis.setContent(contentKey, content)\n\t\t}\n\t\tthis.addRelation(a, b)\n\t\treturn this\n\t}\n\n\tpublic delete(a: string, b?: string): this\n\tpublic delete(\n\t\trelation:\n\t\t\t| Record<ASide | BSide, string>\n\t\t\t| Record<ASide, string>\n\t\t\t| Record<BSide, string>,\n\t\tb?: undefined,\n\t): this\n\tpublic delete(\n\t\tx:\n\t\t\t| Record<ASide | BSide, string>\n\t\t\t| Record<ASide, string>\n\t\t\t| Record<BSide, string>\n\t\t\t| string,\n\t\tb?: string | undefined,\n\t): this {\n\t\t// @ts-expect-error we deduce that this.b may index x\n\t\tb = typeof b === `string` ? b : (x[this.b] as string | undefined)\n\t\t// @ts-expect-error we deduce that this.a may index x\n\t\tconst a = typeof x === `string` ? x : (x[this.a] as string | undefined)\n\n\t\tif (a === undefined && typeof b === `string`) {\n\t\t\tconst bRelations = this.getRelatedKeys(b)\n\t\t\tif (bRelations) {\n\t\t\t\tfor (const a of bRelations) {\n\t\t\t\t\tthis.delete(a, b)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (typeof a === `string` && b === undefined) {\n\t\t\tconst aRelations = this.getRelatedKeys(a)\n\t\t\tif (aRelations) {\n\t\t\t\tfor (const b of aRelations) {\n\t\t\t\t\tthis.delete(a, b)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (typeof a === `string` && typeof b === `string`) {\n\t\t\tthis.deleteRelation(a, b)\n\t\t\tconst contentKey = this.makeContentKey(a, b)\n\t\t\tthis.deleteContent(contentKey)\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic getRelatedKey(key: string): string | undefined {\n\t\tconst relations = this.getRelatedKeys(key)\n\t\tif (relations) {\n\t\t\tif (relations.size > 1) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`${relations.size} related keys were found for key \"${key}\": (${[\n\t\t\t\t\t\t...relations,\n\t\t\t\t\t]\n\t\t\t\t\t\t.map((k) => `\"${k}\"`)\n\t\t\t\t\t\t.join(`, `)}). Only one related key was expected.`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tfor (const relation of relations) {\n\t\t\t\treturn relation\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic replaceRelations(\n\t\ta: string,\n\t\trelations: Content extends null ? string[] : Record<string, Content>,\n\t\tconfig?: { reckless: boolean },\n\t): this {\n\t\tconst hasContent = !Array.isArray(relations)\n\t\tconst bs = hasContent ? Object.keys(relations) : relations\n\t\tif (config?.reckless) {\n\t\t\tthis.replaceRelationsUnsafely(a, bs)\n\t\t} else {\n\t\t\tthis.replaceRelationsSafely(a, bs)\n\t\t}\n\t\tif (hasContent) {\n\t\t\tfor (const b of bs) {\n\t\t\t\tconst contentKey = this.makeContentKey(a, b)\n\t\t\t\tconst content = relations[b] as Content\n\t\t\t\tthis.setContent(contentKey, content)\n\t\t\t}\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic getContent(a: string, b: string): Content | undefined {\n\t\tconst contentKey = this.makeContentKey(a, b)\n\t\treturn this.getContentInternal(contentKey)\n\t}\n\n\tpublic getRelationEntries(\n\t\tinput: Record<ASide, string> | Record<BSide, string>,\n\t): [string, Content][] {\n\t\tconst a: string | undefined = (input as any)[this.a]\n\t\tconst b: string | undefined = (input as any)[this.b]\n\t\tif (a !== undefined && b === undefined) {\n\t\t\tconst aRelations = this.getRelatedKeys(a)\n\t\t\tif (aRelations) {\n\t\t\t\treturn [...aRelations].map((b) => {\n\t\t\t\t\treturn [b, this.getContent(a, b) ?? (null as Content)]\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tif (a === undefined && b !== undefined) {\n\t\t\tconst bRelations = this.getRelatedKeys(b)\n\t\t\tif (bRelations) {\n\t\t\t\treturn [...bRelations].map((a) => {\n\t\t\t\t\treturn [a, this.getContent(a, b) ?? (null as Content)]\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\treturn []\n\t}\n\n\tpublic has(a: string, b?: string): boolean {\n\t\tif (b) {\n\t\t\tconst setA = this.getRelatedKeys(a)\n\t\t\treturn setA?.has(b) ?? false\n\t\t}\n\t\treturn this.relations.has(a)\n\t}\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../anvl/src/json/json-interface.ts","../../anvl/src/json/index.ts","../../anvl/src/primitive/index.ts"],"names":[],"mappings":";AAOO,IAAM,yBAGT;AAAA,EACH,QAAQ,CAAC,cAAc,MAAM,KAAK,SAAS;AAAA,EAC3C,UAAU,CAAC,SAAS,IAAI,IAAI,IAAI;AACjC;;;ACTO,IAAM,YAAY,CACxB,QAC4D,KAAK,MAAM,GAAG;AAIpE,IAAM,gBAAgB,CAC5B,SACoB,KAAK,UAAU,IAAI;AAIjC,IAAM,kBAAkB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAaO,IAAM,gBAA2B;AAAA,EACvC,OAAO,CAAC;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ,CAAC;AAAA,EACT,QAAQ;AACT;;;ACzCO,IAAM,WAAW,CAAC,UAAoC;AAC5D,SAAO,OAAO,UAAU;AACzB;AAEO,IAAM,WAAW,CAAC,UAAoC;AAC5D,SAAO,OAAO,UAAU;AACzB;AAEO,IAAM,YAAY,CAAC,UAAqC;AAC9D,SAAO,OAAO,UAAU;AACzB;AAEO,IAAM,SAAS,CAAC,UAAkC;AACxD,SAAO,UAAU;AAClB;AAEO,IAAM,cAAc,CAAC,UAAuC;AAClE,SAAO,SAAS,KAAK,KAAK,SAAS,KAAK,KAAK,UAAU,KAAK,KAAK,OAAO,KAAK;AAC9E","sourcesContent":["import type { Json } from \".\"\n\nexport type JsonInterface<T, J extends Json.Serializable = Json.Serializable> = {\n\ttoJson: (t: T) => J\n\tfromJson: (json: J) => T\n}\n\nexport const stringSetJsonInterface: JsonInterface<\n\tSet<string>,\n\tJson.Array<string>\n> = {\n\ttoJson: (stringSet) => Array.from(stringSet),\n\tfromJson: (json) => new Set(json),\n}\n","export * from \"./json-interface\"\nimport type * as Json from \"./json\"\nexport { Json }\n\nexport const parseJson = <S extends Stringified<Json.Serializable>>(\n\tstr: S | string,\n): S extends Stringified<infer J> ? J : Json.Serializable => JSON.parse(str)\n\nexport type Stringified<J extends Json.Serializable> = string & { __json: J }\n\nexport const stringifyJson = <J extends Json.Serializable>(\n\tjson: J,\n): Stringified<J> => JSON.stringify(json) as Stringified<J>\n\nexport type Empty = Record<string, never>\n\nexport const JSON_TYPE_NAMES = [\n\t`array`,\n\t`boolean`,\n\t`null`,\n\t`number`,\n\t`object`,\n\t`string`,\n] as const\n\nexport type JsonTypeName = (typeof JSON_TYPE_NAMES)[number]\n\nexport interface JsonTypes extends Record<JsonTypeName, Json.Serializable> {\n\tarray: Json.Array\n\tboolean: boolean\n\tnull: null\n\tnumber: number\n\tobject: Json.Object\n\tstring: string\n}\n\nexport const JSON_DEFAULTS: JsonTypes = {\n\tarray: [],\n\tboolean: false,\n\tnull: null,\n\tnumber: 0,\n\tobject: {},\n\tstring: ``,\n}\n","export type primitive = boolean | number | string | null\n\nexport const isString = (input: unknown): input is string => {\n\treturn typeof input === `string`\n}\n\nexport const isNumber = (input: unknown): input is number => {\n\treturn typeof input === `number`\n}\n\nexport const isBoolean = (input: unknown): input is boolean => {\n\treturn typeof input === `boolean`\n}\n\nexport const isNull = (input: unknown): input is null => {\n\treturn input === null\n}\n\nexport const isPrimitive = (input: unknown): input is primitive => {\n\treturn isString(input) || isNumber(input) || isBoolean(input) || isNull(input)\n}\n"]}
|
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/atom.ts","../src/dispose.ts","../src/find-state.ts","../src/get-state.ts","../src/logger.ts","../src/selector.ts","../src/set-state.ts","../src/silo.ts","../src/subscribe.ts","../src/timeline.ts","../src/transaction.ts","../src/validators.ts"],"names":["IMPLICIT","Internal","createAtomFamily","createSelectorFamily","createStandaloneAtom","createStandaloneSelector","getFromStore","setIntoStore","createTimeline","timeTravel","timeline","arbitrary","createTransaction"],"mappings":"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","sourcesContent":["import type { Store, Subject, Transceiver } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tcreateAtomFamily,\n\tcreateStandaloneAtom,\n} from \"atom.io/internal\"\nimport type { Json, JsonInterface } from \"atom.io/json\"\n\nimport type { AtomToken, MutableAtomToken, RegularAtomToken } from \".\"\n\nexport type Effectors<T> = {\n\tsetSelf: <V extends T>(next: V | ((oldValue: T) => V)) => void\n\tonSet: (callback: (options: { newValue: T; oldValue: T }) => void) => void\n}\n\nexport type AtomEffect<T> = (tools: Effectors<T>) => (() => void) | void\n\nexport type RegularAtomOptions<T> = {\n\tkey: string\n\tdefault: T | (() => T)\n\teffects?: AtomEffect<T>[]\n}\n// biome-ignore format: complex intersection\nexport type MutableAtomOptions<T extends Transceiver<any>, J extends Json.Serializable> = \n\t& JsonInterface<T, J>\n\t& Omit<RegularAtomOptions<T>, `default`> \n\t& { \n\t\t\tdefault: ()\t=> T\n\t\t\tmutable: true\n\t\t}\n\nexport function atom<T extends Transceiver<any>, J extends Json.Serializable>(\n\toptions: MutableAtomOptions<T, J>,\n): MutableAtomToken<T, J>\nexport function atom<T>(options: RegularAtomOptions<T>): RegularAtomToken<T>\nexport function atom(\n\toptions: MutableAtomOptions<any, any> | RegularAtomOptions<any>,\n): AtomToken<any> {\n\treturn createStandaloneAtom(options, IMPLICIT.STORE)\n}\n\nexport type RegularAtomFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tdefault: T | ((key: K) => T)\n\teffects?: (key: K) => AtomEffect<T>[]\n}\n\nexport type RegularAtomFamilyToken<T, K extends Json.Serializable> = {\n\tkey: string\n\ttype: `atom_family`\n\t__T?: T\n\t__K?: K\n}\n// biome-ignore format: intersection\nexport type RegularAtomFamilyTokenWithCall<\n\tT,\n\tK extends Json.Serializable,\n> = \n\t& RegularAtomFamilyToken<T, K>\n\t& {\n\t\t/** @deprecated Prefer the `findState`, `findInStore`, or `find` functions. */\n\t\t(key: K): RegularAtomToken<T>\n\t}\n// biome-ignore format: intersection\nexport type RegularAtomFamily<T, K extends Json.Serializable> = \n\t& RegularAtomFamilyToken<T, K>\n\t& {\n\t\t(key: K): RegularAtomToken<T>\n\t\tsubject: Subject<RegularAtomToken<T>>\n\t\tinstall: (store: Store) => void\n\t}\n\n// biome-ignore format: intersection\nexport type MutableAtomFamilyOptions<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = \n\t& JsonInterface<T, J>\n\t& { \n\t\tkey: string\n\t\tdefault: (key: K) => T\n\t\teffects?: (key: K) => AtomEffect<T>[]\n\t\tmutable: true,\n\t}\n\nexport type MutableAtomFamilyToken<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = {\n\tkey: string\n\ttype: `mutable_atom_family`\n\t__T?: T\n\t__J?: J\n\t__K?: K\n}\n// biome-ignore format: intersection\nexport type MutableAtomFamilyTokenWithCall<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = \n\t& MutableAtomFamilyToken<T, J, K>\n\t& {\n\t\t/** @deprecated Prefer the `findState`, `findInStore`, or `find` functions. */\n\t\t(key: K): MutableAtomToken<T, J>\n\t}\n// biome-ignore format: intersection\nexport type MutableAtomFamily<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = \n\t& JsonInterface<T, J>\n\t& MutableAtomFamilyToken<T, J, K>\n\t& {\n\t\t\t(key: K): MutableAtomToken<T, J>\n\t\t\tsubject: Subject<MutableAtomToken<T, J>>\n\t\t\tinstall: (store: Store) => void\n\t\t}\n\nexport type AtomFamily<T, K extends Json.Serializable = Json.Serializable> =\n\t| MutableAtomFamily<T extends Transceiver<any> ? T : never, any, K>\n\t| RegularAtomFamily<T, K>\nexport type AtomFamilyToken<T, K extends Json.Serializable = Json.Serializable> =\n\t| MutableAtomFamilyToken<T extends Transceiver<any> ? T : never, any, K>\n\t| RegularAtomFamilyToken<T, K>\n\nexport function atomFamily<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n>(\n\toptions: MutableAtomFamilyOptions<T, J, K>,\n): MutableAtomFamilyTokenWithCall<T, J, K>\nexport function atomFamily<T, K extends Json.Serializable>(\n\toptions: RegularAtomFamilyOptions<T, K>,\n): RegularAtomFamilyTokenWithCall<T, K>\nexport function atomFamily<T, K extends Json.Serializable>(\n\toptions:\n\t\t| MutableAtomFamilyOptions<any, any, any>\n\t\t| RegularAtomFamilyOptions<T, K>,\n):\n\t| MutableAtomFamilyTokenWithCall<any, any, any>\n\t| RegularAtomFamilyTokenWithCall<T, K> {\n\treturn createAtomFamily(options, IMPLICIT.STORE)\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { ReadableToken } from \".\"\n\nexport function dispose(\n\ttoken: ReadableToken<any>,\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): void {\n\tswitch (token.type) {\n\t\tcase `atom`:\n\t\t\tInternal.deleteAtom(token, store)\n\t\t\tbreak\n\t\tcase `selector`:\n\t\tcase `readonly_selector`:\n\t\t\tInternal.deleteSelector(token, store)\n\t\t\tbreak\n\t}\n}\n","import type {\n\tMutableAtomFamilyToken,\n\tMutableAtomToken,\n\tReadableFamilyToken,\n\tReadableToken,\n\tReadonlySelectorFamilyToken,\n\tReadonlySelectorToken,\n\tRegularAtomFamilyToken,\n\tRegularAtomToken,\n\tWritableFamilyToken,\n\tWritableSelectorFamilyToken,\n\tWritableSelectorToken,\n\tWritableToken,\n} from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport { IMPLICIT, findInStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nexport function findState<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n\tKey extends K,\n>(token: MutableAtomFamilyToken<T, J, K>, key: Key): MutableAtomToken<T, J>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: RegularAtomFamilyToken<T, K>,\n\tkey: Key,\n): RegularAtomToken<T>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: WritableSelectorFamilyToken<T, K>,\n\tkey: Key,\n): WritableSelectorToken<T>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: ReadonlySelectorFamilyToken<T, K>,\n\tkey: Key,\n): ReadonlySelectorToken<T>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: WritableFamilyToken<T, K>,\n\tkey: Key,\n): WritableToken<T>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: ReadableFamilyToken<T, K>,\n\tkey: Key,\n): ReadableToken<T>\n\nexport function findState(\n\ttoken: ReadableFamilyToken<any, any>,\n\tkey: Json.Serializable,\n): ReadableToken<any> {\n\tconst state = findInStore(token, key, IMPLICIT.STORE)\n\treturn state\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { ReadableToken } from \".\"\n\nexport function getState<T>(token: ReadableToken<T>): T {\n\treturn Internal.getFromStore(token, Internal.IMPLICIT.STORE)\n}\n","const LoggerIconDictionary = {\n\t\"⌛\": `Timeline event fully captured`,\n\t\"⏩\": `Timeline redo`,\n\t\"⏪\": `Timeline undo`,\n\t\"⏭️\": `Transaction redo`,\n\t\"⏮️\": `Transaction undo`,\n\t\"⏳\": `Timeline event partially captured`,\n\t\"⏹️\": `Time-travel complete`,\n\t\"✅\": `Realtime transaction success`,\n\t\"✨\": `Computation complete`,\n\t\"❌\": `Conflict prevents attempted action`,\n\t\"⭕\": `Operation start`,\n\t\"🐞\": `Possible bug in AtomIO`,\n\t\"👀\": `Subscription added`,\n\t\"👋\": `Greeting`,\n\t\"👍\": `Realtime acknowledgment`,\n\t\"👪\": `Family member added`,\n\t\"💁\": `Notice`,\n\t\"💥\": `Caught`,\n\t\"📁\": `Stow update`,\n\t\"📃\": `Copy mutable`,\n\t\"📖\": `Read state`,\n\t\"📝\": `Write state`,\n\t\"📢\": `Notify subscribers`,\n\t\"🔄\": `Realtime transaction synchronized`,\n\t\"🔌\": `Register dependency`,\n\t\"🔍\": `Discover root`,\n\t\"🔥\": `Delete state`,\n\t\"🔧\": `Create mutable atom`,\n\t\"🔨\": `Create immutable atom`,\n\t\"🔴\": `Operation complete`,\n\t\"🗑\": `Evict cached value`,\n\t\"🙈\": `Subscription canceled`,\n\t\"🚀\": `Performance measure`,\n\t\"🛄\": `Apply transaction`,\n\t\"🛠️\": `Install atom into store`,\n\t\"🛫\": `Begin transaction`,\n\t\"🛬\": `Complete transaction`,\n\t\"🧮\": `Computing selector`,\n\t\"🧹\": `Prepare to evict`,\n\t\"🪂\": `Abort transaction`,\n\t\"🤞\": `Realtime optimistic update enqueued`,\n\t\"👈\": `Realtime confirmed update enqueued`,\n\t\"🧑⚖️\": `Realtime update beginning reconciliation`,\n\t\"🛎️\": `Realtime transaction received`,\n\t\"🔭\": `Determining realtime perspective`,\n\t\"🖌\": `Redacting realtime update`,\n\t\"👁\": `Determining perspective`,\n} as const\nexport type LoggerIcon = keyof typeof LoggerIconDictionary\nexport type TokenDenomination =\n\t| `atom`\n\t| `continuity`\n\t| `mutable_atom`\n\t| `readonly_selector`\n\t| `selector`\n\t| `state`\n\t| `timeline`\n\t| `transaction`\n\t| `unknown`\n\nexport const LOG_LEVELS = [`info`, `warn`, `error`] as const\nexport type LogLevel = (typeof LOG_LEVELS)[number]\n\nexport type LogFn = (\n\ticon: LoggerIcon,\n\tdenomination: TokenDenomination,\n\ttokenKey: string,\n\tmessage: string,\n\t...rest: unknown[]\n) => void\nexport type LogFilter = (...params: Parameters<LogFn>) => boolean\n\nexport type Logger = Record<LogLevel, LogFn>\n\nexport const simpleLog =\n\t(logLevel: keyof Logger): LogFn =>\n\t(icon, denomination, tokenKey, message, ...rest) => {\n\t\tconsole[logLevel](\n\t\t\t`${icon} ${denomination} \"${tokenKey}\" ${message}`,\n\t\t\t...rest,\n\t\t)\n\t}\nexport const simpleLogger: Logger = {\n\terror: simpleLog(`error`),\n\tinfo: simpleLog(`info`),\n\twarn: simpleLog(`warn`),\n}\n\nexport class AtomIOLogger implements Logger {\n\tpublic constructor(\n\t\tpublic logLevel: `error` | `info` | `warn` | null,\n\t\tprivate readonly filter?: LogFilter,\n\t\tprivate readonly logger: Logger = simpleLogger,\n\t) {}\n\n\tpublic error: LogFn = (...args) => {\n\t\tif ((this.filter?.(...args) ?? true) && this.logLevel !== null) {\n\t\t\tthis.logger.error(...args)\n\t\t}\n\t}\n\tpublic info: LogFn = (...args) => {\n\t\tif ((this.filter?.(...args) ?? true) && this.logLevel === `info`) {\n\t\t\tthis.logger.info(...args)\n\t\t}\n\t}\n\tpublic warn: LogFn = (...args) => {\n\t\tif (\n\t\t\t(this.filter?.(...args) ?? true) &&\n\t\t\tthis.logLevel !== `error` &&\n\t\t\tthis.logLevel !== null\n\t\t) {\n\t\t\tthis.logger.warn(...args)\n\t\t}\n\t}\n}\n","import type { Store, Subject } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tcreateSelectorFamily,\n\tcreateStandaloneSelector,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ReadonlySelectorToken, WritableSelectorToken } from \".\"\nimport type { Read, Write } from \"./transaction\"\n\nexport type WritableSelectorOptions<T> = {\n\tkey: string\n\tget: Read<() => T>\n\tset: Write<(newValue: T) => void>\n}\nexport type ReadonlySelectorOptions<T> = {\n\tkey: string\n\tget: Read<() => T>\n}\n\nexport function selector<T>(\n\toptions: WritableSelectorOptions<T>,\n): WritableSelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T>,\n): ReadonlySelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T> | WritableSelectorOptions<T>,\n): ReadonlySelectorToken<T> | WritableSelectorToken<T> {\n\treturn createStandaloneSelector(options, IMPLICIT.STORE)\n}\n\nexport type WritableSelectorFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tget: (key: K) => Read<() => T>\n\tset: (key: K) => Write<(newValue: T) => void>\n}\nexport type ReadonlySelectorFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tget: (key: K) => Read<() => T>\n}\n\nexport type WritableSelectorFamilyToken<T, K extends Json.Serializable> = {\n\tkey: string\n\ttype: `selector_family`\n\t__T?: T\n\t__K?: K\n}\n// biome-ignore format: intersection\nexport type WritableSelectorFamilyTokenWithCall<\n\tT,\n\tK extends Json.Serializable,\n> = \n\t& WritableSelectorFamilyToken<T, K>\n\t& {\n\t\t/** @deprecated Prefer the `findState`, `findInStore`, or `find` functions. */\n\t\t(key: K): WritableSelectorToken<T>\n\t}\n// biome-ignore format: intersection\nexport type WritableSelectorFamily<T, K extends Json.Serializable> = \n\t& WritableSelectorFamilyToken<T, K> \n\t& {\n\t\t(key: K): WritableSelectorToken<T>\n\t\tsubject: Subject<WritableSelectorToken<T>>\n\t\tinstall: (store: Store) => void\n\t}\n\nexport type ReadonlySelectorFamilyToken<T, K extends Json.Serializable> = {\n\tkey: string\n\ttype: `readonly_selector_family`\n\t__T?: T\n\t__K?: K\n}\n// biome-ignore format: intersection\nexport type ReadonlySelectorFamilyTokenWithCall<\n\tT,\n\tK extends Json.Serializable,\n> = \n\t& ReadonlySelectorFamilyToken<T, K>\n\t& {\n\t\t/** @deprecated Prefer the `findState`, `findInStore`, or `find` functions. */\n\t\t(key: K): ReadonlySelectorToken<T>\n\t}\n// biome-ignore format: intersection\nexport type ReadonlySelectorFamily<T, K extends Json.Serializable> = \n\t& ((key: K) => ReadonlySelectorToken<T>)\n\t& {\n\t\tkey: string\n\t\ttype: `readonly_selector_family`\n\t\tsubject: Subject<ReadonlySelectorToken<T>>\n\t\tinstall: (store: Store) => void\n\t\t__T?: T\n\t\t__K?: K\n\t}\n\nexport type SelectorFamily<T, K extends Json.Serializable> =\n\t| ReadonlySelectorFamily<T, K>\n\t| WritableSelectorFamily<T, K>\nexport type SelectorFamilyToken<T, K extends Json.Serializable> =\n\t| ReadonlySelectorFamilyToken<T, K>\n\t| WritableSelectorFamilyToken<T, K>\n\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: WritableSelectorFamilyOptions<T, K>,\n): WritableSelectorFamilyTokenWithCall<T, K>\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: ReadonlySelectorFamilyOptions<T, K>,\n): ReadonlySelectorFamilyTokenWithCall<T, K>\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions:\n\t\t| ReadonlySelectorFamilyOptions<T, K>\n\t\t| WritableSelectorFamilyOptions<T, K>,\n):\n\t| ReadonlySelectorFamilyTokenWithCall<T, K>\n\t| WritableSelectorFamilyTokenWithCall<T, K> {\n\treturn createSelectorFamily(options, IMPLICIT.STORE)\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { WritableToken } from \".\"\n\nexport function setState<T, New extends T>(\n\ttoken: WritableToken<T>,\n\tvalue: New | ((oldValue: T) => New),\n): void {\n\tInternal.setIntoStore(token, value, Internal.IMPLICIT.STORE)\n}\n","import type { Transceiver } from \"atom.io/internal\"\nimport {\n\tStore,\n\tcreateAtomFamily,\n\tcreateSelectorFamily,\n\tcreateStandaloneAtom,\n\tcreateStandaloneSelector,\n\tcreateTimeline,\n\tcreateTransaction,\n\tgetFromStore,\n\tsetIntoStore,\n\ttimeTravel,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type {\n\tAtomToken,\n\tMutableAtomFamily,\n\tMutableAtomFamilyOptions,\n\tMutableAtomOptions,\n\tMutableAtomToken,\n\tRegularAtomFamily,\n\tRegularAtomFamilyOptions,\n\tRegularAtomOptions,\n\tRegularAtomToken,\n\tgetState,\n\tredo,\n\tsetState,\n\ttimeline,\n\tundo,\n} from \".\"\nimport { subscribe } from \".\"\nimport type { atom, atomFamily } from \"./atom\"\nimport type { selector, selectorFamily } from \"./selector\"\nimport type { transaction } from \"./transaction\"\n\nexport class Silo {\n\tpublic store: Store\n\tpublic atom: typeof atom\n\tpublic atomFamily: typeof atomFamily\n\tpublic selector: typeof selector\n\tpublic selectorFamily: typeof selectorFamily\n\tpublic transaction: typeof transaction\n\tpublic timeline: typeof timeline\n\tpublic getState: typeof getState\n\tpublic setState: typeof setState\n\tpublic subscribe: typeof subscribe\n\tpublic undo: typeof undo\n\tpublic redo: typeof redo\n\tpublic constructor(name: string, fromStore: Store | null = null) {\n\t\tconst s = new Store(name, fromStore)\n\t\tfunction _atom<T>(options: RegularAtomOptions<T>): RegularAtomToken<T>\n\t\tfunction _atom<T extends Transceiver<any>, J extends Json.Serializable>(\n\t\t\toptions: MutableAtomOptions<T, J>,\n\t\t): MutableAtomToken<T, J>\n\t\tfunction _atom<T>(\n\t\t\toptions: MutableAtomOptions<any, any> | RegularAtomOptions<T>,\n\t\t): AtomToken<T> {\n\t\t\treturn createStandaloneAtom(options, s)\n\t\t}\n\t\tfunction _atomFamily<\n\t\t\tT extends Transceiver<any>,\n\t\t\tJ extends Json.Serializable,\n\t\t\tK extends Json.Serializable,\n\t\t>(options: MutableAtomFamilyOptions<T, J, K>): MutableAtomFamily<T, J, K>\n\t\tfunction _atomFamily<T, K extends Json.Serializable>(\n\t\t\toptions: RegularAtomFamilyOptions<T, K>,\n\t\t): RegularAtomFamily<T, K>\n\t\tfunction _atomFamily<T, K extends Json.Serializable>(\n\t\t\toptions:\n\t\t\t\t| MutableAtomFamilyOptions<any, any, any>\n\t\t\t\t| RegularAtomFamilyOptions<T, K>,\n\t\t): MutableAtomFamily<any, any, any> | RegularAtomFamily<T, K> {\n\t\t\treturn createAtomFamily(options, s)\n\t\t}\n\t\tthis.store = s\n\t\tthis.atom = _atom\n\t\tthis.atomFamily = _atomFamily\n\t\tthis.selector = (options) => createStandaloneSelector(options, s) as any\n\t\tthis.selectorFamily = (options) => createSelectorFamily(options, s) as any\n\t\tthis.transaction = (options) => createTransaction(options, s)\n\t\tthis.timeline = (options) => createTimeline(options, s)\n\t\tthis.getState = (token) => getFromStore(token, s)\n\t\tthis.setState = (token, newValue) => setIntoStore(token, newValue, s)\n\t\tthis.subscribe = (token, handler, key) => subscribe(token, handler, key, s)\n\t\tthis.undo = (token) => timeTravel(`undo`, token, s)\n\t\tthis.redo = (token) => timeTravel(`redo`, token, s)\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tarbitrary,\n\tsubscribeToState,\n\tsubscribeToTimeline,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\n\nimport type {\n\tFamilyMetadata,\n\tReadableToken,\n\tTimelineManageable,\n\tTimelineToken,\n\tTimelineUpdate,\n\tTransactionToken,\n\tTransactionUpdate,\n\tƒn,\n} from \".\"\n\nexport type StateUpdate<T> = { newValue: T; oldValue: T }\nexport type KeyedStateUpdate<T> = StateUpdate<T> & {\n\tkey: string\n\tfamily?: FamilyMetadata\n}\nexport type UpdateHandler<T> = (update: StateUpdate<T>) => void\n\nexport type TransactionUpdateHandler<ƒ extends ƒn> = (\n\tdata: TransactionUpdate<ƒ>,\n) => void\n\nexport function subscribe<T>(\n\ttoken: ReadableToken<T>,\n\thandleUpdate: UpdateHandler<T>,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe<ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\thandleUpdate: TransactionUpdateHandler<ƒ>,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe<M extends TimelineManageable>(\n\ttoken: TimelineToken<M>,\n\thandleUpdate: (update: TimelineUpdate<M> | `redo` | `undo`) => void,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe(\n\ttoken: ReadableToken<any> | TimelineToken<any> | TransactionToken<any>,\n\thandleUpdate: (update: any) => void,\n\tkey: string = arbitrary(),\n\tstore = IMPLICIT.STORE,\n): () => void {\n\tswitch (token.type) {\n\t\tcase `atom`:\n\t\tcase `mutable_atom`:\n\t\tcase `readonly_selector`:\n\t\tcase `selector`:\n\t\t\treturn subscribeToState(token, handleUpdate, key, store)\n\t\tcase `transaction`:\n\t\t\treturn subscribeToTransaction(token, handleUpdate, key, store)\n\t\tcase `timeline`:\n\t\t\treturn subscribeToTimeline(token, handleUpdate, key, store)\n\t}\n}\n","import type {\n\tTimeline,\n\tTimelineAtomUpdate,\n\tTimelineSelectorUpdate,\n\tTimelineTransactionUpdate,\n} from \"atom.io/internal\"\nimport { IMPLICIT, createTimeline, timeTravel } from \"atom.io/internal\"\n\nimport type { AtomFamilyToken, AtomToken } from \".\"\n\nexport type TimelineManageable = AtomFamilyToken<any, any> | AtomToken<any>\n\nexport type TimelineToken<M> = {\n\tkey: string\n\ttype: `timeline`\n\t__M?: M\n}\n\nexport type TimelineOptions<ManagedAtom extends TimelineManageable> = {\n\tkey: string\n\tatoms: ManagedAtom[]\n\tshouldCapture?: (\n\t\tupdate: TimelineUpdate<ManagedAtom>,\n\t\ttimeline: Timeline<TimelineManageable>,\n\t) => boolean\n}\n\nexport type TimelineUpdate<ManagedAtom extends TimelineManageable> =\n\t| TimelineAtomUpdate<ManagedAtom>\n\t| TimelineSelectorUpdate<ManagedAtom>\n\t| TimelineTransactionUpdate\n\nexport const timeline = <ManagedAtom extends TimelineManageable>(\n\toptions: TimelineOptions<ManagedAtom>,\n): TimelineToken<ManagedAtom> => {\n\treturn createTimeline(options, IMPLICIT.STORE)\n}\n\nexport const redo = (timeline: TimelineToken<any>): void => {\n\ttimeTravel(`redo`, timeline, IMPLICIT.STORE)\n}\n\nexport const undo = (timeline: TimelineToken<any>): void => {\n\ttimeTravel(`undo`, timeline, IMPLICIT.STORE)\n}\n","import type { EnvironmentData } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tactUponStore,\n\tarbitrary,\n\tcreateTransaction,\n} from \"atom.io/internal\"\n\nimport type {\n\tKeyedStateUpdate,\n\tReadonlySelectorToken,\n\tWritableToken,\n\tfindState,\n\tƒn,\n} from \".\"\n\nexport type TransactionToken<F> = {\n\tkey: string\n\ttype: `transaction`\n\t__F?: F\n}\n\nexport type TransactionUpdateContent =\n\t| KeyedStateUpdate<unknown>\n\t| TransactionUpdate<ƒn>\n\nexport type TransactionUpdate<ƒ extends ƒn> = {\n\tkey: string\n\tid: string\n\tepoch: number\n\tupdates: TransactionUpdateContent[]\n\tparams: Parameters<ƒ>\n\toutput: ReturnType<ƒ>\n}\n\nexport type Transactors = Readonly<{\n\tget: <S>(state: ReadonlySelectorToken<S> | WritableToken<S>) => S\n\tset: <S, New extends S>(\n\t\tstate: WritableToken<S>,\n\t\tnewValue: New | ((oldValue: S) => New),\n\t) => void\n\tfind: typeof findState\n}>\nexport type TransactorsWithRunAndEnv = Readonly<{\n\tget: <S>(state: ReadonlySelectorToken<S> | WritableToken<S>) => S\n\tset: <S, New extends S>(\n\t\tstate: WritableToken<S>,\n\t\tnewValue: New | ((oldValue: S) => New),\n\t) => void\n\tfind: typeof findState\n\trun: typeof runTransaction\n\tenv: () => EnvironmentData\n}>\nexport type ReadonlyTransactors = Pick<Transactors, `find` | `get`>\n\nexport type Read<ƒ extends ƒn> = (\n\ttransactors: ReadonlyTransactors,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type Write<ƒ extends ƒn> = (\n\ttransactors: Transactors,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type Transact<ƒ extends ƒn> = (\n\ttransactors: TransactorsWithRunAndEnv,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type TransactionOptions<ƒ extends ƒn> = {\n\tkey: string\n\tdo: Transact<ƒ>\n}\n\nexport type TransactionIO<Token extends TransactionToken<any>> =\n\tToken extends TransactionToken<infer ƒ> ? ƒ : never\n\nexport function transaction<ƒ extends ƒn>(\n\toptions: TransactionOptions<ƒ>,\n): TransactionToken<ƒ> {\n\treturn createTransaction(options, IMPLICIT.STORE)\n}\n\nexport function runTransaction<ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\tid = arbitrary(),\n): (...parameters: Parameters<ƒ>) => ReturnType<ƒ> {\n\treturn actUponStore(token, id, IMPLICIT.STORE)\n}\n","import type {\n\tMutableAtomFamily,\n\tMutableAtomFamilyToken,\n\tMutableAtomToken,\n\tReadableFamily,\n\tReadableFamilyToken,\n\tReadableToken,\n\tReadonlySelectorFamily,\n\tReadonlySelectorFamilyToken,\n\tReadonlySelectorToken,\n\tRegularAtomFamily,\n\tRegularAtomFamilyToken,\n\tRegularAtomToken,\n\tWritableFamily,\n\tWritableFamilyToken,\n\tWritableSelectorFamily,\n\tWritableSelectorFamilyToken,\n\tWritableSelectorToken,\n\tWritableToken,\n} from \"atom.io\"\n\nexport type TokenType<\n\tComparison extends ReadableFamilyToken<any, any> | ReadableToken<any>,\n> = Comparison extends ReadableToken<infer RepresentedValue>\n\t? RepresentedValue\n\t: Comparison extends ReadableFamilyToken<infer RepresentedValue, any>\n\t ? RepresentedValue\n\t : never\n\nexport function isToken<KnownToken extends RegularAtomToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is RegularAtomToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends MutableAtomToken<any, any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is MutableAtomToken<TokenType<KnownToken>, any>\nexport function isToken<KnownToken extends WritableSelectorToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is WritableSelectorToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends ReadonlySelectorToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadonlySelectorToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends WritableToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is WritableToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends ReadableToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadableToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends ReadableToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadableToken<TokenType<KnownToken>> {\n\treturn knownToken.key === unknownToken.key\n}\n\nexport function belongsTo<Family extends RegularAtomFamilyToken<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is RegularAtomToken<TokenType<Family>>\nexport function belongsTo<Family extends MutableAtomFamilyToken<any, any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is MutableAtomToken<TokenType<Family>, any>\nexport function belongsTo<Family extends WritableSelectorFamilyToken<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is WritableSelectorToken<TokenType<Family>>\nexport function belongsTo<Family extends ReadonlySelectorFamilyToken<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadonlySelectorToken<TokenType<Family>>\nexport function belongsTo<Family extends WritableFamilyToken<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is WritableToken<TokenType<Family>>\nexport function belongsTo<Family extends ReadableFamilyToken<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadableToken<TokenType<Family>>\nexport function belongsTo<Family extends ReadableFamilyToken<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadableToken<TokenType<Family>> {\n\treturn family.key === unknownToken.family?.key\n}\n"]}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/atom.ts","../src/dispose.ts","../src/find-state.ts","../src/get-state.ts","../src/logger.ts","../src/selector.ts","../src/set-state.ts","../src/silo.ts","../src/subscribe.ts","../src/timeline.ts","../src/transaction.ts","../src/validators.ts"],"names":["IMPLICIT","Internal","createAtomFamily","createSelectorFamily","createStandaloneAtom","createStandaloneSelector","getFromStore","setIntoStore","createTimeline","timeTravel","timeline","arbitrary","createTransaction"],"mappings":"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","sourcesContent":["import type { Store, Subject, Transceiver } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tcreateAtomFamily,\n\tcreateStandaloneAtom,\n} from \"atom.io/internal\"\nimport type { Json, JsonInterface } from \"atom.io/json\"\n\nimport type { AtomToken, MutableAtomToken, RegularAtomToken } from \".\"\n\nexport type Effectors<T> = {\n\tsetSelf: <V extends T>(next: V | ((oldValue: T) => V)) => void\n\tonSet: (callback: (options: { newValue: T; oldValue: T }) => void) => void\n}\n\nexport type AtomEffect<T> = (tools: Effectors<T>) => (() => void) | void\n\nexport type RegularAtomOptions<T> = {\n\tkey: string\n\tdefault: T | (() => T)\n\teffects?: AtomEffect<T>[]\n}\n// biome-ignore format: complex intersection\nexport type MutableAtomOptions<T extends Transceiver<any>, J extends Json.Serializable> = \n\t& JsonInterface<T, J>\n\t& Omit<RegularAtomOptions<T>, `default`> \n\t& { \n\t\t\tdefault: ()\t=> T\n\t\t\tmutable: true\n\t\t}\n\nexport function atom<T extends Transceiver<any>, J extends Json.Serializable>(\n\toptions: MutableAtomOptions<T, J>,\n): MutableAtomToken<T, J>\nexport function atom<T>(options: RegularAtomOptions<T>): RegularAtomToken<T>\nexport function atom(\n\toptions: MutableAtomOptions<any, any> | RegularAtomOptions<any>,\n): AtomToken<any> {\n\treturn createStandaloneAtom(options, IMPLICIT.STORE)\n}\n\nexport type RegularAtomFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tdefault: T | ((key: K) => T)\n\teffects?: (key: K) => AtomEffect<T>[]\n}\n\nexport type RegularAtomFamilyToken<T, K extends Json.Serializable> = {\n\tkey: string\n\ttype: `atom_family`\n\t__T?: T\n\t__K?: K\n}\n// biome-ignore format: intersection\nexport type RegularAtomFamilyTokenWithCall<\n\tT,\n\tK extends Json.Serializable,\n> = \n\t& RegularAtomFamilyToken<T, K>\n\t& {\n\t\t/** @deprecated Prefer the `findState`, `findInStore`, or `find` functions. */\n\t\t(key: K): RegularAtomToken<T>\n\t}\n// biome-ignore format: intersection\nexport type RegularAtomFamily<T, K extends Json.Serializable> = \n\t& RegularAtomFamilyToken<T, K>\n\t& {\n\t\t(key: K): RegularAtomToken<T>\n\t\tsubject: Subject<RegularAtomToken<T>>\n\t\tinstall: (store: Store) => void\n\t}\n\n// biome-ignore format: intersection\nexport type MutableAtomFamilyOptions<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = \n\t& JsonInterface<T, J>\n\t& { \n\t\tkey: string\n\t\tdefault: (key: K) => T\n\t\teffects?: (key: K) => AtomEffect<T>[]\n\t\tmutable: true,\n\t}\n\nexport type MutableAtomFamilyToken<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = {\n\tkey: string\n\ttype: `mutable_atom_family`\n\t__T?: T\n\t__J?: J\n\t__K?: K\n}\n// biome-ignore format: intersection\nexport type MutableAtomFamilyTokenWithCall<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = \n\t& MutableAtomFamilyToken<T, J, K>\n\t& {\n\t\t/** @deprecated Prefer the `findState`, `findInStore`, or `find` functions. */\n\t\t(key: K): MutableAtomToken<T, J>\n\t}\n// biome-ignore format: intersection\nexport type MutableAtomFamily<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = \n\t& JsonInterface<T, J>\n\t& MutableAtomFamilyToken<T, J, K>\n\t& {\n\t\t\t(key: K): MutableAtomToken<T, J>\n\t\t\tsubject: Subject<MutableAtomToken<T, J>>\n\t\t\tinstall: (store: Store) => void\n\t\t}\n\nexport type AtomFamily<T, K extends Json.Serializable = Json.Serializable> =\n\t| MutableAtomFamily<T extends Transceiver<any> ? T : never, any, K>\n\t| RegularAtomFamily<T, K>\nexport type AtomFamilyToken<T, K extends Json.Serializable = Json.Serializable> =\n\t| MutableAtomFamilyToken<T extends Transceiver<any> ? T : never, any, K>\n\t| RegularAtomFamilyToken<T, K>\n\nexport function atomFamily<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n>(\n\toptions: MutableAtomFamilyOptions<T, J, K>,\n): MutableAtomFamilyTokenWithCall<T, J, K>\nexport function atomFamily<T, K extends Json.Serializable>(\n\toptions: RegularAtomFamilyOptions<T, K>,\n): RegularAtomFamilyTokenWithCall<T, K>\nexport function atomFamily<T, K extends Json.Serializable>(\n\toptions:\n\t\t| MutableAtomFamilyOptions<any, any, any>\n\t\t| RegularAtomFamilyOptions<T, K>,\n):\n\t| MutableAtomFamilyTokenWithCall<any, any, any>\n\t| RegularAtomFamilyTokenWithCall<T, K> {\n\treturn createAtomFamily(options, IMPLICIT.STORE)\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { ReadableToken } from \".\"\n\nexport function dispose(\n\ttoken: ReadableToken<any>,\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): void {\n\tswitch (token.type) {\n\t\tcase `atom`:\n\t\t\tInternal.deleteAtom(token, store)\n\t\t\tbreak\n\t\tcase `selector`:\n\t\tcase `readonly_selector`:\n\t\t\tInternal.deleteSelector(token, store)\n\t\t\tbreak\n\t}\n}\n","import type {\n\tMutableAtomFamilyToken,\n\tMutableAtomToken,\n\tReadableFamilyToken,\n\tReadableToken,\n\tReadonlySelectorFamilyToken,\n\tReadonlySelectorToken,\n\tRegularAtomFamilyToken,\n\tRegularAtomToken,\n\tWritableFamilyToken,\n\tWritableSelectorFamilyToken,\n\tWritableSelectorToken,\n\tWritableToken,\n} from \"atom.io\"\nimport type { Transceiver } from \"atom.io/internal\"\nimport { IMPLICIT, findInStore } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nexport function findState<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n\tKey extends K,\n>(token: MutableAtomFamilyToken<T, J, K>, key: Key): MutableAtomToken<T, J>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: RegularAtomFamilyToken<T, K>,\n\tkey: Key,\n): RegularAtomToken<T>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: WritableSelectorFamilyToken<T, K>,\n\tkey: Key,\n): WritableSelectorToken<T>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: ReadonlySelectorFamilyToken<T, K>,\n\tkey: Key,\n): ReadonlySelectorToken<T>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: WritableFamilyToken<T, K>,\n\tkey: Key,\n): WritableToken<T>\n\nexport function findState<T, K extends Json.Serializable, Key extends K>(\n\ttoken: ReadableFamilyToken<T, K>,\n\tkey: Key,\n): ReadableToken<T>\n\nexport function findState(\n\ttoken: ReadableFamilyToken<any, any>,\n\tkey: Json.Serializable,\n): ReadableToken<any> {\n\tconst state = findInStore(token, key, IMPLICIT.STORE)\n\treturn state\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { ReadableToken } from \".\"\n\nexport function getState<T>(token: ReadableToken<T>): T {\n\treturn Internal.getFromStore(token, Internal.IMPLICIT.STORE)\n}\n","const LoggerIconDictionary = {\n\t\"⌛\": `Timeline event fully captured`,\n\t\"⏩\": `Timeline redo`,\n\t\"⏪\": `Timeline undo`,\n\t\"⏭️\": `Transaction redo`,\n\t\"⏮️\": `Transaction undo`,\n\t\"⏳\": `Timeline event partially captured`,\n\t\"⏹️\": `Time-travel complete`,\n\t\"✅\": `Realtime transaction success`,\n\t\"✨\": `Computation complete`,\n\t\"❌\": `Conflict prevents attempted action`,\n\t\"⭕\": `Operation start`,\n\t\"🐞\": `Possible bug in AtomIO`,\n\t\"👀\": `Subscription added`,\n\t\"👋\": `Greeting`,\n\t\"👍\": `Realtime acknowledgment`,\n\t\"👪\": `Family member added`,\n\t\"💁\": `Notice`,\n\t\"💥\": `Caught`,\n\t\"📁\": `Stow update`,\n\t\"📃\": `Copy mutable`,\n\t\"📖\": `Read state`,\n\t\"📝\": `Write state`,\n\t\"📢\": `Notify subscribers`,\n\t\"🔄\": `Realtime transaction synchronized`,\n\t\"🔌\": `Register dependency`,\n\t\"🔍\": `Discover root`,\n\t\"🔥\": `Delete state`,\n\t\"🔧\": `Create mutable atom`,\n\t\"🔨\": `Create immutable atom`,\n\t\"🔴\": `Operation complete`,\n\t\"🗑\": `Evict cached value`,\n\t\"🙈\": `Subscription canceled`,\n\t\"🚀\": `Performance measure`,\n\t\"🛄\": `Apply transaction`,\n\t\"🛠️\": `Install atom into store`,\n\t\"🛫\": `Begin transaction`,\n\t\"🛬\": `Complete transaction`,\n\t\"🧮\": `Computing selector`,\n\t\"🧹\": `Prepare to evict`,\n\t\"🪂\": `Abort transaction`,\n\t\"🤞\": `Realtime optimistic update enqueued`,\n\t\"👈\": `Realtime confirmed update enqueued`,\n\t\"🧑⚖️\": `Realtime update beginning reconciliation`,\n\t\"🛎️\": `Realtime transaction received`,\n\t\"🔭\": `Determining realtime perspective`,\n\t\"🖌\": `Redacting realtime update`,\n\t\"👁\": `Determining perspective`,\n} as const\nexport type LoggerIcon = keyof typeof LoggerIconDictionary\nexport type TokenDenomination =\n\t| `atom`\n\t| `continuity`\n\t| `mutable_atom`\n\t| `readonly_selector`\n\t| `selector`\n\t| `state`\n\t| `timeline`\n\t| `transaction`\n\t| `unknown`\n\nexport const LOG_LEVELS = [`info`, `warn`, `error`] as const\nexport type LogLevel = (typeof LOG_LEVELS)[number]\n\nexport type LogFn = (\n\ticon: LoggerIcon,\n\tdenomination: TokenDenomination,\n\ttokenKey: string,\n\tmessage: string,\n\t...rest: unknown[]\n) => void\nexport type LogFilter = (...params: Parameters<LogFn>) => boolean\n\nexport type Logger = Record<LogLevel, LogFn>\n\nexport const simpleLog =\n\t(logLevel: keyof Logger): LogFn =>\n\t(icon, denomination, tokenKey, message, ...rest) => {\n\t\tconsole[logLevel](\n\t\t\t`${icon} ${denomination} \"${tokenKey}\" ${message}`,\n\t\t\t...rest,\n\t\t)\n\t}\nexport const simpleLogger: Logger = {\n\terror: simpleLog(`error`),\n\tinfo: simpleLog(`info`),\n\twarn: simpleLog(`warn`),\n}\n\nexport class AtomIOLogger implements Logger {\n\tpublic constructor(\n\t\tpublic logLevel: `error` | `info` | `warn` | null,\n\t\tprivate readonly filter?: LogFilter,\n\t\tprivate readonly logger: Logger = simpleLogger,\n\t) {}\n\n\tpublic error: LogFn = (...args) => {\n\t\tif ((this.filter?.(...args) ?? true) && this.logLevel !== null) {\n\t\t\tthis.logger.error(...args)\n\t\t}\n\t}\n\tpublic info: LogFn = (...args) => {\n\t\tif ((this.filter?.(...args) ?? true) && this.logLevel === `info`) {\n\t\t\tthis.logger.info(...args)\n\t\t}\n\t}\n\tpublic warn: LogFn = (...args) => {\n\t\tif (\n\t\t\t(this.filter?.(...args) ?? true) &&\n\t\t\tthis.logLevel !== `error` &&\n\t\t\tthis.logLevel !== null\n\t\t) {\n\t\t\tthis.logger.warn(...args)\n\t\t}\n\t}\n}\n","import type { Store, Subject } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tcreateSelectorFamily,\n\tcreateStandaloneSelector,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ReadonlySelectorToken, WritableSelectorToken } from \".\"\nimport type { Read, Write } from \"./transaction\"\n\nexport type WritableSelectorOptions<T> = {\n\tkey: string\n\tget: Read<() => T>\n\tset: Write<(newValue: T) => void>\n}\nexport type ReadonlySelectorOptions<T> = {\n\tkey: string\n\tget: Read<() => T>\n}\n\nexport function selector<T>(\n\toptions: WritableSelectorOptions<T>,\n): WritableSelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T>,\n): ReadonlySelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T> | WritableSelectorOptions<T>,\n): ReadonlySelectorToken<T> | WritableSelectorToken<T> {\n\treturn createStandaloneSelector(options, IMPLICIT.STORE)\n}\n\nexport type WritableSelectorFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tget: (key: K) => Read<() => T>\n\tset: (key: K) => Write<(newValue: T) => void>\n}\nexport type ReadonlySelectorFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tget: (key: K) => Read<() => T>\n}\n\nexport type WritableSelectorFamilyToken<T, K extends Json.Serializable> = {\n\tkey: string\n\ttype: `selector_family`\n\t__T?: T\n\t__K?: K\n}\n// biome-ignore format: intersection\nexport type WritableSelectorFamilyTokenWithCall<\n\tT,\n\tK extends Json.Serializable,\n> = \n\t& WritableSelectorFamilyToken<T, K>\n\t& {\n\t\t/** @deprecated Prefer the `findState`, `findInStore`, or `find` functions. */\n\t\t(key: K): WritableSelectorToken<T>\n\t}\n// biome-ignore format: intersection\nexport type WritableSelectorFamily<T, K extends Json.Serializable> = \n\t& WritableSelectorFamilyToken<T, K> \n\t& {\n\t\t(key: K): WritableSelectorToken<T>\n\t\tsubject: Subject<WritableSelectorToken<T>>\n\t\tinstall: (store: Store) => void\n\t}\n\nexport type ReadonlySelectorFamilyToken<T, K extends Json.Serializable> = {\n\tkey: string\n\ttype: `readonly_selector_family`\n\t__T?: T\n\t__K?: K\n}\n// biome-ignore format: intersection\nexport type ReadonlySelectorFamilyTokenWithCall<\n\tT,\n\tK extends Json.Serializable,\n> = \n\t& ReadonlySelectorFamilyToken<T, K>\n\t& {\n\t\t/** @deprecated Prefer the `findState`, `findInStore`, or `find` functions. */\n\t\t(key: K): ReadonlySelectorToken<T>\n\t}\n// biome-ignore format: intersection\nexport type ReadonlySelectorFamily<T, K extends Json.Serializable> = \n\t& ((key: K) => ReadonlySelectorToken<T>)\n\t& {\n\t\tkey: string\n\t\ttype: `readonly_selector_family`\n\t\tsubject: Subject<ReadonlySelectorToken<T>>\n\t\tinstall: (store: Store) => void\n\t\t__T?: T\n\t\t__K?: K\n\t}\n\nexport type SelectorFamily<T, K extends Json.Serializable> =\n\t| ReadonlySelectorFamily<T, K>\n\t| WritableSelectorFamily<T, K>\nexport type SelectorFamilyToken<T, K extends Json.Serializable> =\n\t| ReadonlySelectorFamilyToken<T, K>\n\t| WritableSelectorFamilyToken<T, K>\n\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: WritableSelectorFamilyOptions<T, K>,\n): WritableSelectorFamilyTokenWithCall<T, K>\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: ReadonlySelectorFamilyOptions<T, K>,\n): ReadonlySelectorFamilyTokenWithCall<T, K>\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions:\n\t\t| ReadonlySelectorFamilyOptions<T, K>\n\t\t| WritableSelectorFamilyOptions<T, K>,\n):\n\t| ReadonlySelectorFamilyTokenWithCall<T, K>\n\t| WritableSelectorFamilyTokenWithCall<T, K> {\n\treturn createSelectorFamily(options, IMPLICIT.STORE)\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { WritableToken } from \".\"\n\nexport function setState<T, New extends T>(\n\ttoken: WritableToken<T>,\n\tvalue: New | ((oldValue: T) => New),\n): void {\n\tInternal.setIntoStore(token, value, Internal.IMPLICIT.STORE)\n}\n","import type { Transceiver } from \"atom.io/internal\"\nimport {\n\tStore,\n\tcreateAtomFamily,\n\tcreateSelectorFamily,\n\tcreateStandaloneAtom,\n\tcreateStandaloneSelector,\n\tcreateTimeline,\n\tcreateTransaction,\n\tgetFromStore,\n\tsetIntoStore,\n\ttimeTravel,\n} from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type {\n\tAtomToken,\n\tMutableAtomFamily,\n\tMutableAtomFamilyOptions,\n\tMutableAtomOptions,\n\tMutableAtomToken,\n\tRegularAtomFamily,\n\tRegularAtomFamilyOptions,\n\tRegularAtomOptions,\n\tRegularAtomToken,\n\tgetState,\n\tredo,\n\tsetState,\n\ttimeline,\n\tundo,\n} from \".\"\nimport { subscribe } from \".\"\nimport type { atom, atomFamily } from \"./atom\"\nimport type { selector, selectorFamily } from \"./selector\"\nimport type { transaction } from \"./transaction\"\n\nexport class Silo {\n\tpublic store: Store\n\tpublic atom: typeof atom\n\tpublic atomFamily: typeof atomFamily\n\tpublic selector: typeof selector\n\tpublic selectorFamily: typeof selectorFamily\n\tpublic transaction: typeof transaction\n\tpublic timeline: typeof timeline\n\tpublic getState: typeof getState\n\tpublic setState: typeof setState\n\tpublic subscribe: typeof subscribe\n\tpublic undo: typeof undo\n\tpublic redo: typeof redo\n\tpublic constructor(name: string, fromStore: Store | null = null) {\n\t\tconst s = new Store(name, fromStore)\n\t\tfunction _atom<T>(options: RegularAtomOptions<T>): RegularAtomToken<T>\n\t\tfunction _atom<T extends Transceiver<any>, J extends Json.Serializable>(\n\t\t\toptions: MutableAtomOptions<T, J>,\n\t\t): MutableAtomToken<T, J>\n\t\tfunction _atom<T>(\n\t\t\toptions: MutableAtomOptions<any, any> | RegularAtomOptions<T>,\n\t\t): AtomToken<T> {\n\t\t\treturn createStandaloneAtom(options, s)\n\t\t}\n\t\tfunction _atomFamily<\n\t\t\tT extends Transceiver<any>,\n\t\t\tJ extends Json.Serializable,\n\t\t\tK extends Json.Serializable,\n\t\t>(options: MutableAtomFamilyOptions<T, J, K>): MutableAtomFamily<T, J, K>\n\t\tfunction _atomFamily<T, K extends Json.Serializable>(\n\t\t\toptions: RegularAtomFamilyOptions<T, K>,\n\t\t): RegularAtomFamily<T, K>\n\t\tfunction _atomFamily<T, K extends Json.Serializable>(\n\t\t\toptions:\n\t\t\t\t| MutableAtomFamilyOptions<any, any, any>\n\t\t\t\t| RegularAtomFamilyOptions<T, K>,\n\t\t): MutableAtomFamily<any, any, any> | RegularAtomFamily<T, K> {\n\t\t\treturn createAtomFamily(options, s)\n\t\t}\n\t\tthis.store = s\n\t\tthis.atom = _atom\n\t\tthis.atomFamily = _atomFamily\n\t\tthis.selector = (options) => createStandaloneSelector(options, s) as any\n\t\tthis.selectorFamily = (options) => createSelectorFamily(options, s) as any\n\t\tthis.transaction = (options) => createTransaction(options, s)\n\t\tthis.timeline = (options) => createTimeline(options, s)\n\t\tthis.getState = (token) => getFromStore(token, s)\n\t\tthis.setState = (token, newValue) => setIntoStore(token, newValue, s)\n\t\tthis.subscribe = (token, handler, key) => subscribe(token, handler, key, s)\n\t\tthis.undo = (token) => timeTravel(`undo`, token, s)\n\t\tthis.redo = (token) => timeTravel(`redo`, token, s)\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tarbitrary,\n\tsubscribeToState,\n\tsubscribeToTimeline,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\n\nimport type {\n\tFamilyMetadata,\n\tReadableToken,\n\tTimelineManageable,\n\tTimelineToken,\n\tTimelineUpdate,\n\tTransactionToken,\n\tTransactionUpdate,\n\tƒn,\n} from \".\"\n\nexport type StateUpdate<T> = { newValue: T; oldValue: T }\nexport type KeyedStateUpdate<T> = StateUpdate<T> & {\n\tkey: string\n\tfamily?: FamilyMetadata\n}\nexport type UpdateHandler<T> = (update: StateUpdate<T>) => void\n\nexport type TransactionUpdateHandler<ƒ extends ƒn> = (\n\tdata: TransactionUpdate<ƒ>,\n) => void\n\nexport function subscribe<T>(\n\ttoken: ReadableToken<T>,\n\thandleUpdate: UpdateHandler<T>,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe<ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\thandleUpdate: TransactionUpdateHandler<ƒ>,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe<M extends TimelineManageable>(\n\ttoken: TimelineToken<M>,\n\thandleUpdate: (update: TimelineUpdate<M> | `redo` | `undo`) => void,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe(\n\ttoken: ReadableToken<any> | TimelineToken<any> | TransactionToken<any>,\n\thandleUpdate: (update: any) => void,\n\tkey: string = arbitrary(),\n\tstore = IMPLICIT.STORE,\n): () => void {\n\tswitch (token.type) {\n\t\tcase `atom`:\n\t\tcase `mutable_atom`:\n\t\tcase `readonly_selector`:\n\t\tcase `selector`:\n\t\t\treturn subscribeToState(token, handleUpdate, key, store)\n\t\tcase `transaction`:\n\t\t\treturn subscribeToTransaction(token, handleUpdate, key, store)\n\t\tcase `timeline`:\n\t\t\treturn subscribeToTimeline(token, handleUpdate, key, store)\n\t}\n}\n","import type {\n\tTimeline,\n\tTimelineAtomUpdate,\n\tTimelineSelectorUpdate,\n\tTimelineTransactionUpdate,\n} from \"atom.io/internal\"\nimport { IMPLICIT, createTimeline, timeTravel } from \"atom.io/internal\"\n\nimport type { AtomFamilyToken, AtomToken } from \".\"\n\nexport type TimelineManageable = AtomFamilyToken<any, any> | AtomToken<any>\n\nexport type TimelineToken<M> = {\n\tkey: string\n\ttype: `timeline`\n\t__M?: M\n}\n\nexport type TimelineOptions<ManagedAtom extends TimelineManageable> = {\n\tkey: string\n\tatoms: ManagedAtom[]\n\tshouldCapture?: (\n\t\tupdate: TimelineUpdate<ManagedAtom>,\n\t\ttimeline: Timeline<TimelineManageable>,\n\t) => boolean\n}\n\nexport type TimelineUpdate<ManagedAtom extends TimelineManageable> =\n\t| TimelineAtomUpdate<ManagedAtom>\n\t| TimelineSelectorUpdate<ManagedAtom>\n\t| TimelineTransactionUpdate\n\nexport const timeline = <ManagedAtom extends TimelineManageable>(\n\toptions: TimelineOptions<ManagedAtom>,\n): TimelineToken<ManagedAtom> => {\n\treturn createTimeline(options, IMPLICIT.STORE)\n}\n\nexport const redo = (timeline: TimelineToken<any>): void => {\n\ttimeTravel(`redo`, timeline, IMPLICIT.STORE)\n}\n\nexport const undo = (timeline: TimelineToken<any>): void => {\n\ttimeTravel(`undo`, timeline, IMPLICIT.STORE)\n}\n","import type { EnvironmentData } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tactUponStore,\n\tarbitrary,\n\tcreateTransaction,\n} from \"atom.io/internal\"\n\nimport type {\n\tKeyedStateUpdate,\n\tReadonlySelectorToken,\n\tWritableToken,\n\tfindState,\n\tƒn,\n} from \".\"\n\nexport type TransactionToken<F> = {\n\tkey: string\n\ttype: `transaction`\n\t__F?: F\n}\n\nexport type TransactionUpdateContent =\n\t| KeyedStateUpdate<unknown>\n\t| TransactionUpdate<ƒn>\n\nexport type TransactionUpdate<ƒ extends ƒn> = {\n\tkey: string\n\tid: string\n\tepoch: number\n\tupdates: TransactionUpdateContent[]\n\tparams: Parameters<ƒ>\n\toutput: ReturnType<ƒ>\n}\n\nexport type Transactors = Readonly<{\n\tget: <S>(state: ReadonlySelectorToken<S> | WritableToken<S>) => S\n\tset: <S, New extends S>(\n\t\tstate: WritableToken<S>,\n\t\tnewValue: New | ((oldValue: S) => New),\n\t) => void\n\tfind: typeof findState\n}>\nexport type TransactorsWithRunAndEnv = Readonly<{\n\tget: <S>(state: ReadonlySelectorToken<S> | WritableToken<S>) => S\n\tset: <S, New extends S>(\n\t\tstate: WritableToken<S>,\n\t\tnewValue: New | ((oldValue: S) => New),\n\t) => void\n\tfind: typeof findState\n\trun: typeof runTransaction\n\tenv: () => EnvironmentData\n}>\nexport type ReadonlyTransactors = Pick<Transactors, `find` | `get`>\n\nexport type Read<ƒ extends ƒn> = (\n\ttransactors: ReadonlyTransactors,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type Write<ƒ extends ƒn> = (\n\ttransactors: Transactors,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type Transact<ƒ extends ƒn> = (\n\ttransactors: TransactorsWithRunAndEnv,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type TransactionOptions<ƒ extends ƒn> = {\n\tkey: string\n\tdo: Transact<ƒ>\n}\n\nexport type TransactionIO<Token extends TransactionToken<any>> =\n\tToken extends TransactionToken<infer ƒ> ? ƒ : never\n\nexport function transaction<ƒ extends ƒn>(\n\toptions: TransactionOptions<ƒ>,\n): TransactionToken<ƒ> {\n\treturn createTransaction(options, IMPLICIT.STORE)\n}\n\nexport function runTransaction<ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\tid = arbitrary(),\n): (...parameters: Parameters<ƒ>) => ReturnType<ƒ> {\n\treturn actUponStore(token, id, IMPLICIT.STORE)\n}\n","import type {\n\tMutableAtomFamily,\n\tMutableAtomFamilyToken,\n\tMutableAtomToken,\n\tReadableFamily,\n\tReadableFamilyToken,\n\tReadableToken,\n\tReadonlySelectorFamily,\n\tReadonlySelectorFamilyToken,\n\tReadonlySelectorToken,\n\tRegularAtomFamily,\n\tRegularAtomFamilyToken,\n\tRegularAtomToken,\n\tWritableFamily,\n\tWritableFamilyToken,\n\tWritableSelectorFamily,\n\tWritableSelectorFamilyToken,\n\tWritableSelectorToken,\n\tWritableToken,\n} from \"atom.io\"\n\nexport type TokenType<\n\tComparison extends ReadableFamilyToken<any, any> | ReadableToken<any>,\n> = Comparison extends ReadableToken<infer RepresentedValue>\n\t? RepresentedValue\n\t: Comparison extends ReadableFamilyToken<infer RepresentedValue, any>\n\t ? RepresentedValue\n\t : never\n\nexport function isToken<KnownToken extends RegularAtomToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is RegularAtomToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends MutableAtomToken<any, any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is MutableAtomToken<TokenType<KnownToken>, any>\nexport function isToken<KnownToken extends WritableSelectorToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is WritableSelectorToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends ReadonlySelectorToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadonlySelectorToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends WritableToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is WritableToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends ReadableToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadableToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends ReadableToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadableToken<TokenType<KnownToken>> {\n\treturn knownToken.key === unknownToken.key\n}\n\nexport function belongsTo<Family extends RegularAtomFamilyToken<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is RegularAtomToken<TokenType<Family>>\nexport function belongsTo<Family extends MutableAtomFamilyToken<any, any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is MutableAtomToken<TokenType<Family>, any>\nexport function belongsTo<Family extends WritableSelectorFamilyToken<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is WritableSelectorToken<TokenType<Family>>\nexport function belongsTo<Family extends ReadonlySelectorFamilyToken<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadonlySelectorToken<TokenType<Family>>\nexport function belongsTo<Family extends WritableFamilyToken<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is WritableToken<TokenType<Family>>\nexport function belongsTo<Family extends ReadableFamilyToken<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadableToken<TokenType<Family>>\nexport function belongsTo<Family extends ReadableFamilyToken<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<any>,\n): unknownToken is ReadableToken<TokenType<Family>> {\n\treturn family.key === unknownToken.family?.key\n}\n"]}
|