@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 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;AAwBtF;;;GAGG;AACH,eAAO,MAAM,UAAU,wBAOtB,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;AA+DZ;;;GAGG;AACH,eAAO,MAAM,aAAa,mDAEd;IAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE;wBAE7B,OAAO;;CAgB5B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,mDAErB;IAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE;wBAE7B,OAAO;;CAqB5B,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
- let getter = function () {
33
- return registry.get(rx);
34
- };
35
- function subscribe(f) {
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
- return {
44
- rx,
45
- registry,
46
- subscribe,
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 = React.useRef(undefined);
57
- if (store.current?.rx !== rx || store.current?.registry !== registry) {
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 Map());
97
- const suspenseRx = /*#__PURE__*/Rx.family(rx => {
98
- const selfRx = Rx.readable((get, ctx) => {
99
- const result = get(rx);
100
- const value = Result.noWaiting(result);
101
- if (value._tag === "Initial") {
102
- return {
103
- _tag: "Suspended",
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: "Value",
119
- isWaiting,
120
- value
101
+ _tag: "Suspended",
102
+ promise: new Promise(resolve => ctx.addFinalizer(resolve))
121
103
  };
122
- });
123
- return selfRx;
124
- });
125
- const suspenseRxWaiting = /*#__PURE__*/Rx.family(rx => {
126
- const selfRx = Rx.readable((get, ctx) => {
127
- const result = get(rx);
128
- if (result._tag === "Waiting" || result._tag === "Initial") {
129
- return {
130
- _tag: "Suspended",
131
- promise: new Promise(resolve => {
132
- ctx.addFinalizer(() => {
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: "Value",
145
- isWaiting: false,
146
- value: result
116
+ _tag: "Suspended",
117
+ promise: new Promise(resolve => ctx.addFinalizer(resolve))
147
118
  };
148
- });
149
- return selfRx;
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 result = useRxValue(resultRx);
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
- suspenseCache.set(resultRx, registry.mount(resultRx));
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 registry = React.useContext(RegistryContext);
174
- const resultRx = React.useMemo(() => options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx), [options?.suspendOnWaiting, rx]);
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","getter","subscribe","f","unmount","subscribeGetter","snapshot","useRxValue","useContext","store","useRef","undefined","current","useSyncExternalStore","useSetRx","useCallback","value","useRefreshRx","refresh","useRx","suspenseCache","globalValue","Map","suspenseRx","family","selfRx","readable","ctx","result","noWaiting","_tag","promise","Promise","resolve","addFinalizer","delete","isWaiting","suspenseRxWaiting","useRxSuspense","options","resultRx","useMemo","suspendOnWaiting","mount","useRxSuspenseSuccess","squash","cause"],"sources":["./src/index.ts"],"sourcesContent":[null],"mappings":"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"}
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
- let getter = function () {
23
- return registry.get(rx);
24
- };
25
- function subscribe(f) {
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
- return {
34
- rx,
35
- registry,
36
- subscribe,
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 = React.useRef(undefined);
47
- if (store.current?.rx !== rx || store.current?.registry !== registry) {
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 Map());
83
- const suspenseRx = /*#__PURE__*/Rx.family(rx => {
84
- const selfRx = Rx.readable((get, ctx) => {
85
- const result = get(rx);
86
- const value = Result.noWaiting(result);
87
- if (value._tag === "Initial") {
88
- return {
89
- _tag: "Suspended",
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: "Value",
105
- isWaiting,
106
- value
87
+ _tag: "Suspended",
88
+ promise: new Promise(resolve => ctx.addFinalizer(resolve))
107
89
  };
108
- });
109
- return selfRx;
110
- });
111
- const suspenseRxWaiting = /*#__PURE__*/Rx.family(rx => {
112
- const selfRx = Rx.readable((get, ctx) => {
113
- const result = get(rx);
114
- if (result._tag === "Waiting" || result._tag === "Initial") {
115
- return {
116
- _tag: "Suspended",
117
- promise: new Promise(resolve => {
118
- ctx.addFinalizer(() => {
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: "Value",
131
- isWaiting: false,
132
- value: result
102
+ _tag: "Suspended",
103
+ promise: new Promise(resolve => ctx.addFinalizer(resolve))
133
104
  };
134
- });
135
- return selfRx;
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 result = useRxValue(resultRx);
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
- suspenseCache.set(resultRx, registry.mount(resultRx));
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 registry = React.useContext(RegistryContext);
159
- const resultRx = React.useMemo(() => options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx), [options?.suspendOnWaiting, rx]);
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","makeStore","registry","rx","getter","get","subscribe","f","unmount","subscribeGetter","snapshot","useRxValue","useContext","store","useRef","undefined","current","useSyncExternalStore","useSetRx","useCallback","value","set","useRefreshRx","refresh","useRx","suspenseCache","Map","suspenseRx","family","selfRx","readable","ctx","result","noWaiting","_tag","promise","Promise","resolve","addFinalizer","delete","isWaiting","suspenseRxWaiting","useRxSuspense","options","resultRx","useMemo","suspendOnWaiting","has","mount","useRxSuspenseSuccess","squash","cause"],"sources":["../src/index.ts"],"sourcesContent":[null],"mappings":"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"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-rx/rx-react",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "description": "Reactive toolkit for Effect",
5
5
  "license": "MIT",
6
6
  "repository": {
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
- let getter = function() {
30
- return registry.get(rx)
31
- }
32
- function subscribe(f: () => void): () => void {
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
- function snapshot() {
38
- return getter()
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
- return { rx, registry, subscribe, snapshot }
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 = React.useRef<RxStore<A>>(undefined as any)
50
- if (store.current?.rx !== rx || store.current?.registry !== registry) {
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 Map<Rx.Rx<any>, () => void>())
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
- const selfRx = Rx.readable((get, ctx): SuspenseResult<any, any> => {
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
- return selfRx
129
- })
125
+ )
130
126
 
131
- const suspenseRxWaiting = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) => {
132
- const selfRx = Rx.readable((get, ctx): SuspenseResult<any, any> => {
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
- return selfRx
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 result = useRxValue(resultRx)
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
- suspenseCache.set(resultRx, registry.mount(resultRx))
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 registry = React.useContext(RegistryContext)
192
- const resultRx = React.useMemo(
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 {