@effect-rx/rx-react 0.1.14 → 0.1.16

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 CHANGED
@@ -2,7 +2,8 @@
2
2
  * @since 1.0.0
3
3
  */
4
4
  import * as Registry from "@effect-rx/rx/Registry";
5
- import type * as Rx from "@effect-rx/rx/Rx";
5
+ import * as Result from "@effect-rx/rx/Result";
6
+ import * as Rx from "@effect-rx/rx/Rx";
6
7
  import * as React from "react";
7
8
  export * as Registry from "@effect-rx/rx/Registry";
8
9
  export * as Result from "@effect-rx/rx/Result";
@@ -32,4 +33,24 @@ export declare const useRefreshRx: <A>(rx: Rx.Rx<A> & Rx.Refreshable) => () => v
32
33
  * @category hooks
33
34
  */
34
35
  export declare const useRx: <R, W>(rx: Rx.Writable<R, W>) => readonly [value: R, setOrUpdate: (_: W | ((_: R) => W)) => void];
36
+ /**
37
+ * @since 1.0.0
38
+ * @category hooks
39
+ */
40
+ export declare const useRxSuspense: <E, A>(rx: Rx.Rx<Result.Result<E, A>>, options?: {
41
+ readonly suspendOnWaiting?: boolean;
42
+ }) => {
43
+ readonly isWaiting: boolean;
44
+ readonly value: Result.Success<E, A> | Result.Failure<E, A>;
45
+ };
46
+ /**
47
+ * @since 1.0.0
48
+ * @category hooks
49
+ */
50
+ export declare const useRxSuspenseSuccess: <E, A>(rx: Rx.Rx<Result.Result<E, A>>, options?: {
51
+ readonly suspendOnWaiting?: boolean;
52
+ }) => {
53
+ readonly isWaiting: boolean;
54
+ readonly value: A;
55
+ };
35
56
  //# sourceMappingURL=index.d.ts.map
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,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAC3C,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"}
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;AA2DZ;;;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"}
package/index.js CHANGED
@@ -3,15 +3,19 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.useSetRx = exports.useRxValue = exports.useRx = exports.useRefreshRx = exports.Rx = exports.Result = exports.RegistryContext = exports.Registry = void 0;
6
+ exports.useSetRx = exports.useRxValue = exports.useRxSuspenseSuccess = exports.useRxSuspense = exports.useRx = exports.useRefreshRx = exports.Rx = exports.Result = exports.RegistryContext = exports.Registry = void 0;
7
7
  var Registry = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect-rx/rx/Registry"));
8
8
  var Registry_1 = Registry;
9
9
  exports.Registry = Registry;
10
+ var Result = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect-rx/rx/Result"));
11
+ var Result_1 = Result;
12
+ exports.Result = Result;
13
+ var Rx = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect-rx/rx/Rx"));
14
+ var Rx_1 = Rx;
15
+ exports.Rx = Rx;
16
+ var _GlobalValue = /*#__PURE__*/require("@effect/data/GlobalValue");
17
+ var Cause = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect/io/Cause"));
10
18
  var React = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("react"));
