@zokugun/xtry 0.6.4 → 0.7.0

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/README.md CHANGED
@@ -147,17 +147,32 @@ To minimize allocations when returning the same `Success` shape, you can reuse t
147
147
 
148
148
  ```
149
149
  function xtry<T, E>(func: (() => MaybePromise<T>) | Promise<T>, handler?: (error: unknown) => void | E): MaybePromise<Result<T, E>>;
150
- function xtrySync<T, E>(func: () => Exclude<T, Promise<unknown>>, handler?: (error: unknown) => void | E): Result<T, E>;
150
+ function xtry<T, E>(iterable: (() => Iterable<T>) | Iterable<T>, handler?: (error: unknown) => void | E): Iterable<Result<T, E>>;
151
+ function xtry<T, E>(iterable: (() => AsyncIterable<T>) | AsyncIterable<T>, handler?: (error: unknown) => void | E): AsyncIterable<Result<T, E>>;
151
152
  function xtryAsync<T, E>(func: (() => Promise<T>) | Promise<T>, handler?: (error: unknown) => void | E): Promise<Result<T, E>>;
153
+ function xtryAsyncIterable<T, E>(iterable: (() => MaybePromise<AsyncIterable<T>>) | MaybePromise<AsyncIterable<T>>, handler?: (error: unknown) => void | E): AsyncIterable<Result<T, E>>;
154
+ function xtrySync<T, E>(func: () => Exclude<T, Promise<unknown>>, handler?: (error: unknown) => void | E): Result<T, E>;
155
+ function xtrySyncIterable<T, E>(iterable: (() => Iterable<T>) | Iterable<T>, handler?: (error: unknown) => void | E): Iterable<Result<T, E>>;
156
+ (error: unknown) => void | E): AsyncIterable<Result<T, E>>;
152
157
 
153
158
  function stringifyError(error: unknown): string;
154
159
  ```
155
160
 
156
- `xtry` inspects the supplied value: if it is or returns a promise you get a `Promise<Result<…>>`, otherwise you get a plain `Result`. Use `xtrySync`/`xtryAsync` when you need to force a specific flavor (tree shaking, stricter contracts, etc.). All helpers:
161
+ `xtry` inspects the supplied value and chooses the matching shape:
162
+
163
+ - promises or async factories → `Promise<Result<…>>`
164
+ - async iterables → `AsyncIterable<Result<…>>`
165
+ - iterators/generators → `Iterable<Result<…>>`
166
+ - everything else → plain `Result<…>`
167
+
168
+ Wrap default collections (arrays, sets, maps, strings, typed arrays, …) inside a function if you need them treated as raw values instead of iterables.<br />
169
+ Reach for `xtrySync`/`xtryAsync` when you want to force a specific mode, and prefer the explicit `xtrySyncIterable`/`xtryAsyncIterable` exports whenever you always expect iterable outputs.<br />
170
+ `xtryIterable` and `xtryAsyncIterable` wrap synchronous or asynchronous iterables, yielding a stream of `Result` values and emitting a single `err(...)` before stopping when the underlying iterator throws or rejects.
171
+
172
+ All helpers:
157
173
 
158
174
  - execute the supplied function and capture thrown values;
159
175
  - call the optional `handler` before turning that value into `err(error)`;
160
- - never throw, making the return signature a reliable discriminated union.
161
176
 
162
177
  ### Partial helpers
163
178
 
package/lib/cjs/async.cjs CHANGED
@@ -1,12 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.xtry = exports.stringifyError = exports.OK_FALSE = exports.OK_TRUE = exports.OK_NULL = exports.OK = exports.err = exports.ok = exports.YOK_FALSE = exports.YOK_TRUE = exports.YOK_NULL = exports.YOK = exports.yep = exports.yres = exports.yerr = exports.yok = exports.xdefer = void 0;
3
+ exports.xtrySyncIterable = exports.xtrySync = exports.xtryIterable = exports.xtry = exports.xtryUnknown = exports.toStringFailure = exports.stringifyError = exports.OK_FALSE = exports.OK_TRUE = exports.OK_NULL = exports.OK = exports.err = exports.ok = exports.YOK_FALSE = exports.YOK_TRUE = exports.YOK_NULL = exports.YOK = exports.yep = exports.yresSync = exports.yres = exports.yresUnknown = exports.yerr = exports.yok = exports.xdeferSync = exports.xdefer = exports.xdeferUnknown = void 0;
4
4
  var defer_js_1 = require("./defer.cjs");
5
+ Object.defineProperty(exports, "xdeferUnknown", { enumerable: true, get: function () { return defer_js_1.xdefer; } });
5
6
  Object.defineProperty(exports, "xdefer", { enumerable: true, get: function () { return defer_js_1.xdeferAsync; } });
7
+ Object.defineProperty(exports, "xdeferSync", { enumerable: true, get: function () { return defer_js_1.xdeferSync; } });
6
8
  var partial_js_1 = require("./partial.cjs");
7
9
  Object.defineProperty(exports, "yok", { enumerable: true, get: function () { return partial_js_1.yok; } });
