atom.io 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -11
- package/dist/index-3b5d305c.d.ts +257 -0
- package/dist/index.d.ts +4 -257
- package/dist/index.js +35 -23
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +35 -23
- package/dist/index.mjs.map +1 -0
- package/dist/react/index.d.ts +21 -0
- package/dist/react/index.js +780 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/index.mjs +751 -0
- package/dist/react/index.mjs.map +1 -0
- package/package.json +7 -6
package/dist/index.js
CHANGED
|
@@ -88,7 +88,7 @@ __export(internal_exports, {
|
|
|
88
88
|
getState__INTERNAL: () => getState__INTERNAL,
|
|
89
89
|
isDone: () => isDone,
|
|
90
90
|
markDone: () => markDone,
|
|
91
|
-
|
|
91
|
+
propagateDown: () => propagateDown,
|
|
92
92
|
recall: () => recall,
|
|
93
93
|
setAtomState: () => setAtomState,
|
|
94
94
|
setSelectorState: () => setSelectorState,
|
|
@@ -562,11 +562,6 @@ var import_hamt_plus4 = __toESM(require("hamt_plus"));
|
|
|
562
562
|
|
|
563
563
|
// src/internal/operation.ts
|
|
564
564
|
var import_hamt_plus3 = __toESM(require("hamt_plus"));
|
|
565
|
-
var finishAction = (store) => {
|
|
566
|
-
var _a;
|
|
567
|
-
store.operation = { open: false };
|
|
568
|
-
(_a = store.config.logger) == null ? void 0 : _a.info(` \u2705`, `operation complete`);
|
|
569
|
-
};
|
|
570
565
|
var startAction = (store) => {
|
|
571
566
|
var _a;
|
|
572
567
|
store.operation = {
|
|
@@ -574,7 +569,12 @@ var startAction = (store) => {
|
|
|
574
569
|
done: /* @__PURE__ */ new Set(),
|
|
575
570
|
prev: store.valueMap
|
|
576
571
|
};
|
|
577
|
-
(_a = store.config.logger) == null ? void 0 : _a.info(
|
|
572
|
+
(_a = store.config.logger) == null ? void 0 : _a.info(`\u2610`, `operation start`);
|
|
573
|
+
};
|
|
574
|
+
var finishAction = (store) => {
|
|
575
|
+
var _a;
|
|
576
|
+
store.operation = { open: false };
|
|
577
|
+
(_a = store.config.logger) == null ? void 0 : _a.info(`\u2611\uFE0F`, `operation done`);
|
|
578
578
|
};
|
|
579
579
|
var isDone = (key, store = IMPLICIT.STORE) => {
|
|
580
580
|
var _a;
|
|
@@ -608,7 +608,7 @@ var recall = (state, store = IMPLICIT.STORE) => {
|
|
|
608
608
|
};
|
|
609
609
|
|
|
610
610
|
// src/internal/set.ts
|
|
611
|
-
var
|
|
611
|
+
var propagateDown = (state, store = IMPLICIT.STORE) => {
|
|
612
612
|
var _a, _b;
|
|
613
613
|
const relatedStateKeys = store.selectorGraph.getRelations(state.key);
|
|
614
614
|
(_a = store.config.logger) == null ? void 0 : _a.info(
|
|
@@ -622,21 +622,29 @@ var propagateChanges = (state, store = IMPLICIT.STORE) => {
|
|
|
622
622
|
(_b = store.config.logger) == null ? void 0 : _b.info(` ||`, `done:`, store.operation.done);
|
|
623
623
|
}
|
|
624
624
|
relatedStateKeys.forEach(({ id: stateKey }) => {
|
|
625
|
-
var _a2, _b2, _c, _d;
|
|
625
|
+
var _a2, _b2, _c, _d, _e;
|
|
626
626
|
if (isDone(stateKey, store)) {
|
|
627
627
|
(_a2 = store.config.logger) == null ? void 0 : _a2.info(` ||`, stateKey, `already done`);
|
|
628
628
|
return;
|
|
629
629
|
}
|
|
630
630
|
(_b2 = store.config.logger) == null ? void 0 : _b2.info(`->`, `bumping`, stateKey);
|
|
631
|
-
store.valueMap = import_hamt_plus4.default.remove(stateKey, store.valueMap);
|
|
632
631
|
const state2 = (_c = import_hamt_plus4.default.get(stateKey, store.selectors)) != null ? _c : import_hamt_plus4.default.get(stateKey, store.readonlySelectors);
|
|
632
|
+
if (!state2) {
|
|
633
|
+
(_d = store.config.logger) == null ? void 0 : _d.info(
|
|
634
|
+
` ||`,
|
|
635
|
+
stateKey,
|
|
636
|
+
`is an atom - no need to propagate down`
|
|
637
|
+
);
|
|
638
|
+
return;
|
|
639
|
+
}
|
|
640
|
+
store.valueMap = import_hamt_plus4.default.remove(stateKey, store.valueMap);
|
|
633
641
|
const newValue = getState__INTERNAL(state2, store);
|
|
634
|
-
(
|
|
642
|
+
(_e = store.config.logger) == null ? void 0 : _e.info(` <-`, stateKey, `became`, newValue);
|
|
635
643
|
const oldValue = recall(state2, store);
|
|
636
644
|
state2.subject.next({ newValue, oldValue });
|
|
637
645
|
markDone(stateKey, store);
|
|
638
646
|
if (`set` in state2)
|
|
639
|
-
|
|
647
|
+
propagateDown(state2, store);
|
|
640
648
|
});
|
|
641
649
|
};
|
|
642
650
|
var setAtomState = (atom2, next, store = IMPLICIT.STORE) => {
|
|
@@ -653,8 +661,12 @@ var setAtomState = (atom2, next, store = IMPLICIT.STORE) => {
|
|
|
653
661
|
store.valueMap = import_hamt_plus4.default.set(atom2.key, newValue, store.valueMap);
|
|
654
662
|
markDone(atom2.key, store);
|
|
655
663
|
atom2.subject.next({ newValue, oldValue });
|
|
656
|
-
(_b = store.config.logger) == null ? void 0 : _b.info(
|
|
657
|
-
|
|
664
|
+
(_b = store.config.logger) == null ? void 0 : _b.info(
|
|
665
|
+
` ||`,
|
|
666
|
+
`propagating change made to`,
|
|
667
|
+
`"${atom2.key}"`
|
|
668
|
+
);
|
|
669
|
+
propagateDown(atom2, store);
|
|
658
670
|
};
|
|
659
671
|
var setSelectorState = (selector2, next, store = IMPLICIT.STORE) => {
|
|
660
672
|
var _a, _b;
|
|
@@ -669,12 +681,11 @@ var setSelectorState = (selector2, next, store = IMPLICIT.STORE) => {
|
|
|
669
681
|
);
|
|
670
682
|
(_b = store.config.logger) == null ? void 0 : _b.info(
|
|
671
683
|
` ||`,
|
|
672
|
-
`propagating change to`,
|
|
684
|
+
`propagating change made to`,
|
|
673
685
|
`"${selector2.key}"`
|
|
674
686
|
);
|
|
675
687
|
selector2.set(newValue);
|
|
676
|
-
|
|
677
|
-
propagateChanges(selector2, store);
|
|
688
|
+
propagateDown(selector2, store);
|
|
678
689
|
};
|
|
679
690
|
var setState__INTERNAL = (token, value, store = IMPLICIT.STORE) => {
|
|
680
691
|
const state = withdraw(token, store);
|
|
@@ -689,7 +700,7 @@ var setState__INTERNAL = (token, value, store = IMPLICIT.STORE) => {
|
|
|
689
700
|
var finishTransaction = (store) => {
|
|
690
701
|
var _a;
|
|
691
702
|
store.transaction = { open: false };
|
|
692
|
-
(_a = store.config.logger) == null ? void 0 : _a.info(`\u{
|
|
703
|
+
(_a = store.config.logger) == null ? void 0 : _a.info(`\u{1F6EC}`, `transaction done`);
|
|
693
704
|
};
|
|
694
705
|
var startTransaction = (store) => {
|
|
695
706
|
var _a;
|
|
@@ -703,7 +714,7 @@ var startTransaction = (store) => {
|
|
|
703
714
|
valueMap: store.valueMap
|
|
704
715
|
}
|
|
705
716
|
};
|
|
706
|
-
(_a = store.config.logger) == null ? void 0 : _a.info(`\u{
|
|
717
|
+
(_a = store.config.logger) == null ? void 0 : _a.info(`\u{1F6EB}`, `transaction start`);
|
|
707
718
|
};
|
|
708
719
|
var abortTransaction = (store) => {
|
|
709
720
|
var _a, _b;
|
|
@@ -803,7 +814,7 @@ function selector(options, store = IMPLICIT.STORE) {
|
|
|
803
814
|
const oldValue = getSelf();
|
|
804
815
|
const newValue = become(next)(oldValue);
|
|
805
816
|
store.valueMap = import_hamt_plus6.default.set(options.key, newValue, store.valueMap);
|
|
806
|
-
|
|
817
|
+
markDone(options.key, store);
|
|
807
818
|
subject.next({ newValue, oldValue });
|
|
808
819
|
options.set({ get, set }, newValue);
|
|
809
820
|
};
|
|
@@ -852,9 +863,9 @@ var registerSelector = (selectorKey, store = IMPLICIT.STORE) => ({
|
|
|
852
863
|
} else {
|
|
853
864
|
(_b = store.config.logger) == null ? void 0 : _b.info(
|
|
854
865
|
`\u{1F50C} registerSelector`,
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
866
|
+
selectorKey,
|
|
867
|
+
`<-`,
|
|
868
|
+
state.key
|
|
858
869
|
);
|
|
859
870
|
store.selectorGraph = store.selectorGraph.set(selectorKey, state.key);
|
|
860
871
|
}
|
|
@@ -921,3 +932,4 @@ var subscribe = (token, observe, store = IMPLICIT.STORE) => {
|
|
|
921
932
|
subscribe,
|
|
922
933
|
transaction
|
|
923
934
|
});
|
|
935
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/internal/index.ts","../src/internal/get.ts","../src/internal/store.ts","../../anvl/src/join/core-relation-data.ts","../../anvl/src/array/venn.ts","../../anvl/src/array/index.ts","../../anvl/src/object/refinement.ts","../../anvl/src/object/access.ts","../../anvl/src/object/entries.ts","../../anvl/src/object/mapObject.ts","../../anvl/src/function/index.ts","../../anvl/src/nullish/index.ts","../../anvl/src/join/get-related-ids.ts","../../anvl/src/join/relation-contents.ts","../../anvl/src/join/relation-record.ts","../../anvl/src/join/remove-relation.ts","../../anvl/src/object/index.ts","../../anvl/src/string/split.ts","../../anvl/src/join/set-relation.ts","../../anvl/src/refinement/index.ts","../../anvl/src/join/index.ts","../src/internal/set.ts","../src/internal/operation.ts","../src/internal/transaction-internal.ts","../src/atom.ts","../../anvl/src/json/index.ts","../src/selector.ts","../src/transaction.ts"],"sourcesContent":["import {\n IMPLICIT,\n configure,\n finishAction,\n getState__INTERNAL,\n setState__INTERNAL,\n startAction,\n withdraw,\n} from \"./internal\"\nimport * as __INTERNAL__ from \"./internal\"\nimport type { Store } from \"./internal/store\"\n\nexport * from \"./atom\"\nexport * from \"./selector\"\nexport * from \"./transaction\"\nexport { __INTERNAL__, configure }\n\nexport type AtomToken<_> = {\n key: string\n type: `atom`\n}\nexport type SelectorToken<_> = {\n key: string\n type: `selector`\n}\nexport type StateToken<T> = AtomToken<T> | SelectorToken<T>\n\nexport type ReadonlyValueToken<_> = {\n key: string\n type: `readonly_selector`\n}\n\nexport const getState = <T>(\n token: ReadonlyValueToken<T> | StateToken<T>,\n store: Store = IMPLICIT.STORE\n): T => {\n const state = withdraw<T>(token, store)\n return getState__INTERNAL(state, store)\n}\n\nexport const setState = <T, New extends T>(\n state: StateToken<T>,\n value: New | ((oldValue: T) => New),\n store: Store = IMPLICIT.STORE\n): void => {\n startAction(store)\n setState__INTERNAL(state, value, store)\n finishAction(store)\n}\n\nexport type Observe<T> = (change: { newValue: T; oldValue: T }) => void\n\nexport const subscribe = <T>(\n token: ReadonlyValueToken<T> | StateToken<T>,\n observe: Observe<T>,\n store: Store = IMPLICIT.STORE\n): (() => void) => {\n const state = withdraw<T>(token, store)\n const subscription = state.subject.subscribe(observe)\n return () => subscription.unsubscribe()\n}\n","import type * as Rx from \"rxjs\"\n\nexport * from \"./get\"\nexport * from \"./set\"\nexport * from \"./store\"\nexport * from \"./operation\"\nexport * from \"./transaction-internal\"\n\nexport type Atom<T> = {\n key: string\n subject: Rx.Subject<{ newValue: T; oldValue: T }>\n default: T\n}\nexport type Selector<T> = {\n key: string\n subject: Rx.Subject<{ newValue: T; oldValue: T }>\n get: () => T\n set: (newValue: T | ((oldValue: T) => T)) => void\n}\nexport type ReadonlySelector<T> = Omit<Selector<T>, `set`>\n","import HAMT from \"hamt_plus\"\n\nimport type { Atom, ReadonlySelector, Selector } from \".\"\nimport type { Store } from \"./store\"\nimport { IMPLICIT } from \"./store\"\nimport type {\n AtomToken,\n ReadonlyValueToken,\n SelectorToken,\n StateToken,\n} from \"..\"\n\nexport const getCachedState = <T>(\n state: Atom<T> | ReadonlySelector<T> | Selector<T>,\n store: Store = IMPLICIT.STORE\n): T => {\n const value = HAMT.get(state.key, store.valueMap)\n return value\n}\n\nexport const getSelectorState = <T>(\n selector: ReadonlySelector<T> | Selector<T>\n): T => selector.get()\n\nexport function withdraw<T>(token: AtomToken<T>, store: Store): Atom<T>\nexport function withdraw<T>(token: SelectorToken<T>, store: Store): Selector<T>\nexport function withdraw<T>(\n token: StateToken<T>,\n store: Store\n): Atom<T> | Selector<T>\nexport function withdraw<T>(\n token: ReadonlyValueToken<T>,\n store: Store\n): ReadonlySelector<T>\nexport function withdraw<T>(\n token: ReadonlyValueToken<T> | StateToken<T>,\n store: Store\n): Atom<T> | ReadonlySelector<T> | Selector<T>\nexport function withdraw<T>(\n token: ReadonlyValueToken<T> | StateToken<T>,\n store: Store\n): Atom<T> | ReadonlySelector<T> | Selector<T> {\n return (\n HAMT.get(token.key, store.atoms) ??\n HAMT.get(token.key, store.selectors) ??\n HAMT.get(token.key, store.readonlySelectors)\n )\n}\n\nexport function deposit<T>(state: Atom<T>): AtomToken<T>\nexport function deposit<T>(state: Selector<T>): SelectorToken<T>\nexport function deposit<T>(state: Atom<T> | Selector<T>): StateToken<T>\nexport function deposit<T>(state: ReadonlySelector<T>): ReadonlyValueToken<T>\nexport function deposit<T>(\n state: Atom<T> | ReadonlySelector<T> | Selector<T>\n): ReadonlyValueToken<T> | StateToken<T>\nexport function deposit<T>(\n state: Atom<T> | ReadonlySelector<T> | Selector<T>\n): ReadonlyValueToken<T> | StateToken<T> {\n if (`get` in state) {\n if (`set` in state) {\n return { key: state.key, type: `selector` }\n }\n return { key: state.key, type: `readonly_selector` }\n }\n return { key: state.key, type: `atom` }\n}\n\nexport const getState__INTERNAL = <T>(\n state: Atom<T> | ReadonlySelector<T> | Selector<T>,\n store: Store = IMPLICIT.STORE\n): T => {\n if (HAMT.has(state.key, store.valueMap)) {\n return getCachedState(state, store)\n }\n if (`get` in state) {\n return getSelectorState(state)\n }\n store.config.logger?.error(\n `Attempted to get atom \"${state.key}\", which was never initialized in store \"${store.config.name}\".`\n )\n return state.default\n}\n","import type { Hamt } from \"hamt_plus\"\nimport HAMT from \"hamt_plus\"\n\nimport { Join } from \"~/packages/anvl/src/join\"\n\nimport type { Atom, ReadonlySelector, Selector } from \".\"\n\nexport interface Store {\n valueMap: Hamt<any, string>\n selectorGraph: Join\n selectors: Hamt<Selector<any>, string>\n readonlySelectors: Hamt<ReadonlySelector<any>, string>\n atoms: Hamt<Atom<any>, string>\n operation:\n | {\n open: false\n }\n | {\n open: true\n done: Set<string>\n prev: Hamt<any, string>\n }\n transaction:\n | {\n open: false\n }\n | {\n open: true\n prev: Pick<\n Store,\n | `atoms`\n | `readonlySelectors`\n | `selectorGraph`\n | `selectors`\n | `valueMap`\n >\n }\n config: {\n name: string\n logger: Pick<Console, `error` | `info` | `warn`> | null\n }\n}\n\nexport const createStore = (name: string): Store =>\n ({\n valueMap: HAMT.make<any, string>(),\n selectorGraph: new Join({ relationType: `n:n` }),\n atoms: HAMT.make<Atom<any>, string>(),\n selectors: HAMT.make<Selector<any>, string>(),\n readonlySelectors: HAMT.make<ReadonlySelector<any>, string>(),\n operation: {\n open: false,\n },\n transaction: {\n open: false,\n },\n config: {\n name,\n logger: null,\n },\n } satisfies Store)\n\nexport const IMPLICIT = {\n STORE_INTERNAL: undefined as Store | undefined,\n get STORE(): Store {\n return this.STORE_INTERNAL ?? (this.STORE_INTERNAL = createStore(`DEFAULT`))\n },\n}\nexport const configure = (\n config: Partial<Store[`config`]>,\n store: Store = IMPLICIT.STORE\n): void => {\n Object.assign(store.config, config)\n}\n\nexport const clearStore = (store: Store = IMPLICIT.STORE): void => {\n const { config } = store\n Object.assign(store, createStore(config.name))\n store.config = config\n}\n","import { isString } from \"fp-ts/string\"\n\nimport type { Json, JsonObj } from \"~/packages/anvl/src/json\"\n\nimport { isArray } from \"../array\"\nimport { hasExactProperties, isRecord } from \"../object/refinement\"\n\nexport const RELATION_TYPES = [`1:1`, `1:n`, `n:n`] as const\n\nexport type RelationType = (typeof RELATION_TYPES)[number]\n\nexport const isRelationType = (x: unknown): x is RelationType =>\n RELATION_TYPES.includes(x as RelationType)\n\nexport type RelationData<CONTENT extends JsonObj | null = null> = {\n contents: JsonObj<string, CONTENT>\n relations: JsonObj<string, string[]>\n relationType: RelationType\n}\n\nexport const EMPTY_RELATION_DATA: RelationData = {\n contents: {},\n relations: {},\n relationType: `n:n`,\n}\n\nexport const isRelationData =\n <CONTENT extends JsonObj | null = null>(\n isContent?: (json: Json) => json is CONTENT\n ) =>\n (input: unknown): input is RelationData<CONTENT> =>\n hasExactProperties<RelationData<CONTENT>>({\n contents: isContent\n ? isRecord(isString, isContent)\n : hasExactProperties({}),\n relations: isRecord(isString, isArray(isString)),\n relationType: isRelationType,\n })(input)\n","export type VennCheck = (\n items: ReadonlyArray<unknown> | unknown[]\n) => (array: ReadonlyArray<unknown> | unknown[]) => boolean\n\nexport type VennTally = (\n items: ReadonlyArray<unknown> | unknown[]\n) => (array: ReadonlyArray<unknown> | unknown[]) => number\n\nexport const includesAll: VennCheck = (items) => (array) => {\n for (const item of items) {\n if (!array.includes(item)) return false\n }\n return true\n}\n\nexport const includesAny: VennCheck = (items) => (array) => {\n for (const item of items) {\n if (array.includes(item)) return true\n }\n return false\n}\n\nexport const excludesAll: VennCheck = (items) => (array) =>\n !includesAny(items)(array)\n\nexport const excludesAny: VennCheck = (items) => (array) =>\n !includesAll(items)(array)\n\nexport const comprises: VennCheck = (items) => (array) =>\n includesAll(items)(array) && includesAll(array)(items)\n\nexport const overlaps: VennTally = (items) => (array) => {\n let incidences = 0\n for (const item of items) {\n if (array.includes(item)) incidences += 1\n }\n return incidences\n}\n","export * from \"./match\"\nexport * from \"./venn\"\n\nimport type { Refinement } from \"fp-ts/Refinement\"\n\nexport const each =\n <T>(isType: Refinement<unknown, T>) =>\n (input: unknown): T[] =>\n isType(input) ? [input] : Array.isArray(input) ? input.filter(isType) : []\n\nexport const lastOf = <T>(input: ReadonlyArray<T>): T | undefined =>\n input[input.length - 1]\n\nexport const isArray =\n <T>(isType: Refinement<unknown, T>) =>\n (input: unknown): input is T[] =>\n Array.isArray(input) && input.every((item) => isType(item))\n\nexport const at =\n <T>(index: number) =>\n (input: T[]): T | undefined =>\n input.at(index)\n\nexport const content =\n <T>(isType: Refinement<unknown, T>) =>\n (input: unknown): input is T | T[] =>\n isType(input) || isArray(isType)(input)\n\nexport const join =\n (separator?: string) =>\n (a: string[]): string =>\n a.join(separator)\n\nexport const map =\n <I, O>(f: (value: I, index: number, array: I[]) => O) =>\n (a: I[]): O[] =>\n a.map(f)\n\nexport const reduce =\n <I, O>(f: (acc: O, value: I, index: number, array: I[]) => O, initial: O) =>\n (a: I[]): O =>\n a.reduce(f, initial)\n\nexport const slice =\n (start: number, end?: number) =>\n <I>(a: I[]): I[] =>\n a.slice(start, end)\n\nexport const using =\n <I, O>(a: I[]) =>\n (f: (acc: O, value: I, index: number, array: I[]) => O) =>\n (initial: O): O =>\n a.reduce(f, initial)\n\nexport const reduceRight =\n <I, O>(f: (acc: O, value: I, index: number, array: I[]) => O, initial: O) =>\n (a: I[]): O =>\n a.reduceRight(f, initial)\n\nexport const reverse = <I>(a: I[]): I[] => a.reverse()\n\nexport const sort =\n <I>(a: I[]) =>\n (f?: (x: I, y: I) => number): I[] =>\n f ? a.sort(f) : a.sort()\n\nexport const sortBy =\n <I>(f: (value: I) => number) =>\n (a: I[]): I[] =>\n a.sort((x, y) => f(x) - f(y))\n\nexport const sortByDesc =\n <I>(f: (value: I) => number) =>\n (a: I[]): I[] =>\n a.sort((x, y) => f(y) - f(x))\n\nexport const every =\n <I>(f: (value: I, index: number, array: I[]) => boolean = Boolean) =>\n (a: I[]): boolean =>\n a.every(f)\n\nexport const allTrue = every((x: boolean) => x === true)\n\nexport const addTo =\n <I>(a: I[]) =>\n (x: I): I[] =>\n a.includes(x) ? a : [...a, x]\n\nexport const isEmptyArray = (input: unknown): input is [] =>\n Array.isArray(input) && input.length === 0\n\nexport const isOneOf =\n <T>(...args: ReadonlyArray<T>) =>\n (input: unknown): input is T =>\n args.includes(input as T)\n\nexport const filter =\n <I, O extends I>(f: (value: I, index: number, array: I[]) => value is O) =>\n (a: I[]): O[] =>\n a.filter(f)\n","import { pipe } from \"fp-ts/function\"\nimport type { Refinement } from \"fp-ts/Refinement\"\n\nimport { access } from \"./access\"\nimport { recordToEntries } from \"./entries\"\nimport { mob } from \"./mapObject\"\nimport { allTrue, every } from \"../array\"\nimport { pass } from \"../function\"\nimport { ifNullish } from \"../nullish\"\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 typeof input === `object` && input !== null\n\nexport const isPlainObject = (input: unknown): input is PlainObject =>\n isNonNullObject(input) && Object.getPrototypeOf(input) === Object.prototype\n\nexport const isEmptyObject = (input: unknown): input is EmptyObject =>\n isPlainObject(input) && Object.keys(input).length === 0\n\n/* prettier-ignore */\nexport const isRecord = <\n KEY extends keyof any, \n VAL\n >( \n isKey: Refinement<keyof any, KEY>,\n isValue: Refinement<unknown, VAL>\n ) =>\n (input: unknown): input is Record<KEY, VAL> =>\n isPlainObject(input) &&\n Object.entries(input).every(([k, v]) => isKey(k) && isValue(v))\n/* prettier-ignore-end */\n\nexport type HasPropertiesOptions = {\n readonly allowExtraProperties?: boolean\n}\nexport const hasProperties = <OBJ extends object>(\n isValue: {\n [K in keyof OBJ]: Refinement<unknown, OBJ[K]>\n },\n options: HasPropertiesOptions = { allowExtraProperties: false }\n): Refinement<unknown, OBJ> => {\n const name = `{${recordToEntries(\n isValue as Record<keyof any, Refinement<any, any>>\n )\n .map(([k, v]) => String(k) + `:` + v.name)\n .join(`,`)}}`\n\n const _ = {\n [name]: (input: unknown): input is OBJ =>\n isPlainObject(input) &&\n pipe(\n isValue,\n Object.entries,\n every(([key, val]) => key in input || val(undefined))\n ) &&\n pipe(\n input,\n mob((val, key) =>\n pipe(\n isValue,\n access(key),\n ifNullish(() => options.allowExtraProperties),\n pass(val)\n )\n ),\n Object.values,\n allTrue\n ),\n }\n return _[name]\n}\n\nexport const doesExtend =\n /* alias for hasExactProperties with allowExtraProperties */\n <OBJ extends object>(isValue: {\n [K in keyof OBJ]: Refinement<unknown, OBJ[K]>\n }): Refinement<unknown, OBJ> =>\n hasProperties(isValue, { allowExtraProperties: true })\n\nexport const hasExactProperties =\n /* alias for hasProperties without allowExtraProperties */\n <OBJ extends object>(isValue: {\n [K in keyof OBJ]: Refinement<unknown, OBJ[K]>\n }): Refinement<unknown, OBJ> =>\n hasProperties(isValue, { allowExtraProperties: false })\n","export const key =\n <T extends object>(k: keyof T) =>\n (obj: Exclude<object, null>): unknown =>\n (obj as Record<keyof any, any>)[k]\n\nexport const access = <V, T extends Record<keyof any, V>>(\n k: keyof any\n): {\n (obj: T): T[keyof T] | undefined\n in: (obj: T) => T[keyof T] | undefined\n} =>\n Object.assign((obj: T) => obj[k as keyof T], {\n in: (obj: T) => obj[k as keyof T],\n })\n","export type Entries<K extends keyof any, V> = [key: K, value: V][]\n\nexport const recordToEntries = <K extends keyof any, V>(\n obj: Record<K, V>\n): Entries<K, V> => Object.entries(obj) as Entries<K, V>\n\nexport const entriesToRecord = <K extends keyof any, V>(\n entries: Entries<K, V>\n): Record<K, V> => Object.fromEntries(entries) as Record<K, V>\n","import { pipe } from \"fp-ts/lib/function\"\n\nimport { entriesToRecord, recordToEntries } from \"./entries\"\nimport { map } from \"../array\"\n\nexport const mapObject = <K extends keyof any, I, O>(\n obj: Record<K, I>,\n fn: (val: I, key: K) => O\n): Record<K, O> =>\n pipe(\n obj,\n recordToEntries,\n map(([key, val]) => [key, fn(val, key)] as const),\n entriesToRecord\n )\n\nexport const mob =\n <K extends keyof any, I, O>(fn: (val: I, key: K) => O) =>\n (obj: Record<K, I>): Record<K, O> =>\n mapObject(obj, fn)\n","import type { Refinement } from \"fp-ts/Refinement\"\nexport * from \"./curry\"\n\nexport const doNothing = (): void => undefined\n\n/* eslint-disable prettier/prettier */\nexport const become =\n <T>\n (nextVersionOfThing: Modifier<T> | T) =>\n (originalThing: T | (() => T)): T =>\n nextVersionOfThing instanceof Function\n ? nextVersionOfThing(originalThing instanceof Function \n ? originalThing() \n : originalThing\n )\n : nextVersionOfThing\n/* eslint-enable prettier/prettier */\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>(validate: Refinement<unknown, T>) =>\n (sample: T): Refinement<unknown, Modifier<T>> => {\n const sampleIsValid = validate(sample)\n if (!sampleIsValid) {\n throw new Error(`Invalid test case: JSON.stringify(${sample})`)\n }\n return (input: unknown): input is Modifier<T> => {\n if (typeof input !== `function`) return false\n const testResult = input(sample)\n return validate(testResult)\n }\n }\n\nexport const pass =\n <Params extends ReadonlyArray<any>, Out>(...params: Params) =>\n (fn: (...params: Params) => Out): Out =>\n fn(...params)\n\nexport const typeOf =\n <T>(input: unknown) =>\n (isType: Refinement<unknown, T>): boolean =>\n isType(input)\n\nexport const raiseError = (message: string): never => {\n throw new Error(message)\n}\n\nexport type Encapsulate<T extends (...args: any[]) => any> = (\n ...args: Parameters<T>\n) => void\n\nexport const attempt = (fn: () => void): boolean => {\n try {\n fn()\n return true\n } catch (_) {\n return false\n }\n}\n","import type { Refinement } from \"fp-ts/Refinement\"\n\nexport const isUndefined = (input: unknown): input is undefined =>\n input === undefined\n\nexport const ifDefined = <T>(\n validate: Refinement<unknown, T>\n): Refinement<unknown, T | undefined> =>\n ((input) => isUndefined(input) || validate(input)) as Refinement<\n unknown,\n T | undefined\n >\n\nexport const isNull = (input: unknown): input is null => input === null\n\nexport const isNullish = (input: unknown): input is null | undefined =>\n isUndefined(input) || isNull(input)\n\nexport type NullSafeUnion<Base, Extension> = Extension extends null\n ? Base\n : Base & Extension\n\nexport type NullSafeRest<MaybeArg> = MaybeArg extends null\n ? [] | [undefined]\n : [MaybeArg]\n\nexport interface Discard {\n readonly _discard: unique symbol\n}\n\nexport const ifNullish =\n <X, Y>(alt: Y) =>\n (input: X): Exclude<X, null | undefined> | Y =>\n (input ?? alt) as Exclude<X, null | undefined> | Y\n","import type { JsonObj } from \"../json\"\nimport type { RelationData } from \"./core-relation-data\"\n\nexport const getRelatedIds = <CONTENT extends JsonObj | null = null>(\n relationMap: RelationData<CONTENT>,\n id: string\n): string[] => relationMap.relations[id] ?? []\n\nexport const getRelatedId = <CONTENT extends JsonObj | null = null>(\n relationMap: RelationData<CONTENT>,\n id: string\n): string | undefined => {\n const relations = getRelatedIds(relationMap, id)\n if (relations.length > 1) {\n console.warn(\n `entry with id ${id} was not expected to have multiple relations`\n )\n }\n return relations[0]\n}\n","import { pipe } from \"fp-ts/function\"\n\nimport type { Identified } from \"~/packages/anvl/src/id/identified\"\nimport { isEmptyObject } from \"~/packages/anvl/src/object/refinement\"\n\nimport type { RelationData } from \"./core-relation-data\"\nimport { getRelatedIds } from \"./get-related-ids\"\nimport { getRelationEntries } from \"./relation-record\"\nimport { removeRelation } from \"./remove-relation\"\nimport { setRelationWithContent } from \"./set-relation\"\nimport type { JsonObj } from \"../json\"\n\nexport const makeContentId = (idA: string, idB: string): string =>\n [idA, idB].sort().join(`/`)\n\nexport const getContent = <CONTENT extends JsonObj | null = null>(\n relationMap: RelationData<CONTENT>,\n idA: string,\n idB: string\n): CONTENT | undefined => relationMap.contents[makeContentId(idA, idB)]\n\nexport const setContent = <CONTENT extends JsonObj | null = null>(\n map: RelationData<CONTENT>,\n idA: string,\n idB: string,\n content: CONTENT\n): RelationData<CONTENT> => ({\n ...map,\n contents: {\n ...map.contents,\n [makeContentId(idA, idB)]: content,\n },\n})\n\nexport const getRelations = <CONTENT extends JsonObj | null = null>(\n relationMap: RelationData<CONTENT>,\n id: string\n): (CONTENT extends null ? Identified : CONTENT & Identified)[] =>\n getRelationEntries(relationMap, id).map(\n ([id, content]) =>\n ({\n id,\n ...content,\n } as CONTENT extends null ? Identified : CONTENT & Identified)\n )\n\nexport const setRelations = <CONTENT extends JsonObj | null = null>(\n current: RelationData<CONTENT>,\n idA: string,\n relations: (CONTENT extends null ? Identified : CONTENT & Identified)[]\n): RelationData<CONTENT> =>\n pipe(\n current,\n (relationData) => {\n const relatedIds = getRelatedIds(current, idA)\n const removedIds = relatedIds.filter(\n (id) => !relations.some((r) => r.id === id)\n )\n let step = relationData\n for (const idB of removedIds) step = removeRelation(step, idA, idB)\n return step\n },\n (relationData) => {\n let step = relationData\n for (const { id: idB, ...rest } of relations) {\n const content = isEmptyObject(rest) ? undefined : rest\n // @ts-expect-error Omit<CONTENT & Identified, \"id\"> === CONTENT\n step = setRelationWithContent(step, idA, idB, content)\n }\n return step\n },\n (relationData) => {\n const newlyOrderedIds = relations.map((r) => r.id)\n return {\n ...relationData,\n relations: {\n ...relationData.relations,\n [idA]: newlyOrderedIds,\n },\n }\n }\n )\n","import type { JsonObj } from \"../json\"\nimport type { RelationData } from \"./core-relation-data\"\nimport { getRelatedIds } from \"./get-related-ids\"\nimport { getContent } from \"./relation-contents\"\n\nexport const getRelationEntries = <CONTENT extends JsonObj | null = null>(\n relationMap: RelationData<CONTENT>,\n idA: string\n): [string, CONTENT][] =>\n getRelatedIds(relationMap, idA).map((idB) => [\n idB,\n getContent(relationMap, idA, idB) as CONTENT,\n ])\n\nexport const getRelationRecord = <CONTENT extends JsonObj | null = null>(\n relationMap: RelationData<CONTENT>,\n id: string\n): Record<string, CONTENT> =>\n Object.fromEntries(getRelationEntries(relationMap, id))\n","import { pipe } from \"fp-ts/function\"\nimport { isString } from \"fp-ts/string\"\n\nimport type { RelationData } from \"./core-relation-data\"\nimport { isEmptyArray, isOneOf, map } from \"../array\"\nimport { comprises } from \"../array/venn\"\nimport type { JsonObj } from \"../json\"\nimport { treeShake as removeProperties } from \"../object\"\nimport { entriesToRecord, recordToEntries } from \"../object/entries\"\nimport { split } from \"../string/split\"\n\nexport const removeSpecific = <CONTENT extends JsonObj | null = null>(\n current: RelationData<CONTENT>,\n idA: string,\n idB: string\n): RelationData<CONTENT> => {\n const isIdForRemoval = isOneOf(idA, idB)\n return {\n ...current,\n relations: pipe(\n current.relations,\n recordToEntries,\n map(([id, relations]): [id: string, fewerRelations: string[]] => [\n id,\n isIdForRemoval(id)\n ? relations.filter((relation) => !isIdForRemoval(relation))\n : relations,\n ]),\n entriesToRecord,\n removeProperties(isEmptyArray)\n ),\n contents: pipe(\n current.contents,\n removeProperties(\n (_, key) => isString(key) && pipe(key, split(`/`), comprises([idA, idB]))\n )\n ),\n }\n}\n\nexport const removeAll = <CONTENT extends JsonObj | null = null>(\n current: RelationData<CONTENT>,\n idToRemove: string\n): RelationData<CONTENT> => {\n const next: RelationData<CONTENT> = {\n ...current,\n relations: pipe(\n current.relations,\n recordToEntries,\n map(([id, relations]): [id: string, fewerRelations: string[]] => [\n id,\n relations.filter((relation) => relation !== idToRemove),\n ]),\n entriesToRecord,\n removeProperties((val, key) => key === idToRemove || isEmptyArray(val))\n ),\n contents: pipe(\n current.contents,\n removeProperties(\n (_, key) => isString(key) && key.split(`/`).includes(idToRemove)\n )\n ),\n }\n return next\n}\n\nexport const removeRelation = <CONTENT extends JsonObj | null = null>(\n current: RelationData<CONTENT>,\n idA: string,\n idB?: string\n): RelationData<CONTENT> =>\n idB ? removeSpecific(current, idA, idB) : removeAll(current, idA)\n","import { flow, pipe } from \"fp-ts/function\"\nimport type { Refinement } from \"fp-ts/lib/Refinement\"\n\nimport { deepMob } from \"./deepMob\"\nimport { entriesToRecord, recordToEntries } from \"./entries\"\nimport { isPlainObject } from \"./refinement\"\nimport { includesAny, map, reduce, filter } from \"../array\"\nimport { isUndefined } from \"../nullish\"\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 <K extends keyof any>(...args: K[]) =>\n <O extends Record<K, any>>(obj: O): Omit<O, K> =>\n reduce<K, O>((acc, key) => (delete acc[key], acc), obj)(args)\n\nexport type Redacted<Holder, RedactProp extends keyof any> = Omit<\n {\n [K in keyof Holder]: Holder[K] extends (infer Item)[]\n ? Redacted<Item, RedactProp>[]\n : Redacted<Omit<Holder[K], RedactProp>, RedactProp>\n },\n RedactProp\n>\nexport const redactDeep =\n <K extends keyof any>(...args: K[]) =>\n <O extends Record<K, any>>(base: O): Redacted<O, K> =>\n deepMob(base, (node, path) =>\n includesAny(args)(path)\n ? {\n meta: { pathComplete: true },\n }\n : {\n data: isPlainObject(node)\n ? redact(...args)(node as Record<keyof any, any>)\n : node,\n }\n )\n\nexport const select =\n <Key extends keyof any>(...args: Key[]) =>\n <Obj extends object>(\n obj: Obj\n ): {\n // @ts-expect-error fuk u\n [K in keyof Pick<Obj, Key>]: any extends Pick<Obj, Key>[K]\n ? undefined\n : // @ts-expect-error fuk u\n Pick<Obj, Key>[K]\n } =>\n // @ts-expect-error fuk u ts\n reduce<Key, Pick<Obj, Key>>(\n // @ts-expect-error i will fite u\n (acc, key) => (key in obj ? (acc[key] = obj[key as keyof Obj]) : acc, acc),\n // @ts-expect-error fuk u\n {} as Pick<Obj, Key>\n )(args)\n\nexport const treeShake =\n (shouldDiscard: (val: unknown, key: keyof any) => boolean = isUndefined) =>\n <T extends object>(\n obj: T\n ): T extends Record<keyof any, unknown> ? T : Partial<T> => {\n const newObj = {} as T\n const entries = Object.entries(obj) as [keyof T, any][]\n entries.forEach(([key, val]) =>\n !shouldDiscard(val, key) ? (newObj[key] = val) : null\n )\n return newObj as T extends Record<keyof any, unknown> ? T : Partial<T>\n }\n\nexport type KeysExtending<T, V> = keyof {\n [K in keyof T]: T[K] extends V ? K : never\n}\n\nconst a: never | null = null\n\nexport const filterProperties =\n <DiscardVal, DiscardKey extends keyof any>(\n shouldDiscardVal: Refinement<unknown, DiscardVal>,\n shouldDiscardKey: Refinement<unknown, DiscardKey>\n ) =>\n <P extends Record<keyof any, any>>(\n props: P\n ): DiscardVal extends never\n ? DiscardKey extends never\n ? P\n : Omit<P, DiscardKey>\n : Omit<P, DiscardKey | KeysExtending<P, DiscardVal>> =>\n // @ts-expect-error oh well\n pipe(\n props,\n recordToEntries,\n filter(\n (\n entry\n ): entry is [\n Exclude<keyof P, DiscardKey>,\n Exclude<P[keyof P], DiscardVal>\n ] => !shouldDiscardKey(entry[0]) || !shouldDiscardVal(entry[1])\n ),\n entriesToRecord\n )\n\nexport const delve = (\n obj: Record<keyof any, any>,\n path: ReadonlyArray<keyof any>\n): Error | { found: unknown } => {\n const found = path.reduce((acc, key) => acc?.[key], obj)\n return found === undefined ? new Error(`Not found`) : { found }\n}\n\nexport const tweak = (\n obj: Record<keyof any, any>,\n path: ReadonlyArray<keyof any>,\n value: unknown\n): void =>\n path.reduce((acc, key, i) => {\n if (i === path.length - 1) {\n acc[key] = value\n }\n if (acc[key] === undefined) {\n acc[key] = typeof key === `number` ? [] : {}\n }\n return acc[key]\n }, obj)\n\nexport type RequireAtLeastOne<T> = {\n [K in keyof T]-?: Partial<Pick<T, Exclude<keyof T, K>>> & Required<Pick<T, K>>\n}[keyof T]\n","export const split =\n (separator: string) =>\n (str: string): string[] =>\n str.split(separator)\n","import type { RelationData } from \"./core-relation-data\"\nimport { getRelatedId } from \"./get-related-ids\"\nimport { setContent } from \"./relation-contents\"\nimport { addTo, isEmptyArray } from \"../array\"\nimport type { JsonObj } from \"../json\"\nimport type { NullSafeRest } from \"../nullish\"\nimport { treeShake as removeProperties } from \"../object\"\n\nexport const setManyToMany = <CONTENT extends JsonObj | null = null>(\n map: RelationData<CONTENT>,\n idA: string,\n idB: string,\n ...rest: NullSafeRest<CONTENT>\n): RelationData<CONTENT> => {\n const next = {\n ...map,\n relations: {\n ...map.relations,\n [idA]: addTo(map.relations[idA] ?? [])(idB),\n [idB]: addTo(map.relations[idB] ?? [])(idA),\n },\n }\n const content = rest[0] as CONTENT | undefined\n return content ? setContent(next, idA, idB, content) : next\n}\n\nconst removeEmpties = removeProperties(isEmptyArray)\n\nexport const set1ToMany = <CONTENT extends JsonObj | null = null>(\n current: RelationData<CONTENT>,\n leaderId: string,\n followerId: string,\n ...rest: NullSafeRest<CONTENT>\n): RelationData<CONTENT> => {\n const relations = { ...current.relations }\n const prevLeaderId = getRelatedId(current, followerId)\n const next = {\n ...current,\n relations: removeEmpties({\n ...relations,\n ...(prevLeaderId &&\n prevLeaderId !== leaderId && {\n [prevLeaderId]: relations[prevLeaderId].filter(\n (id) => id !== followerId\n ),\n }),\n [followerId]: [leaderId],\n [leaderId]: addTo(relations[leaderId] ?? [])(followerId),\n }),\n }\n const content = rest[0] as CONTENT | undefined\n return content ? setContent(next, leaderId, followerId, content) : next\n}\n\nexport const set1To1 = <CONTENT extends JsonObj | null = null>(\n current: RelationData<CONTENT>,\n wifeId: string,\n husbandId: string,\n ...rest: NullSafeRest<CONTENT>\n): RelationData<CONTENT> => {\n const prevWifeId = getRelatedId(current, husbandId)\n const prevHusbandId = getRelatedId(current, wifeId)\n const next = {\n ...current,\n relations: removeEmpties({\n ...current.relations,\n ...(prevWifeId && { [prevWifeId]: [] }),\n ...(prevHusbandId && { [prevHusbandId]: [] }),\n [wifeId]: [husbandId],\n [husbandId]: [wifeId],\n }),\n }\n\n const content = rest[0] as CONTENT | undefined\n return content ? setContent(next, wifeId, husbandId, content) : next\n}\n\nexport const setRelationWithContent = <CONTENT extends JsonObj | null = null>(\n current: RelationData<CONTENT>,\n idA: string,\n idB: string,\n ...rest: NullSafeRest<CONTENT>\n): RelationData<CONTENT> => {\n switch (current.relationType) {\n case `1:1`:\n return set1To1(current, idA, idB, ...rest)\n case `1:n`:\n return set1ToMany(current, idA, idB, ...rest)\n case `n:n`:\n return setManyToMany(current, idA, idB, ...rest)\n }\n}\n","import type { Refinement } from \"fp-ts/Refinement\"\n\nexport * from \"./refined\"\n\nexport const canExist = (_: unknown): _ is unknown => true\nexport const cannotExist = (_: unknown): _ is never => false\n\nexport const isLiteral =\n <T extends boolean | number | string>(value: T): Refinement<unknown, T> =>\n (input: unknown): input is T =>\n input === value\n\nexport const isWithin =\n <Options extends ReadonlyArray<any>>(args: Options) =>\n (input: unknown): input is Options[number] =>\n args.includes(input as Options[number])\n\nexport const ensure =\n <T>(isType: Refinement<unknown, T>) =>\n (input: unknown): T => {\n if (!isType(input)) {\n throw new TypeError(`Expected ${input} to be of type ${isType.name}`)\n }\n return input as T\n }\n\nexport const ensureAgainst =\n <A, B>(isType: Refinement<unknown, A>) =>\n (input: A | B): Exclude<A | B, A> => {\n if (isType(input)) {\n throw new TypeError(`Expected ${input} to not be of type ${isType.name}`)\n }\n return input as Exclude<A | B, A>\n }\n\nexport type ExtendsSome<A, B> = Refinement<unknown, A | B> & {\n or: <C>(isType: Refinement<unknown, C>) => ExtendsSome<unknown, A | B | C>\n}\nexport const couldBe = <A>(\n isTypeA: Refinement<unknown, A>,\n logging = false,\n refinements: Refinement<unknown, any>[] = [isTypeA]\n): {\n (input: unknown): input is A\n or: <B>(isTypeB: Refinement<unknown, B>) => ExtendsSome<A, B>\n} => {\n const name = `(${refinements.map((r) => r.name || `anon`).join(` | `)})`\n const _ = {\n [name]: (input: unknown): input is A =>\n refinements.some(\n (refinement) => (\n logging &&\n console.log(\n refinements.map((r) => r.name || `anon`).join(` | `),\n `>`,\n refinement.name ?? `anon`,\n `:`,\n refinement(input)\n ),\n refinement(input)\n )\n ),\n }\n const checkTypes: {\n (input: unknown): input is A\n or: <B>(isTypeB: Refinement<unknown, B>) => ExtendsSome<A, B>\n } = Object.assign(_[name], {\n or: <B>(isTypeB: Refinement<unknown, B>): ExtendsSome<A, B> =>\n couldBe(isTypeB, logging, [...refinements, isTypeB]),\n })\n return checkTypes\n}\n\nexport const isUnion = couldBe(cannotExist)\n\nexport type ExtendsAll<A, B> = Refinement<unknown, A & B> & {\n and: <C>(isType: Refinement<unknown, C>) => ExtendsAll<A & B, C>\n}\n\nexport const mustBe = <A>(\n isTypeA: Refinement<unknown, A>,\n logging = false,\n refinements: Refinement<unknown, any>[] = [isTypeA]\n): {\n (input: unknown): input is A\n and: <B>(isTypeB: Refinement<unknown, B>) => ExtendsAll<A, B>\n} => {\n const name = `(${refinements.map((r) => r.name || `anon`).join(` & `)})`\n const _ = {\n [name]: (input: unknown): input is A =>\n refinements.every(\n (refinement) => (\n logging &&\n console.log(\n refinements.map((r) => r.name || `anon`).join(` & `),\n `>`,\n refinement.name || `anon`,\n `:`,\n refinement(input)\n ),\n refinement(input)\n )\n ),\n }\n const checkTypes: {\n (input: unknown): input is A\n and: <B>(isTypeB: Refinement<unknown, B>) => ExtendsAll<A, B>\n } = Object.assign(_[name], {\n and: <B>(isTypeB: Refinement<unknown, B>): ExtendsAll<A, B> =>\n mustBe(isTypeB, logging, [...refinements, isTypeB]) as ExtendsAll<A, B>,\n })\n return checkTypes\n}\n\nexport const isIntersection = mustBe(canExist)\n\nexport const isClass =\n <ClassSignature extends abstract new (...args: any) => any>(\n C: ClassSignature\n ) =>\n (input: unknown): input is InstanceType<ClassSignature> =>\n input instanceof C\n","import type { Refinement } from \"fp-ts/Refinement\"\n\nimport type { Identified } from \"~/packages/anvl/src/id/identified\"\n\nimport type { RelationData } from \"./core-relation-data\"\nimport { EMPTY_RELATION_DATA, isRelationData } from \"./core-relation-data\"\nimport { getRelatedId, getRelatedIds } from \"./get-related-ids\"\nimport { getContent, getRelations, setRelations } from \"./relation-contents\"\nimport { getRelationEntries, getRelationRecord } from \"./relation-record\"\nimport { removeRelation } from \"./remove-relation\"\nimport { setRelationWithContent } from \"./set-relation\"\nimport type { Json, JsonObj } from \"../json\"\nimport type { NullSafeRest, NullSafeUnion } from \"../nullish\"\nimport { cannotExist } from \"../refinement\"\n\nexport class Join<CONTENT extends JsonObj | null = null>\n implements RelationData<CONTENT>\n{\n public readonly relationType: `1:1` | `1:n` | `n:n`\n public readonly relations: Record<string, string[]>\n public readonly contents: Record<string, CONTENT>\n public constructor(json?: Partial<RelationData<CONTENT>>) {\n Object.assign(this, { ...EMPTY_RELATION_DATA, ...json })\n }\n public toJSON(): RelationData<CONTENT> {\n return {\n relationType: this.relationType,\n relations: this.relations,\n contents: this.contents,\n }\n }\n public static fromJSON<CONTENT extends JsonObj | null = null>(\n json: Json,\n isContent: Refinement<unknown, CONTENT> = cannotExist\n ): Join<CONTENT> {\n const isValid = isRelationData(isContent)(json)\n if (isValid) {\n return new Join(json)\n }\n throw new Error(\n `Saved JSON for this Join is invalid: ${JSON.stringify(json)}`\n )\n }\n\n public getRelatedId(id: string): string | undefined {\n return getRelatedId(this, id)\n }\n public getRelatedIds(id: string): string[] {\n return getRelatedIds(this, id)\n }\n public getContent(idA: string, idB: string): CONTENT | undefined {\n return getContent(this, idA, idB)\n }\n public getRelationEntries(id: string): [string, CONTENT][] {\n return getRelationEntries(this, id)\n }\n public getRelationRecord(id: string): Record<string, CONTENT> {\n return getRelationRecord(this, id)\n }\n public getRelation(\n id: string\n ): NullSafeUnion<Identified, CONTENT> | undefined {\n return getRelations(this, id)[0]\n }\n public getRelations(id: string): NullSafeUnion<Identified, CONTENT>[] {\n return getRelations(this, id)\n }\n public setRelations(\n id: string,\n relations: NullSafeUnion<Identified, CONTENT>[]\n ): Join<CONTENT> {\n return new Join(setRelations(this, id, relations))\n }\n public set(\n idA: string,\n idB: string,\n ...rest: NullSafeRest<CONTENT>\n ): Join<CONTENT> {\n return new Join(setRelationWithContent(this, idA, idB, ...rest))\n }\n public remove(idA: string, idB?: string): Join<CONTENT> {\n return new Join(removeRelation(this, idA, idB))\n }\n}\n","import HAMT from \"hamt_plus\"\n\nimport { become } from \"~/packages/anvl/src/function\"\n\nimport type { Atom, Selector } from \".\"\nimport { withdraw, getState__INTERNAL } from \"./get\"\nimport { isDone, recall, markDone } from \"./operation\"\nimport type { Store } from \"./store\"\nimport { IMPLICIT } from \"./store\"\nimport type { StateToken } from \"..\"\n\nexport const propagateDown = <T>(\n state: Atom<T> | Selector<T>,\n store: Store = IMPLICIT.STORE\n): void => {\n const relatedStateKeys = store.selectorGraph.getRelations(state.key)\n store.config.logger?.info(\n ` ||`,\n `bumping`,\n relatedStateKeys.length,\n `states:`,\n relatedStateKeys.map(({ id }) => id)\n )\n if (store.operation.open) {\n store.config.logger?.info(` ||`, `done:`, store.operation.done)\n }\n relatedStateKeys.forEach(({ id: stateKey }) => {\n if (isDone(stateKey, store)) {\n store.config.logger?.info(` ||`, stateKey, `already done`)\n return\n }\n store.config.logger?.info(`->`, `bumping`, stateKey)\n const state =\n HAMT.get(stateKey, store.selectors) ??\n HAMT.get(stateKey, store.readonlySelectors)\n if (!state) {\n store.config.logger?.info(\n ` ||`,\n stateKey,\n `is an atom - no need to propagate down`\n )\n return\n }\n store.valueMap = HAMT.remove(stateKey, store.valueMap)\n const newValue = getState__INTERNAL(state, store)\n store.config.logger?.info(` <-`, stateKey, `became`, newValue)\n const oldValue = recall(state, store)\n state.subject.next({ newValue, oldValue })\n markDone(stateKey, store)\n if (`set` in state) propagateDown(state, store)\n })\n}\n\nexport const setAtomState = <T>(\n atom: Atom<T>,\n next: T | ((oldValue: T) => T),\n store: Store = IMPLICIT.STORE\n): void => {\n const oldValue = getState__INTERNAL(atom, store)\n const newValue = become(next)(oldValue)\n store.config.logger?.info(\n `->`,\n `setting atom`,\n `\"${atom.key}\"`,\n `to`,\n newValue\n )\n store.valueMap = HAMT.set(atom.key, newValue, store.valueMap)\n markDone(atom.key, store)\n atom.subject.next({ newValue, oldValue })\n store.config.logger?.info(\n ` ||`,\n `propagating change made to`,\n `\"${atom.key}\"`\n )\n propagateDown(atom, store)\n}\nexport const setSelectorState = <T>(\n selector: Selector<T>,\n next: T | ((oldValue: T) => T),\n store: Store = IMPLICIT.STORE\n): void => {\n const oldValue = getState__INTERNAL(selector, store)\n const newValue = become(next)(oldValue)\n\n store.config.logger?.info(\n `->`,\n `setting selector`,\n `\"${selector.key}\"`,\n `to`,\n newValue\n )\n store.config.logger?.info(\n ` ||`,\n `propagating change made to`,\n `\"${selector.key}\"`\n )\n\n selector.set(newValue)\n propagateDown(selector, store)\n}\nexport const setState__INTERNAL = <T>(\n token: StateToken<T>,\n value: T | ((oldValue: T) => T),\n store: Store = IMPLICIT.STORE\n): void => {\n const state = withdraw<T>(token, store)\n if (`set` in state) {\n setSelectorState(state, value, store)\n } else {\n setAtomState(state, value, store)\n }\n}\n","import HAMT from \"hamt_plus\"\n\nimport type { Atom, ReadonlySelector, Selector } from \".\"\nimport type { Store } from \"./store\"\nimport { IMPLICIT } from \"./store\"\n\nexport const startAction = (store: Store): void => {\n store.operation = {\n open: true,\n done: new Set(),\n prev: store.valueMap,\n }\n store.config.logger?.info(`☐`, `operation start`)\n}\nexport const finishAction = (store: Store): void => {\n store.operation = { open: false }\n store.config.logger?.info(`☑️`, `operation done`)\n}\n\nexport const isDone = (key: string, store: Store = IMPLICIT.STORE): boolean => {\n if (!store.operation.open) {\n store.config.logger?.warn(\n `isDone called outside of an action. This is probably a bug.`\n )\n return true\n }\n return store.operation.done.has(key)\n}\nexport const markDone = (key: string, store: Store = IMPLICIT.STORE): void => {\n if (!store.operation.open) {\n store.config.logger?.warn(\n `markDone called outside of an action. This is probably a bug.`\n )\n return\n }\n store.operation.done.add(key)\n}\nexport const recall = <T>(\n state: Atom<T> | ReadonlySelector<T> | Selector<T>,\n store: Store = IMPLICIT.STORE\n): T => {\n if (!store.operation.open) {\n store.config.logger?.warn(\n `recall called outside of an action. This is probably a bug.`\n )\n return HAMT.get(state.key, store.valueMap)\n }\n return HAMT.get(state.key, store.operation.prev)\n}\n","import type { Store } from \"./store\"\n\nexport const finishTransaction = (store: Store): void => {\n store.transaction = { open: false }\n store.config.logger?.info(`🛬`, `transaction done`)\n}\nexport const startTransaction = (store: Store): void => {\n store.transaction = {\n open: true,\n prev: {\n atoms: store.atoms,\n readonlySelectors: store.readonlySelectors,\n selectorGraph: store.selectorGraph,\n selectors: store.selectors,\n valueMap: store.valueMap,\n },\n }\n store.config.logger?.info(`🛫`, `transaction start`)\n}\nexport const abortTransaction = (store: Store): void => {\n if (!store.transaction.open) {\n store.config.logger?.warn(\n `abortTransaction called outside of a transaction. This is probably a bug.`\n )\n return\n }\n store.atoms = store.transaction.prev.atoms\n store.readonlySelectors = store.transaction.prev.readonlySelectors\n store.selectorGraph = store.transaction.prev.selectorGraph\n store.selectors = store.transaction.prev.selectors\n store.valueMap = store.transaction.prev.valueMap\n store.transaction = { open: false }\n store.config.logger?.info(`🪂`, `transaction fail`)\n}\n","import HAMT from \"hamt_plus\"\nimport * as Rx from \"rxjs\"\n\nimport type { Serializable } from \"~/packages/anvl/src/json\"\nimport { stringifyJson } from \"~/packages/anvl/src/json\"\n\nimport type { AtomToken, Observe } from \".\"\nimport { subscribe, setState } from \".\"\nimport { deposit } from \"./internal\"\nimport type { Store } from \"./internal/store\"\nimport { IMPLICIT } from \"./internal/store\"\n\nexport type Effectors<T> = {\n setSelf: <V extends T>(next: V | ((oldValue: T) => V)) => void\n onSet: (callback: (options: { newValue: T; oldValue: T }) => void) => void\n}\n\nexport type AtomEffect<T> = (tools: Effectors<T>) => void\n\nexport type AtomOptions<T> = {\n key: string\n default: T\n effects?: AtomEffect<T>[]\n}\n\nexport const atom = <T>(\n options: AtomOptions<T>,\n store: Store = IMPLICIT.STORE\n): AtomToken<T> => {\n if (HAMT.has(options.key, store.atoms)) {\n store.config.logger?.error?.(\n `Key \"${options.key}\" already exists in the store.`\n )\n return deposit(store.atoms.get(options.key))\n }\n const subject = new Rx.Subject<{ newValue: T; oldValue: T }>()\n const newAtom = { ...options, subject }\n store.atoms = HAMT.set(options.key, newAtom, store.atoms)\n store.valueMap = HAMT.set(options.key, options.default, store.valueMap)\n const token = deposit(newAtom)\n const setSelf = (next) => setState(token, next, store)\n const onSet = (observe: Observe<T>) => subscribe(token, observe, store)\n setSelf(options.default)\n options.effects?.forEach((effect) => effect({ setSelf, onSet }))\n return token\n}\n\nexport type AtomFamilyOptions<T, K extends Serializable> = {\n key: string\n default: T | ((key: K) => T)\n effects?: (key: K) => AtomEffect<T>[]\n}\n\nexport const atomFamily =\n <T, K extends Serializable>(\n options: AtomFamilyOptions<T, K>,\n store: Store = IMPLICIT.STORE\n ) =>\n (key: K): AtomToken<T> => {\n const fullKey = `${options.key}__${stringifyJson(key)}`\n const existing = store.atoms.get(fullKey)\n if (existing) {\n return deposit(existing)\n }\n return atom<T>(\n {\n key: fullKey,\n default:\n options.default instanceof Function\n ? options.default(key)\n : options.default,\n effects: options.effects?.(key),\n },\n store\n )\n }\n","import { pipe } from \"fp-ts/function\"\n\nexport * from \"./refine\"\n\nexport const serializeSet = <T>(set: Set<T>): string =>\n pipe(set, Array.from, JSON.stringify)\n\nexport const deserializeSet = <T>(str: string): Set<T> =>\n pipe(str, JSON.parse, Array.from, (a) => new Set(a as T[]))\n\nexport type Primitive = boolean | number | string | null\n\nexport type Serializable =\n | Primitive\n | Readonly<{ [key: string]: Serializable }>\n | ReadonlyArray<Serializable>\n\nexport type JsonObj<\n Key extends string = string,\n Value extends Serializable = Serializable\n> = Record<Key, Value>\n\nexport type JsonArr<Element extends Serializable = Serializable> =\n ReadonlyArray<Element>\n\nexport type Json = JsonArr | JsonObj | Primitive\n\nexport const parseJson = <J extends Json, S extends Stringified<J> | string>(\n str: S | string\n): S extends Stringified<J> ? J : Json => JSON.parse(str)\n\nexport type Stringified<J extends Json> = string & { __json: J }\n\nexport const stringifyJson = <J extends Json>(json: J): Stringified<J> =>\n JSON.stringify(json) as Stringified<J>\n\nexport type Empty = Record<string, never>\n\nexport const JSON_TYPE_NAMES = [\n `array`,\n `boolean`,\n `null`,\n `number`,\n `object`,\n `string`,\n] as const\n\nexport type JsonTypeName = (typeof JSON_TYPE_NAMES)[number]\n\nexport interface JsonTypes extends Record<JsonTypeName, Json> {\n array: JsonArr\n boolean: boolean\n null: null\n number: number\n object: JsonObj\n string: string\n}\n\nexport const JSON_DEFAULTS: JsonTypes = {\n array: [],\n boolean: false,\n null: null,\n number: 0,\n object: {},\n string: ``,\n}\n\nexport type JsonInterface<T, J extends Json = Json> = {\n toJson: (t: T) => J\n fromJson: (json: J) => T\n}\n","import HAMT from \"hamt_plus\"\nimport * as Rx from \"rxjs\"\n\nimport { become } from \"~/packages/anvl/src/function\"\nimport type { Serializable } from \"~/packages/anvl/src/json\"\nimport { stringifyJson } from \"~/packages/anvl/src/json\"\n\nimport type { ReadonlyValueToken, SelectorToken } from \".\"\nimport { getState } from \".\"\nimport type { Selector } from \"./internal\"\nimport { markDone, deposit } from \"./internal\"\nimport { setState__INTERNAL } from \"./internal/set\"\nimport type { Store } from \"./internal/store\"\nimport { IMPLICIT } from \"./internal/store\"\nimport type { ReadonlyTransactors, Transactors } from \"./transaction\"\n\nexport type SelectorOptions<T> = {\n key: string\n get: (readonlyTransactors: ReadonlyTransactors) => T\n set: (transactors: Transactors, newValue: T) => void\n}\nexport type ReadonlySelectorOptions<T> = Omit<SelectorOptions<T>, `set`>\n\nexport function selector<T>(\n options: SelectorOptions<T>,\n store?: Store\n): SelectorToken<T>\nexport function selector<T>(\n options: ReadonlySelectorOptions<T>,\n store?: Store\n): ReadonlyValueToken<T>\nexport function selector<T>(\n options: ReadonlySelectorOptions<T> | SelectorOptions<T>,\n store: Store = IMPLICIT.STORE\n): ReadonlyValueToken<T> | SelectorToken<T> {\n if (HAMT.has(options.key, store.selectors)) {\n throw new Error(`Key \"${options.key}\" already exists in the store.`)\n }\n\n const subject = new Rx.Subject<{ newValue: T; oldValue: T }>()\n\n const { get, set } = registerSelector(options.key, store)\n const getSelf = () => {\n const value = options.get({ get })\n store.valueMap = HAMT.set(options.key, value, store.valueMap)\n return value\n }\n\n if (!(`set` in options)) {\n const readonlySelector = {\n ...options,\n subject,\n get: getSelf,\n }\n store.readonlySelectors = HAMT.set(\n options.key,\n readonlySelector,\n store.readonlySelectors\n )\n const initialValue = getSelf()\n store.config.logger?.info(` ✨`, options.key, `=`, initialValue)\n return { ...readonlySelector, type: `readonly_selector` }\n }\n\n const setSelf = (next: T | ((oldValue: T) => T)): void => {\n store.config.logger?.info(`${options.key}.set`, next)\n const oldValue = getSelf()\n const newValue = become(next)(oldValue)\n store.valueMap = HAMT.set(options.key, newValue, store.valueMap)\n markDone(options.key, store)\n subject.next({ newValue, oldValue })\n options.set({ get, set }, newValue)\n }\n\n const mySelector: Selector<T> = {\n ...options,\n subject,\n get: getSelf,\n set: setSelf,\n }\n store.selectors = HAMT.set(options.key, mySelector, store.selectors)\n const initialValue = getSelf()\n store.config.logger?.info(` ✨`, options.key, `=`, initialValue)\n return { ...mySelector, type: `selector` }\n}\n\nexport type SelectorFamilyOptions<T, K extends Serializable> = {\n key: string\n get: (key: K) => (readonlyTransactors: ReadonlyTransactors) => T\n set: (key: K) => (transactors: Transactors, newValue: T) => void\n}\nexport type ReadonlySelectorFamilyOptions<T, K extends Serializable> = Omit<\n SelectorFamilyOptions<T, K>,\n `set`\n>\n\nexport function selectorFamily<T, K extends Serializable>(\n options: SelectorFamilyOptions<T, K>,\n store?: Store\n): (key: K) => SelectorToken<T>\nexport function selectorFamily<T, K extends Serializable>(\n options: ReadonlySelectorFamilyOptions<T, K>,\n store?: Store\n): (key: K) => ReadonlyValueToken<T>\nexport function selectorFamily<T, K extends Serializable>(\n options: ReadonlySelectorFamilyOptions<T, K> | SelectorFamilyOptions<T, K>,\n store: Store = IMPLICIT.STORE\n): (key: K) => ReadonlyValueToken<T> | SelectorToken<T> {\n return (key: K): ReadonlyValueToken<T> | SelectorToken<T> => {\n const fullKey = `${options.key}__${stringifyJson(key)}`\n const existing =\n store.selectors.get(fullKey) ?? store.readonlySelectors.get(fullKey)\n if (existing) {\n return deposit(existing)\n }\n const readonlySelectorOptions: ReadonlySelectorOptions<T> = {\n key: fullKey,\n get: options.get(key),\n }\n if (!(`set` in options)) {\n return selector<T>(\n {\n ...readonlySelectorOptions,\n },\n store\n )\n }\n return selector<T>(\n {\n ...readonlySelectorOptions,\n set: options.set(key),\n },\n store\n )\n }\n}\n\nexport const registerSelector = (\n selectorKey: string,\n store: Store = IMPLICIT.STORE\n): Transactors => ({\n get: (state) => {\n const isRegistered = store.selectorGraph\n .getRelatedIds(selectorKey)\n .includes(state.key)\n if (isRegistered) {\n store.config.logger?.info(` ||`, selectorKey, `<-`, state.key)\n } else {\n store.config.logger?.info(\n `🔌 registerSelector`,\n selectorKey,\n `<-`,\n state.key\n )\n store.selectorGraph = store.selectorGraph.set(selectorKey, state.key)\n }\n const currentValue = getState(state, store)\n store.config.logger?.info(` ||`, state.key, `=`, currentValue)\n return currentValue\n },\n set: (token, newValue) => {\n store.selectorGraph.set(token.key, selectorKey)\n setState__INTERNAL(token, newValue, store)\n },\n})\n","import type { ReadonlyValueToken, StateToken } from \".\"\nimport { getState, setState } from \".\"\nimport type { Store } from \"./internal\"\nimport { IMPLICIT } from \"./internal\"\nimport {\n abortTransaction,\n finishTransaction,\n startTransaction,\n} from \"./internal/transaction-internal\"\n\nexport type ƒn = (...parameters: any[]) => any\n\nexport type Transactors = {\n get: <S>(state: ReadonlyValueToken<S> | StateToken<S>) => S\n set: <S>(state: StateToken<S>, newValue: S | ((oldValue: S) => S)) => void\n}\nexport type ReadonlyTransactors = Pick<Transactors, `get`>\n\nexport type Action<ƒ extends ƒn> = (\n transactors: Transactors,\n ...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type TransactionOptions<ƒ extends ƒn> = {\n key: string\n do: Action<ƒ>\n}\n\nexport const transaction = <ƒ extends ƒn>(\n options: TransactionOptions<ƒ>,\n store: Store = IMPLICIT.STORE\n): ((...parameters: Parameters<ƒ>) => ReturnType<ƒ>) & { key: string } =>\n Object.assign(\n (...parameters: Parameters<ƒ>) => {\n startTransaction(store)\n try {\n const result = options.do(\n {\n get: (token) => getState(token, store),\n set: (token, value) => setState(token, value, store),\n },\n ...parameters\n )\n finishTransaction(store)\n return result\n } catch (thrown) {\n abortTransaction(store)\n store.config.logger?.error(`Transaction ${options.key} failed`, thrown)\n throw thrown\n }\n },\n { key: options.key }\n )\n"],"mappings":"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","names":["import_hamt_plus","import_function","import_function","import_function","import_string","import_function","map","map","id","HAMT","HAMT","selector","import_hamt_plus","import_hamt_plus","HAMT","_a","_b","state","HAMT","atom","selector","import_hamt_plus","import_function","HAMT","import_hamt_plus","Rx","HAMT","initialValue","_a"]}
|
package/dist/index.mjs
CHANGED
|
@@ -50,7 +50,7 @@ __export(internal_exports, {
|
|
|
50
50
|
getState__INTERNAL: () => getState__INTERNAL,
|
|
51
51
|
isDone: () => isDone,
|
|
52
52
|
markDone: () => markDone,
|
|
53
|
-
|
|
53
|
+
propagateDown: () => propagateDown,
|
|
54
54
|
recall: () => recall,
|
|
55
55
|
setAtomState: () => setAtomState,
|
|
56
56
|
setSelectorState: () => setSelectorState,
|
|
@@ -524,11 +524,6 @@ import HAMT4 from "hamt_plus";
|
|
|
524
524
|
|
|
525
525
|
// src/internal/operation.ts
|
|
526
526
|
import HAMT3 from "hamt_plus";
|
|
527
|
-
var finishAction = (store) => {
|
|
528
|
-
var _a;
|
|
529
|
-
store.operation = { open: false };
|
|
530
|
-
(_a = store.config.logger) == null ? void 0 : _a.info(` \u2705`, `operation complete`);
|
|
531
|
-
};
|
|
532
527
|
var startAction = (store) => {
|
|
533
528
|
var _a;
|
|
534
529
|
store.operation = {
|
|
@@ -536,7 +531,12 @@ var startAction = (store) => {
|
|
|
536
531
|
done: /* @__PURE__ */ new Set(),
|
|
537
532
|
prev: store.valueMap
|
|
538
533
|
};
|
|
539
|
-
(_a = store.config.logger) == null ? void 0 : _a.info(
|
|
534
|
+
(_a = store.config.logger) == null ? void 0 : _a.info(`\u2610`, `operation start`);
|
|
535
|
+
};
|
|
536
|
+
var finishAction = (store) => {
|
|
537
|
+
var _a;
|
|
538
|
+
store.operation = { open: false };
|
|
539
|
+
(_a = store.config.logger) == null ? void 0 : _a.info(`\u2611\uFE0F`, `operation done`);
|
|
540
540
|
};
|
|
541
541
|
var isDone = (key, store = IMPLICIT.STORE) => {
|
|
542
542
|
var _a;
|
|
@@ -570,7 +570,7 @@ var recall = (state, store = IMPLICIT.STORE) => {
|
|
|
570
570
|
};
|
|
571
571
|
|
|
572
572
|
// src/internal/set.ts
|
|
573
|
-
var
|
|
573
|
+
var propagateDown = (state, store = IMPLICIT.STORE) => {
|
|
574
574
|
var _a, _b;
|
|
575
575
|
const relatedStateKeys = store.selectorGraph.getRelations(state.key);
|
|
576
576
|
(_a = store.config.logger) == null ? void 0 : _a.info(
|
|
@@ -584,21 +584,29 @@ var propagateChanges = (state, store = IMPLICIT.STORE) => {
|
|
|
584
584
|
(_b = store.config.logger) == null ? void 0 : _b.info(` ||`, `done:`, store.operation.done);
|
|
585
585
|
}
|
|
586
586
|
relatedStateKeys.forEach(({ id: stateKey }) => {
|
|
587
|
-
var _a2, _b2, _c, _d;
|
|
587
|
+
var _a2, _b2, _c, _d, _e;
|
|
588
588
|
if (isDone(stateKey, store)) {
|
|
589
589
|
(_a2 = store.config.logger) == null ? void 0 : _a2.info(` ||`, stateKey, `already done`);
|
|
590
590
|
return;
|
|
591
591
|
}
|
|
592
592
|
(_b2 = store.config.logger) == null ? void 0 : _b2.info(`->`, `bumping`, stateKey);
|
|
593
|
-
store.valueMap = HAMT4.remove(stateKey, store.valueMap);
|
|
594
593
|
const state2 = (_c = HAMT4.get(stateKey, store.selectors)) != null ? _c : HAMT4.get(stateKey, store.readonlySelectors);
|
|
594
|
+
if (!state2) {
|
|
595
|
+
(_d = store.config.logger) == null ? void 0 : _d.info(
|
|
596
|
+
` ||`,
|
|
597
|
+
stateKey,
|
|
598
|
+
`is an atom - no need to propagate down`
|
|
599
|
+
);
|
|
600
|
+
return;
|
|
601
|
+
}
|
|
602
|
+
store.valueMap = HAMT4.remove(stateKey, store.valueMap);
|
|
595
603
|
const newValue = getState__INTERNAL(state2, store);
|
|
596
|
-
(
|
|
604
|
+
(_e = store.config.logger) == null ? void 0 : _e.info(` <-`, stateKey, `became`, newValue);
|
|
597
605
|
const oldValue = recall(state2, store);
|
|
598
606
|
state2.subject.next({ newValue, oldValue });
|
|
599
607
|
markDone(stateKey, store);
|
|
600
608
|
if (`set` in state2)
|
|
601
|
-
|
|
609
|
+
propagateDown(state2, store);
|
|
602
610
|
});
|
|
603
611
|
};
|
|
604
612
|
var setAtomState = (atom2, next, store = IMPLICIT.STORE) => {
|
|
@@ -615,8 +623,12 @@ var setAtomState = (atom2, next, store = IMPLICIT.STORE) => {
|
|
|
615
623
|
store.valueMap = HAMT4.set(atom2.key, newValue, store.valueMap);
|
|
616
624
|
markDone(atom2.key, store);
|
|
617
625
|
atom2.subject.next({ newValue, oldValue });
|
|
618
|
-
(_b = store.config.logger) == null ? void 0 : _b.info(
|
|
619
|
-
|
|
626
|
+
(_b = store.config.logger) == null ? void 0 : _b.info(
|
|
627
|
+
` ||`,
|
|
628
|
+
`propagating change made to`,
|
|
629
|
+
`"${atom2.key}"`
|
|
630
|
+
);
|
|
631
|
+
propagateDown(atom2, store);
|
|
620
632
|
};
|
|
621
633
|
var setSelectorState = (selector2, next, store = IMPLICIT.STORE) => {
|
|
622
634
|
var _a, _b;
|
|
@@ -631,12 +643,11 @@ var setSelectorState = (selector2, next, store = IMPLICIT.STORE) => {
|
|
|
631
643
|
);
|
|
632
644
|
(_b = store.config.logger) == null ? void 0 : _b.info(
|
|
633
645
|
` ||`,
|
|
634
|
-
`propagating change to`,
|
|
646
|
+
`propagating change made to`,
|
|
635
647
|
`"${selector2.key}"`
|
|
636
648
|
);
|
|
637
649
|
selector2.set(newValue);
|
|
638
|
-
|
|
639
|
-
propagateChanges(selector2, store);
|
|
650
|
+
propagateDown(selector2, store);
|
|
640
651
|
};
|
|
641
652
|
var setState__INTERNAL = (token, value, store = IMPLICIT.STORE) => {
|
|
642
653
|
const state = withdraw(token, store);
|
|
@@ -651,7 +662,7 @@ var setState__INTERNAL = (token, value, store = IMPLICIT.STORE) => {
|
|
|
651
662
|
var finishTransaction = (store) => {
|
|
652
663
|
var _a;
|
|
653
664
|
store.transaction = { open: false };
|
|
654
|
-
(_a = store.config.logger) == null ? void 0 : _a.info(`\u{
|
|
665
|
+
(_a = store.config.logger) == null ? void 0 : _a.info(`\u{1F6EC}`, `transaction done`);
|
|
655
666
|
};
|
|
656
667
|
var startTransaction = (store) => {
|
|
657
668
|
var _a;
|
|
@@ -665,7 +676,7 @@ var startTransaction = (store) => {
|
|
|
665
676
|
valueMap: store.valueMap
|
|
666
677
|
}
|
|
667
678
|
};
|
|
668
|
-
(_a = store.config.logger) == null ? void 0 : _a.info(`\u{
|
|
679
|
+
(_a = store.config.logger) == null ? void 0 : _a.info(`\u{1F6EB}`, `transaction start`);
|
|
669
680
|
};
|
|
670
681
|
var abortTransaction = (store) => {
|
|
671
682
|
var _a, _b;
|
|
@@ -765,7 +776,7 @@ function selector(options, store = IMPLICIT.STORE) {
|
|
|
765
776
|
const oldValue = getSelf();
|
|
766
777
|
const newValue = become(next)(oldValue);
|
|
767
778
|
store.valueMap = HAMT6.set(options.key, newValue, store.valueMap);
|
|
768
|
-
|
|
779
|
+
markDone(options.key, store);
|
|
769
780
|
subject.next({ newValue, oldValue });
|
|
770
781
|
options.set({ get, set }, newValue);
|
|
771
782
|
};
|
|
@@ -814,9 +825,9 @@ var registerSelector = (selectorKey, store = IMPLICIT.STORE) => ({
|
|
|
814
825
|
} else {
|
|
815
826
|
(_b = store.config.logger) == null ? void 0 : _b.info(
|
|
816
827
|
`\u{1F50C} registerSelector`,
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
828
|
+
selectorKey,
|
|
829
|
+
`<-`,
|
|
830
|
+
state.key
|
|
820
831
|
);
|
|
821
832
|
store.selectorGraph = store.selectorGraph.set(selectorKey, state.key);
|
|
822
833
|
}
|
|
@@ -882,3 +893,4 @@ export {
|
|
|
882
893
|
subscribe,
|
|
883
894
|
transaction
|
|
884
895
|
};
|
|
896
|
+
//# sourceMappingURL=index.mjs.map
|