11
- var Result_1 = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect-rx/rx/Result"));
12
- exports.Result = Result_1;
13
- var Rx_1 = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect-rx/rx/Rx"));
14
- exports.Rx = Rx_1;
15
19
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
16
20
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
17
21
  /**
@@ -89,4 +93,92 @@ const useRefreshRx = rx => {
89
93
  exports.useRefreshRx = useRefreshRx;
90
94
  const useRx = rx => [useRxValue(rx), useSetRx(rx)];
91
95
  exports.useRx = useRx;
96
+ const suspenseCache = /*#__PURE__*/(0, _GlobalValue.globalValue)("@effect-rx/rx-react/suspenseCache", () => new Map());
97
+ const suspenseRx = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
98
+ const result = get(rx);
99
+ const value = Result.noWaiting(result);
100
+ if (value._tag === "Initial") {
101
+ return {
102
+ _tag: "Suspended",
103
+ promise: new Promise(resolve => {
104
+ ctx.addFinalizer(() => {
105
+ resolve();
106
+ const unmount = suspenseCache.get(rx);
107
+ if (unmount) {
108
+ unmount();
109
+ suspenseCache.delete(rx);
110
+ }
111
+ });
112
+ })
113
+ };
114
+ }
115
+ const isWaiting = Result.isWaiting(result);
116
+ return {
117
+ _tag: "Value",
118
+ isWaiting,
119
+ value
120
+ };
121
+ }));
122
+ const suspenseRxWaiting = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
123
+ const result = get(rx);
124
+ if (result._tag === "Waiting" || result._tag === "Initial") {
125
+ return {
126
+ _tag: "Suspended",
127
+ promise: new Promise(resolve => {
128
+ ctx.addFinalizer(() => {
129
+ resolve();
130
+ const unmount = suspenseCache.get(rx);
131
+ if (unmount) {
132
+ unmount();
133
+ suspenseCache.delete(rx);
134
+ }
135
+ });
136
+ })
137
+ };
138
+ }
139
+ return {
140
+ _tag: "Value",
141
+ isWaiting: false,
142
+ value: result
143
+ };
144
+ }));
145
+ /**
146
+ * @since 1.0.0
147
+ * @category hooks
148
+ */
149
+ const useRxSuspense = (rx, options) => {
150
+ const registry = React.useContext(RegistryContext);
151
+ const resultRx = React.useMemo(() => options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx), [options?.suspendOnWaiting, rx]);
152
+ const result = useRxValue(resultRx);
153
+ if (result._tag === "Suspended") {
154
+ if (!suspenseCache.has(resultRx)) {
155
+ suspenseCache.set(resultRx, registry.mount(resultRx));
156
+ }
157
+ throw result.promise;
158
+ }
159
+ return result;
160
+ };
161
+ /**
162
+ * @since 1.0.0
163
+ * @category hooks
164
+ */
165
+ exports.useRxSuspense = useRxSuspense;
166
+ const useRxSuspenseSuccess = (rx, options) => {
167
+ const registry = React.useContext(RegistryContext);
168
+ const resultRx = React.useMemo(() => options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx), [options?.suspendOnWaiting, rx]);
169
+ const result = useRxValue(resultRx);
170
+ if (result._tag === "Suspended") {
171
+ if (!suspenseCache.has(resultRx)) {
172
+ suspenseCache.set(resultRx, registry.mount(resultRx));
173
+ }
174
+ throw result.promise;
175
+ } else if (result.value._tag === "Failure") {
176
+ throw Cause.squash(result.value.cause);
177
+ }
178
+ return {
179
+ isWaiting: result.isWaiting,
180
+ value: result.value.value
181
+ };
182
+ };
183
+ exports.useRxSuspenseSuccess = useRxSuspenseSuccess;
92
184
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Registry","_interopRequireWildcard","require","Registry_1","exports","React","Result","Result_1","Rx","Rx_1","_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"],"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","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","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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"}
package/mjs/index.mjs CHANGED
@@ -2,6 +2,10 @@
2
2
  * @since 1.0.0
3
3
  */
4
4
  import * as Registry from "@effect-rx/rx/Registry";
5
+ import * as Result from "@effect-rx/rx/Result";
6
+ import * as Rx from "@effect-rx/rx/Rx";
7
+ import { globalValue } from "@effect/data/GlobalValue";
8
+ import * as Cause from "@effect/io/Cause";
5
9
  import * as React from "react";
6
10
  import * as Registry_1 from "@effect-rx/rx/Registry";
7
11
  export { Registry_1 as Registry };