8
10
  Object.defineProperty(exports, "yerr", { enumerable: true, get: function () { return partial_js_1.yerr; } });
11
+ Object.defineProperty(exports, "yresUnknown", { enumerable: true, get: function () { return partial_js_1.yres; } });
9
12
  Object.defineProperty(exports, "yres", { enumerable: true, get: function () { return partial_js_1.yresAsync; } });
13
+ Object.defineProperty(exports, "yresSync", { enumerable: true, get: function () { return partial_js_1.yresSync; } });
10
14
  Object.defineProperty(exports, "yep", { enumerable: true, get: function () { return partial_js_1.yep; } });
11
15
  Object.defineProperty(exports, "YOK", { enumerable: true, get: function () { return partial_js_1.YOK; } });
12
16
  Object.defineProperty(exports, "YOK_NULL", { enumerable: true, get: function () { return partial_js_1.YOK_NULL; } });
@@ -21,5 +25,11 @@ Object.defineProperty(exports, "OK_TRUE", { enumerable: true, get: function () {
21
25
  Object.defineProperty(exports, "OK_FALSE", { enumerable: true, get: function () { return result_js_1.OK_FALSE; } });
22
26
  var stringify_error_js_1 = require("./stringify-error.cjs");
23
27
  Object.defineProperty(exports, "stringifyError", { enumerable: true, get: function () { return stringify_error_js_1.stringifyError; } });
28
+ var to_string_failure_js_1 = require("./to-string-failure.cjs");
29
+ Object.defineProperty(exports, "toStringFailure", { enumerable: true, get: function () { return to_string_failure_js_1.toStringFailure; } });
24
30
  var try_js_1 = require("./try.cjs");
31
+ Object.defineProperty(exports, "xtryUnknown", { enumerable: true, get: function () { return try_js_1.xtry; } });
25
32
  Object.defineProperty(exports, "xtry", { enumerable: true, get: function () { return try_js_1.xtryAsync; } });
33
+ Object.defineProperty(exports, "xtryIterable", { enumerable: true, get: function () { return try_js_1.xtryAsyncIterable; } });
34
+ Object.defineProperty(exports, "xtrySync", { enumerable: true, get: function () { return try_js_1.xtrySync; } });
35
+ Object.defineProperty(exports, "xtrySyncIterable", { enumerable: true, get: function () { return try_js_1.xtrySyncIterable; } });
@@ -1,7 +1,8 @@
1
- export { xdeferAsync as xdefer } from './defer.cjs';
1
+ export { xdefer as xdeferUnknown, xdeferAsync as xdefer, xdeferSync } from './defer.cjs';
2
2
  export type { YResult, YSuccess, YFailure } from './partial.cjs';
3
- export { yok, yerr, yresAsync as yres, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.cjs';
3
+ export { yok, yerr, yres as yresUnknown, yresAsync as yres, yresSync, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.cjs';
4
4
  export type { Success, Failure, Result } from './result.cjs';
5
5
  export { ok, err, OK, OK_NULL, OK_TRUE, OK_FALSE } from './result.cjs';
6
6
  export { stringifyError } from './stringify-error.cjs';
7
- export { xtryAsync as xtry } from './try.cjs';
7
+ export { toStringFailure } from './to-string-failure.cjs';
8
+ export { xtry as xtryUnknown, xtryAsync as xtry, xtryAsyncIterable as xtryIterable, xtrySync, xtrySyncIterable } from './try.cjs';
package/lib/cjs/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.xtrySync = exports.xtryAsync = exports.xtry = exports.stringifyError = exports.OK_FALSE = exports.OK_TRUE = exports.OK_NULL = exports.OK = exports.err = exports.ok = exports.YOK_FALSE = exports.YOK_TRUE = exports.YOK_NULL = exports.YOK = exports.yep = exports.yresSync = exports.yresAsync = exports.yres = exports.yerr = exports.yok = exports.xdeferSync = exports.xdeferAsync = exports.xdefer = void 0;
3
+ exports.xtrySyncIterable = exports.xtrySync = exports.xtryAsyncIterable = exports.xtryAsync = exports.xtry = exports.toStringFailure = exports.stringifyError = exports.OK_FALSE = exports.OK_TRUE = exports.OK_NULL = exports.OK = exports.err = exports.ok = exports.YOK_FALSE = exports.YOK_TRUE = exports.YOK_NULL = exports.YOK = exports.yep = exports.yresSync = exports.yresAsync = exports.yres = exports.yerr = exports.yok = exports.xdeferSync = exports.xdeferAsync = exports.xdefer = void 0;
4
4
  var defer_js_1 = require("./defer.cjs");
5
5
  Object.defineProperty(exports, "xdefer", { enumerable: true, get: function () { return defer_js_1.xdefer; } });
6
6
  Object.defineProperty(exports, "xdeferAsync", { enumerable: true, get: function () { return defer_js_1.xdeferAsync; } });
@@ -25,7 +25,11 @@ Object.defineProperty(exports, "OK_TRUE", { enumerable: true, get: function () {
25
25
  Object.defineProperty(exports, "OK_FALSE", { enumerable: true, get: function () { return result_js_1.OK_FALSE; } });
26
26
  var stringify_error_js_1 = require("./stringify-error.cjs");
27
27
  Object.defineProperty(exports, "stringifyError", { enumerable: true, get: function () { return stringify_error_js_1.stringifyError; } });
28
+ var to_string_failure_js_1 = require("./to-string-failure.cjs");
29
+ Object.defineProperty(exports, "toStringFailure", { enumerable: true, get: function () { return to_string_failure_js_1.toStringFailure; } });
28
30
  var try_js_1 = require("./try.cjs");
29
31
  Object.defineProperty(exports, "xtry", { enumerable: true, get: function () { return try_js_1.xtry; } });
30
32
  Object.defineProperty(exports, "xtryAsync", { enumerable: true, get: function () { return try_js_1.xtryAsync; } });
33
+ Object.defineProperty(exports, "xtryAsyncIterable", { enumerable: true, get: function () { return try_js_1.xtryAsyncIterable; } });
31
34
  Object.defineProperty(exports, "xtrySync", { enumerable: true, get: function () { return try_js_1.xtrySync; } });
35
+ Object.defineProperty(exports, "xtrySyncIterable", { enumerable: true, get: function () { return try_js_1.xtrySyncIterable; } });
@@ -4,4 +4,5 @@ export { yok, yerr, yres, yresAsync, yresSync, yep, YOK, YOK_NULL, YOK_TRUE, YOK
4
4
  export type { Success, Failure, Result } from './result.cjs';
5
5
  export { ok, err, OK, OK_NULL, OK_TRUE, OK_FALSE } from './result.cjs';
6
6
  export { stringifyError } from './stringify-error.cjs';
7
- export { xtry, xtryAsync, xtrySync } from './try.cjs';
7
+ export { toStringFailure } from './to-string-failure.cjs';
8
+ export { xtry, xtryAsync, xtryAsyncIterable, xtrySync, xtrySyncIterable } from './try.cjs';
package/lib/cjs/sync.cjs CHANGED
@@ -1,11 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.xtry = exports.stringifyError = exports.OK_FALSE = exports.OK_TRUE = exports.OK_NULL = exports.OK = exports.err = exports.ok = exports.YOK_FALSE = exports.YOK_TRUE = exports.YOK_NULL = exports.YOK = exports.yep = exports.yres = exports.yerr = exports.yok = exports.xdefer = void 0;
3
+ exports.xtryIterable = exports.xtry = exports.xtryAsyncIterable = exports.xtryAsync = exports.xtryUnknown = exports.toStringFailure = exports.stringifyError = exports.OK_FALSE = exports.OK_TRUE = exports.OK_NULL = exports.OK = exports.err = exports.ok = exports.YOK_FALSE = exports.YOK_TRUE = exports.YOK_NULL = exports.YOK = exports.yep = exports.yres = exports.yresAsync = exports.yresUnknown = exports.yerr = exports.yok = exports.xdefer = exports.xdeferAsync = exports.xdeferUnknown = void 0;
4
4
  var defer_js_1 = require("./defer.cjs");
5
+ Object.defineProperty(exports, "xdeferUnknown", { enumerable: true, get: function () { return defer_js_1.xdefer; } });
6
+ Object.defineProperty(exports, "xdeferAsync", { enumerable: true, get: function () { return defer_js_1.xdeferAsync; } });
5
7
  Object.defineProperty(exports, "xdefer", { enumerable: true, get: function () { return defer_js_1.xdeferSync; } });
6
8
  var partial_js_1 = require("./partial.cjs");
7
9
  Object.defineProperty(exports, "yok", { enumerable: true, get: function () { return partial_js_1.yok; } });
8
10
  Object.defineProperty(exports, "yerr", { enumerable: true, get: function () { return partial_js_1.yerr; } });
11
+ Object.defineProperty(exports, "yresUnknown", { enumerable: true, get: function () { return partial_js_1.yres; } });
12
+ Object.defineProperty(exports, "yresAsync", { enumerable: true, get: function () { return partial_js_1.yresAsync; } });
9
13
  Object.defineProperty(exports, "yres", { enumerable: true, get: function () { return partial_js_1.yresSync; } });
10
14
  Object.defineProperty(exports, "yep", { enumerable: true, get: function () { return partial_js_1.yep; } });
11
15
  Object.defineProperty(exports, "YOK", { enumerable: true, get: function () { return partial_js_1.YOK; } });
@@ -21,5 +25,11 @@ Object.defineProperty(exports, "OK_TRUE", { enumerable: true, get: function () {
21
25
  Object.defineProperty(exports, "OK_FALSE", { enumerable: true, get: function () { return result_js_1.OK_FALSE; } });
22
26
  var stringify_error_js_1 = require("./stringify-error.cjs");
23
27
  Object.defineProperty(exports, "stringifyError", { enumerable: true, get: function () { return stringify_error_js_1.stringifyError; } });
28
+ var to_string_failure_js_1 = require("./to-string-failure.cjs");
29
+ Object.defineProperty(exports, "toStringFailure", { enumerable: true, get: function () { return to_string_failure_js_1.toStringFailure; } });
24
30
  var try_js_1 = require("./try.cjs");
31
+ Object.defineProperty(exports, "xtryUnknown", { enumerable: true, get: function () { return try_js_1.xtry; } });
32
+ Object.defineProperty(exports, "xtryAsync", { enumerable: true, get: function () { return try_js_1.xtryAsync; } });
33
+ Object.defineProperty(exports, "xtryAsyncIterable", { enumerable: true, get: function () { return try_js_1.xtryAsyncIterable; } });
25
34
  Object.defineProperty(exports, "xtry", { enumerable: true, get: function () { return try_js_1.xtrySync; } });
35
+ Object.defineProperty(exports, "xtryIterable", { enumerable: true, get: function () { return try_js_1.xtrySyncIterable; } });
@@ -1,7 +1,8 @@
1
- export { xdeferSync as xdefer } from './defer.cjs';
1
+ export { xdefer as xdeferUnknown, xdeferAsync, xdeferSync as xdefer } from './defer.cjs';
2
2
  export type { YResult, YSuccess, YFailure } from './partial.cjs';
3
- export { yok, yerr, yresSync as yres, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.cjs';
3
+ export { yok, yerr, yres as yresUnknown, yresAsync, yresSync as yres, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.cjs';
4
4
  export type { Success, Failure, Result } from './result.cjs';
5
5
  export { ok, err, OK, OK_NULL, OK_TRUE, OK_FALSE } from './result.cjs';
6
6
  export { stringifyError } from './stringify-error.cjs';
7
- export { xtrySync as xtry } from './try.cjs';
7
+ export { toStringFailure } from './to-string-failure.cjs';
8
+ export { xtry as xtryUnknown, xtryAsync, xtryAsyncIterable, xtrySync as xtry, xtrySyncIterable as xtryIterable } from './try.cjs';
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toStringFailure = toStringFailure;
4
+ const result_js_1 = require("./result.cjs");
5
+ const stringify_error_js_1 = require("./stringify-error.cjs");
6
+ function toStringFailure(error) {
7
+ return (0, result_js_1.err)((0, stringify_error_js_1.stringifyError)(error));
8
+ }
@@ -0,0 +1,2 @@
1
+ import { type Failure } from './result.cjs';
2
+ export declare function toStringFailure(error: unknown): Failure<string>;
package/lib/cjs/try.cjs CHANGED
@@ -3,35 +3,44 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.xtry = xtry;
4
4
  exports.xtrySync = xtrySync;
5
5
  exports.xtryAsync = xtryAsync;
6
+ exports.xtrySyncIterable = xtrySyncIterable;
7
+ exports.xtryAsyncIterable = xtryAsyncIterable;
6
8
  const result_js_1 = require("./result.cjs");
9
+ const is_async_iterable_js_1 = require("./utils/is-async-iterable.cjs");
7
10
  const is_promise_like_js_1 = require("./utils/is-promise-like.cjs");
11
+ const is_sync_iterable_js_1 = require("./utils/is-sync-iterable.cjs");
12
+ function handleError(handler, error) {
13
+ if (handler) {
14
+ const newError = handler(error);
15
+ if (newError !== undefined) {
16
+ return (0, result_js_1.err)(newError);
17
+ }
18
+ }
19
+ return (0, result_js_1.err)(error);
20
+ } // }}}
8
21
  function xtry(func, handler) {
9
22
  // eslint-disable-next-line @typescript-eslint/promise-function-async
10
23
  const run = func instanceof Function ? func : () => func;
11
- const handleError = (error) => {
12
- if (handler) {
13
- const newError = handler(error);
14
- if (newError !== undefined) {
15
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
16
- return (0, result_js_1.err)(newError);
17
- }
18
- }
19
- return (0, result_js_1.err)(error);
20
- };
21
- const handleSuccess = (value) => (0, result_js_1.ok)(value);
22
24
  try {
23
25
  const value = run();
24
26
  if ((0, is_promise_like_js_1.isPromiseLike)(value)) {
25
- return Promise.resolve(value).then(handleSuccess, handleError);
27
+ return Promise.resolve(value).then(
28
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
29
+ (value) => (0, result_js_1.ok)(value), (error) => handleError(handler, error));
30
+ }
31
+ if ((0, is_async_iterable_js_1.isAsyncIterable)(value)) {
32
+ return xtryAsyncIterable(value, handler);
33
+ }
34
+ if ((0, is_sync_iterable_js_1.isSyncIterable)(value)) {
35
+ return xtrySyncIterable(value, handler);
26
36
  }
27
37
  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
28
38
  return (0, result_js_1.ok)(value);
29
39
  }
30
40
  catch (error) {
31
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
32
- return handleError(error);
41
+ return handleError(handler, error);
33
42
  }
34
- }
43
+ } // }}}
35
44
  function xtrySync(func, handler) {
36
45
  try {
37
46
  const value = func();
@@ -39,17 +48,9 @@ function xtrySync(func, handler) {
39
48
  return (0, result_js_1.ok)(value);
40
49
  }
41
50
  catch (error) {
42
- if (handler) {
43
- const newError = handler(error);
44
- if (newError !== undefined) {
45
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
46
- return (0, result_js_1.err)(newError);
47
- }
48
- }
49
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
50
- return (0, result_js_1.err)(error);
51
+ return handleError(handler, error);
51
52
  }
52
- }
53
+ } // }}}
53
54
  async function xtryAsync(func, handler) {
54
55
  try {
55
56
  const value = await (func instanceof Promise ? func : Promise.resolve().then(func));
@@ -57,14 +58,72 @@ async function xtryAsync(func, handler) {
57
58
  return (0, result_js_1.ok)(value);
58
59
  }
59
60
  catch (error) {
60
- if (handler) {
61
- const newError = handler(error);
62
- if (newError !== undefined) {
63
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
64
- return (0, result_js_1.err)(newError);
61
+ return handleError(handler, error);
62
+ }
63
+ } // }}}
64
+ function xtrySyncIterable(iterable, handler) {
65
+ const generator = iterable instanceof Function ? iterable : () => iterable;
66
+ function* iterate() {
67
+ let source;
68
+ try {
69
+ source = generator();
70
+ }
71
+ catch (error) {
72
+ yield handleError(handler, error);
73
+ return;
74
+ }
75
+ if (!source || typeof source[Symbol.iterator] !== 'function') {
76
+ yield handleError(handler, new TypeError('xtryIterable expects an Iterable'));
77
+ return;
78
+ }
79
+ const iterator = source[Symbol.iterator]();
80
+ while (true) {
81
+ let step;
82
+ try {
83
+ step = iterator.next();
84
+ }
85
+ catch (error) {
86
+ yield handleError(handler, error);
87
+ return;
88
+ }
89
+ if (step.done) {
90
+ return;
65
91
  }
92
+ yield (0, result_js_1.ok)(step.value);
93
+ }
94
+ }
95
+ return iterate();
96
+ } // }}}
97
+ function xtryAsyncIterable(iterable, handler) {
98
+ const generator = iterable instanceof Function ? iterable : async () => iterable;
99
+ async function* iterate() {
100
+ let source;
101
+ try {
102
+ source = await Promise.resolve(generator());
103
+ }
104
+ catch (error) {
105
+ yield handleError(handler, error);
106
+ return;
107
+ }
108
+ if (!source || typeof source[Symbol.asyncIterator] !== 'function') {
109
+ yield handleError(handler, new TypeError('xtryAsyncIterable expects an AsyncIterable'));
110
+ return;
111
+ }
112
+ const iterator = source[Symbol.asyncIterator]();
113
+ while (true) {
114
+ let step;
115
+ try {
116
+ step = await iterator.next();
117
+ }
118
+ catch (error) {
119
+ yield handleError(handler, error);
120
+ return;
121
+ }
122
+ if (step.done) {
123
+ return;
124
+ }
125
+ yield (0, result_js_1.ok)(step.value);
66
126
  }
67
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
68
- return (0, result_js_1.err)(error);
69
127
  }
70
- }
128
+ return iterate();
129
+ } // }}}
package/lib/cjs/try.d.cts CHANGED
@@ -1,9 +1,17 @@
1
1
  import { type Result } from './result.cjs';
2
- import { type NonPromiseCallback, type PromiseCallback } from './utils/types.cjs';
2
+ import { type MaybePromise, type NonPromiseCallback, type PromiseCallback } from './utils/types.cjs';
3
+ type AsyncIterableCallback<T> = (() => AsyncIterable<T>) | AsyncIterable<T>;
4
+ type AsyncIterableResult<T, E> = AsyncIterable<VoidableResult<T, E>>;
3
5
  type ErrorHandler<T> = (error: unknown) => T | undefined;
6
+ type SyncIterableCallback<T> = (() => Iterable<T>) | Iterable<T>;
7
+ type SyncIterableResult<T, E> = Iterable<VoidableResult<T, E>>;
4
8
  type VoidableResult<T, E> = E extends void ? Result<T, unknown> : Result<T, E>;
9
+ export declare function xtry<T, E = unknown>(iterable: SyncIterableCallback<T>, handler?: ErrorHandler<E>): SyncIterableResult<T, E>;
10
+ export declare function xtry<T, E = unknown>(iterable: AsyncIterableCallback<T>, handler?: ErrorHandler<E>): AsyncIterableResult<T, E>;
5
11
  export declare function xtry<T, E = unknown>(func: NonPromiseCallback<T>, handler?: ErrorHandler<E>): VoidableResult<T, E>;
6
12
  export declare function xtry<T, E = unknown>(func: PromiseCallback<T>, handler?: ErrorHandler<E>): Promise<VoidableResult<T, E>>;
7
13
  export declare function xtrySync<T, E = unknown>(func: NonPromiseCallback<T>, handler?: ErrorHandler<E>): VoidableResult<T, E>;
8
14
  export declare function xtryAsync<T, E = unknown>(func: PromiseCallback<T>, handler?: ErrorHandler<E>): Promise<VoidableResult<T, E>>;
15
+ export declare function xtrySyncIterable<T, E = unknown>(iterable: Iterable<T> | (() => Iterable<T>), handler?: ErrorHandler<E>): Iterable<VoidableResult<T, E>>;
16
+ export declare function xtryAsyncIterable<T, E = unknown>(iterable: AsyncIterable<T> | Promise<AsyncIterable<T>> | (() => MaybePromise<AsyncIterable<T>>), handler?: ErrorHandler<E>): AsyncIterable<VoidableResult<T, E>>;
9
17
  export {};
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isAsyncIterable = isAsyncIterable;
4
+ function isAsyncIterable(item) {
5
+ return item !== null && typeof item === 'object' && typeof item[Symbol.asyncIterator] === 'function';
6
+ }
@@ -0,0 +1 @@
1
+ export declare function isAsyncIterable<T>(item: unknown): item is AsyncIterableIterator<T>;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isSyncIterable = isSyncIterable;
4
+ function isSyncIterable(item) {
5
+ return item !== null && typeof item === 'object' && typeof item[Symbol.iterator] === 'function';
6
+ }
@@ -0,0 +1 @@
1
+ export declare function isSyncIterable<T>(item: unknown): item is IterableIterator<T>;
@@ -1,7 +1,8 @@
1
- export { xdeferAsync as xdefer } from './defer.mjs';
1
+ export { xdefer as xdeferUnknown, xdeferAsync as xdefer, xdeferSync } from './defer.mjs';
2
2
  export type { YResult, YSuccess, YFailure } from './partial.mjs';
3
- export { yok, yerr, yresAsync as yres, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.mjs';
3
+ export { yok, yerr, yres as yresUnknown, yresAsync as yres, yresSync, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.mjs';
4
4
  export type { Success, Failure, Result } from './result.mjs';
5
5
  export { ok, err, OK, OK_NULL, OK_TRUE, OK_FALSE } from './result.mjs';
6
6
  export { stringifyError } from './stringify-error.mjs';
7
- export { xtryAsync as xtry } from './try.mjs';
7
+ export { toStringFailure } from './to-string-failure.mjs';
8
+ export { xtry as xtryUnknown, xtryAsync as xtry, xtryAsyncIterable as xtryIterable, xtrySync, xtrySyncIterable } from './try.mjs';
package/lib/esm/async.mjs CHANGED
@@ -1,5 +1,6 @@
1
- export { xdeferAsync as xdefer } from './defer.mjs';
2
- export { yok, yerr, yresAsync as yres, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.mjs';
1
+ export { xdefer as xdeferUnknown, xdeferAsync as xdefer, xdeferSync } from './defer.mjs';
2
+ export { yok, yerr, yres as yresUnknown, yresAsync as yres, yresSync, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.mjs';
3
3
  export { ok, err, OK, OK_NULL, OK_TRUE, OK_FALSE } from './result.mjs';
4
4
  export { stringifyError } from './stringify-error.mjs';
5
- export { xtryAsync as xtry } from './try.mjs';
5
+ export { toStringFailure } from './to-string-failure.mjs';
6
+ export { xtry as xtryUnknown, xtryAsync as xtry, xtryAsyncIterable as xtryIterable, xtrySync, xtrySyncIterable } from './try.mjs';
@@ -4,4 +4,5 @@ export { yok, yerr, yres, yresAsync, yresSync, yep, YOK, YOK_NULL, YOK_TRUE, YOK
4
4
  export type { Success, Failure, Result } from './result.mjs';
5
5
  export { ok, err, OK, OK_NULL, OK_TRUE, OK_FALSE } from './result.mjs';
6
6
  export { stringifyError } from './stringify-error.mjs';
7
- export { xtry, xtryAsync, xtrySync } from './try.mjs';
7
+ export { toStringFailure } from './to-string-failure.mjs';
8
+ export { xtry, xtryAsync, xtryAsyncIterable, xtrySync, xtrySyncIterable } from './try.mjs';
package/lib/esm/index.mjs CHANGED
@@ -2,4 +2,5 @@ export { xdefer, xdeferAsync, xdeferSync } from './defer.mjs';
2
2
  export { yok, yerr, yres, yresAsync, yresSync, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.mjs';
3
3
  export { ok, err, OK, OK_NULL, OK_TRUE, OK_FALSE } from './result.mjs';
4
4
  export { stringifyError } from './stringify-error.mjs';
5
- export { xtry, xtryAsync, xtrySync } from './try.mjs';
5
+ export { toStringFailure } from './to-string-failure.mjs';
6
+ export { xtry, xtryAsync, xtryAsyncIterable, xtrySync, xtrySyncIterable } from './try.mjs';
@@ -1,7 +1,8 @@
1
- export { xdeferSync as xdefer } from './defer.mjs';
1
+ export { xdefer as xdeferUnknown, xdeferAsync, xdeferSync as xdefer } from './defer.mjs';
2
2
  export type { YResult, YSuccess, YFailure } from './partial.mjs';
3
- export { yok, yerr, yresSync as yres, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.mjs';
3
+ export { yok, yerr, yres as yresUnknown, yresAsync, yresSync as yres, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.mjs';
4
4
  export type { Success, Failure, Result } from './result.mjs';
5
5
  export { ok, err, OK, OK_NULL, OK_TRUE, OK_FALSE } from './result.mjs';
6
6
  export { stringifyError } from './stringify-error.mjs';
7
- export { xtrySync as xtry } from './try.mjs';
7
+ export { toStringFailure } from './to-string-failure.mjs';
8
+ export { xtry as xtryUnknown, xtryAsync, xtryAsyncIterable, xtrySync as xtry, xtrySyncIterable as xtryIterable } from './try.mjs';
package/lib/esm/sync.mjs CHANGED
@@ -1,5 +1,6 @@
1
- export { xdeferSync as xdefer } from './defer.mjs';
2
- export { yok, yerr, yresSync as yres, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.mjs';
1
+ export { xdefer as xdeferUnknown, xdeferAsync, xdeferSync as xdefer } from './defer.mjs';
2
+ export { yok, yerr, yres as yresUnknown, yresAsync, yresSync as yres, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.mjs';
3
3
  export { ok, err, OK, OK_NULL, OK_TRUE, OK_FALSE } from './result.mjs';
4
4
  export { stringifyError } from './stringify-error.mjs';
5
- export { xtrySync as xtry } from './try.mjs';
5
+ export { toStringFailure } from './to-string-failure.mjs';
6
+ export { xtry as xtryUnknown, xtryAsync, xtryAsyncIterable, xtrySync as xtry, xtrySyncIterable as xtryIterable } from './try.mjs';
@@ -0,0 +1,2 @@
1
+ import { type Failure } from './result.mjs';
2
+ export declare function toStringFailure(error: unknown): Failure<string>;
@@ -0,0 +1,5 @@
1
+ import { err } from './result.mjs';
2
+ import { stringifyError } from './stringify-error.mjs';
3
+ export function toStringFailure(error) {
4
+ return err(stringifyError(error));
5
+ }
package/lib/esm/try.d.mts CHANGED
@@ -1,9 +1,17 @@
1
1
  import { type Result } from './result.mjs';
2
- import { type NonPromiseCallback, type PromiseCallback } from './utils/types.mjs';
2
+ import { type MaybePromise, type NonPromiseCallback, type PromiseCallback } from './utils/types.mjs';
3
+ type AsyncIterableCallback<T> = (() => AsyncIterable<T>) | AsyncIterable<T>;
4
+ type AsyncIterableResult<T, E> = AsyncIterable<VoidableResult<T, E>>;
3
5
  type ErrorHandler<T> = (error: unknown) => T | undefined;
6
+ type SyncIterableCallback<T> = (() => Iterable<T>) | Iterable<T>;
7
+ type SyncIterableResult<T, E> = Iterable<VoidableResult<T, E>>;
4
8
  type VoidableResult<T, E> = E extends void ? Result<T, unknown> : Result<T, E>;
9
+ export declare function xtry<T, E = unknown>(iterable: SyncIterableCallback<T>, handler?: ErrorHandler<E>): SyncIterableResult<T, E>;
10
+ export declare function xtry<T, E = unknown>(iterable: AsyncIterableCallback<T>, handler?: ErrorHandler<E>): AsyncIterableResult<T, E>;
5
11
  export declare function xtry<T, E = unknown>(func: NonPromiseCallback<T>, handler?: ErrorHandler<E>): VoidableResult<T, E>;
6
12
  export declare function xtry<T, E = unknown>(func: PromiseCallback<T>, handler?: ErrorHandler<E>): Promise<VoidableResult<T, E>>;
7
13
  export declare function xtrySync<T, E = unknown>(func: NonPromiseCallback<T>, handler?: ErrorHandler<E>): VoidableResult<T, E>;
8
14
  export declare function xtryAsync<T, E = unknown>(func: PromiseCallback<T>, handler?: ErrorHandler<E>): Promise<VoidableResult<T, E>>;
15
+ export declare function xtrySyncIterable<T, E = unknown>(iterable: Iterable<T> | (() => Iterable<T>), handler?: ErrorHandler<E>): Iterable<VoidableResult<T, E>>;
16
+ export declare function xtryAsyncIterable<T, E = unknown>(iterable: AsyncIterable<T> | Promise<AsyncIterable<T>> | (() => MaybePromise<AsyncIterable<T>>), handler?: ErrorHandler<E>): AsyncIterable<VoidableResult<T, E>>;
9
17
  export {};
package/lib/esm/try.mjs CHANGED
@@ -1,32 +1,39 @@
1
1
  import { err, ok } from './result.mjs';
2
+ import { isAsyncIterable } from './utils/is-async-iterable.mjs';
2
3
  import { isPromiseLike } from './utils/is-promise-like.mjs';
4
+ import { isSyncIterable } from './utils/is-sync-iterable.mjs';
5
+ function handleError(handler, error) {
6
+ if (handler) {
7
+ const newError = handler(error);
8
+ if (newError !== undefined) {
9
+ return err(newError);
10
+ }
11
+ }
12
+ return err(error);
13
+ } // }}}
3
14
  export function xtry(func, handler) {
4
15
  // eslint-disable-next-line @typescript-eslint/promise-function-async
5
16
  const run = func instanceof Function ? func : () => func;
6
- const handleError = (error) => {
7
- if (handler) {
8
- const newError = handler(error);
9
- if (newError !== undefined) {
10
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
11
- return err(newError);
12
- }
13
- }
14
- return err(error);
15
- };
16
- const handleSuccess = (value) => ok(value);
17
17
  try {
18
18
  const value = run();
19
19
  if (isPromiseLike(value)) {
20
- return Promise.resolve(value).then(handleSuccess, handleError);
20
+ return Promise.resolve(value).then(
21
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
22
+ (value) => ok(value), (error) => handleError(handler, error));
23
+ }
24
+ if (isAsyncIterable(value)) {
25
+ return xtryAsyncIterable(value, handler);
26
+ }
27
+ if (isSyncIterable(value)) {
28
+ return xtrySyncIterable(value, handler);
21
29
  }
22
30
  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
23
31
  return ok(value);
24
32
  }
25
33
  catch (error) {
26
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
27
- return handleError(error);
34
+ return handleError(handler, error);
28
35
  }
29
- }
36
+ } // }}}
30
37
  export function xtrySync(func, handler) {
31
38
  try {
32
39
  const value = func();
@@ -34,17 +41,9 @@ export function xtrySync(func, handler) {
34
41
  return ok(value);
35
42
  }
36
43
  catch (error) {
37
- if (handler) {
38
- const newError = handler(error);
39
- if (newError !== undefined) {
40
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
41
- return err(newError);
42
- }
43
- }
44
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
45
- return err(error);
44
+ return handleError(handler, error);
46
45
  }
47
- }
46
+ } // }}}
48
47
  export async function xtryAsync(func, handler) {
49
48
  try {
50
49
  const value = await (func instanceof Promise ? func : Promise.resolve().then(func));
@@ -52,14 +51,72 @@ export async function xtryAsync(func, handler) {
52
51
  return ok(value);
53
52
  }
54
53
  catch (error) {
55
- if (handler) {
56
- const newError = handler(error);
57
- if (newError !== undefined) {
58
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
59
- return err(newError);
54
+ return handleError(handler, error);
55
+ }
56
+ } // }}}
57
+ export function xtrySyncIterable(iterable, handler) {
58
+ const generator = iterable instanceof Function ? iterable : () => iterable;
59
+ function* iterate() {
60
+ let source;
61
+ try {
62
+ source = generator();
63
+ }
64
+ catch (error) {
65
+ yield handleError(handler, error);
66
+ return;
67
+ }
68
+ if (!source || typeof source[Symbol.iterator] !== 'function') {
69
+ yield handleError(handler, new TypeError('xtryIterable expects an Iterable'));
70
+ return;
71
+ }
72
+ const iterator = source[Symbol.iterator]();
73
+ while (true) {
74
+ let step;
75
+ try {
76
+ step = iterator.next();
77
+ }
78
+ catch (error) {
79
+ yield handleError(handler, error);
80
+ return;
81
+ }
82
+ if (step.done) {
83
+ return;
60
84
  }
85
+ yield ok(step.value);
86
+ }
87
+ }
88
+ return iterate();
89
+ } // }}}
90
+ export function xtryAsyncIterable(iterable, handler) {
91
+ const generator = iterable instanceof Function ? iterable : async () => iterable;
92
+ async function* iterate() {
93
+ let source;
94
+ try {
95
+ source = await Promise.resolve(generator());
96
+ }
97
+ catch (error) {
98
+ yield handleError(handler, error);
99
+ return;
100
+ }
101
+ if (!source || typeof source[Symbol.asyncIterator] !== 'function') {
102
+ yield handleError(handler, new TypeError('xtryAsyncIterable expects an AsyncIterable'));
103
+ return;
104
+ }
105
+ const iterator = source[Symbol.asyncIterator]();
106
+ while (true) {
107
+ let step;
108
+ try {
109
+ step = await iterator.next();
110
+ }
111
+ catch (error) {
112
+ yield handleError(handler, error);
113
+ return;
114
+ }
115
+ if (step.done) {
116
+ return;
117
+ }
118
+ yield ok(step.value);
61
119
  }
62
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
63
- return err(error);
64
120
  }
65
- }
121
+ return iterate();
122
+ } // }}}
@@ -0,0 +1 @@
1
+ export declare function isAsyncIterable<T>(item: unknown): item is AsyncIterableIterator<T>;
@@ -0,0 +1,3 @@
1
+ export function isAsyncIterable(item) {
2
+ return item !== null && typeof item === 'object' && typeof item[Symbol.asyncIterator] === 'function';
3
+ }
@@ -0,0 +1 @@
1
+ export declare function isSyncIterable<T>(item: unknown): item is IterableIterator<T>;
@@ -0,0 +1,3 @@
1
+ export function isSyncIterable(item) {
2
+ return item !== null && typeof item === 'object' && typeof item[Symbol.iterator] === 'function';
3
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zokugun/xtry",
3
3
  "description": "simple try/catch wrapper returning Result",
4
- "version": "0.6.4",
4
+ "version": "0.7.0",
5
5
  "author": {
6
6
  "name": "Baptiste Augrain",
7
7
  "email": "daiyam@zokugun.org"