rexfect 0.0.7

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.
Files changed (190) hide show
  1. package/README.md +1756 -0
  2. package/dist/abortableContext.d.ts +3 -0
  3. package/dist/abortableContext.d.ts.map +1 -0
  4. package/dist/abortableContext.js +48 -0
  5. package/dist/abortableContext.js.map +1 -0
  6. package/dist/action.d.ts +64 -0
  7. package/dist/action.d.ts.map +1 -0
  8. package/dist/action.js +208 -0
  9. package/dist/action.js.map +1 -0
  10. package/dist/action.test.d.ts +2 -0
  11. package/dist/action.test.d.ts.map +1 -0
  12. package/dist/action.test.js +189 -0
  13. package/dist/action.test.js.map +1 -0
  14. package/dist/async/abortable-guard.d.ts +25 -0
  15. package/dist/async/abortable-guard.d.ts.map +1 -0
  16. package/dist/async/abortable-guard.js +33 -0
  17. package/dist/async/abortable-guard.js.map +1 -0
  18. package/dist/async/abortable.d.ts +331 -0
  19. package/dist/async/abortable.d.ts.map +1 -0
  20. package/dist/async/abortable.js +410 -0
  21. package/dist/async/abortable.js.map +1 -0
  22. package/dist/async/abortable.test.d.ts +2 -0
  23. package/dist/async/abortable.test.d.ts.map +1 -0
  24. package/dist/async/abortable.test.js +535 -0
  25. package/dist/async/abortable.test.js.map +1 -0
  26. package/dist/async/abortable.typeCheck.d.ts +8 -0
  27. package/dist/async/abortable.typeCheck.d.ts.map +1 -0
  28. package/dist/async/abortable.typeCheck.js +138 -0
  29. package/dist/async/abortable.typeCheck.js.map +1 -0
  30. package/dist/async/async.d.ts +18 -0
  31. package/dist/async/async.d.ts.map +1 -0
  32. package/dist/async/async.js +20 -0
  33. package/dist/async/async.js.map +1 -0
  34. package/dist/async/index.d.ts +15 -0
  35. package/dist/async/index.d.ts.map +1 -0
  36. package/dist/async/index.js +13 -0
  37. package/dist/async/index.js.map +1 -0
  38. package/dist/async/loadable.d.ts +7 -0
  39. package/dist/async/loadable.d.ts.map +1 -0
  40. package/dist/async/loadable.js +52 -0
  41. package/dist/async/loadable.js.map +1 -0
  42. package/dist/async/loadable.test.d.ts +2 -0
  43. package/dist/async/loadable.test.d.ts.map +1 -0
  44. package/dist/async/loadable.test.js +322 -0
  45. package/dist/async/loadable.test.js.map +1 -0
  46. package/dist/async/promiseCache.d.ts +14 -0
  47. package/dist/async/promiseCache.d.ts.map +1 -0
  48. package/dist/async/promiseCache.js +29 -0
  49. package/dist/async/promiseCache.js.map +1 -0
  50. package/dist/async/read.d.ts +120 -0
  51. package/dist/async/read.d.ts.map +1 -0
  52. package/dist/async/read.js +286 -0
  53. package/dist/async/read.js.map +1 -0
  54. package/dist/async/read.test.d.ts +2 -0
  55. package/dist/async/read.test.d.ts.map +1 -0
  56. package/dist/async/read.test.js +419 -0
  57. package/dist/async/read.test.js.map +1 -0
  58. package/dist/async/read.typeCheck.d.ts +6 -0
  59. package/dist/async/read.typeCheck.d.ts.map +1 -0
  60. package/dist/async/read.typeCheck.js +101 -0
  61. package/dist/async/read.typeCheck.js.map +1 -0
  62. package/dist/async/safe.d.ts +230 -0
  63. package/dist/async/safe.d.ts.map +1 -0
  64. package/dist/async/safe.js +247 -0
  65. package/dist/async/safe.js.map +1 -0
  66. package/dist/async/safe.test.d.ts +2 -0
  67. package/dist/async/safe.test.d.ts.map +1 -0
  68. package/dist/async/safe.test.js +447 -0
  69. package/dist/async/safe.test.js.map +1 -0
  70. package/dist/async/utils.d.ts +17 -0
  71. package/dist/async/utils.d.ts.map +1 -0
  72. package/dist/async/utils.js +38 -0
  73. package/dist/async/utils.js.map +1 -0
  74. package/dist/async/wait.d.ts +120 -0
  75. package/dist/async/wait.d.ts.map +1 -0
  76. package/dist/async/wait.js +112 -0
  77. package/dist/async/wait.js.map +1 -0
  78. package/dist/async/wait.test.d.ts +2 -0
  79. package/dist/async/wait.test.d.ts.map +1 -0
  80. package/dist/async/wait.test.js +122 -0
  81. package/dist/async/wait.test.js.map +1 -0
  82. package/dist/async/wait.typeCheck.d.ts +6 -0
  83. package/dist/async/wait.typeCheck.d.ts.map +1 -0
  84. package/dist/async/wait.typeCheck.js +104 -0
  85. package/dist/async/wait.typeCheck.js.map +1 -0
  86. package/dist/atom.d.ts +46 -0
  87. package/dist/atom.d.ts.map +1 -0
  88. package/dist/atom.js +86 -0
  89. package/dist/atom.js.map +1 -0
  90. package/dist/atom.test.d.ts +2 -0
  91. package/dist/atom.test.d.ts.map +1 -0
  92. package/dist/atom.test.js +75 -0
  93. package/dist/atom.test.js.map +1 -0
  94. package/dist/batch.d.ts +15 -0
  95. package/dist/batch.d.ts.map +1 -0
  96. package/dist/batch.js +45 -0
  97. package/dist/batch.js.map +1 -0
  98. package/dist/defer.d.ts +56 -0
  99. package/dist/defer.d.ts.map +1 -0
  100. package/dist/defer.js +49 -0
  101. package/dist/defer.js.map +1 -0
  102. package/dist/effect.d.ts +91 -0
  103. package/dist/effect.d.ts.map +1 -0
  104. package/dist/effect.js +311 -0
  105. package/dist/effect.js.map +1 -0
  106. package/dist/effect.test.d.ts +2 -0
  107. package/dist/effect.test.d.ts.map +1 -0
  108. package/dist/effect.test.js +123 -0
  109. package/dist/effect.test.js.map +1 -0
  110. package/dist/emitter.d.ts +129 -0
  111. package/dist/emitter.d.ts.map +1 -0
  112. package/dist/emitter.js +164 -0
  113. package/dist/emitter.js.map +1 -0
  114. package/dist/emitter.test.d.ts +2 -0
  115. package/dist/emitter.test.d.ts.map +1 -0
  116. package/dist/emitter.test.js +259 -0
  117. package/dist/emitter.test.js.map +1 -0
  118. package/dist/equality.d.ts +66 -0
  119. package/dist/equality.d.ts.map +1 -0
  120. package/dist/equality.js +145 -0
  121. package/dist/equality.js.map +1 -0
  122. package/dist/event.d.ts +18 -0
  123. package/dist/event.d.ts.map +1 -0
  124. package/dist/event.js +166 -0
  125. package/dist/event.js.map +1 -0
  126. package/dist/event.test.d.ts +2 -0
  127. package/dist/event.test.d.ts.map +1 -0
  128. package/dist/event.test.js +167 -0
  129. package/dist/event.test.js.map +1 -0
  130. package/dist/hooks.d.ts +152 -0
  131. package/dist/hooks.d.ts.map +1 -0
  132. package/dist/hooks.js +122 -0
  133. package/dist/hooks.js.map +1 -0
  134. package/dist/hooks.test.d.ts +2 -0
  135. package/dist/hooks.test.d.ts.map +1 -0
  136. package/dist/hooks.test.js +99 -0
  137. package/dist/hooks.test.js.map +1 -0
  138. package/dist/index.d.ts +33 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +35 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/isPromiseLike.d.ts +10 -0
  143. package/dist/isPromiseLike.d.ts.map +1 -0
  144. package/dist/isPromiseLike.js +15 -0
  145. package/dist/isPromiseLike.js.map +1 -0
  146. package/dist/pick.d.ts +22 -0
  147. package/dist/pick.d.ts.map +1 -0
  148. package/dist/pick.js +46 -0
  149. package/dist/pick.js.map +1 -0
  150. package/dist/react/index.d.ts +8 -0
  151. package/dist/react/index.d.ts.map +1 -0
  152. package/dist/react/index.js +8 -0
  153. package/dist/react/index.js.map +1 -0
  154. package/dist/react/useRx.d.ts +14 -0
  155. package/dist/react/useRx.d.ts.map +1 -0
  156. package/dist/react/useRx.js +110 -0
  157. package/dist/react/useRx.js.map +1 -0
  158. package/dist/react/useRx.test.d.ts +2 -0
  159. package/dist/react/useRx.test.d.ts.map +1 -0
  160. package/dist/react/useRx.test.js +457 -0
  161. package/dist/react/useRx.test.js.map +1 -0
  162. package/dist/strictModeTest.d.ts +11 -0
  163. package/dist/strictModeTest.d.ts.map +1 -0
  164. package/dist/strictModeTest.js +41 -0
  165. package/dist/strictModeTest.js.map +1 -0
  166. package/dist/types.d.ts +606 -0
  167. package/dist/types.d.ts.map +1 -0
  168. package/dist/types.js +5 -0
  169. package/dist/types.js.map +1 -0
  170. package/dist/untrack.d.ts +14 -0
  171. package/dist/untrack.d.ts.map +1 -0
  172. package/dist/untrack.js +17 -0
  173. package/dist/untrack.js.map +1 -0
  174. package/dist/utils/withUse.d.ts +10 -0
  175. package/dist/utils/withUse.d.ts.map +1 -0
  176. package/dist/utils/withUse.js +21 -0
  177. package/dist/utils/withUse.js.map +1 -0
  178. package/dist/utils/withUse.test.d.ts +2 -0
  179. package/dist/utils/withUse.test.d.ts.map +1 -0
  180. package/dist/utils/withUse.test.js +233 -0
  181. package/dist/utils/withUse.test.js.map +1 -0
  182. package/dist/utils.d.ts +7 -0
  183. package/dist/utils.d.ts.map +1 -0
  184. package/dist/utils.js +7 -0
  185. package/dist/utils.js.map +1 -0
  186. package/dist/utils.test.d.ts +2 -0
  187. package/dist/utils.test.d.ts.map +1 -0
  188. package/dist/utils.test.js +119 -0
  189. package/dist/utils.test.js.map +1 -0
  190. package/package.json +64 -0
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Safe execution utilities.
3
+ *
4
+ * Creates a `safe` function that wraps operations to be aware of cancellation/staleness.
5
+ * Reused by both effect context and async context.
6
+ */
7
+ import type { Abortable } from "./abortable";
8
+ /**
9
+ * Check if a value is a PromiseLike (has a .then method).
10
+ *
11
+ * @example
12
+ * isPromiseLike(Promise.resolve(1)) // true
13
+ * isPromiseLike({ then: () => {} }) // true
14
+ * isPromiseLike(42) // false
15
+ */
16
+ export declare function isPromiseLike(value: unknown): value is PromiseLike<unknown>;
17
+ /**
18
+ * Safe input: any value or parameterless function.
19
+ * Functions are invoked and their return value is processed.
20
+ */
21
+ export type SafeInput<T> = T | (() => T);
22
+ /**
23
+ * Extract the resolved type from a SafeInput.
24
+ */
25
+ export type SafeInputResult<T> = T extends () => infer R ? Awaited<R> : Awaited<T>;
26
+ type SafeAllArrayResult<T extends readonly SafeInput<any>[]> = {
27
+ -readonly [K in keyof T]: SafeInputResult<T[K]>;
28
+ };
29
+ type SafeAllObjectResult<T extends Record<string, SafeInput<any>>> = {
30
+ [K in keyof T]: SafeInputResult<T[K]>;
31
+ };
32
+ export interface SafeAll {
33
+ /**
34
+ * Wait for all inputs to complete. Returns array preserving order and types.
35
+ *
36
+ * @example
37
+ * const [user, posts] = await safe.all([fetchUser(), () => fetchPosts()]);
38
+ */
39
+ <T extends readonly SafeInput<any>[]>(inputs: [...T]): Promise<SafeAllArrayResult<T>>;
40
+ /**
41
+ * Wait for all inputs to complete. Returns object preserving keys.
42
+ *
43
+ * @example
44
+ * const { user, posts } = await safe.all({
45
+ * user: fetchUser(),
46
+ * posts: () => fetchPosts(),
47
+ * });
48
+ */
49
+ <T extends Record<string, SafeInput<any>>>(inputs: T): Promise<SafeAllObjectResult<T>>;
50
+ }
51
+ type SafeRaceArrayResult<T extends readonly SafeInput<any>[]> = SafeInputResult<T[number]>;
52
+ type SafeRaceObjectResult<T extends Record<string, SafeInput<any>>> = {
53
+ [K in keyof T]: [K, SafeInputResult<T[K]>];
54
+ }[keyof T];
55
+ export interface SafeRace {
56
+ /**
57
+ * Race inputs. Returns the first value to resolve.
58
+ *
59
+ * @example
60
+ * const fastest = await safe.race([api1(), api2(), api3()]);
61
+ */
62
+ <T extends readonly SafeInput<any>[]>(inputs: [...T]): Promise<SafeRaceArrayResult<T>>;
63
+ /**
64
+ * Race inputs. Returns [winnerKey, value] tuple.
65
+ *
66
+ * @example
67
+ * const [winner, value] = await safe.race({
68
+ * primary: primaryApi(),
69
+ * fallback: fallbackApi(),
70
+ * });
71
+ * // winner: "primary" | "fallback"
72
+ */
73
+ <T extends Record<string, SafeInput<any>>>(inputs: T): Promise<SafeRaceObjectResult<T>>;
74
+ }
75
+ type SafeSettledArrayResult<T extends readonly SafeInput<any>[]> = {
76
+ -readonly [K in keyof T]: PromiseSettledResult<SafeInputResult<T[K]>>;
77
+ };
78
+ type SafeSettledObjectResult<T extends Record<string, SafeInput<any>>> = {
79
+ [K in keyof T]: PromiseSettledResult<SafeInputResult<T[K]>>;
80
+ };
81
+ export interface SafeSettled {
82
+ /**
83
+ * Wait for all inputs to settle (resolve or reject).
84
+ *
85
+ * @example
86
+ * const results = await safe.settled([api1(), api2()]);
87
+ * results.forEach(r => {
88
+ * if (r.status === "fulfilled") console.log(r.value);
89
+ * else console.error(r.reason);
90
+ * });
91
+ */
92
+ <T extends readonly SafeInput<any>[]>(inputs: [...T]): Promise<SafeSettledArrayResult<T>>;
93
+ /**
94
+ * Wait for all inputs to settle. Returns object with PromiseSettledResult values.
95
+ *
96
+ * @example
97
+ * const { user, posts } = await safe.settled({
98
+ * user: fetchUser(),
99
+ * posts: fetchPosts(),
100
+ * });
101
+ * if (user.status === "fulfilled") console.log(user.value);
102
+ */
103
+ <T extends Record<string, SafeInput<any>>>(inputs: T): Promise<SafeSettledObjectResult<T>>;
104
+ }
105
+ export interface SafeAny {
106
+ /**
107
+ * Returns the first successful result. Throws AggregateError if all fail.
108
+ *
109
+ * @example
110
+ * const result = await safe.any([api1(), api2(), api3()]);
111
+ */
112
+ <T extends readonly SafeInput<any>[]>(inputs: [...T]): Promise<SafeRaceArrayResult<T>>;
113
+ /**
114
+ * Returns [winnerKey, value] for first success. Throws AggregateError if all fail.
115
+ *
116
+ * @example
117
+ * const [winner, value] = await safe.any({
118
+ * primary: primaryApi(),
119
+ * fallback: fallbackApi(),
120
+ * });
121
+ */
122
+ <T extends Record<string, SafeInput<any>>>(inputs: T): Promise<SafeRaceObjectResult<T>>;
123
+ }
124
+ export interface SafeCallback {
125
+ /**
126
+ * Wrap a callback to only execute if not cancelled.
127
+ * If cancelled, the callback is a no-op.
128
+ *
129
+ * @example
130
+ * const handleClick = safe.callback((e: MouseEvent) => {
131
+ * state.clicked = true;
132
+ * });
133
+ * document.addEventListener('click', handleClick);
134
+ */
135
+ <TArgs extends any[]>(callback: (...args: TArgs) => void): (...args: TArgs) => void;
136
+ }
137
+ export interface SafeDelay {
138
+ /**
139
+ * Delay execution for specified milliseconds.
140
+ * Never resolves if cancelled.
141
+ *
142
+ * @example
143
+ * // Wait 1 second
144
+ * await safe.delay(1000);
145
+ *
146
+ * // Wait and return a value
147
+ * const result = await safe.delay(500, "done");
148
+ */
149
+ <T = void>(ms: number, resolved?: T): Promise<T>;
150
+ }
151
+ /**
152
+ * Safe function type returned by createSafe.
153
+ *
154
+ * Overloads:
155
+ * 1. `safe(promise)` - Wrap promise, never resolve/reject if cancelled
156
+ * 2. `safe(normalFn, ...args)` - Call function, wrap result if promise
157
+ * 3. `safe(Abortable, ...args)` - Call with signal, wrap result if promise
158
+ */
159
+ export interface SafeFn {
160
+ /**
161
+ * Wrap a promise to never resolve/reject if cancelled.
162
+ *
163
+ * @example
164
+ * ctx.safe(fetchData()).then(data => {
165
+ * // Only runs if not cancelled
166
+ * state.data = data;
167
+ * });
168
+ */
169
+ <T>(promise: PromiseLike<T>): Promise<T>;
170
+ /**
171
+ * Call a normal function and wrap result if it's a promise.
172
+ *
173
+ * @example
174
+ * const result = await ctx.safe(myAsyncFn, arg1, arg2);
175
+ */
176
+ <TArgs extends any[], TResult>(fn: (...args: TArgs) => TResult, ...args: TArgs): TResult extends PromiseLike<infer U> ? Promise<U> : TResult;
177
+ /**
178
+ * Call an abortable function with the context's signal.
179
+ * Wraps result if it's a promise.
180
+ *
181
+ * @example
182
+ * const user = await ctx.safe(getUser, userId);
183
+ */
184
+ <TArgs extends any[], TResult>(fn: Abortable<TArgs, TResult>, ...args: TArgs): TResult extends PromiseLike<infer U> ? Promise<U> : TResult;
185
+ }
186
+ /**
187
+ * Safe function with utility methods for concurrent operations.
188
+ */
189
+ export interface SafeFnWithUtils extends SafeFn {
190
+ /** Wait for all inputs to complete */
191
+ all: SafeAll;
192
+ /** Race inputs, return first to resolve */
193
+ race: SafeRace;
194
+ /** Wait for all inputs to settle (resolve or reject) */
195
+ settled: SafeSettled;
196
+ /** Return first successful result */
197
+ any: SafeAny;
198
+ /** Wrap callback to only execute if not cancelled */
199
+ callback: SafeCallback;
200
+ /** Delay execution, never resolves if cancelled */
201
+ delay: SafeDelay;
202
+ }
203
+ /**
204
+ * Create a safe function for a given context.
205
+ *
206
+ * @param getSignal - Function to get the current AbortSignal
207
+ * @param isCancelled - Function to check if the context is cancelled/stale
208
+ * @returns A safe function with utility methods
209
+ *
210
+ * @example
211
+ * ```ts
212
+ * const safe = createSafe(
213
+ * () => abortController.signal,
214
+ * () => abortController.signal.aborted
215
+ * );
216
+ *
217
+ * // Wrap promise
218
+ * await safe(fetchData());
219
+ *
220
+ * // Call abortable function
221
+ * await safe(getUser, userId);
222
+ *
223
+ * // Concurrent operations
224
+ * const [a, b] = await safe.all([fetchA(), fetchB()]);
225
+ * const fastest = await safe.race([api1(), api2()]);
226
+ * ```
227
+ */
228
+ export declare function createSafe(getSignal: () => AbortSignal | undefined, isCancelled: () => boolean): SafeFnWithUtils;
229
+ export {};
230
+ //# sourceMappingURL=safe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe.d.ts","sourceRoot":"","sources":["../../src/async/safe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,247 @@
1
+ /**
2
+ * Safe execution utilities.
3
+ *
4
+ * Creates a `safe` function that wraps operations to be aware of cancellation/staleness.
5
+ * Reused by both effect context and async context.
6
+ */
7
+ import { isAbortable } from "./abortable-guard";
8
+ import { toPromise } from "./utils";
9
+ // =============================================================================
10
+ // UTILITY: isPromiseLike & toPromise
11
+ // =============================================================================
12
+ /**
13
+ * Check if a value is a PromiseLike (has a .then method).
14
+ *
15
+ * @example
16
+ * isPromiseLike(Promise.resolve(1)) // true
17
+ * isPromiseLike({ then: () => {} }) // true
18
+ * isPromiseLike(42) // false
19
+ */
20
+ export function isPromiseLike(value) {
21
+ return (value !== null &&
22
+ typeof value === "object" &&
23
+ "then" in value &&
24
+ typeof value.then === "function");
25
+ }
26
+ /**
27
+ * AggregateError polyfill for environments without ES2021 support.
28
+ */
29
+ class AggregateErrorImpl extends Error {
30
+ errors;
31
+ constructor(errors, message) {
32
+ super(message);
33
+ this.name = "AggregateError";
34
+ this.errors = errors;
35
+ }
36
+ }
37
+ /**
38
+ * Polyfill for Promise.any (ES2021).
39
+ * Returns first fulfilled promise, or rejects with AggregateError if all reject.
40
+ */
41
+ function promiseAny(promises) {
42
+ return new Promise((resolve, reject) => {
43
+ const promiseArray = Array.from(promises);
44
+ if (promiseArray.length === 0) {
45
+ reject(new AggregateErrorImpl([], "All promises were rejected"));
46
+ return;
47
+ }
48
+ const errors = [];
49
+ let rejectedCount = 0;
50
+ promiseArray.forEach((promise, index) => {
51
+ Promise.resolve(promise).then(resolve, (error) => {
52
+ errors[index] = error;
53
+ rejectedCount++;
54
+ if (rejectedCount === promiseArray.length) {
55
+ reject(new AggregateErrorImpl(errors, "All promises were rejected"));
56
+ }
57
+ });
58
+ });
59
+ });
60
+ }
61
+ // =============================================================================
62
+ // CREATE SAFE
63
+ // =============================================================================
64
+ /**
65
+ * Create a safe function for a given context.
66
+ *
67
+ * @param getSignal - Function to get the current AbortSignal
68
+ * @param isCancelled - Function to check if the context is cancelled/stale
69
+ * @returns A safe function with utility methods
70
+ *
71
+ * @example
72
+ * ```ts
73
+ * const safe = createSafe(
74
+ * () => abortController.signal,
75
+ * () => abortController.signal.aborted
76
+ * );
77
+ *
78
+ * // Wrap promise
79
+ * await safe(fetchData());
80
+ *
81
+ * // Call abortable function
82
+ * await safe(getUser, userId);
83
+ *
84
+ * // Concurrent operations
85
+ * const [a, b] = await safe.all([fetchA(), fetchB()]);
86
+ * const fastest = await safe.race([api1(), api2()]);
87
+ * ```
88
+ */
89
+ export function createSafe(getSignal, isCancelled) {
90
+ /**
91
+ * Wrap a promise to never resolve/reject if cancelled.
92
+ */
93
+ function wrapPromise(promise) {
94
+ return new Promise((resolve, reject) => {
95
+ promise.then((value) => {
96
+ if (!isCancelled()) {
97
+ resolve(value);
98
+ }
99
+ // Never resolve/reject if cancelled - promise stays pending
100
+ }, (error) => {
101
+ if (!isCancelled()) {
102
+ reject(error);
103
+ }
104
+ // Never resolve/reject if cancelled
105
+ });
106
+ });
107
+ }
108
+ /**
109
+ * Wrap a value - if it's a promise-like, wrap it.
110
+ */
111
+ function wrapResult(result) {
112
+ if (isPromiseLike(result)) {
113
+ return wrapPromise(result);
114
+ }
115
+ return result;
116
+ }
117
+ /**
118
+ * Convert and wrap input with never-resolve-if-cancelled behavior.
119
+ */
120
+ function wrapInput(input) {
121
+ return wrapPromise(toPromise(input));
122
+ }
123
+ /**
124
+ * The safe function implementation.
125
+ */
126
+ function safe(input, ...args) {
127
+ // Check if cancelled before doing anything
128
+ if (isCancelled()) {
129
+ // Return a never-resolving promise for consistency
130
+ if (isPromiseLike(input)) {
131
+ return new Promise(() => { });
132
+ }
133
+ // For functions, still call but wrap result
134
+ }
135
+ // Case 1: PromiseLike - wrap it
136
+ if (isPromiseLike(input)) {
137
+ return wrapPromise(input);
138
+ }
139
+ // Case 2: Abortable - call with signal and wrap result
140
+ if (isAbortable(input)) {
141
+ const signal = getSignal();
142
+ const result = input.withSignal(signal, ...args);
143
+ return wrapResult(result);
144
+ }
145
+ // Case 3: Normal function - call and wrap result
146
+ if (typeof input === "function") {
147
+ const result = input(...args);
148
+ return wrapResult(result);
149
+ }
150
+ // Fallback - shouldn't happen with proper types
151
+ return input;
152
+ }
153
+ // ---------------------------------------------------------------------------
154
+ // safe.all
155
+ // ---------------------------------------------------------------------------
156
+ const all = ((inputs) => {
157
+ if (isCancelled()) {
158
+ return new Promise(() => { });
159
+ }
160
+ if (Array.isArray(inputs)) {
161
+ return Promise.all(inputs.map(wrapInput));
162
+ }
163
+ // Object case
164
+ const obj = inputs;
165
+ const keys = Object.keys(obj);
166
+ return Promise.all(keys.map((k) => wrapInput(obj[k]))).then((values) => Object.fromEntries(keys.map((k, i) => [k, values[i]])));
167
+ });
168
+ // ---------------------------------------------------------------------------
169
+ // safe.race
170
+ // ---------------------------------------------------------------------------
171
+ const race = ((inputs) => {
172
+ if (isCancelled()) {
173
+ return new Promise(() => { });
174
+ }
175
+ if (Array.isArray(inputs)) {
176
+ return Promise.race(inputs.map(wrapInput));
177
+ }
178
+ // Object case - return [key, value] tuple
179
+ const obj = inputs;
180
+ const keys = Object.keys(obj);
181
+ return Promise.race(keys.map((k) => wrapInput(obj[k]).then((v) => [k, v])));
182
+ });
183
+ // ---------------------------------------------------------------------------
184
+ // safe.settled
185
+ // ---------------------------------------------------------------------------
186
+ const settled = ((inputs) => {
187
+ if (isCancelled()) {
188
+ return new Promise(() => { });
189
+ }
190
+ if (Array.isArray(inputs)) {
191
+ return wrapPromise(Promise.allSettled(inputs.map(toPromise)));
192
+ }
193
+ // Object case
194
+ const obj = inputs;
195
+ const keys = Object.keys(obj);
196
+ return wrapPromise(Promise.allSettled(keys.map((k) => toPromise(obj[k])))).then((results) => Object.fromEntries(keys.map((k, i) => [k, results[i]])));
197
+ });
198
+ // ---------------------------------------------------------------------------
199
+ // safe.any
200
+ // ---------------------------------------------------------------------------
201
+ const any = ((inputs) => {
202
+ if (isCancelled()) {
203
+ return new Promise(() => { });
204
+ }
205
+ if (Array.isArray(inputs)) {
206
+ return wrapPromise(promiseAny(inputs.map(toPromise)));
207
+ }
208
+ // Object case - return [key, value] tuple
209
+ const obj = inputs;
210
+ const keys = Object.keys(obj);
211
+ return wrapPromise(promiseAny(keys.map((k) => toPromise(obj[k]).then((v) => [k, v]))));
212
+ });
213
+ // ---------------------------------------------------------------------------
214
+ // safe.callback
215
+ // ---------------------------------------------------------------------------
216
+ const callback = ((cb) => {
217
+ return (...args) => {
218
+ if (isCancelled()) {
219
+ return;
220
+ }
221
+ cb(...args);
222
+ };
223
+ });
224
+ // ---------------------------------------------------------------------------
225
+ // safe.delay
226
+ // ---------------------------------------------------------------------------
227
+ const delay = ((ms, resolved) => {
228
+ if (isCancelled()) {
229
+ return new Promise(() => { });
230
+ }
231
+ return wrapPromise(new Promise((resolve) => {
232
+ setTimeout(() => resolve(resolved), ms);
233
+ }));
234
+ });
235
+ // ---------------------------------------------------------------------------
236
+ // Return safe with utilities attached
237
+ // ---------------------------------------------------------------------------
238
+ return Object.assign(safe, {
239
+ all,
240
+ race,
241
+ settled,
242
+ any,
243
+ callback,
244
+ delay,
245
+ });
246
+ }
247
+ //# sourceMappingURL=safe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe.js","sourceRoot":"","sources":["../../src/async/safe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=safe.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe.test.d.ts","sourceRoot":"","sources":["../../src/async/safe.test.ts"],"names":[],"mappings":""}