@@ -75,4 +79,90 @@ export const useRefreshRx = rx => {
75
79
  * @category hooks
76
80
  */
77
81
  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 => Rx.readable((get, ctx) => {
84
+ const result = get(rx);
85
+ const value = Result.noWaiting(result);
86
+ if (value._tag === "Initial") {
87
+ return {
88
+ _tag: "Suspended",
89
+ promise: new Promise(resolve => {
90
+ ctx.addFinalizer(() => {
91
+ resolve();
92
+ const unmount = suspenseCache.get(rx);
93
+ if (unmount) {
94
+ unmount();
95
+ suspenseCache.delete(rx);
96
+ }
97
+ });
98
+ })
99
+ };
100
+ }
101
+ const isWaiting = Result.isWaiting(result);
102
+ return {
103
+ _tag: "Value",
104
+ isWaiting,
105
+ value
106
+ };
107
+ }));
108
+ const suspenseRxWaiting = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
109
+ const result = get(rx);
110
+ if (result._tag === "Waiting" || result._tag === "Initial") {
111
+ return {
112
+ _tag: "Suspended",
113
+ promise: new Promise(resolve => {
114
+ ctx.addFinalizer(() => {
115
+ resolve();
116
+ const unmount = suspenseCache.get(rx);
117
+ if (unmount) {
118
+ unmount();
119
+ suspenseCache.delete(rx);
120
+ }
121
+ });
122
+ })
123
+ };
124
+ }
125
+ return {
126
+ _tag: "Value",
127
+ isWaiting: false,
128
+ value: result
129
+ };
130
+ }));
131
+ /**
132
+ * @since 1.0.0
133
+ * @category hooks
134
+ */
135
+ export const useRxSuspense = (rx, options) => {
136
+ const registry = React.useContext(RegistryContext);
137
+ const resultRx = React.useMemo(() => options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx), [options?.suspendOnWaiting, rx]);
138
+ const result = useRxValue(resultRx);
139
+ if (result._tag === "Suspended") {
140
+ if (!suspenseCache.has(resultRx)) {
141
+ suspenseCache.set(resultRx, registry.mount(resultRx));
142
+ }
143
+ throw result.promise;
144
+ }
145
+ return result;
146
+ };
147
+ /**
148
+ * @since 1.0.0
149
+ * @category hooks
150
+ */
151
+ export const useRxSuspenseSuccess = (rx, options) => {
152
+ const registry = React.useContext(RegistryContext);
153
+ const resultRx = React.useMemo(() => options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx), [options?.suspendOnWaiting, rx]);
154
+ const result = useRxValue(resultRx);
155
+ if (result._tag === "Suspended") {
156
+ if (!suspenseCache.has(resultRx)) {
157
+ suspenseCache.set(resultRx, registry.mount(resultRx));
158
+ }
159
+ throw result.promise;
160
+ } else if (result.value._tag === "Failure") {
161
+ throw Cause.squash(result.value.cause);
162
+ }
163
+ return {
164
+ isWaiting: result.isWaiting,
165
+ value: result.value.value
166
+ };
167
+ };
78
168
  //# sourceMappingURL=index.mjs.map
