atom.io 0.33.1 → 0.33.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/dist/data/index.d.ts +3 -3
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js.map +1 -1
- package/dist/eslint-plugin/index.d.ts.map +1 -1
- package/dist/internal/index.d.ts +111 -54
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +381 -128
- package/dist/internal/index.js.map +1 -1
- package/dist/introspection/index.d.ts +10 -10
- package/dist/introspection/index.d.ts.map +1 -1
- package/dist/introspection/index.js +4 -4
- package/dist/introspection/index.js.map +1 -1
- package/dist/json/index.d.ts +3 -3
- package/dist/json/index.d.ts.map +1 -1
- package/dist/json/index.js +2 -2
- package/dist/json/index.js.map +1 -1
- package/dist/main/index.d.ts +155 -36
- package/dist/main/index.d.ts.map +1 -1
- package/dist/main/index.js +15 -3
- package/dist/main/index.js.map +1 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/{devtools-Jyn42mZm.css → react-devtools/index.css} +1 -1
- package/dist/react-devtools/index.css.map +1 -0
- package/dist/react-devtools/index.d.ts +0 -1
- package/dist/react-devtools/index.d.ts.map +1 -1
- package/dist/react-devtools/index.js +8 -3
- package/dist/react-devtools/index.js.map +1 -1
- package/dist/realtime/index.d.ts +2 -2
- package/dist/realtime/index.d.ts.map +1 -1
- package/dist/realtime/index.js.map +1 -1
- package/dist/realtime-client/index.d.ts +1 -1
- package/dist/realtime-client/index.d.ts.map +1 -1
- package/dist/realtime-client/index.js.map +1 -1
- package/dist/realtime-react/index.d.ts.map +1 -1
- package/dist/realtime-react/index.js.map +1 -1
- package/dist/realtime-server/index.d.ts +2 -2
- package/dist/realtime-server/index.d.ts.map +1 -1
- package/dist/realtime-server/index.js.map +1 -1
- package/dist/realtime-testing/index.d.ts.map +1 -1
- package/dist/transceivers/set-rtx/index.d.ts.map +1 -1
- package/dist/web/index.d.ts.map +1 -1
- package/package.json +21 -21
- package/src/data/dict.ts +5 -5
- package/src/data/struct-family.ts +2 -2
- package/src/data/struct.ts +1 -1
- package/src/internal/atom/create-regular-atom.ts +14 -17
- package/src/internal/caching.ts +1 -1
- package/src/internal/families/create-readonly-held-selector-family.ts +81 -0
- package/src/internal/families/{create-readonly-selector-family.ts → create-readonly-pure-selector-family.ts} +26 -23
- package/src/internal/families/create-selector-family.ts +39 -16
- package/src/internal/families/create-writable-held-selector-family.ts +80 -0
- package/src/internal/families/{create-writable-selector-family.ts → create-writable-pure-selector-family.ts} +26 -23
- package/src/internal/families/dispose-from-store.ts +4 -2
- package/src/internal/families/find-in-store.ts +8 -8
- package/src/internal/families/get-family-of-token.ts +8 -8
- package/src/internal/families/index.ts +3 -3
- package/src/internal/families/init-family-member.ts +12 -10
- package/src/internal/families/seek-in-store.ts +13 -11
- package/src/internal/get-state/get-from-store.ts +5 -2
- package/src/internal/get-state/read-or-compute-value.ts +4 -2
- package/src/internal/index.ts +97 -20
- package/src/internal/join/join-internal.ts +18 -18
- package/src/internal/keys.ts +1 -1
- package/src/internal/mutable/create-mutable-atom.ts +17 -15
- package/src/internal/mutable/get-json-family.ts +4 -4
- package/src/internal/mutable/get-json-token.ts +7 -7
- package/src/internal/selector/create-readonly-held-selector.ts +50 -0
- package/src/internal/selector/create-readonly-pure-selector.ts +51 -0
- package/src/internal/selector/create-standalone-selector.ts +48 -15
- package/src/internal/selector/create-writable-held-selector.ts +68 -0
- package/src/internal/selector/{create-writable-selector.ts → create-writable-pure-selector.ts} +18 -25
- package/src/internal/selector/dispose-selector.ts +37 -7
- package/src/internal/selector/get-selector-dependency-keys.ts +1 -1
- package/src/internal/selector/index.ts +4 -2
- package/src/internal/selector/register-selector.ts +17 -5
- package/src/internal/selector/trace-selector-atoms.ts +5 -5
- package/src/internal/selector/update-selector-atoms.ts +16 -10
- package/src/internal/set-state/emit-update.ts +4 -2
- package/src/internal/set-state/set-atom-or-selector.ts +2 -1
- package/src/internal/store/counterfeit.ts +13 -11
- package/src/internal/store/deposit.ts +18 -14
- package/src/internal/store/store.ts +9 -14
- package/src/internal/store/withdraw.ts +83 -7
- package/src/internal/subscribe/subscribe-in-store.ts +4 -2
- package/src/internal/subscribe/subscribe-to-state.ts +2 -1
- package/src/internal/timeline/create-timeline.ts +4 -2
- package/src/internal/transaction/build-transaction.ts +1 -1
- package/src/introspection/attach-atom-index.ts +2 -2
- package/src/introspection/attach-introspection-states.ts +9 -9
- package/src/introspection/attach-selector-index.ts +3 -3
- package/src/introspection/attach-timeline-family.ts +2 -2
- package/src/introspection/attach-timeline-index.ts +2 -2
- package/src/introspection/attach-transaction-index.ts +2 -2
- package/src/introspection/attach-transaction-logs.ts +2 -2
- package/src/introspection/attach-type-selectors.ts +5 -5
- package/src/introspection/auditor.ts +3 -3
- package/src/json/select-json-family.ts +5 -5
- package/src/json/select-json.ts +1 -1
- package/src/main/find-state.ts +8 -8
- package/src/main/index.ts +51 -6
- package/src/main/join.ts +13 -13
- package/src/main/logger.ts +32 -15
- package/src/main/selector.ts +164 -30
- package/src/main/transaction.ts +3 -3
- package/src/main/validators.ts +16 -12
- package/src/react-devtools/StateEditor.tsx +14 -4
- package/src/react-devtools/StateIndex.tsx +6 -4
- package/src/react-devtools/TimelineIndex.tsx +2 -2
- package/src/react-devtools/TransactionIndex.tsx +2 -2
- package/src/realtime/shared-room-store.ts +3 -3
- package/src/realtime-client/realtime-client-stores/client-main-store.ts +1 -1
- package/src/realtime-react/use-pull-selector-family-member.ts +1 -0
- package/src/realtime-server/realtime-server-stores/server-room-external-store.ts +2 -2
- package/dist/devtools-CAg2k57t.js +0 -0
- package/dist/devtools-Jyn42mZm.css.map +0 -1
- package/src/internal/selector/create-readonly-selector.ts +0 -55
package/dist/internal/index.js
CHANGED
|
@@ -102,10 +102,12 @@ var CircularBuffer = class CircularBuffer {
|
|
|
102
102
|
//#region src/internal/store/counterfeit.ts
|
|
103
103
|
const FAMILY_MEMBER_TOKEN_TYPES = {
|
|
104
104
|
atom_family: `atom`,
|
|
105
|
+
molecule_family: `molecule`,
|
|
105
106
|
mutable_atom_family: `mutable_atom`,
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
readonly_held_selector_family: `readonly_held_selector`,
|
|
108
|
+
readonly_pure_selector_family: `readonly_pure_selector`,
|
|
109
|
+
writable_held_selector_family: `writable_held_selector`,
|
|
110
|
+
writable_pure_selector_family: `writable_pure_selector`
|
|
109
111
|
};
|
|
110
112
|
function counterfeit(token, key) {
|
|
111
113
|
const subKey = stringifyJson(key);
|
|
@@ -492,8 +494,10 @@ const readOrComputeValue = (target, state) => {
|
|
|
492
494
|
return readCachedValue(state, target);
|
|
493
495
|
}
|
|
494
496
|
switch (state.type) {
|
|
495
|
-
case `
|
|
496
|
-
case `
|
|
497
|
+
case `readonly_held_selector`:
|
|
498
|
+
case `readonly_pure_selector`:
|
|
499
|
+
case `writable_held_selector`:
|
|
500
|
+
case `writable_pure_selector`:
|
|
497
501
|
target.logger.info(`🧮`, state.type, state.key, `computing value`);
|
|
498
502
|
return state.get();
|
|
499
503
|
case `atom`:
|
|
@@ -553,8 +557,10 @@ const emitUpdate = (store, state, update) => {
|
|
|
553
557
|
store.logger.info(`📢`, state.type, state.key, `is now (`, update.newValue, `) subscribers:`, state.subject.subscribers);
|
|
554
558
|
break;
|
|
555
559
|
case `atom`:
|
|
556
|
-
case `
|
|
557
|
-
case `
|
|
560
|
+
case `writable_pure_selector`:
|
|
561
|
+
case `readonly_pure_selector`:
|
|
562
|
+
case `writable_held_selector`:
|
|
563
|
+
case `readonly_held_selector`: store.logger.info(`📢`, state.type, state.key, `went (`, update.oldValue, `->`, update.newValue, `) subscribers:`, state.subject.subscribers);
|
|
558
564
|
}
|
|
559
565
|
state.subject.next(update);
|
|
560
566
|
};
|
|
@@ -632,7 +638,8 @@ const setAtomOrSelector = (store, state, value) => {
|
|
|
632
638
|
case `mutable_atom`:
|
|
633
639
|
setAtom(store, state, value);
|
|
634
640
|
break;
|
|
635
|
-
case `
|
|
641
|
+
case `writable_pure_selector`:
|
|
642
|
+
case `writable_held_selector`:
|
|
636
643
|
state.set(value);
|
|
637
644
|
break;
|
|
638
645
|
}
|
|
@@ -690,62 +697,63 @@ function createAtomFamily(store, options) {
|
|
|
690
697
|
//#endregion
|
|
691
698
|
//#region src/internal/keys.ts
|
|
692
699
|
const isAtomKey = (store, key) => newest(store).atoms.has(key);
|
|
693
|
-
const isSelectorKey = (store, key) => newest(store).
|
|
700
|
+
const isSelectorKey = (store, key) => newest(store).writableSelectors.has(key);
|
|
694
701
|
const isReadonlySelectorKey = (store, key) => newest(store).readonlySelectors.has(key);
|
|
695
702
|
const isStateKey = (store, key) => isAtomKey(store, key) || isSelectorKey(store, key) || isReadonlySelectorKey(store, key);
|
|
696
703
|
|
|
697
704
|
//#endregion
|
|
698
705
|
//#region src/internal/selector/get-selector-dependency-keys.ts
|
|
699
|
-
const getSelectorDependencyKeys = (
|
|
706
|
+
const getSelectorDependencyKeys = (store, key) => {
|
|
700
707
|
const sources = newest(store).selectorGraph.getRelationEntries({ downstreamSelectorKey: key }).filter(([_, { source }]) => source !== key).map(([_, { source }]) => source).filter((source) => isStateKey(store, source));
|
|
701
708
|
return sources;
|
|
702
709
|
};
|
|
703
710
|
|
|
704
711
|
//#endregion
|
|
705
712
|
//#region src/internal/selector/trace-selector-atoms.ts
|
|
706
|
-
const traceSelectorAtoms = (directDependencyKey, covered
|
|
713
|
+
const traceSelectorAtoms = (store, directDependencyKey, covered) => {
|
|
707
714
|
const rootKeys = [];
|
|
708
|
-
const indirectDependencyKeys = getSelectorDependencyKeys(
|
|
715
|
+
const indirectDependencyKeys = getSelectorDependencyKeys(store, directDependencyKey);
|
|
709
716
|
while (indirectDependencyKeys.length > 0) {
|
|
710
717
|
const indirectDependencyKey = indirectDependencyKeys.shift();
|
|
711
718
|
if (covered.has(indirectDependencyKey)) continue;
|
|
712
719
|
covered.add(indirectDependencyKey);
|
|
713
|
-
if (!isAtomKey(store, indirectDependencyKey)) indirectDependencyKeys.push(...getSelectorDependencyKeys(
|
|
720
|
+
if (!isAtomKey(store, indirectDependencyKey)) indirectDependencyKeys.push(...getSelectorDependencyKeys(store, indirectDependencyKey));
|
|
714
721
|
else if (!rootKeys.includes(indirectDependencyKey)) rootKeys.push(indirectDependencyKey);
|
|
715
722
|
}
|
|
716
723
|
return rootKeys;
|
|
717
724
|
};
|
|
718
725
|
const traceAllSelectorAtoms = (selector, store) => {
|
|
719
726
|
const selectorKey = selector.key;
|
|
720
|
-
const directDependencyKeys = getSelectorDependencyKeys(
|
|
727
|
+
const directDependencyKeys = getSelectorDependencyKeys(store, selectorKey);
|
|
721
728
|
const covered = new Set();
|
|
722
|
-
return directDependencyKeys.flatMap((depKey) => isAtomKey(store, depKey) ? depKey : traceSelectorAtoms(depKey, covered
|
|
729
|
+
return directDependencyKeys.flatMap((depKey) => isAtomKey(store, depKey) ? depKey : traceSelectorAtoms(store, depKey, covered));
|
|
723
730
|
};
|
|
724
731
|
|
|
725
732
|
//#endregion
|
|
726
733
|
//#region src/internal/selector/update-selector-atoms.ts
|
|
727
|
-
const updateSelectorAtoms = (selectorKey, dependency, covered
|
|
734
|
+
const updateSelectorAtoms = (store, selectorType, selectorKey, dependency, covered) => {
|
|
728
735
|
const target = newest(store);
|
|
729
|
-
|
|
736
|
+
const { type: dependencyType, key: dependencyKey } = dependency;
|
|
737
|
+
if (dependencyType === `atom` || dependencyType === `mutable_atom`) {
|
|
730
738
|
target.selectorAtoms.set({
|
|
731
739
|
selectorKey,
|
|
732
|
-
atomKey:
|
|
740
|
+
atomKey: dependencyKey
|
|
733
741
|
});
|
|
734
|
-
store.logger.info(`🔍`,
|
|
742
|
+
store.logger.info(`🔍`, selectorType, selectorKey, `discovers root atom "${dependencyKey}"`);
|
|
735
743
|
} else {
|
|
736
|
-
const rootKeys = traceSelectorAtoms(
|
|
737
|
-
store.logger.info(`🔍`,
|
|
744
|
+
const rootKeys = traceSelectorAtoms(store, dependencyKey, covered);
|
|
745
|
+
store.logger.info(`🔍`, selectorType, selectorKey, `discovers root atoms: [ ${rootKeys.map((key) => `"${key}"`).join(`, `)} ]`);
|
|
738
746
|
for (const atomKey of rootKeys) target.selectorAtoms = target.selectorAtoms.set({
|
|
739
747
|
selectorKey,
|
|
740
748
|
atomKey
|
|
741
749
|
});
|
|
742
750
|
}
|
|
743
|
-
covered.add(
|
|
751
|
+
covered.add(dependencyKey);
|
|
744
752
|
};
|
|
745
753
|
|
|
746
754
|
//#endregion
|
|
747
755
|
//#region src/internal/selector/register-selector.ts
|
|
748
|
-
const registerSelector = (selectorKey, covered
|
|
756
|
+
const registerSelector = (store, selectorType, selectorKey, covered) => ({
|
|
749
757
|
get: (...params) => {
|
|
750
758
|
const target = newest(store);
|
|
751
759
|
let dependency;
|
|
@@ -755,12 +763,13 @@ const registerSelector = (selectorKey, covered, store) => ({
|
|
|
755
763
|
} else [dependency] = params;
|
|
756
764
|
const dependencyState = withdraw(store, dependency);
|
|
757
765
|
const dependencyValue = readOrComputeValue(store, dependencyState);
|
|
758
|
-
|
|
766
|
+
const dependencyKey = dependency.key;
|
|
767
|
+
store.logger.info(`🔌`, selectorType, selectorKey, `registers dependency ( "${dependencyKey}" =`, dependencyValue, `)`);
|
|
759
768
|
target.selectorGraph.set({
|
|
760
|
-
upstreamSelectorKey:
|
|
769
|
+
upstreamSelectorKey: dependencyKey,
|
|
761
770
|
downstreamSelectorKey: selectorKey
|
|
762
771
|
}, { source: dependency.key });
|
|
763
|
-
updateSelectorAtoms(selectorKey, dependency, covered
|
|
772
|
+
updateSelectorAtoms(store, selectorType, selectorKey, dependency, covered);
|
|
764
773
|
return dependencyValue;
|
|
765
774
|
},
|
|
766
775
|
set: (...params) => {
|
|
@@ -784,48 +793,143 @@ const registerSelector = (selectorKey, covered, store) => ({
|
|
|
784
793
|
});
|
|
785
794
|
|
|
786
795
|
//#endregion
|
|
787
|
-
//#region src/internal/selector/create-readonly-selector.ts
|
|
788
|
-
const
|
|
796
|
+
//#region src/internal/selector/create-readonly-held-selector.ts
|
|
797
|
+
const createReadonlyHeldSelector = (store, options, family) => {
|
|
789
798
|
const target = newest(store);
|
|
790
799
|
const subject = new Subject();
|
|
791
800
|
const covered = new Set();
|
|
792
|
-
const {
|
|
801
|
+
const { key, const: constant } = options;
|
|
802
|
+
const type = `readonly_held_selector`;
|
|
803
|
+
const { get, find, json } = registerSelector(target, type, key, covered);
|
|
804
|
+
const getSelf = () => {
|
|
805
|
+
options.get({
|
|
806
|
+
get,
|
|
807
|
+
find,
|
|
808
|
+
json
|
|
809
|
+
}, constant);
|
|
810
|
+
cacheValue(newest(store), key, constant, subject);
|
|
811
|
+
covered.clear();
|
|
812
|
+
return constant;
|
|
813
|
+
};
|
|
814
|
+
const readonlySelector = {
|
|
815
|
+
...options,
|
|
816
|
+
type,
|
|
817
|
+
subject,
|
|
818
|
+
install: (s) => createReadonlyHeldSelector(s, options, family),
|
|
819
|
+
get: getSelf,
|
|
820
|
+
...family && { family }
|
|
821
|
+
};
|
|
822
|
+
target.readonlySelectors.set(key, readonlySelector);
|
|
823
|
+
store.logger.info(`✨`, type, key, `=`, constant);
|
|
824
|
+
const token = {
|
|
825
|
+
key,
|
|
826
|
+
type
|
|
827
|
+
};
|
|
828
|
+
if (family) token.family = family;
|
|
829
|
+
return token;
|
|
830
|
+
};
|
|
831
|
+
|
|
832
|
+
//#endregion
|
|
833
|
+
//#region src/internal/selector/create-readonly-pure-selector.ts
|
|
834
|
+
const createReadonlyPureSelector = (store, options, family) => {
|
|
835
|
+
const target = newest(store);
|
|
836
|
+
const subject = new Subject();
|
|
837
|
+
const covered = new Set();
|
|
838
|
+
const key = options.key;
|
|
839
|
+
const type = `readonly_pure_selector`;
|
|
840
|
+
const { get, find, json } = registerSelector(target, type, key, covered);
|
|
793
841
|
const getSelf = () => {
|
|
794
842
|
const value = options.get({
|
|
795
843
|
get,
|
|
796
844
|
find,
|
|
797
845
|
json
|
|
798
846
|
});
|
|
799
|
-
cacheValue(newest(store),
|
|
847
|
+
cacheValue(newest(store), key, value, subject);
|
|
800
848
|
covered.clear();
|
|
801
849
|
return value;
|
|
802
850
|
};
|
|
803
851
|
const readonlySelector = {
|
|
804
852
|
...options,
|
|
853
|
+
type,
|
|
805
854
|
subject,
|
|
806
|
-
install: (s) =>
|
|
855
|
+
install: (s) => createReadonlyPureSelector(s, options, family),
|
|
807
856
|
get: getSelf,
|
|
808
|
-
type: `readonly_selector`,
|
|
809
857
|
...family && { family }
|
|
810
858
|
};
|
|
811
|
-
target.readonlySelectors.set(
|
|
859
|
+
target.readonlySelectors.set(key, readonlySelector);
|
|
812
860
|
const initialValue = getSelf();
|
|
813
|
-
store.logger.info(`✨`,
|
|
861
|
+
store.logger.info(`✨`, type, key, `=`, initialValue);
|
|
814
862
|
const token = {
|
|
815
|
-
key
|
|
816
|
-
type
|
|
863
|
+
key,
|
|
864
|
+
type
|
|
865
|
+
};
|
|
866
|
+
if (family) token.family = family;
|
|
867
|
+
return token;
|
|
868
|
+
};
|
|
869
|
+
|
|
870
|
+
//#endregion
|
|
871
|
+
//#region src/internal/selector/create-writable-held-selector.ts
|
|
872
|
+
const createWritableHeldSelector = (store, options, family) => {
|
|
873
|
+
const target = newest(store);
|
|
874
|
+
const subject = new Subject();
|
|
875
|
+
const covered = new Set();
|
|
876
|
+
const { key, const: constant } = options;
|
|
877
|
+
const type = `writable_held_selector`;
|
|
878
|
+
const setterToolkit = registerSelector(target, type, key, covered);
|
|
879
|
+
const { find, get, json } = setterToolkit;
|
|
880
|
+
const getterToolkit = {
|
|
881
|
+
find,
|
|
882
|
+
get,
|
|
883
|
+
json
|
|
884
|
+
};
|
|
885
|
+
const getSelf = (getFn = options.get, innerTarget = newest(store)) => {
|
|
886
|
+
getFn(getterToolkit, constant);
|
|
887
|
+
cacheValue(innerTarget, key, constant, subject);
|
|
888
|
+
covered.clear();
|
|
889
|
+
return constant;
|
|
890
|
+
};
|
|
891
|
+
const setSelf = (next) => {
|
|
892
|
+
const innerTarget = newest(store);
|
|
893
|
+
const oldValue = getSelf(options.get, innerTarget);
|
|
894
|
+
const newValue = become(next)(oldValue);
|
|
895
|
+
store.logger.info(`📝`, type, key, `set (`, oldValue, `->`, newValue, `)`);
|
|
896
|
+
cacheValue(innerTarget, key, newValue, subject);
|
|
897
|
+
markDone(innerTarget, key);
|
|
898
|
+
if (isRootStore(innerTarget)) subject.next({
|
|
899
|
+
newValue,
|
|
900
|
+
oldValue
|
|
901
|
+
});
|
|
902
|
+
options.set(setterToolkit, newValue);
|
|
903
|
+
};
|
|
904
|
+
const mySelector = {
|
|
905
|
+
...options,
|
|
906
|
+
type,
|
|
907
|
+
subject,
|
|
908
|
+
install: (s) => createWritableHeldSelector(s, options, family),
|
|
909
|
+
get: getSelf,
|
|
910
|
+
set: setSelf,
|
|
911
|
+
...family && { family }
|
|
912
|
+
};
|
|
913
|
+
target.writableSelectors.set(key, mySelector);
|
|
914
|
+
const initialValue = getSelf();
|
|
915
|
+
store.logger.info(`✨`, type, key, `=`, initialValue);
|
|
916
|
+
const token = {
|
|
917
|
+
key,
|
|
918
|
+
type
|
|
817
919
|
};
|
|
818
920
|
if (family) token.family = family;
|
|
819
921
|
return token;
|
|
820
922
|
};
|
|
821
923
|
|
|
822
924
|
//#endregion
|
|
823
|
-
//#region src/internal/selector/create-writable-selector.ts
|
|
824
|
-
const
|
|
925
|
+
//#region src/internal/selector/create-writable-pure-selector.ts
|
|
926
|
+
const createWritablePureSelector = (store, options, family) => {
|
|
825
927
|
const target = newest(store);
|
|
826
928
|
const subject = new Subject();
|
|
827
929
|
const covered = new Set();
|
|
828
|
-
const
|
|
930
|
+
const key = options.key;
|
|
931
|
+
const type = `writable_pure_selector`;
|
|
932
|
+
const setterToolkit = registerSelector(target, type, key, covered);
|
|
829
933
|
const { find, get, json } = setterToolkit;
|
|
830
934
|
const getterToolkit = {
|
|
831
935
|
find,
|
|
@@ -834,7 +938,7 @@ const createWritableSelector = (store, options, family) => {
|
|
|
834
938
|
};
|
|
835
939
|
const getSelf = (getFn = options.get, innerTarget = newest(store)) => {
|
|
836
940
|
const value = getFn(getterToolkit);
|
|
837
|
-
cacheValue(innerTarget,
|
|
941
|
+
cacheValue(innerTarget, key, value, subject);
|
|
838
942
|
covered.clear();
|
|
839
943
|
return value;
|
|
840
944
|
};
|
|
@@ -842,7 +946,7 @@ const createWritableSelector = (store, options, family) => {
|
|
|
842
946
|
const innerTarget = newest(store);
|
|
843
947
|
const oldValue = getSelf(options.get, innerTarget);
|
|
844
948
|
const newValue = become(next)(oldValue);
|
|
845
|
-
store.logger.info(`📝`,
|
|
949
|
+
store.logger.info(`📝`, type, key, `set (`, oldValue, `->`, newValue, `)`);
|
|
846
950
|
cacheValue(innerTarget, options.key, newValue, subject);
|
|
847
951
|
markDone(innerTarget, options.key);
|
|
848
952
|
if (isRootStore(innerTarget)) subject.next({
|
|
@@ -853,19 +957,19 @@ const createWritableSelector = (store, options, family) => {
|
|
|
853
957
|
};
|
|
854
958
|
const mySelector = {
|
|
855
959
|
...options,
|
|
960
|
+
type,
|
|
856
961
|
subject,
|
|
857
|
-
install: (s) =>
|
|
962
|
+
install: (s) => createWritablePureSelector(s, options, family),
|
|
858
963
|
get: getSelf,
|
|
859
964
|
set: setSelf,
|
|
860
|
-
type: `selector`,
|
|
861
965
|
...family && { family }
|
|
862
966
|
};
|
|
863
|
-
target.
|
|
967
|
+
target.writableSelectors.set(key, mySelector);
|
|
864
968
|
const initialValue = getSelf();
|
|
865
969
|
store.logger.info(`✨`, mySelector.type, mySelector.key, `=`, initialValue);
|
|
866
970
|
const token = {
|
|
867
|
-
key
|
|
868
|
-
type
|
|
971
|
+
key,
|
|
972
|
+
type
|
|
869
973
|
};
|
|
870
974
|
if (family) token.family = family;
|
|
871
975
|
return token;
|
|
@@ -875,12 +979,23 @@ const createWritableSelector = (store, options, family) => {
|
|
|
875
979
|
//#region src/internal/selector/create-standalone-selector.ts
|
|
876
980
|
function createStandaloneSelector(store, options) {
|
|
877
981
|
const isWritable = `set` in options;
|
|
982
|
+
const isHeld = `const` in options;
|
|
983
|
+
if (isHeld && isWritable) {
|
|
984
|
+
const state$1 = createWritableHeldSelector(store, options, void 0);
|
|
985
|
+
store.on.selectorCreation.next(state$1);
|
|
986
|
+
return state$1;
|
|
987
|
+
}
|
|
988
|
+
if (isHeld) {
|
|
989
|
+
const state$1 = createReadonlyHeldSelector(store, options, void 0);
|
|
990
|
+
store.on.selectorCreation.next(state$1);
|
|
991
|
+
return state$1;
|
|
992
|
+
}
|
|
878
993
|
if (isWritable) {
|
|
879
|
-
const state$1 =
|
|
994
|
+
const state$1 = createWritablePureSelector(store, options, void 0);
|
|
880
995
|
store.on.selectorCreation.next(state$1);
|
|
881
996
|
return state$1;
|
|
882
997
|
}
|
|
883
|
-
const state =
|
|
998
|
+
const state = createReadonlyPureSelector(store, options, void 0);
|
|
884
999
|
store.on.selectorCreation.next(state);
|
|
885
1000
|
return state;
|
|
886
1001
|
}
|
|
@@ -889,20 +1004,35 @@ function createStandaloneSelector(store, options) {
|
|
|
889
1004
|
//#region src/internal/selector/dispose-selector.ts
|
|
890
1005
|
function disposeSelector(store, selectorToken) {
|
|
891
1006
|
const target = newest(store);
|
|
892
|
-
const { key } = selectorToken;
|
|
1007
|
+
const { key, type } = selectorToken;
|
|
893
1008
|
const selector = withdraw(target, selectorToken);
|
|
894
|
-
if (!selector.family) store.logger.error(`❌`,
|
|
1009
|
+
if (!selector.family) store.logger.error(`❌`, type, key, `Standalone selectors cannot be disposed.`);
|
|
895
1010
|
else {
|
|
896
1011
|
const molecule = target.molecules.get(selector.family.subKey);
|
|
897
1012
|
if (molecule) target.moleculeData.delete(selector.family.subKey, selector.family.key);
|
|
898
1013
|
let familyToken;
|
|
899
1014
|
switch (selectorToken.type) {
|
|
900
|
-
case `
|
|
1015
|
+
case `writable_held_selector`:
|
|
1016
|
+
{
|
|
1017
|
+
target.writableSelectors.delete(key);
|
|
1018
|
+
familyToken = {
|
|
1019
|
+
key: selector.family.key,
|
|
1020
|
+
type: `writable_held_selector_family`
|
|
1021
|
+
};
|
|
1022
|
+
const family = withdraw(store, familyToken);
|
|
1023
|
+
family.subject.next({
|
|
1024
|
+
type: `state_disposal`,
|
|
1025
|
+
subType: `selector`,
|
|
1026
|
+
token: selectorToken
|
|
1027
|
+
});
|
|
1028
|
+
}
|
|
1029
|
+
break;
|
|
1030
|
+
case `writable_pure_selector`:
|
|
901
1031
|
{
|
|
902
|
-
target.
|
|
1032
|
+
target.writableSelectors.delete(key);
|
|
903
1033
|
familyToken = {
|
|
904
1034
|
key: selector.family.key,
|
|
905
|
-
type: `
|
|
1035
|
+
type: `writable_pure_selector_family`
|
|
906
1036
|
};
|
|
907
1037
|
const family = withdraw(store, familyToken);
|
|
908
1038
|
family.subject.next({
|
|
@@ -912,12 +1042,27 @@ function disposeSelector(store, selectorToken) {
|
|
|
912
1042
|
});
|
|
913
1043
|
}
|
|
914
1044
|
break;
|
|
915
|
-
case `
|
|
1045
|
+
case `readonly_held_selector`:
|
|
916
1046
|
{
|
|
917
1047
|
target.readonlySelectors.delete(key);
|
|
918
1048
|
familyToken = {
|
|
919
1049
|
key: selector.family.key,
|
|
920
|
-
type: `
|
|
1050
|
+
type: `readonly_held_selector_family`
|
|
1051
|
+
};
|
|
1052
|
+
const family = withdraw(store, familyToken);
|
|
1053
|
+
family.subject.next({
|
|
1054
|
+
type: `state_disposal`,
|
|
1055
|
+
subType: `selector`,
|
|
1056
|
+
token: selectorToken
|
|
1057
|
+
});
|
|
1058
|
+
}
|
|
1059
|
+
break;
|
|
1060
|
+
case `readonly_pure_selector`:
|
|
1061
|
+
{
|
|
1062
|
+
target.readonlySelectors.delete(key);
|
|
1063
|
+
familyToken = {
|
|
1064
|
+
key: selector.family.key,
|
|
1065
|
+
type: `readonly_pure_selector_family`
|
|
921
1066
|
};
|
|
922
1067
|
const family = withdraw(store, familyToken);
|
|
923
1068
|
family.subject.next({
|
|
@@ -942,24 +1087,26 @@ function disposeSelector(store, selectorToken) {
|
|
|
942
1087
|
}
|
|
943
1088
|
|
|
944
1089
|
//#endregion
|
|
945
|
-
//#region src/internal/families/create-readonly-selector-family.ts
|
|
946
|
-
function
|
|
1090
|
+
//#region src/internal/families/create-readonly-pure-selector-family.ts
|
|
1091
|
+
function createReadonlyPureSelectorFamily(store, options, internalRoles) {
|
|
1092
|
+
const familyKey = options.key;
|
|
1093
|
+
const type = `readonly_pure_selector_family`;
|
|
947
1094
|
const familyToken = {
|
|
948
|
-
key:
|
|
949
|
-
type
|
|
1095
|
+
key: familyKey,
|
|
1096
|
+
type
|
|
950
1097
|
};
|
|
951
|
-
const existing = store.families.get(
|
|
952
|
-
if (existing) store.logger.error(`❗`,
|
|
1098
|
+
const existing = store.families.get(familyKey);
|
|
1099
|
+
if (existing) store.logger.error(`❗`, type, familyKey, `Overwriting an existing ${prettyPrintTokenType(existing)} "${existing.key}" in store "${store.config.name}". You can safely ignore this warning if it is due to hot module replacement.`);
|
|
953
1100
|
const subject = new Subject();
|
|
954
1101
|
const familyFunction = (key) => {
|
|
955
1102
|
const subKey = stringifyJson(key);
|
|
956
1103
|
const family = {
|
|
957
|
-
key:
|
|
1104
|
+
key: familyKey,
|
|
958
1105
|
subKey
|
|
959
1106
|
};
|
|
960
|
-
const fullKey = `${
|
|
1107
|
+
const fullKey = `${familyKey}(${subKey})`;
|
|
961
1108
|
const target = newest(store);
|
|
962
|
-
const token =
|
|
1109
|
+
const token = createReadonlyPureSelector(target, {
|
|
963
1110
|
key: fullKey,
|
|
964
1111
|
get: options.get(key)
|
|
965
1112
|
}, family);
|
|
@@ -972,7 +1119,7 @@ function createReadonlySelectorFamily(store, options, internalRoles) {
|
|
|
972
1119
|
const readonlySelectorFamily = Object.assign(familyFunction, familyToken, {
|
|
973
1120
|
internalRoles,
|
|
974
1121
|
subject,
|
|
975
|
-
install: (s) =>
|
|
1122
|
+
install: (s) => createReadonlyPureSelectorFamily(s, options),
|
|
976
1123
|
default: (key) => {
|
|
977
1124
|
const getFn = options.get(key);
|
|
978
1125
|
return getFn({
|
|
@@ -982,29 +1129,114 @@ function createReadonlySelectorFamily(store, options, internalRoles) {
|
|
|
982
1129
|
});
|
|
983
1130
|
}
|
|
984
1131
|
});
|
|
985
|
-
store.families.set(
|
|
1132
|
+
store.families.set(familyKey, readonlySelectorFamily);
|
|
986
1133
|
return familyToken;
|
|
987
1134
|
}
|
|
988
1135
|
|
|
989
1136
|
//#endregion
|
|
990
|
-
//#region src/internal/families/create-
|
|
991
|
-
function
|
|
1137
|
+
//#region src/internal/families/create-readonly-held-selector-family.ts
|
|
1138
|
+
function createReadonlyHeldSelectorFamily(store, options, internalRoles) {
|
|
1139
|
+
const familyKey = options.key;
|
|
1140
|
+
const type = `readonly_held_selector_family`;
|
|
992
1141
|
const familyToken = {
|
|
993
|
-
key:
|
|
994
|
-
type
|
|
1142
|
+
key: familyKey,
|
|
1143
|
+
type
|
|
995
1144
|
};
|
|
996
|
-
const existing = store.families.get(
|
|
997
|
-
if (existing) store.logger.error(`❗`,
|
|
1145
|
+
const existing = store.families.get(familyKey);
|
|
1146
|
+
if (existing) store.logger.error(`❗`, type, familyKey, `Overwriting an existing ${prettyPrintTokenType(existing)} "${existing.key}" in store "${store.config.name}". You can safely ignore this warning if it is due to hot module replacement.`);
|
|
998
1147
|
const subject = new Subject();
|
|
999
1148
|
const familyFunction = (key) => {
|
|
1000
1149
|
const subKey = stringifyJson(key);
|
|
1001
1150
|
const family = {
|
|
1002
|
-
key:
|
|
1151
|
+
key: familyKey,
|
|
1003
1152
|
subKey
|
|
1004
1153
|
};
|
|
1005
|
-
const fullKey = `${
|
|
1154
|
+
const fullKey = `${familyKey}(${subKey})`;
|
|
1155
|
+
const target = newest(store);
|
|
1156
|
+
const token = createReadonlyHeldSelector(target, {
|
|
1157
|
+
key: fullKey,
|
|
1158
|
+
const: options.const(key),
|
|
1159
|
+
get: options.get(key)
|
|
1160
|
+
}, family);
|
|
1161
|
+
subject.next({
|
|
1162
|
+
type: `state_creation`,
|
|
1163
|
+
token
|
|
1164
|
+
});
|
|
1165
|
+
return token;
|
|
1166
|
+
};
|
|
1167
|
+
const readonlySelectorFamily = Object.assign(familyFunction, familyToken, {
|
|
1168
|
+
internalRoles,
|
|
1169
|
+
subject,
|
|
1170
|
+
install: (s) => createReadonlyHeldSelectorFamily(s, options),
|
|
1171
|
+
default: options.const
|
|
1172
|
+
});
|
|
1173
|
+
store.families.set(familyKey, readonlySelectorFamily);
|
|
1174
|
+
return familyToken;
|
|
1175
|
+
}
|
|
1176
|
+
|
|
1177
|
+
//#endregion
|
|
1178
|
+
//#region src/internal/families/create-writable-held-selector-family.ts
|
|
1179
|
+
function createWritableHeldSelectorFamily(store, options, internalRoles) {
|
|
1180
|
+
const familyKey = options.key;
|
|
1181
|
+
const type = `writable_held_selector_family`;
|
|
1182
|
+
const familyToken = {
|
|
1183
|
+
key: familyKey,
|
|
1184
|
+
type
|
|
1185
|
+
};
|
|
1186
|
+
const existing = store.families.get(familyKey);
|
|
1187
|
+
if (existing) store.logger.error(`❗`, type, familyKey, `Overwriting an existing ${prettyPrintTokenType(existing)} "${existing.key}" in store "${store.config.name}". You can safely ignore this warning if it is due to hot module replacement.`);
|
|
1188
|
+
const subject = new Subject();
|
|
1189
|
+
const familyFunction = (key) => {
|
|
1190
|
+
const subKey = stringifyJson(key);
|
|
1191
|
+
const family = {
|
|
1192
|
+
key: familyKey,
|
|
1193
|
+
subKey
|
|
1194
|
+
};
|
|
1195
|
+
const fullKey = `${familyKey}(${subKey})`;
|
|
1196
|
+
const target = newest(store);
|
|
1197
|
+
const token = createWritableHeldSelector(target, {
|
|
1198
|
+
key: fullKey,
|
|
1199
|
+
const: options.const(key),
|
|
1200
|
+
get: options.get(key),
|
|
1201
|
+
set: options.set(key)
|
|
1202
|
+
}, family);
|
|
1203
|
+
subject.next({
|
|
1204
|
+
type: `state_creation`,
|
|
1205
|
+
token
|
|
1206
|
+
});
|
|
1207
|
+
return token;
|
|
1208
|
+
};
|
|
1209
|
+
const selectorFamily$1 = Object.assign(familyFunction, familyToken, {
|
|
1210
|
+
internalRoles,
|
|
1211
|
+
subject,
|
|
1212
|
+
install: (s) => createWritableHeldSelectorFamily(s, options),
|
|
1213
|
+
default: options.const
|
|
1214
|
+
});
|
|
1215
|
+
store.families.set(familyKey, selectorFamily$1);
|
|
1216
|
+
return familyToken;
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
//#endregion
|
|
1220
|
+
//#region src/internal/families/create-writable-pure-selector-family.ts
|
|
1221
|
+
function createWritablePureSelectorFamily(store, options, internalRoles) {
|
|
1222
|
+
const familyKey = options.key;
|
|
1223
|
+
const type = `writable_pure_selector_family`;
|
|
1224
|
+
const familyToken = {
|
|
1225
|
+
key: familyKey,
|
|
1226
|
+
type
|
|
1227
|
+
};
|
|
1228
|
+
const existing = store.families.get(familyKey);
|
|
1229
|
+
if (existing) store.logger.error(`❗`, type, familyKey, `Overwriting an existing ${prettyPrintTokenType(existing)} "${existing.key}" in store "${store.config.name}". You can safely ignore this warning if it is due to hot module replacement.`);
|
|
1230
|
+
const subject = new Subject();
|
|
1231
|
+
const familyFunction = (key) => {
|
|
1232
|
+
const subKey = stringifyJson(key);
|
|
1233
|
+
const family = {
|
|
1234
|
+
key: familyKey,
|
|
1235
|
+
subKey
|
|
1236
|
+
};
|
|
1237
|
+
const fullKey = `${familyKey}(${subKey})`;
|
|
1006
1238
|
const target = newest(store);
|
|
1007
|
-
const token =
|
|
1239
|
+
const token = createWritablePureSelector(target, {
|
|
1008
1240
|
key: fullKey,
|
|
1009
1241
|
get: options.get(key),
|
|
1010
1242
|
set: options.set(key)
|
|
@@ -1018,7 +1250,7 @@ function createWritableSelectorFamily(store, options, internalRoles) {
|
|
|
1018
1250
|
const selectorFamily$1 = Object.assign(familyFunction, familyToken, {
|
|
1019
1251
|
internalRoles,
|
|
1020
1252
|
subject,
|
|
1021
|
-
install: (s) =>
|
|
1253
|
+
install: (s) => createWritablePureSelectorFamily(s, options),
|
|
1022
1254
|
default: (key) => {
|
|
1023
1255
|
const getFn = options.get(key);
|
|
1024
1256
|
return getFn({
|
|
@@ -1028,7 +1260,7 @@ function createWritableSelectorFamily(store, options, internalRoles) {
|
|
|
1028
1260
|
});
|
|
1029
1261
|
}
|
|
1030
1262
|
});
|
|
1031
|
-
store.families.set(
|
|
1263
|
+
store.families.set(familyKey, selectorFamily$1);
|
|
1032
1264
|
return familyToken;
|
|
1033
1265
|
}
|
|
1034
1266
|
|
|
@@ -1036,8 +1268,11 @@ function createWritableSelectorFamily(store, options, internalRoles) {
|
|
|
1036
1268
|
//#region src/internal/families/create-selector-family.ts
|
|
1037
1269
|
function createSelectorFamily(store, options) {
|
|
1038
1270
|
const isWritable = `set` in options;
|
|
1039
|
-
|
|
1040
|
-
return
|
|
1271
|
+
const isHeld = `const` in options;
|
|
1272
|
+
if (isHeld && isWritable) return createWritableHeldSelectorFamily(store, options, void 0);
|
|
1273
|
+
if (isHeld) return createReadonlyHeldSelectorFamily(store, options, void 0);
|
|
1274
|
+
if (isWritable) return createWritablePureSelectorFamily(store, options);
|
|
1275
|
+
return createReadonlyPureSelectorFamily(store, options);
|
|
1041
1276
|
}
|
|
1042
1277
|
|
|
1043
1278
|
//#endregion
|
|
@@ -1053,8 +1288,10 @@ function initFamilyMemberInStore(store, token, key) {
|
|
|
1053
1288
|
case `mutable_atom`:
|
|
1054
1289
|
store.on.atomCreation.next(state);
|
|
1055
1290
|
break;
|
|
1056
|
-
case `
|
|
1057
|
-
case `
|
|
1291
|
+
case `writable_pure_selector`:
|
|
1292
|
+
case `readonly_pure_selector`:
|
|
1293
|
+
case `writable_held_selector`:
|
|
1294
|
+
case `readonly_held_selector`:
|
|
1058
1295
|
store.on.selectorCreation.next(state);
|
|
1059
1296
|
break;
|
|
1060
1297
|
}
|
|
@@ -1078,10 +1315,12 @@ function seekInStore(store, token, key) {
|
|
|
1078
1315
|
case `mutable_atom_family`:
|
|
1079
1316
|
state = target.atoms.get(fullKey);
|
|
1080
1317
|
break;
|
|
1081
|
-
case `
|
|
1082
|
-
|
|
1318
|
+
case `writable_held_selector_family`:
|
|
1319
|
+
case `writable_pure_selector_family`:
|
|
1320
|
+
state = target.writableSelectors.get(fullKey);
|
|
1083
1321
|
break;
|
|
1084
|
-
case `
|
|
1322
|
+
case `readonly_held_selector_family`:
|
|
1323
|
+
case `readonly_pure_selector_family`:
|
|
1085
1324
|
state = target.readonlySelectors.get(fullKey);
|
|
1086
1325
|
break;
|
|
1087
1326
|
}
|
|
@@ -1131,8 +1370,10 @@ function disposeFromStore(store, ...params) {
|
|
|
1131
1370
|
case `mutable_atom`:
|
|
1132
1371
|
disposeAtom(store, token);
|
|
1133
1372
|
break;
|
|
1134
|
-
case `
|
|
1135
|
-
case `
|
|
1373
|
+
case `writable_pure_selector`:
|
|
1374
|
+
case `readonly_pure_selector`:
|
|
1375
|
+
case `writable_held_selector`:
|
|
1376
|
+
case `readonly_held_selector`:
|
|
1136
1377
|
disposeSelector(store, token);
|
|
1137
1378
|
break;
|
|
1138
1379
|
}
|
|
@@ -1561,8 +1802,10 @@ function getFromStore(store, ...params) {
|
|
|
1561
1802
|
switch (family.type) {
|
|
1562
1803
|
case `atom_family`:
|
|
1563
1804
|
case `mutable_atom_family`: return store.defaults.get(family.key);
|
|
1564
|
-
case `
|
|
1565
|
-
case `
|
|
1805
|
+
case `readonly_pure_selector_family`:
|
|
1806
|
+
case `writable_pure_selector_family`:
|
|
1807
|
+
case `readonly_held_selector_family`:
|
|
1808
|
+
case `writable_held_selector_family`: {
|
|
1566
1809
|
if (store.defaults.has(family.key)) return store.defaults.get(token.family.key);
|
|
1567
1810
|
const defaultValue = withdraw(store, family).default(subKey);
|
|
1568
1811
|
store.defaults.set(family.key, defaultValue);
|
|
@@ -1630,7 +1873,7 @@ const buildTransaction = (store, key, params, id) => {
|
|
|
1630
1873
|
transactions: new LazyMap(parent.transactions),
|
|
1631
1874
|
selectorAtoms: new Junction(parent.selectorAtoms.toJSON()),
|
|
1632
1875
|
selectorGraph: new Junction(parent.selectorGraph.toJSON(), { makeContentKey: (...keys) => keys.sort().join(`:`) }),
|
|
1633
|
-
|
|
1876
|
+
writableSelectors: new LazyMap(parent.writableSelectors),
|
|
1634
1877
|
valueMap: new LazyMap(parent.valueMap),
|
|
1635
1878
|
defaults: parent.defaults,
|
|
1636
1879
|
disposalTraces: store.disposalTraces.copy(),
|
|
@@ -1718,7 +1961,7 @@ var Store = class {
|
|
|
1718
1961
|
valueMap = new Map();
|
|
1719
1962
|
defaults = new Map();
|
|
1720
1963
|
atoms = new Map();
|
|
1721
|
-
|
|
1964
|
+
writableSelectors = new Map();
|
|
1722
1965
|
readonlySelectors = new Map();
|
|
1723
1966
|
atomsThatAreDefault = new Set();
|
|
1724
1967
|
selectorAtoms = new Junction({
|
|
@@ -1817,7 +2060,7 @@ var Store = class {
|
|
|
1817
2060
|
}
|
|
1818
2061
|
}
|
|
1819
2062
|
for (const [, selector] of store.readonlySelectors) selector.install(this);
|
|
1820
|
-
for (const [, selector] of store.
|
|
2063
|
+
for (const [, selector] of store.writableSelectors) {
|
|
1821
2064
|
if (mutableHelpers.has(selector.key)) continue;
|
|
1822
2065
|
selector.install(this);
|
|
1823
2066
|
}
|
|
@@ -1851,16 +2094,20 @@ function withdraw(store, token) {
|
|
|
1851
2094
|
case `mutable_atom`:
|
|
1852
2095
|
withdrawn = target.atoms.get(token.key);
|
|
1853
2096
|
break;
|
|
1854
|
-
case `
|
|
1855
|
-
|
|
2097
|
+
case `writable_pure_selector`:
|
|
2098
|
+
case `writable_held_selector`:
|
|
2099
|
+
withdrawn = target.writableSelectors.get(token.key);
|
|
1856
2100
|
break;
|
|
1857
|
-
case `
|
|
2101
|
+
case `readonly_pure_selector`:
|
|
2102
|
+
case `readonly_held_selector`:
|
|
1858
2103
|
withdrawn = target.readonlySelectors.get(token.key);
|
|
1859
2104
|
break;
|
|
1860
2105
|
case `atom_family`:
|
|
1861
2106
|
case `mutable_atom_family`:
|
|
1862
|
-
case `
|
|
1863
|
-
case `
|
|
2107
|
+
case `writable_pure_selector_family`:
|
|
2108
|
+
case `readonly_pure_selector_family`:
|
|
2109
|
+
case `writable_held_selector_family`:
|
|
2110
|
+
case `readonly_held_selector_family`:
|
|
1864
2111
|
withdrawn = target.families.get(token.key);
|
|
1865
2112
|
break;
|
|
1866
2113
|
case `timeline`:
|
|
@@ -1890,8 +2137,10 @@ function subscribeInStore(store, token, handleUpdate, key = arbitrary$1()) {
|
|
|
1890
2137
|
switch (token.type) {
|
|
1891
2138
|
case `atom`:
|
|
1892
2139
|
case `mutable_atom`:
|
|
1893
|
-
case `
|
|
1894
|
-
case `
|
|
2140
|
+
case `readonly_pure_selector`:
|
|
2141
|
+
case `readonly_held_selector`:
|
|
2142
|
+
case `writable_pure_selector`:
|
|
2143
|
+
case `writable_held_selector`: return subscribeToState$1(store, token, key, handleUpdate);
|
|
1895
2144
|
case `transaction`: return subscribeToTransaction$1(store, token, key, handleUpdate);
|
|
1896
2145
|
case `timeline`: return subscribeToTimeline$1(store, token, key, handleUpdate);
|
|
1897
2146
|
}
|
|
@@ -1931,7 +2180,7 @@ function subscribeToState(store, token, key, handleUpdate) {
|
|
|
1931
2180
|
}
|
|
1932
2181
|
const state = withdraw(store, token);
|
|
1933
2182
|
store.logger.info(`👀`, state.type, state.key, `Adding subscription "${key}"`);
|
|
1934
|
-
const isSelector = state.type === `
|
|
2183
|
+
const isSelector = state.type === `writable_pure_selector` || state.type === `readonly_pure_selector`;
|
|
1935
2184
|
let dependencyUnsubFunctions = null;
|
|
1936
2185
|
let updateHandler = safelyHandleUpdate;
|
|
1937
2186
|
if (isSelector) {
|
|
@@ -2074,26 +2323,28 @@ var Tracker = class {
|
|
|
2074
2323
|
function createMutableAtom(store, options, family) {
|
|
2075
2324
|
store.logger.info(`🔨`, `atom`, options.key, `creating in store "${store.config.name}"`);
|
|
2076
2325
|
const target = newest(store);
|
|
2077
|
-
const
|
|
2078
|
-
|
|
2079
|
-
|
|
2326
|
+
const { key, default: def } = options;
|
|
2327
|
+
const existing = target.atoms.get(key);
|
|
2328
|
+
const type = `mutable_atom`;
|
|
2329
|
+
if (existing && existing.type === type) {
|
|
2330
|
+
store.logger.error(`❌`, type, key, `Tried to create atom, but it already exists in the store.`);
|
|
2080
2331
|
return deposit(existing);
|
|
2081
2332
|
}
|
|
2082
2333
|
const subject = new Subject();
|
|
2083
2334
|
const newAtom = {
|
|
2084
2335
|
...options,
|
|
2085
|
-
type
|
|
2336
|
+
type,
|
|
2086
2337
|
install: (s) => {
|
|
2087
|
-
s.logger.info(`🛠️`, `atom`,
|
|
2338
|
+
s.logger.info(`🛠️`, `atom`, key, `installing in store "${s.config.name}"`);
|
|
2088
2339
|
return createMutableAtom(s, options, family);
|
|
2089
2340
|
},
|
|
2090
2341
|
subject
|
|
2091
2342
|
};
|
|
2092
2343
|
if (family) newAtom.family = family;
|
|
2093
|
-
const initialValue =
|
|
2344
|
+
const initialValue = def();
|
|
2094
2345
|
target.atoms.set(newAtom.key, newAtom);
|
|
2095
|
-
markAtomAsDefault(store,
|
|
2096
|
-
cacheValue(target,
|
|
2346
|
+
markAtomAsDefault(store, key);
|
|
2347
|
+
cacheValue(target, key, initialValue, subject);
|
|
2097
2348
|
const token = deposit(newAtom);
|
|
2098
2349
|
if (options.effects) {
|
|
2099
2350
|
let effectIndex = 0;
|
|
@@ -2216,7 +2467,7 @@ const getJsonToken = (store, mutableAtomToken) => {
|
|
|
2216
2467
|
const jsonFamilyKey = `${mutableAtomToken.family.key}:JSON`;
|
|
2217
2468
|
const jsonFamilyToken = {
|
|
2218
2469
|
key: jsonFamilyKey,
|
|
2219
|
-
type: `
|
|
2470
|
+
type: `writable_pure_selector_family`
|
|
2220
2471
|
};
|
|
2221
2472
|
const family = withdraw(target, jsonFamilyToken);
|
|
2222
2473
|
const subKey = JSON.parse(mutableAtomToken.family.subKey);
|
|
@@ -2224,7 +2475,7 @@ const getJsonToken = (store, mutableAtomToken) => {
|
|
|
2224
2475
|
return jsonToken;
|
|
2225
2476
|
}
|
|
2226
2477
|
const token = {
|
|
2227
|
-
type: `
|
|
2478
|
+
type: `writable_pure_selector`,
|
|
2228
2479
|
key: `${mutableAtomToken.key}:JSON`
|
|
2229
2480
|
};
|
|
2230
2481
|
return token;
|
|
@@ -2313,7 +2564,7 @@ const evictCachedValue = (key, target) => {
|
|
|
2313
2564
|
const currentValue = target.valueMap.get(key);
|
|
2314
2565
|
if (currentValue instanceof Future) {
|
|
2315
2566
|
const future = currentValue;
|
|
2316
|
-
const selector = target.
|
|
2567
|
+
const selector = target.writableSelectors.get(key) ?? target.readonlySelectors.get(key);
|
|
2317
2568
|
if (selector) future.use(selector.get());
|
|
2318
2569
|
return;
|
|
2319
2570
|
}
|
|
@@ -2341,29 +2592,31 @@ const markAtomAsNotDefault = (store, key) => {
|
|
|
2341
2592
|
//#endregion
|
|
2342
2593
|
//#region src/internal/atom/create-regular-atom.ts
|
|
2343
2594
|
function createRegularAtom(store, options, family) {
|
|
2344
|
-
|
|
2595
|
+
const type = `atom`;
|
|
2596
|
+
const { key, default: def } = options;
|
|
2597
|
+
store.logger.info(`🔨`, `atom`, key, `creating in store "${store.config.name}"`);
|
|
2345
2598
|
const target = newest(store);
|
|
2346
|
-
const existing = target.atoms.get(
|
|
2347
|
-
if (existing && existing.type ===
|
|
2348
|
-
store.logger.error(`❌`, `atom`,
|
|
2599
|
+
const existing = target.atoms.get(key);
|
|
2600
|
+
if (existing && existing.type === type) {
|
|
2601
|
+
store.logger.error(`❌`, `atom`, key, `Tried to create atom, but it already exists in the store.`);
|
|
2349
2602
|
return deposit(existing);
|
|
2350
2603
|
}
|
|
2351
2604
|
const subject = new Subject();
|
|
2352
2605
|
const newAtom = {
|
|
2353
2606
|
...options,
|
|
2354
|
-
type
|
|
2607
|
+
type,
|
|
2355
2608
|
install: (s) => {
|
|
2356
|
-
s.logger.info(`🛠️`,
|
|
2609
|
+
s.logger.info(`🛠️`, type, key, `installing in store "${s.config.name}"`);
|
|
2357
2610
|
return createRegularAtom(s, options, family);
|
|
2358
2611
|
},
|
|
2359
2612
|
subject
|
|
2360
2613
|
};
|
|
2361
2614
|
if (family) newAtom.family = family;
|
|
2362
|
-
let initialValue =
|
|
2363
|
-
if (
|
|
2364
|
-
target.atoms.set(
|
|
2365
|
-
markAtomAsDefault(store,
|
|
2366
|
-
cacheValue(target,
|
|
2615
|
+
let initialValue = def;
|
|
2616
|
+
if (def instanceof Function) initialValue = def();
|
|
2617
|
+
target.atoms.set(key, newAtom);
|
|
2618
|
+
markAtomAsDefault(store, key);
|
|
2619
|
+
cacheValue(target, key, initialValue, subject);
|
|
2367
2620
|
const token = deposit(newAtom);
|
|
2368
2621
|
if (options.effects) {
|
|
2369
2622
|
let effectIndex = 0;
|
|
@@ -2649,7 +2902,7 @@ var Join = class {
|
|
|
2649
2902
|
return compositeKey;
|
|
2650
2903
|
}
|
|
2651
2904
|
});
|
|
2652
|
-
const createSingleKeySelectorFamily = () =>
|
|
2905
|
+
const createSingleKeySelectorFamily = () => createReadonlyPureSelectorFamily(store, {
|
|
2653
2906
|
key: `${options.key}/singleRelatedKey`,
|
|
2654
2907
|
get: (key) => ({ get }) => {
|
|
2655
2908
|
const relatedKeys = get(relatedKeysAtoms, key);
|
|
@@ -2658,7 +2911,7 @@ var Join = class {
|
|
|
2658
2911
|
}
|
|
2659
2912
|
}, [`join`, `keys`]);
|
|
2660
2913
|
const getMultipleKeySelectorFamily = () => {
|
|
2661
|
-
return
|
|
2914
|
+
return createReadonlyPureSelectorFamily(store, {
|
|
2662
2915
|
key: `${options.key}/multipleRelatedKeys`,
|
|
2663
2916
|
get: (key) => ({ get }) => {
|
|
2664
2917
|
const jsonFamily = getJsonFamily(relatedKeysAtoms, store);
|
|
@@ -2667,7 +2920,7 @@ var Join = class {
|
|
|
2667
2920
|
}
|
|
2668
2921
|
}, [`join`, `keys`]);
|
|
2669
2922
|
};
|
|
2670
|
-
const createSingleEntrySelectorFamily = () =>
|
|
2923
|
+
const createSingleEntrySelectorFamily = () => createReadonlyPureSelectorFamily(store, {
|
|
2671
2924
|
key: `${options.key}/singleRelatedEntry`,
|
|
2672
2925
|
get: (x) => ({ get }) => {
|
|
2673
2926
|
const relatedKeys = get(relatedKeysAtoms, x);
|
|
@@ -2683,7 +2936,7 @@ var Join = class {
|
|
|
2683
2936
|
return null;
|
|
2684
2937
|
}
|
|
2685
2938
|
}, [`join`, `entries`]);
|
|
2686
|
-
const getMultipleEntrySelectorFamily = () =>
|
|
2939
|
+
const getMultipleEntrySelectorFamily = () => createReadonlyPureSelectorFamily(store, {
|
|
2687
2940
|
key: `${options.key}/multipleRelatedEntries`,
|
|
2688
2941
|
get: (x) => ({ get }) => {
|
|
2689
2942
|
const jsonFamily = getJsonFamily(relatedKeysAtoms, store);
|
|
@@ -2999,8 +3252,8 @@ function addAtomToTimeline(store, atomToken, tl) {
|
|
|
2999
3252
|
}, { topicType: `atom` });
|
|
3000
3253
|
tl.subscriptions.set(atom$1.key, atom$1.subject.subscribe(`timeline`, function timelineCapturesAtomUpdate(update) {
|
|
3001
3254
|
const target = newest(store);
|
|
3002
|
-
const currentSelectorKey = store.operation.open && store.operation.token.type === `
|
|
3003
|
-
const currentSelectorTime = store.operation.open && store.operation.token.type === `
|
|
3255
|
+
const currentSelectorKey = store.operation.open && store.operation.token.type === `writable_pure_selector` ? store.operation.token.key : null;
|
|
3256
|
+
const currentSelectorTime = store.operation.open && store.operation.token.type === `writable_pure_selector` ? store.operation.time : null;
|
|
3004
3257
|
const txUpdateInProgress = target.on.transactionApplying.state?.update;
|
|
3005
3258
|
store.logger.info(`⏳`, `timeline`, tl.key, `atom`, atomToken.key, `went`, update.oldValue, `->`, update.newValue, txUpdateInProgress ? `in transaction "${txUpdateInProgress.key}"` : currentSelectorKey ? `in selector "${currentSelectorKey}"` : ``);
|
|
3006
3259
|
if (tl.timeTraveling === null) if (txUpdateInProgress) joinTransaction(store, tl, txUpdateInProgress);
|
|
@@ -3209,5 +3462,5 @@ const timeTravel = (store, action, token) => {
|
|
|
3209
3462
|
};
|
|
3210
3463
|
|
|
3211
3464
|
//#endregion
|
|
3212
|
-
export { CircularBuffer, FAMILY_MEMBER_TOKEN_TYPES, FamilyTracker, Future, IMPLICIT, Join, Junction, LazyMap, NotFoundError, StatefulSubject, Store, Subject, TRANSACTION_PHASES, Tracker, abortTransaction, actUponStore, allocateIntoStore, applyTransaction, arbitrary, assignTransactionToContinuity, become, buildTransaction, cacheValue, capitalize, claimWithinStore, clearStore, closeOperation, counterfeit, createAtomFamily, createMutableAtom, createMutableAtomFamily,
|
|
3465
|
+
export { CircularBuffer, FAMILY_MEMBER_TOKEN_TYPES, FamilyTracker, Future, IMPLICIT, Join, Junction, LazyMap, NotFoundError, StatefulSubject, Store, Subject, TRANSACTION_PHASES, Tracker, abortTransaction, actUponStore, allocateIntoStore, applyTransaction, arbitrary, assignTransactionToContinuity, become, buildTransaction, cacheValue, capitalize, claimWithinStore, clearStore, closeOperation, counterfeit, createAtomFamily, createMutableAtom, createMutableAtomFamily, createReadonlyHeldSelector, createReadonlyPureSelector, createReadonlyPureSelectorFamily, createRegularAtom, createRegularAtomFamily, createSelectorFamily, createStandaloneAtom, createStandaloneSelector, createTimeline, createTransaction, createWritableHeldSelector, createWritablePureSelector, createWritablePureSelectorFamily, deallocateFromStore, deposit, disposeAtom, disposeFromStore, disposeSelector, editRelationsInStore, evictCachedValue, findInStore, findRelationsInStore, fuseWithinStore, getContinuityKey, getEnvironmentData, getEpochNumberOfAction, getEpochNumberOfContinuity, getFromStore, getInternalRelationsFromStore, getJoin, getJsonFamily, getJsonToken, getSelectorDependencyKeys, getTrace, getUpdateFamily, getUpdateToken, ingestAtomUpdate, ingestCreationEvent, ingestDisposalEvent, ingestMoleculeCreationEvent, ingestMoleculeDisposalEvent, ingestMoleculeTransferEvent, ingestSelectorUpdate, ingestTransactionUpdate, initFamilyMemberInStore, installIntoStore, isAtomDefault, isAtomKey, isChildStore, isDone, isReadonlySelectorKey, isReservedIntrospectionKey, isRootStore, isSelectorKey, isStateKey, isTransceiver, makeRootMoleculeInStore, markAtomAsDefault, markAtomAsNotDefault, markDone, newest, openOperation, prettyPrintTokenType, readCachedValue, readOrComputeValue, recallState, registerSelector, seekInStore, setAtomOrSelector, setEpochNumberOfAction, setEpochNumberOfContinuity, setIntoStore, subscribeInStore, subscribeToRootAtoms, subscribeToState, subscribeToTimeline, subscribeToTransaction, timeTravel, traceAllSelectorAtoms, traceSelectorAtoms, updateSelectorAtoms, withdraw };
|
|
3213
3466
|
//# sourceMappingURL=index.js.map
|