@effect-rx/rx-react 0.1.18 → 0.1.20
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/index.d.ts.map +1 -1
- package/index.js +60 -82
- package/index.js.map +1 -1
- package/mjs/index.mjs +60 -82
- package/mjs/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +47 -60
package/index.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["./src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAA;AAClD,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAA;AAC9C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAGtC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAA;AAClD,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAA;AAC9C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAEtC;;;GAGG;AACH,eAAO,MAAM,eAAe,kCAA0D,CAAA;
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["./src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAA;AAClD,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAA;AAC9C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAGtC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAA;AAClD,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAA;AAC9C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAEtC;;;GAGG;AACH,eAAO,MAAM,eAAe,kCAA0D,CAAA;AA8BtF;;;GAGG;AACH,eAAO,MAAM,UAAU,wBAItB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,6DAA4D,IAUhF,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,wCAAuC,MAAM,IAKrE,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,KAAK,8FAA6F,IAAI,CAIvG,CAAA;AA8CZ;;;GAGG;AACH,eAAO,MAAM,aAAa,mDAEd;IAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE;wBAE7B,OAAO;;CA2B5B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,mDAErB;IAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE;wBAE7B,OAAO;;CAW5B,CAAA"}
|
package/index.js
CHANGED
@@ -28,24 +28,23 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
28
28
|
*/
|
29
29
|
const RegistryContext = /*#__PURE__*/React.createContext( /*#__PURE__*/Registry.make());
|
30
30
|
exports.RegistryContext = RegistryContext;
|
31
|
+
const storeRegistry = /*#__PURE__*/(0, _GlobalValue.globalValue)("@effect-rx/rx-react/storeRegistry", () => new WeakMap());
|
31
32
|
function makeStore(registry, rx) {
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
const [get, unmount] = registry.subscribeGetter(rx, f);
|
37
|
-
getter = get;
|
38
|
-
return unmount;
|
39
|
-
}
|
40
|
-
function snapshot() {
|
41
|
-
return getter();
|
33
|
+
const stores = storeRegistry.get(registry) ?? storeRegistry.set(registry, new WeakMap()).get(registry);
|
34
|
+
const store = stores.get(rx);
|
35
|
+
if (store) {
|
36
|
+
return store;
|
42
37
|
}
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
snapshot
|
38
|
+
const newStore = {
|
39
|
+
subscribe(f) {
|
40
|
+
return registry.subscribe(rx, f);
|
41
|
+
},
|
42
|
+
snapshot() {
|
43
|
+
return registry.get(rx);
|
44
|
+
}
|
48
45
|
};
|
46
|
+
stores.set(rx, newStore);
|
47
|
+
return newStore;
|
49
48
|
}
|
50
49
|
/**
|
51
50
|
* @since 1.0.0
|
@@ -53,11 +52,8 @@ function makeStore(registry, rx) {
|
|
53
52
|
*/
|
54
53
|
const useRxValue = rx => {
|
55
54
|
const registry = React.useContext(RegistryContext);
|
56
|
-
const store =
|
57
|
-
|
58
|
-
store.current = makeStore(registry, rx);
|
59
|
-
}
|
60
|
-
return React.useSyncExternalStore(store.current.subscribe, store.current.snapshot);
|
55
|
+
const store = makeStore(registry, rx);
|
56
|
+
return React.useSyncExternalStore(store.subscribe, store.snapshot);
|
61
57
|
};
|
62
58
|
/**
|
63
59
|
* @since 1.0.0
|
@@ -93,61 +89,40 @@ const useRefreshRx = rx => {
|
|
93
89
|
exports.useRefreshRx = useRefreshRx;
|
94
90
|
const useRx = rx => [useRxValue(rx), useSetRx(rx)];
|
95
91
|
exports.useRx = useRx;
|
96
|
-
const suspenseCache = /*#__PURE__*/(0, _GlobalValue.globalValue)("@effect-rx/rx-react/suspenseCache", () => new
|
97
|
-
const
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
promise: new Promise(resolve => {
|
105
|
-
ctx.addFinalizer(() => {
|
106
|
-
resolve();
|
107
|
-
const unmount = suspenseCache.get(selfRx);
|
108
|
-
if (unmount) {
|
109
|
-
unmount();
|
110
|
-
suspenseCache.delete(selfRx);
|
111
|
-
}
|
112
|
-
});
|
113
|
-
})
|
114
|
-
};
|
115
|
-
}
|
116
|
-
const isWaiting = Result.isWaiting(result);
|
92
|
+
const suspenseCache = /*#__PURE__*/(0, _GlobalValue.globalValue)("@effect-rx/rx-react/suspenseCache", () => new WeakMap());
|
93
|
+
const suspenseRegistry = /*#__PURE__*/new FinalizationRegistry(unmount => {
|
94
|
+
unmount();
|
95
|
+
});
|
96
|
+
const suspenseRx = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
|
97
|
+
const result = get(rx);
|
98
|
+
const value = Result.noWaiting(result);
|
99
|
+
if (value._tag === "Initial") {
|
117
100
|
return {
|
118
|
-
_tag: "
|
119
|
-
|
120
|
-
value
|
101
|
+
_tag: "Suspended",
|
102
|
+
promise: new Promise(resolve => ctx.addFinalizer(resolve))
|
121
103
|
};
|
122
|
-
}
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
resolve();
|
134
|
-
const unmount = suspenseCache.get(rx);
|
135
|
-
if (unmount) {
|
136
|
-
unmount();
|
137
|
-
suspenseCache.delete(rx);
|
138
|
-
}
|
139
|
-
});
|
140
|
-
})
|
141
|
-
};
|
142
|
-
}
|
104
|
+
}
|
105
|
+
const isWaiting = Result.isWaiting(result);
|
106
|
+
return {
|
107
|
+
_tag: "Value",
|
108
|
+
isWaiting,
|
109
|
+
value
|
110
|
+
};
|
111
|
+
}));
|
112
|
+
const suspenseRxWaiting = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
|
113
|
+
const result = get(rx);
|
114
|
+
if (result._tag === "Waiting" || result._tag === "Initial") {
|
143
115
|
return {
|
144
|
-
_tag: "
|
145
|
-
|
146
|
-
value: result
|
116
|
+
_tag: "Suspended",
|
117
|
+
promise: new Promise(resolve => ctx.addFinalizer(resolve))
|
147
118
|
};
|
148
|
-
}
|
149
|
-
return
|
150
|
-
|
119
|
+
}
|
120
|
+
return {
|
121
|
+
_tag: "Value",
|
122
|
+
isWaiting: false,
|
123
|
+
value: result
|
124
|
+
};
|
125
|
+
}));
|
151
126
|
/**
|
152
127
|
* @since 1.0.0
|
153
128
|
* @category hooks
|
@@ -155,12 +130,22 @@ const suspenseRxWaiting = /*#__PURE__*/Rx.family(rx => {
|
|
155
130
|
const useRxSuspense = (rx, options) => {
|
156
131
|
const registry = React.useContext(RegistryContext);
|
157
132
|
const resultRx = React.useMemo(() => options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx), [options?.suspendOnWaiting, rx]);
|
158
|
-
const
|
133
|
+
const store = makeStore(registry, resultRx);
|
134
|
+
const result = React.useSyncExternalStore(store.subscribe, store.snapshot);
|
159
135
|
if (result._tag === "Suspended") {
|
160
136
|
if (!suspenseCache.has(resultRx)) {
|
161
|
-
|
137
|
+
const unmount = registry.mount(resultRx);
|
138
|
+
suspenseCache.set(resultRx, unmount);
|
139
|
+
suspenseRegistry.register(result.promise, unmount, resultRx);
|
162
140
|
}
|
163
141
|
throw result.promise;
|
142
|
+
} else if (suspenseCache.has(resultRx)) {
|
143
|
+
const unmount = suspenseCache.get(resultRx);
|
144
|
+
if (unmount) {
|
145
|
+
suspenseCache.delete(resultRx);
|
146
|
+
suspenseRegistry.unregister(resultRx);
|
147
|
+
unmount();
|
148
|
+
}
|
164
149
|
}
|
165
150
|
return result;
|
166
151
|
};
|
@@ -170,15 +155,8 @@ const useRxSuspense = (rx, options) => {
|
|
170
155
|
*/
|
171
156
|
exports.useRxSuspense = useRxSuspense;
|
172
157
|
const useRxSuspenseSuccess = (rx, options) => {
|
173
|
-
const
|
174
|
-
|
175
|
-
const result = useRxValue(resultRx);
|
176
|
-
if (result._tag === "Suspended") {
|
177
|
-
if (!suspenseCache.has(resultRx)) {
|
178
|
-
suspenseCache.set(resultRx, registry.mount(resultRx));
|
179
|
-
}
|
180
|
-
throw result.promise;
|
181
|
-
} else if (result.value._tag === "Failure") {
|
158
|
+
const result = useRxSuspense(rx, options);
|
159
|
+
if (result.value._tag === "Failure") {
|
182
160
|
throw Cause.squash(result.value.cause);
|
183
161
|
}
|
184
162
|
return {
|
package/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","names":["Registry","_interopRequireWildcard","require","Registry_1","exports","Result","Result_1","Rx","Rx_1","_GlobalValue","Cause","React","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","RegistryContext","createContext","make","makeStore","registry","rx","
|
1
|
+
{"version":3,"file":"index.js","names":["Registry","_interopRequireWildcard","require","Registry_1","exports","Result","Result_1","Rx","Rx_1","_GlobalValue","Cause","React","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","RegistryContext","createContext","make","storeRegistry","globalValue","makeStore","registry","rx","stores","store","newStore","subscribe","f","snapshot","useRxValue","useContext","useSyncExternalStore","useSetRx","useCallback","value","useRefreshRx","refresh","useRx","suspenseCache","suspenseRegistry","FinalizationRegistry","unmount","suspenseRx","family","readable","ctx","result","noWaiting","_tag","promise","Promise","resolve","addFinalizer","isWaiting","suspenseRxWaiting","useRxSuspense","options","resultRx","useMemo","suspendOnWaiting","mount","register","delete","unregister","useRxSuspenseSuccess","squash","cause"],"sources":["./src/index.ts"],"sourcesContent":[null],"mappings":"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"}
|
package/mjs/index.mjs
CHANGED
@@ -18,24 +18,23 @@ export { Rx_1 as Rx };
|
|
18
18
|
* @category context
|
19
19
|
*/
|
20
20
|
export const RegistryContext = /*#__PURE__*/React.createContext( /*#__PURE__*/Registry.make());
|
21
|
+
const storeRegistry = /*#__PURE__*/globalValue("@effect-rx/rx-react/storeRegistry", () => new WeakMap());
|
21
22
|
function makeStore(registry, rx) {
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
const [get, unmount] = registry.subscribeGetter(rx, f);
|
27
|
-
getter = get;
|
28
|
-
return unmount;
|
29
|
-
}
|
30
|
-
function snapshot() {
|
31
|
-
return getter();
|
23
|
+
const stores = storeRegistry.get(registry) ?? storeRegistry.set(registry, new WeakMap()).get(registry);
|
24
|
+
const store = stores.get(rx);
|
25
|
+
if (store) {
|
26
|
+
return store;
|
32
27
|
}
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
snapshot
|
28
|
+
const newStore = {
|
29
|
+
subscribe(f) {
|
30
|
+
return registry.subscribe(rx, f);
|
31
|
+
},
|
32
|
+
snapshot() {
|
33
|
+
return registry.get(rx);
|
34
|
+
}
|
38
35
|
};
|
36
|
+
stores.set(rx, newStore);
|
37
|
+
return newStore;
|
39
38
|
}
|
40
39
|
/**
|
41
40
|
* @since 1.0.0
|
@@ -43,11 +42,8 @@ function makeStore(registry, rx) {
|
|
43
42
|
*/
|
44
43
|
export const useRxValue = rx => {
|
45
44
|
const registry = React.useContext(RegistryContext);
|
46
|
-
const store =
|
47
|
-
|
48
|
-
store.current = makeStore(registry, rx);
|
49
|
-
}
|
50
|
-
return React.useSyncExternalStore(store.current.subscribe, store.current.snapshot);
|
45
|
+
const store = makeStore(registry, rx);
|
46
|
+
return React.useSyncExternalStore(store.subscribe, store.snapshot);
|
51
47
|
};
|
52
48
|
/**
|
53
49
|
* @since 1.0.0
|
@@ -79,61 +75,40 @@ export const useRefreshRx = rx => {
|
|
79
75
|
* @category hooks
|
80
76
|
*/
|
81
77
|
export const useRx = rx => [useRxValue(rx), useSetRx(rx)];
|
82
|
-
const suspenseCache = /*#__PURE__*/globalValue("@effect-rx/rx-react/suspenseCache", () => new
|
83
|
-
const
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
promise: new Promise(resolve => {
|
91
|
-
ctx.addFinalizer(() => {
|
92
|
-
resolve();
|
93
|
-
const unmount = suspenseCache.get(selfRx);
|
94
|
-
if (unmount) {
|
95
|
-
unmount();
|
96
|
-
suspenseCache.delete(selfRx);
|
97
|
-
}
|
98
|
-
});
|
99
|
-
})
|
100
|
-
};
|
101
|
-
}
|
102
|
-
const isWaiting = Result.isWaiting(result);
|
78
|
+
const suspenseCache = /*#__PURE__*/globalValue("@effect-rx/rx-react/suspenseCache", () => new WeakMap());
|
79
|
+
const suspenseRegistry = /*#__PURE__*/new FinalizationRegistry(unmount => {
|
80
|
+
unmount();
|
81
|
+
});
|
82
|
+
const suspenseRx = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
|
83
|
+
const result = get(rx);
|
84
|
+
const value = Result.noWaiting(result);
|
85
|
+
if (value._tag === "Initial") {
|
103
86
|
return {
|
104
|
-
_tag: "
|
105
|
-
|
106
|
-
value
|
87
|
+
_tag: "Suspended",
|
88
|
+
promise: new Promise(resolve => ctx.addFinalizer(resolve))
|
107
89
|
};
|
108
|
-
}
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
resolve();
|
120
|
-
const unmount = suspenseCache.get(rx);
|
121
|
-
if (unmount) {
|
122
|
-
unmount();
|
123
|
-
suspenseCache.delete(rx);
|
124
|
-
}
|
125
|
-
});
|
126
|
-
})
|
127
|
-
};
|
128
|
-
}
|
90
|
+
}
|
91
|
+
const isWaiting = Result.isWaiting(result);
|
92
|
+
return {
|
93
|
+
_tag: "Value",
|
94
|
+
isWaiting,
|
95
|
+
value
|
96
|
+
};
|
97
|
+
}));
|
98
|
+
const suspenseRxWaiting = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
|
99
|
+
const result = get(rx);
|
100
|
+
if (result._tag === "Waiting" || result._tag === "Initial") {
|
129
101
|
return {
|
130
|
-
_tag: "
|
131
|
-
|
132
|
-
value: result
|
102
|
+
_tag: "Suspended",
|
103
|
+
promise: new Promise(resolve => ctx.addFinalizer(resolve))
|
133
104
|
};
|
134
|
-
}
|
135
|
-
return
|
136
|
-
|
105
|
+
}
|
106
|
+
return {
|
107
|
+
_tag: "Value",
|
108
|
+
isWaiting: false,
|
109
|
+
value: result
|
110
|
+
};
|
111
|
+
}));
|
137
112
|
/**
|
138
113
|
* @since 1.0.0
|
139
114
|
* @category hooks
|
@@ -141,12 +116,22 @@ const suspenseRxWaiting = /*#__PURE__*/Rx.family(rx => {
|
|
141
116
|
export const useRxSuspense = (rx, options) => {
|
142
117
|
const registry = React.useContext(RegistryContext);
|
143
118
|
const resultRx = React.useMemo(() => options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx), [options?.suspendOnWaiting, rx]);
|
144
|
-
const
|
119
|
+
const store = makeStore(registry, resultRx);
|
120
|
+
const result = React.useSyncExternalStore(store.subscribe, store.snapshot);
|
145
121
|
if (result._tag === "Suspended") {
|
146
122
|
if (!suspenseCache.has(resultRx)) {
|
147
|
-
|
123
|
+
const unmount = registry.mount(resultRx);
|
124
|
+
suspenseCache.set(resultRx, unmount);
|
125
|
+
suspenseRegistry.register(result.promise, unmount, resultRx);
|
148
126
|
}
|
149
127
|
throw result.promise;
|
128
|
+
} else if (suspenseCache.has(resultRx)) {
|
129
|
+
const unmount = suspenseCache.get(resultRx);
|
130
|
+
if (unmount) {
|
131
|
+
suspenseCache.delete(resultRx);
|
132
|
+
suspenseRegistry.unregister(resultRx);
|
133
|
+
unmount();
|
134
|
+
}
|
150
135
|
}
|
151
136
|
return result;
|
152
137
|
};
|
@@ -155,15 +140,8 @@ export const useRxSuspense = (rx, options) => {
|
|
155
140
|
* @category hooks
|
156
141
|
*/
|
157
142
|
export const useRxSuspenseSuccess = (rx, options) => {
|
158
|
-
const
|
159
|
-
|
160
|
-
const result = useRxValue(resultRx);
|
161
|
-
if (result._tag === "Suspended") {
|
162
|
-
if (!suspenseCache.has(resultRx)) {
|
163
|
-
suspenseCache.set(resultRx, registry.mount(resultRx));
|
164
|
-
}
|
165
|
-
throw result.promise;
|
166
|
-
} else if (result.value._tag === "Failure") {
|
143
|
+
const result = useRxSuspense(rx, options);
|
144
|
+
if (result.value._tag === "Failure") {
|
167
145
|
throw Cause.squash(result.value.cause);
|
168
146
|
}
|
169
147
|
return {
|
package/mjs/index.mjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["Registry","Result","Rx","globalValue","Cause","React","RegistryContext","createContext","make","
|
1
|
+
{"version":3,"file":"index.mjs","names":["Registry","Result","Rx","globalValue","Cause","React","RegistryContext","createContext","make","storeRegistry","WeakMap","makeStore","registry","rx","stores","get","set","store","newStore","subscribe","f","snapshot","useRxValue","useContext","useSyncExternalStore","useSetRx","useCallback","value","useRefreshRx","refresh","useRx","suspenseCache","suspenseRegistry","FinalizationRegistry","unmount","suspenseRx","family","readable","ctx","result","noWaiting","_tag","promise","Promise","resolve","addFinalizer","isWaiting","suspenseRxWaiting","useRxSuspense","options","resultRx","useMemo","suspendOnWaiting","has","mount","register","delete","unregister","useRxSuspenseSuccess","squash","cause"],"sources":["../src/index.ts"],"sourcesContent":[null],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
@@ -19,25 +19,31 @@ export * as Rx from "@effect-rx/rx/Rx"
|
|
19
19
|
export const RegistryContext = React.createContext<Registry.Registry>(Registry.make())
|
20
20
|
|
21
21
|
interface RxStore<A> {
|
22
|
-
readonly rx: Rx.Rx<A>
|
23
|
-
readonly registry: Registry.Registry
|
24
22
|
readonly subscribe: (f: () => void) => () => void
|
25
23
|
readonly snapshot: () => A
|
26
24
|
}
|
27
25
|
|
26
|
+
const storeRegistry = globalValue(
|
27
|
+
"@effect-rx/rx-react/storeRegistry",
|
28
|
+
() => new WeakMap<Registry.Registry, WeakMap<Rx.Rx<any>, RxStore<any>>>()
|
29
|
+
)
|
30
|
+
|
28
31
|
function makeStore<A>(registry: Registry.Registry, rx: Rx.Rx<A>): RxStore<A> {
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
const [get, unmount] = registry.subscribeGetter(rx, f)
|
34
|
-
getter = get
|
35
|
-
return unmount
|
32
|
+
const stores = storeRegistry.get(registry) ?? storeRegistry.set(registry, new WeakMap()).get(registry)!
|
33
|
+
const store = stores.get(rx)
|
34
|
+
if (store) {
|
35
|
+
return store
|
36
36
|
}
|
37
|
-
|
38
|
-
|
37
|
+
const newStore: RxStore<A> = {
|
38
|
+
subscribe(f) {
|
39
|
+
return registry.subscribe(rx, f)
|
40
|
+
},
|
41
|
+
snapshot() {
|
42
|
+
return registry.get(rx)
|
43
|
+
}
|
39
44
|
}
|
40
|
-
|
45
|
+
stores.set(rx, newStore)
|
46
|
+
return newStore
|
41
47
|
}
|
42
48
|
|
43
49
|
/**
|
@@ -46,11 +52,8 @@ function makeStore<A>(registry: Registry.Registry, rx: Rx.Rx<A>): RxStore<A> {
|
|
46
52
|
*/
|
47
53
|
export const useRxValue = <A>(rx: Rx.Rx<A>): A => {
|
48
54
|
const registry = React.useContext(RegistryContext)
|
49
|
-
const store =
|
50
|
-
|
51
|
-
store.current = makeStore(registry, rx)
|
52
|
-
}
|
53
|
-
return React.useSyncExternalStore(store.current.subscribe, store.current.snapshot)
|
55
|
+
const store = makeStore(registry, rx)
|
56
|
+
return React.useSyncExternalStore(store.subscribe, store.snapshot)
|
54
57
|
}
|
55
58
|
|
56
59
|
/**
|
@@ -101,55 +104,38 @@ type SuspenseResult<E, A> =
|
|
101
104
|
readonly value: Result.Success<E, A> | Result.Failure<E, A>
|
102
105
|
}
|
103
106
|
|
104
|
-
const suspenseCache = globalValue("@effect-rx/rx-react/suspenseCache", () => new
|
107
|
+
const suspenseCache = globalValue("@effect-rx/rx-react/suspenseCache", () => new WeakMap<Rx.Rx<any>, () => void>())
|
108
|
+
const suspenseRegistry = new FinalizationRegistry((unmount: () => void) => {
|
109
|
+
unmount()
|
110
|
+
})
|
105
111
|
|
106
|
-
const suspenseRx = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) =>
|
107
|
-
|
112
|
+
const suspenseRx = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) =>
|
113
|
+
Rx.readable((get, ctx): SuspenseResult<any, any> => {
|
108
114
|
const result = get(rx)
|
109
115
|
const value = Result.noWaiting(result)
|
110
116
|
if (value._tag === "Initial") {
|
111
117
|
return {
|
112
118
|
_tag: "Suspended",
|
113
|
-
promise: new Promise<void>((resolve) =>
|
114
|
-
ctx.addFinalizer(() => {
|
115
|
-
resolve()
|
116
|
-
const unmount = suspenseCache.get(selfRx)
|
117
|
-
if (unmount) {
|
118
|
-
unmount()
|
119
|
-
suspenseCache.delete(selfRx)
|
120
|
-
}
|
121
|
-
})
|
122
|
-
})
|
119
|
+
promise: new Promise<void>((resolve) => ctx.addFinalizer(resolve))
|
123
120
|
} as const
|
124
121
|
}
|
125
122
|
const isWaiting = Result.isWaiting(result)
|
126
123
|
return { _tag: "Value", isWaiting, value } as const
|
127
124
|
})
|
128
|
-
|
129
|
-
})
|
125
|
+
)
|
130
126
|
|
131
|
-
const suspenseRxWaiting = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) =>
|
132
|
-
|
127
|
+
const suspenseRxWaiting = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) =>
|
128
|
+
Rx.readable((get, ctx): SuspenseResult<any, any> => {
|
133
129
|
const result = get(rx)
|
134
130
|
if (result._tag === "Waiting" || result._tag === "Initial") {
|
135
131
|
return {
|
136
132
|
_tag: "Suspended",
|
137
|
-
promise: new Promise<void>((resolve) =>
|
138
|
-
ctx.addFinalizer(() => {
|
139
|
-
resolve()
|
140
|
-
const unmount = suspenseCache.get(rx)
|
141
|
-
if (unmount) {
|
142
|
-
unmount()
|
143
|
-
suspenseCache.delete(rx)
|
144
|
-
}
|
145
|
-
})
|
146
|
-
})
|
133
|
+
promise: new Promise<void>((resolve) => ctx.addFinalizer(resolve))
|
147
134
|
} as const
|
148
135
|
}
|
149
136
|
return { _tag: "Value", isWaiting: false, value: result } as const
|
150
137
|
})
|
151
|
-
|
152
|
-
})
|
138
|
+
)
|
153
139
|
|
154
140
|
/**
|
155
141
|
* @since 1.0.0
|
@@ -167,13 +153,24 @@ export const useRxSuspense = <E, A>(
|
|
167
153
|
() => (options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx)),
|
168
154
|
[options?.suspendOnWaiting, rx]
|
169
155
|
)
|
170
|
-
const
|
156
|
+
const store = makeStore(registry, resultRx)
|
157
|
+
const result = React.useSyncExternalStore(store.subscribe, store.snapshot)
|
171
158
|
if (result._tag === "Suspended") {
|
172
159
|
if (!suspenseCache.has(resultRx)) {
|
173
|
-
|
160
|
+
const unmount = registry.mount(resultRx)
|
161
|
+
suspenseCache.set(resultRx, unmount)
|
162
|
+
suspenseRegistry.register(result.promise, unmount, resultRx)
|
174
163
|
}
|
175
164
|
throw result.promise
|
165
|
+
} else if (suspenseCache.has(resultRx)) {
|
166
|
+
const unmount = suspenseCache.get(resultRx)
|
167
|
+
if (unmount) {
|
168
|
+
suspenseCache.delete(resultRx)
|
169
|
+
suspenseRegistry.unregister(resultRx)
|
170
|
+
unmount()
|
171
|
+
}
|
176
172
|
}
|
173
|
+
|
177
174
|
return result
|
178
175
|
}
|
179
176
|
|
@@ -188,18 +185,8 @@ export const useRxSuspenseSuccess = <E, A>(
|
|
188
185
|
readonly isWaiting: boolean
|
189
186
|
readonly value: A
|
190
187
|
} => {
|
191
|
-
const
|
192
|
-
|
193
|
-
() => (options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx)),
|
194
|
-
[options?.suspendOnWaiting, rx]
|
195
|
-
)
|
196
|
-
const result = useRxValue(resultRx)
|
197
|
-
if (result._tag === "Suspended") {
|
198
|
-
if (!suspenseCache.has(resultRx)) {
|
199
|
-
suspenseCache.set(resultRx, registry.mount(resultRx))
|
200
|
-
}
|
201
|
-
throw result.promise
|
202
|
-
} else if (result.value._tag === "Failure") {
|
188
|
+
const result = useRxSuspense(rx, options)
|
189
|
+
if (result.value._tag === "Failure") {
|
203
190
|
throw Cause.squash(result.value.cause)
|
204
191
|
}
|
205
192
|
return {
|