package/mjs/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["Registry","React","Result","Rx","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"],"sources":["../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,QAAQ,MAAM,wBAAwB;AAElD,OAAO,KAAKC,KAAK,MAAM,OAAO;4BAEJ,wBAAwB;uBAAtCD,QAAQ;0BACI,sBAAsB;qBAAlCE,MAAM;sBACE,kBAAkB;iBAA1BC,EAAE;AAEd;;;;AAIA,OAAO,MAAMC,eAAe,gBAAGH,KAAK,CAACI,aAAa,eAAoBL,QAAQ,CAACM,IAAI,EAAE,CAAC;AAStF,SAASC,SAASA,CAAIC,QAA2B,EAAEC,EAAY;EAC7D,IAAIC,MAAM,GAAG,SAAAA,CAAA;IACX,OAAOF,QAAQ,CAACG,GAAG,CAACF,EAAE,CAAC;EACzB,CAAC;EACD,SAASG,SAASA,CAACC,CAAa;IAC9B,MAAM,CAACF,GAAG,EAAEG,OAAO,CAAC,GAAGN,QAAQ,CAACO,eAAe,CAACN,EAAE,EAAEI,CAAC,CAAC;IACtDH,MAAM,GAAGC,GAAG;IACZ,OAAOG,OAAO;EAChB;EACA,SAASE,QAAQA,CAAA;IACf,OAAON,MAAM,EAAE;EACjB;EACA,OAAO;IAAED,EAAE;IAAED,QAAQ;IAAEI,SAAS;IAAEI;EAAQ,CAAE;AAC9C;AAEA;;;;AAIA,OAAO,MAAMC,UAAU,GAAOR,EAAY,IAAO;EAC/C,MAAMD,QAAQ,GAAGP,KAAK,CAACiB,UAAU,CAACd,eAAe,CAAC;EAClD,MAAMe,KAAK,GAAGlB,KAAK,CAACmB,MAAM,CAAaC,SAAgB,CAAC;EACxD,IAAIF,KAAK,CAACG,OAAO,EAAEb,EAAE,KAAKA,EAAE,IAAIU,KAAK,CAACG,OAAO,EAAEd,QAAQ,KAAKA,QAAQ,EAAE;IACpEW,KAAK,CAACG,OAAO,GAAGf,SAAS,CAACC,QAAQ,EAAEC,EAAE,CAAC;;EAEzC,OAAOR,KAAK,CAACsB,oBAAoB,CAACJ,KAAK,CAACG,OAAO,CAACV,SAAS,EAAEO,KAAK,CAACG,OAAO,CAACN,QAAQ,CAAC;AACpF,CAAC;AAED;;;;AAIA,OAAO,MAAMQ,QAAQ,GAAUf,EAAqB,IAAoC;EACtF,MAAMD,QAAQ,GAAGP,KAAK,CAACiB,UAAU,CAACd,eAAe,CAAC;EAClD,OAAOH,KAAK,CAACwB,WAAW,CAAEC,KAAK,IAAI;IACjC,IAAI,OAAOA,KAAK,KAAK,UAAU,EAAE;MAC/BlB,QAAQ,CAACmB,GAAG,CAAClB,EAAE,EAAGiB,KAAa,CAAClB,QAAQ,CAACG,GAAG,CAACF,EAAE,CAAC,CAAC,CAAC;MAClD;KACD,MAAM;MACLD,QAAQ,CAACmB,GAAG,CAAClB,EAAE,EAAEiB,KAAK,CAAC;;EAE3B,CAAC,EAAE,CAAClB,QAAQ,EAAEC,EAAE,CAAC,CAAC;AACpB,CAAC;AAED;;;;AAIA,OAAO,MAAMmB,YAAY,GAAOnB,EAA6B,IAAgB;EAC3E,MAAMD,QAAQ,GAAGP,KAAK,CAACiB,UAAU,CAACd,eAAe,CAAC;EAClD,OAAOH,KAAK,CAACwB,WAAW,CAAC,MAAK;IAC5BjB,QAAQ,CAACqB,OAAO,CAACpB,EAAE,CAAC;EACtB,CAAC,EAAE,CAACD,QAAQ,EAAEC,EAAE,CAAC,CAAC;AACpB,CAAC;AAED;;;;AAIA,OAAO,MAAMqB,KAAK,GAAUrB,EAAqB,IAC/C,CACEQ,UAAU,CAACR,EAAE,CAAC,EACde,QAAQ,CAACf,EAAE,CAAC,CACJ"}
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","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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-rx/rx-react",
3
- "version": "0.1.14",
3
+ "version": "0.1.16",
4
4
  "description": "Reactive toolkit for Effect",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -35,7 +35,7 @@
35
35
  "sideEffects": [],
36
36
  "author": "Effect contributors",
37
37
  "dependencies": {
38
- "@effect-rx/rx": "^0.1.14"
38
+ "@effect-rx/rx": "^0.1.15"
39
39
  },
40
40
  "peerDependencies": {
41
41
  "@effect/data": "^0.18.5",
package/src/index.ts CHANGED
@@ -2,7 +2,10 @@
2
2
  * @since 1.0.0
3
3
  */
4
4
  import * as Registry from "@effect-rx/rx/Registry"
5
- import type * as Rx from "@effect-rx/rx/Rx"
5
+ import * as Result from "@effect-rx/rx/Result"
6
+ import * as Rx from "@effect-rx/rx/Rx"
7
+ import { globalValue } from "@effect/data/GlobalValue"
8
+ import * as Cause from "@effect/io/Cause"
6
9
  import * as React from "react"
7
10
 
8
11
  export * as Registry from "@effect-rx/rx/Registry"
@@ -86,3 +89,117 @@ export const useRx = <R, W>(rx: Rx.Writable<R, W>): readonly [value: R, setOrUpd
86
89
  useRxValue(rx),
87
90
  useSetRx(rx)
88
91
  ] as const
92
+
93
+ type SuspenseResult<E, A> =
94
+ | {
95
+ readonly _tag: "Suspended"
96
+ readonly promise: Promise<void>
97
+ }
98
+ | {
99
+ readonly _tag: "Value"
100
+ readonly isWaiting: boolean
101
+ readonly value: Result.Success<E, A> | Result.Failure<E, A>
102
+ }
103
+
104
+ const suspenseCache = globalValue("@effect-rx/rx-react/suspenseCache", () => new Map<Rx.Rx<any>, () => void>())
105
+ const suspenseRx = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) =>
106
+ Rx.readable((get, ctx): SuspenseResult<any, any> => {
107
+ const result = get(rx)
108
+ const value = Result.noWaiting(result)
109
+ if (value._tag === "Initial") {
110
+ return {
111
+ _tag: "Suspended",
112
+ promise: new Promise<void>((resolve) => {
113
+ ctx.addFinalizer(() => {
114
+ resolve()
115
+ const unmount = suspenseCache.get(rx)
116
+ if (unmount) {
117
+ unmount()
118
+ suspenseCache.delete(rx)
119
+ }
120
+ })
121
+ })
122
+ } as const
123
+ }
124
+ const isWaiting = Result.isWaiting(result)
125
+ return { _tag: "Value", isWaiting, value } as const
126
+ })
127
+ )
128
+ const suspenseRxWaiting = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) =>
129
+ Rx.readable((get, ctx): SuspenseResult<any, any> => {
130
+ const result = get(rx)
131
+ if (result._tag === "Waiting" || result._tag === "Initial") {
132
+ return {
133
+ _tag: "Suspended",
134
+ promise: new Promise<void>((resolve) => {
135
+ ctx.addFinalizer(() => {
136
+ resolve()
137
+ const unmount = suspenseCache.get(rx)
138
+ if (unmount) {
139
+ unmount()
140
+ suspenseCache.delete(rx)
141
+ }
142
+ })
143
+ })
144
+ } as const
145
+ }
146
+ return { _tag: "Value", isWaiting: false, value: result } as const
147
+ })
148
+ )
149
+
150
+ /**
151
+ * @since 1.0.0
152
+ * @category hooks
153
+ */
154
+ export const useRxSuspense = <E, A>(
155
+ rx: Rx.Rx<Result.Result<E, A>>,
156
+ options?: { readonly suspendOnWaiting?: boolean }
157
+ ): {
158
+ readonly isWaiting: boolean
159
+ readonly value: Result.Success<E, A> | Result.Failure<E, A>
160
+ } => {
161
+ const registry = React.useContext(RegistryContext)
162
+ const resultRx = React.useMemo(
163
+ () => (options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx)),
164
+ [options?.suspendOnWaiting, rx]
165
+ )
166
+ const result = useRxValue(resultRx)
167
+ if (result._tag === "Suspended") {
168
+ if (!suspenseCache.has(resultRx)) {
169
+ suspenseCache.set(resultRx, registry.mount(resultRx))
170
+ }
171
+ throw result.promise
172
+ }
173
+ return result
174
+ }
175
+
176
+ /**
177
+ * @since 1.0.0
178
+ * @category hooks
179
+ */
180
+ export const useRxSuspenseSuccess = <E, A>(
181
+ rx: Rx.Rx<Result.Result<E, A>>,
182
+ options?: { readonly suspendOnWaiting?: boolean }
183
+ ): {
184
+ readonly isWaiting: boolean
185
+ readonly value: A
186
+ } => {
187
+ const registry = React.useContext(RegistryContext)
188
+ const resultRx = React.useMemo(
189
+ () => (options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx)),
190
+ [options?.suspendOnWaiting, rx]
191
+ )
192
+ const result = useRxValue(resultRx)
193
+ if (result._tag === "Suspended") {
194
+ if (!suspenseCache.has(resultRx)) {
195
+ suspenseCache.set(resultRx, registry.mount(resultRx))
196
+ }
197
+ throw result.promise
198
+ } else if (result.value._tag === "Failure") {
199
+ throw Cause.squash(result.value.cause)
200
+ }
201
+ return {
202
+ isWaiting: result.isWaiting,
203
+ value: result.value.value
204
+ }
205
+ }