@zokugun/xtry 0.7.1 → 0.8.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
@@ -174,6 +174,27 @@ All helpers:
174
174
  - execute the supplied function and capture thrown values;
175
175
  - call the optional `handler` before turning that value into `err(error)`;
176
176
 
177
+ ### xtryify helpers
178
+
179
+ `xtryify*` helpers turn any function into a reusable wrapper that always yields a `Result`, saving you from retyping `xtry(…)` every time you call it.
180
+
181
+ ```typescript
182
+ import { xtryifyAsync, xtryifySync } from '@zokugun/xtry'
183
+
184
+ const fetchUserSafely = xtryifyAsync((id: string) => fetch(`/users/${id}`).then(r => r.json()));
185
+ const parseConfig = xtryifySync(() => JSON.parse(readFileSync('config.json', 'utf8')));
186
+
187
+ const userResult = await fetchUserSafely('42');
188
+ const configResult = parseConfig();
189
+ ```
190
+
191
+ Available variants mirror the regular helpers:
192
+
193
+ - `xtryifySync(fn)` and `xtryifyAsync(fn)` return new functions that forward arguments to `fn` and capture thrown/errors as `Result` objects.
194
+ - `xtryifySyncIterable(fn)` and `xtryifyAsyncIterable(fn)` wrap functions that return iterables/async iterables, yielding streams of `Result` values.
195
+
196
+ Because the returned function already encapsulates the try/catch logic, you can share it across modules (e.g., inject into DI containers or export once for common utilities) while keeping strong `Result` typing for every call site.
197
+
177
198
  ### Partial helpers
178
199
 
179
200
  ```typescript
package/lib/cjs/async.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
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;
3
+ exports.xtryifySyncIterable = exports.xtryifySync = exports.xtryifyIterable = exports.xtryify = 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
5
  Object.defineProperty(exports, "xdeferUnknown", { enumerable: true, get: function () { return defer_js_1.xdefer; } });
6
6
  Object.defineProperty(exports, "xdefer", { enumerable: true, get: function () { return defer_js_1.xdeferAsync; } });
@@ -33,3 +33,8 @@ Object.defineProperty(exports, "xtry", { enumerable: true, get: function () { re
33
33
  Object.defineProperty(exports, "xtryIterable", { enumerable: true, get: function () { return try_js_1.xtryAsyncIterable; } });
34
34
  Object.defineProperty(exports, "xtrySync", { enumerable: true, get: function () { return try_js_1.xtrySync; } });
35
35
  Object.defineProperty(exports, "xtrySyncIterable", { enumerable: true, get: function () { return try_js_1.xtrySyncIterable; } });
36
+ var tryify_js_1 = require("./tryify.cjs");
37
+ Object.defineProperty(exports, "xtryify", { enumerable: true, get: function () { return tryify_js_1.xtryifyAsync; } });
38
+ Object.defineProperty(exports, "xtryifyIterable", { enumerable: true, get: function () { return tryify_js_1.xtryifyAsyncIterable; } });
39
+ Object.defineProperty(exports, "xtryifySync", { enumerable: true, get: function () { return tryify_js_1.xtryifySync; } });
40
+ Object.defineProperty(exports, "xtryifySyncIterable", { enumerable: true, get: function () { return tryify_js_1.xtryifySyncIterable; } });
@@ -1,3 +1,4 @@
1
+ export type { XDeferAsync, XDeferSync } from './defer.cjs';
1
2
  export { xdefer as xdeferUnknown, xdeferAsync as xdefer, xdeferSync } from './defer.cjs';
2
3
  export type { YResult, YSuccess, YFailure } from './partial.cjs';
3
4
  export { yok, yerr, yres as yresUnknown, yresAsync as yres, yresSync, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.cjs';
@@ -6,3 +7,5 @@ export { ok, err, OK, OK_NULL, OK_TRUE, OK_FALSE } from './result.cjs';
6
7
  export { stringifyError } from './stringify-error.cjs';
7
8
  export { toStringFailure } from './to-string-failure.cjs';
8
9
  export { xtry as xtryUnknown, xtryAsync as xtry, xtryAsyncIterable as xtryIterable, xtrySync, xtrySyncIterable } from './try.cjs';
10
+ export type { AsyncIteratableResult, AsyncIteratorElement, AsyncResult, SyncIteratableResult, SyncIteratorElement, SyncResult } from './tryify.cjs';
11
+ export { xtryifyAsync as xtryify, xtryifyAsyncIterable as xtryifyIterable, xtryifySync, xtryifySyncIterable } from './tryify.cjs';
package/lib/cjs/defer.cjs CHANGED
@@ -5,7 +5,7 @@ exports.xdeferAsync = xdeferAsync;
5
5
  exports.xdeferSync = xdeferSync;
6
6
  const result_js_1 = require("./result.cjs");
7
7
  const is_promise_like_js_1 = require("./utils/is-promise-like.cjs");
8
- function xdefer(callback) {
8
+ function xdefer(callback, bind, ...args) {
9
9
  // eslint-disable-next-line @typescript-eslint/promise-function-async
10
10
  return ((result) => {
11
11
  const finalize = (deferResult) => {
@@ -17,16 +17,36 @@ function xdefer(callback) {
17
17
  }
18
18
  return (result) ?? (0, result_js_1.ok)();
19
19
  };
20
- const deferredValue = callback instanceof Function ? callback() : callback;
20
+ let deferredValue;
21
+ if (callback instanceof Function) {
22
+ if (bind) {
23
+ deferredValue = Reflect.apply(callback, bind, args);
24
+ }
25
+ else {
26
+ deferredValue = callback(...args);
27
+ }
28
+ }
29
+ else {
30
+ deferredValue = callback;
31
+ }
21
32
  if ((0, is_promise_like_js_1.isPromiseLike)(deferredValue)) {
22
33
  return Promise.resolve(deferredValue).then(finalize);
23
34
  }
24
35
  return finalize(deferredValue);
25
36
  });
26
37
  }
27
- function xdeferAsync(callback) {
38
+ function xdeferAsync(callback, bind, ...args) {
28
39
  return (async (result) => {
29
- const deferResult = await (callback instanceof Promise ? callback : callback());
40
+ let deferResult;
41
+ if (callback instanceof Promise) {
42
+ deferResult = await callback;
43
+ }
44
+ else if (bind) {
45
+ deferResult = await callback.apply(bind, args);
46
+ }
47
+ else {
48
+ deferResult = await callback(...args);
49
+ }
30
50
  if (deferResult.fails) {
31
51
  if (result?.fails) {
32
52
  return result;
@@ -36,9 +56,9 @@ function xdeferAsync(callback) {
36
56
  return result ?? (0, result_js_1.ok)();
37
57
  });
38
58
  }
39
- function xdeferSync(callback) {
59
+ function xdeferSync(callback, bind, ...args) {
40
60
  return ((result) => {
41
- const deferResult = callback();
61
+ const deferResult = bind ? callback.apply(bind, args) : callback(...args);
42
62
  if (deferResult.fails) {
43
63
  if (result?.fails) {
44
64
  return result;
@@ -1,19 +1,20 @@
1
1
  import { type Failure, type Result, type Success } from './result.cjs';
2
- import { type NonPromiseCallback, type PromiseCallback } from './utils/types.cjs';
3
- type DeferAsync<E> = {
2
+ import { type NonPromiseCallback } from './utils/types.cjs';
3
+ export type XDeferAsync<E> = {
4
4
  (): Promise<Success<void>>;
5
5
  <T>(result: Success<T>): Promise<Result<T, E>>;
6
6
  <F>(result: Failure<F>): Promise<Failure<F>>;
7
7
  <T, F>(result: Result<T, F>): Promise<Result<T, E | F>>;
8
8
  };
9
- type DeferSync<E> = {
9
+ export type XDeferSync<E> = {
10
10
  (): Success<void>;
11
11
  <T>(result: Success<T>): Result<T, E>;
12
12
  <F>(result: Failure<F>): Failure<F>;
13
13
  <T, F>(result: Result<T, F>): Result<T, E | F>;
14
14
  };
15
- export declare function xdefer<E>(callback: NonPromiseCallback<Result<unknown, E>>): DeferSync<E>;
16
- export declare function xdefer<E>(callback: PromiseCallback<Result<unknown, E>>): DeferAsync<E>;
17
- export declare function xdeferAsync<E>(callback: PromiseCallback<Result<unknown, E>>): DeferAsync<E>;
18
- export declare function xdeferSync<E>(callback: NonPromiseCallback<Result<unknown, E>>): DeferSync<E>;
19
- export {};
15
+ export declare function xdefer<E, Args extends unknown[]>(callback: NonPromiseCallback<Result<unknown, E>, Args>, bind?: object, ...args: Args): XDeferSync<E>;
16
+ export declare function xdefer<E>(callback: Promise<Result<unknown, E>>): XDeferAsync<E>;
17
+ export declare function xdefer<E, Args extends unknown[]>(callback: (...args: Args) => Promise<Result<unknown, E>>, bind?: object, ...args: Args): XDeferAsync<E>;
18
+ export declare function xdeferAsync<E>(callback: Promise<Result<unknown, E>>): XDeferAsync<E>;
19
+ export declare function xdeferAsync<E, Args extends unknown[]>(callback: (...args: Args) => Promise<Result<unknown, E>>, bind?: object, ...args: Args): XDeferAsync<E>;
20
+ export declare function xdeferSync<E, Args extends unknown[]>(callback: NonPromiseCallback<Result<unknown, E>, Args>, bind?: object, ...args: Args): XDeferSync<E>;
package/lib/cjs/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
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;
3
+ exports.xtryifySyncIterable = exports.xtryifySync = exports.xtryifyAsyncIterable = exports.xtryifyAsync = 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; } });
@@ -33,3 +33,8 @@ Object.defineProperty(exports, "xtryAsync", { enumerable: true, get: function ()
33
33
  Object.defineProperty(exports, "xtryAsyncIterable", { enumerable: true, get: function () { return try_js_1.xtryAsyncIterable; } });
34
34
  Object.defineProperty(exports, "xtrySync", { enumerable: true, get: function () { return try_js_1.xtrySync; } });
35
35
  Object.defineProperty(exports, "xtrySyncIterable", { enumerable: true, get: function () { return try_js_1.xtrySyncIterable; } });
36
+ var tryify_js_1 = require("./tryify.cjs");
37
+ Object.defineProperty(exports, "xtryifyAsync", { enumerable: true, get: function () { return tryify_js_1.xtryifyAsync; } });
38
+ Object.defineProperty(exports, "xtryifyAsyncIterable", { enumerable: true, get: function () { return tryify_js_1.xtryifyAsyncIterable; } });
39
+ Object.defineProperty(exports, "xtryifySync", { enumerable: true, get: function () { return tryify_js_1.xtryifySync; } });
40
+ Object.defineProperty(exports, "xtryifySyncIterable", { enumerable: true, get: function () { return tryify_js_1.xtryifySyncIterable; } });
@@ -1,3 +1,4 @@
1
+ export type { XDeferAsync, XDeferSync } from './defer.cjs';
1
2
  export { xdefer, xdeferAsync, xdeferSync } from './defer.cjs';
2
3
  export type { YResult, YSuccess, YFailure } from './partial.cjs';
3
4
  export { yok, yerr, yres, yresAsync, yresSync, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.cjs';
@@ -6,3 +7,5 @@ export { ok, err, OK, OK_NULL, OK_TRUE, OK_FALSE } from './result.cjs';
6
7
  export { stringifyError } from './stringify-error.cjs';
7
8
  export { toStringFailure } from './to-string-failure.cjs';
8
9
  export { xtry, xtryAsync, xtryAsyncIterable, xtrySync, xtrySyncIterable } from './try.cjs';
10
+ export type { AsyncIteratableResult, AsyncIteratorElement, AsyncResult, SyncIteratableResult, SyncIteratorElement, SyncResult } from './tryify.cjs';
11
+ export { xtryifyAsync, xtryifyAsyncIterable, xtryifySync, xtryifySyncIterable } from './tryify.cjs';
package/lib/cjs/sync.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
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;
3
+ exports.xtryifyIterable = exports.xtryify = exports.xtryifyAsyncIterable = exports.xtryifyAsync = 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
5
  Object.defineProperty(exports, "xdeferUnknown", { enumerable: true, get: function () { return defer_js_1.xdefer; } });
6
6
  Object.defineProperty(exports, "xdeferAsync", { enumerable: true, get: function () { return defer_js_1.xdeferAsync; } });
@@ -33,3 +33,8 @@ Object.defineProperty(exports, "xtryAsync", { enumerable: true, get: function ()
33
33
  Object.defineProperty(exports, "xtryAsyncIterable", { enumerable: true, get: function () { return try_js_1.xtryAsyncIterable; } });
34
34
  Object.defineProperty(exports, "xtry", { enumerable: true, get: function () { return try_js_1.xtrySync; } });
35
35
  Object.defineProperty(exports, "xtryIterable", { enumerable: true, get: function () { return try_js_1.xtrySyncIterable; } });
36
+ var tryify_js_1 = require("./tryify.cjs");
37
+ Object.defineProperty(exports, "xtryifyAsync", { enumerable: true, get: function () { return tryify_js_1.xtryifyAsync; } });
38
+ Object.defineProperty(exports, "xtryifyAsyncIterable", { enumerable: true, get: function () { return tryify_js_1.xtryifyAsyncIterable; } });
39
+ Object.defineProperty(exports, "xtryify", { enumerable: true, get: function () { return tryify_js_1.xtryifySync; } });
40
+ Object.defineProperty(exports, "xtryifyIterable", { enumerable: true, get: function () { return tryify_js_1.xtryifySyncIterable; } });
@@ -1,3 +1,4 @@
1
+ export type { XDeferAsync, XDeferSync } from './defer.cjs';
1
2
  export { xdefer as xdeferUnknown, xdeferAsync, xdeferSync as xdefer } from './defer.cjs';
2
3
  export type { YResult, YSuccess, YFailure } from './partial.cjs';
3
4
  export { yok, yerr, yres as yresUnknown, yresAsync, yresSync as yres, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.cjs';
@@ -6,3 +7,5 @@ export { ok, err, OK, OK_NULL, OK_TRUE, OK_FALSE } from './result.cjs';
6
7
  export { stringifyError } from './stringify-error.cjs';
7
8
  export { toStringFailure } from './to-string-failure.cjs';
8
9
  export { xtry as xtryUnknown, xtryAsync, xtryAsyncIterable, xtrySync as xtry, xtrySyncIterable as xtryIterable } from './try.cjs';
10
+ export type { AsyncIteratableResult, AsyncIteratorElement, AsyncResult, SyncIteratableResult, SyncIteratorElement, SyncResult } from './tryify.cjs';
11
+ export { xtryifyAsync, xtryifyAsyncIterable, xtryifySync as xtryify, xtryifySyncIterable as xtryifyIterable } from './tryify.cjs';
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.xtryifyAsync = xtryifyAsync;
4
+ exports.xtryifyAsyncIterable = xtryifyAsyncIterable;
5
+ exports.xtryifySync = xtryifySync;
6
+ exports.xtryifySyncIterable = xtryifySyncIterable;
7
+ const try_js_1 = require("./try.cjs");
8
+ function xtryifyAsync(fn) {
9
+ return async function (...args) {
10
+ return (0, try_js_1.xtryAsync)(fn(...args));
11
+ };
12
+ }
13
+ function xtryifyAsyncIterable(fn) {
14
+ return function (...args) {
15
+ return (0, try_js_1.xtryAsyncIterable)(fn(...args));
16
+ };
17
+ }
18
+ function xtryifySync(fn) {
19
+ return function (...args) {
20
+ return (0, try_js_1.xtrySync)(() => fn(...args));
21
+ };
22
+ }
23
+ function xtryifySyncIterable(fn) {
24
+ return function (...args) {
25
+ return (0, try_js_1.xtrySyncIterable)(fn(...args));
26
+ };
27
+ }
@@ -0,0 +1,16 @@
1
+ import { type Result } from './result.cjs';
2
+ import { type NotPromise } from './utils/types.cjs';
3
+ export type AsyncIteratorElement<T> = T extends Promise<infer P> ? AsyncIteratorElement<P> : T extends AsyncIterator<infer E> ? E : T extends AsyncIterable<infer E> ? E : T extends {
4
+ [Symbol.asyncIterator]: (...args: unknown[]) => infer I;
5
+ } ? AsyncIteratorElement<I> : unknown;
6
+ export type SyncIteratorElement<T> = T extends Iterator<infer E> ? E : T extends Iterable<infer E> ? E : T extends {
7
+ [Symbol.iterator]: (...args: unknown[]) => infer I;
8
+ } ? SyncIteratorElement<I> : unknown;
9
+ export type AsyncResult<T extends (...args: unknown[]) => unknown, Err extends Error> = Promise<Result<Awaited<ReturnType<T>>, Err>>;
10
+ export type AsyncIteratableResult<T extends (...args: unknown[]) => unknown, Err extends Error> = AsyncIterable<Result<AsyncIteratorElement<ReturnType<T>>, Err>, unknown, unknown>;
11
+ export type SyncResult<T extends (...args: unknown[]) => NotPromise<unknown>, Err extends Error> = Result<ReturnType<T>, Err>;
12
+ export type SyncIteratableResult<T extends (...args: unknown[]) => unknown, Err extends Error> = Iterable<Result<SyncIteratorElement<ReturnType<T>>, Err>, unknown, unknown>;
13
+ export declare function xtryifyAsync<Fn extends (...args: unknown[]) => Promise<unknown>, Err extends Error>(fn: Fn): (...args: Parameters<Fn>) => AsyncResult<Fn, Err>;
14
+ export declare function xtryifyAsyncIterable<Fn extends (...args: unknown[]) => AsyncIterable<unknown>, Err extends Error>(fn: Fn): (...args: Parameters<Fn>) => AsyncIteratableResult<Fn, Err>;
15
+ export declare function xtryifySync<Fn extends (...args: unknown[]) => NotPromise<unknown>, Err extends Error>(fn: Fn): (...args: Parameters<Fn>) => SyncResult<Fn, Err>;
16
+ export declare function xtryifySyncIterable<Fn extends (...args: unknown[]) => Iterable<unknown>, Err extends Error>(fn: Fn): (...args: Parameters<Fn>) => SyncIteratableResult<Fn, Err>;
@@ -1,5 +1,5 @@
1
1
  export type NotPromise<T> = Exclude<T, Promise<unknown>>;
2
- export type NonPromiseCallback<T> = () => NotPromise<T>;
3
- export type PromiseCallback<T> = (() => Promise<T>) | Promise<T>;
4
- export type Callback<T> = NonPromiseCallback<T> | PromiseCallback<T>;
2
+ export type NonPromiseCallback<T, Args extends unknown[] = []> = (...args: Args) => NotPromise<T>;
3
+ export type PromiseCallback<T, Args extends unknown[] = []> = ((...args: Args) => Promise<T>) | Promise<T>;
4
+ export type Callback<T, Args extends unknown[] = []> = NonPromiseCallback<T, Args> | PromiseCallback<T, Args>;
5
5
  export type MaybePromise<T> = T | Promise<T>;
@@ -1,3 +1,4 @@
1
+ export type { XDeferAsync, XDeferSync } from './defer.mjs';
1
2
  export { xdefer as xdeferUnknown, xdeferAsync as xdefer, xdeferSync } from './defer.mjs';
2
3
  export type { YResult, YSuccess, YFailure } from './partial.mjs';
3
4
  export { yok, yerr, yres as yresUnknown, yresAsync as yres, yresSync, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.mjs';
@@ -6,3 +7,5 @@ export { ok, err, OK, OK_NULL, OK_TRUE, OK_FALSE } from './result.mjs';
6
7
  export { stringifyError } from './stringify-error.mjs';
7
8
  export { toStringFailure } from './to-string-failure.mjs';
8
9
  export { xtry as xtryUnknown, xtryAsync as xtry, xtryAsyncIterable as xtryIterable, xtrySync, xtrySyncIterable } from './try.mjs';
10
+ export type { AsyncIteratableResult, AsyncIteratorElement, AsyncResult, SyncIteratableResult, SyncIteratorElement, SyncResult } from './tryify.mjs';
11
+ export { xtryifyAsync as xtryify, xtryifyAsyncIterable as xtryifyIterable, xtryifySync, xtryifySyncIterable } from './tryify.mjs';
package/lib/esm/async.mjs CHANGED
@@ -4,3 +4,4 @@ export { ok, err, OK, OK_NULL, OK_TRUE, OK_FALSE } from './result.mjs';
4
4
  export { stringifyError } from './stringify-error.mjs';
5
5
  export { toStringFailure } from './to-string-failure.mjs';
6
6
  export { xtry as xtryUnknown, xtryAsync as xtry, xtryAsyncIterable as xtryIterable, xtrySync, xtrySyncIterable } from './try.mjs';
7
+ export { xtryifyAsync as xtryify, xtryifyAsyncIterable as xtryifyIterable, xtryifySync, xtryifySyncIterable } from './tryify.mjs';
@@ -1,19 +1,20 @@
1
1
  import { type Failure, type Result, type Success } from './result.mjs';
2
- import { type NonPromiseCallback, type PromiseCallback } from './utils/types.mjs';
3
- type DeferAsync<E> = {
2
+ import { type NonPromiseCallback } from './utils/types.mjs';
3
+ export type XDeferAsync<E> = {
4
4
  (): Promise<Success<void>>;
5
5
  <T>(result: Success<T>): Promise<Result<T, E>>;
6
6
  <F>(result: Failure<F>): Promise<Failure<F>>;
7
7
  <T, F>(result: Result<T, F>): Promise<Result<T, E | F>>;
8
8
  };
9
- type DeferSync<E> = {
9
+ export type XDeferSync<E> = {
10
10
  (): Success<void>;
11
11
  <T>(result: Success<T>): Result<T, E>;
12
12
  <F>(result: Failure<F>): Failure<F>;
13
13
  <T, F>(result: Result<T, F>): Result<T, E | F>;
14
14
  };
15
- export declare function xdefer<E>(callback: NonPromiseCallback<Result<unknown, E>>): DeferSync<E>;
16
- export declare function xdefer<E>(callback: PromiseCallback<Result<unknown, E>>): DeferAsync<E>;
17
- export declare function xdeferAsync<E>(callback: PromiseCallback<Result<unknown, E>>): DeferAsync<E>;
18
- export declare function xdeferSync<E>(callback: NonPromiseCallback<Result<unknown, E>>): DeferSync<E>;
19
- export {};
15
+ export declare function xdefer<E, Args extends unknown[]>(callback: NonPromiseCallback<Result<unknown, E>, Args>, bind?: object, ...args: Args): XDeferSync<E>;
16
+ export declare function xdefer<E>(callback: Promise<Result<unknown, E>>): XDeferAsync<E>;
17
+ export declare function xdefer<E, Args extends unknown[]>(callback: (...args: Args) => Promise<Result<unknown, E>>, bind?: object, ...args: Args): XDeferAsync<E>;
18
+ export declare function xdeferAsync<E>(callback: Promise<Result<unknown, E>>): XDeferAsync<E>;
19
+ export declare function xdeferAsync<E, Args extends unknown[]>(callback: (...args: Args) => Promise<Result<unknown, E>>, bind?: object, ...args: Args): XDeferAsync<E>;
20
+ export declare function xdeferSync<E, Args extends unknown[]>(callback: NonPromiseCallback<Result<unknown, E>, Args>, bind?: object, ...args: Args): XDeferSync<E>;
package/lib/esm/defer.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import { ok } from './result.mjs';
2
2
  import { isPromiseLike } from './utils/is-promise-like.mjs';
3
- export function xdefer(callback) {
3
+ export function xdefer(callback, bind, ...args) {
4
4
  // eslint-disable-next-line @typescript-eslint/promise-function-async
5
5
  return ((result) => {
6
6
  const finalize = (deferResult) => {
@@ -12,16 +12,36 @@ export function xdefer(callback) {
12
12
  }
13
13
  return (result) ?? ok();
14
14
  };
15
- const deferredValue = callback instanceof Function ? callback() : callback;
15
+ let deferredValue;
16
+ if (callback instanceof Function) {
17
+ if (bind) {
18
+ deferredValue = Reflect.apply(callback, bind, args);
19
+ }
20
+ else {
21
+ deferredValue = callback(...args);
22
+ }
23
+ }
24
+ else {
25
+ deferredValue = callback;
26
+ }
16
27
  if (isPromiseLike(deferredValue)) {
17
28
  return Promise.resolve(deferredValue).then(finalize);
18
29
  }
19
30
  return finalize(deferredValue);
20
31
  });
21
32
  }
22
- export function xdeferAsync(callback) {
33
+ export function xdeferAsync(callback, bind, ...args) {
23
34
  return (async (result) => {
24
- const deferResult = await (callback instanceof Promise ? callback : callback());
35
+ let deferResult;
36
+ if (callback instanceof Promise) {
37
+ deferResult = await callback;
38
+ }
39
+ else if (bind) {
40
+ deferResult = await callback.apply(bind, args);
41
+ }
42
+ else {
43
+ deferResult = await callback(...args);
44
+ }
25
45
  if (deferResult.fails) {
26
46
  if (result?.fails) {
27
47
  return result;
@@ -31,9 +51,9 @@ export function xdeferAsync(callback) {
31
51
  return result ?? ok();
32
52
  });
33
53
  }
34
- export function xdeferSync(callback) {
54
+ export function xdeferSync(callback, bind, ...args) {
35
55
  return ((result) => {
36
- const deferResult = callback();
56
+ const deferResult = bind ? callback.apply(bind, args) : callback(...args);
37
57
  if (deferResult.fails) {
38
58
  if (result?.fails) {
39
59
  return result;
@@ -1,3 +1,4 @@
1
+ export type { XDeferAsync, XDeferSync } from './defer.mjs';
1
2
  export { xdefer, xdeferAsync, xdeferSync } from './defer.mjs';
2
3
  export type { YResult, YSuccess, YFailure } from './partial.mjs';
3
4
  export { yok, yerr, yres, yresAsync, yresSync, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.mjs';
@@ -6,3 +7,5 @@ export { ok, err, OK, OK_NULL, OK_TRUE, OK_FALSE } from './result.mjs';
6
7
  export { stringifyError } from './stringify-error.mjs';
7
8
  export { toStringFailure } from './to-string-failure.mjs';
8
9
  export { xtry, xtryAsync, xtryAsyncIterable, xtrySync, xtrySyncIterable } from './try.mjs';
10
+ export type { AsyncIteratableResult, AsyncIteratorElement, AsyncResult, SyncIteratableResult, SyncIteratorElement, SyncResult } from './tryify.mjs';
11
+ export { xtryifyAsync, xtryifyAsyncIterable, xtryifySync, xtryifySyncIterable } from './tryify.mjs';
package/lib/esm/index.mjs CHANGED
@@ -4,3 +4,4 @@ export { ok, err, OK, OK_NULL, OK_TRUE, OK_FALSE } from './result.mjs';
4
4
  export { stringifyError } from './stringify-error.mjs';
5
5
  export { toStringFailure } from './to-string-failure.mjs';
6
6
  export { xtry, xtryAsync, xtryAsyncIterable, xtrySync, xtrySyncIterable } from './try.mjs';
7
+ export { xtryifyAsync, xtryifyAsyncIterable, xtryifySync, xtryifySyncIterable } from './tryify.mjs';
@@ -1,3 +1,4 @@
1
+ export type { XDeferAsync, XDeferSync } from './defer.mjs';
1
2
  export { xdefer as xdeferUnknown, xdeferAsync, xdeferSync as xdefer } from './defer.mjs';
2
3
  export type { YResult, YSuccess, YFailure } from './partial.mjs';
3
4
  export { yok, yerr, yres as yresUnknown, yresAsync, yresSync as yres, yep, YOK, YOK_NULL, YOK_TRUE, YOK_FALSE } from './partial.mjs';
@@ -6,3 +7,5 @@ export { ok, err, OK, OK_NULL, OK_TRUE, OK_FALSE } from './result.mjs';
6
7
  export { stringifyError } from './stringify-error.mjs';
7
8
  export { toStringFailure } from './to-string-failure.mjs';
8
9
  export { xtry as xtryUnknown, xtryAsync, xtryAsyncIterable, xtrySync as xtry, xtrySyncIterable as xtryIterable } from './try.mjs';
10
+ export type { AsyncIteratableResult, AsyncIteratorElement, AsyncResult, SyncIteratableResult, SyncIteratorElement, SyncResult } from './tryify.mjs';
11
+ export { xtryifyAsync, xtryifyAsyncIterable, xtryifySync as xtryify, xtryifySyncIterable as xtryifyIterable } from './tryify.mjs';
package/lib/esm/sync.mjs CHANGED
@@ -4,3 +4,4 @@ export { ok, err, OK, OK_NULL, OK_TRUE, OK_FALSE } from './result.mjs';
4
4
  export { stringifyError } from './stringify-error.mjs';
5
5
  export { toStringFailure } from './to-string-failure.mjs';
6
6
  export { xtry as xtryUnknown, xtryAsync, xtryAsyncIterable, xtrySync as xtry, xtrySyncIterable as xtryIterable } from './try.mjs';
7
+ export { xtryifyAsync, xtryifyAsyncIterable, xtryifySync as xtryify, xtryifySyncIterable as xtryifyIterable } from './tryify.mjs';
@@ -0,0 +1,16 @@
1
+ import { type Result } from './result.mjs';
2
+ import { type NotPromise } from './utils/types.mjs';
3
+ export type AsyncIteratorElement<T> = T extends Promise<infer P> ? AsyncIteratorElement<P> : T extends AsyncIterator<infer E> ? E : T extends AsyncIterable<infer E> ? E : T extends {
4
+ [Symbol.asyncIterator]: (...args: unknown[]) => infer I;
5
+ } ? AsyncIteratorElement<I> : unknown;
6
+ export type SyncIteratorElement<T> = T extends Iterator<infer E> ? E : T extends Iterable<infer E> ? E : T extends {
7
+ [Symbol.iterator]: (...args: unknown[]) => infer I;
8
+ } ? SyncIteratorElement<I> : unknown;
9
+ export type AsyncResult<T extends (...args: unknown[]) => unknown, Err extends Error> = Promise<Result<Awaited<ReturnType<T>>, Err>>;
10
+ export type AsyncIteratableResult<T extends (...args: unknown[]) => unknown, Err extends Error> = AsyncIterable<Result<AsyncIteratorElement<ReturnType<T>>, Err>, unknown, unknown>;
11
+ export type SyncResult<T extends (...args: unknown[]) => NotPromise<unknown>, Err extends Error> = Result<ReturnType<T>, Err>;
12
+ export type SyncIteratableResult<T extends (...args: unknown[]) => unknown, Err extends Error> = Iterable<Result<SyncIteratorElement<ReturnType<T>>, Err>, unknown, unknown>;
13
+ export declare function xtryifyAsync<Fn extends (...args: unknown[]) => Promise<unknown>, Err extends Error>(fn: Fn): (...args: Parameters<Fn>) => AsyncResult<Fn, Err>;
14
+ export declare function xtryifyAsyncIterable<Fn extends (...args: unknown[]) => AsyncIterable<unknown>, Err extends Error>(fn: Fn): (...args: Parameters<Fn>) => AsyncIteratableResult<Fn, Err>;
15
+ export declare function xtryifySync<Fn extends (...args: unknown[]) => NotPromise<unknown>, Err extends Error>(fn: Fn): (...args: Parameters<Fn>) => SyncResult<Fn, Err>;
16
+ export declare function xtryifySyncIterable<Fn extends (...args: unknown[]) => Iterable<unknown>, Err extends Error>(fn: Fn): (...args: Parameters<Fn>) => SyncIteratableResult<Fn, Err>;
@@ -0,0 +1,21 @@
1
+ import { xtryAsync, xtryAsyncIterable, xtrySync, xtrySyncIterable } from './try.mjs';
2
+ export function xtryifyAsync(fn) {
3
+ return async function (...args) {
4
+ return xtryAsync(fn(...args));
5
+ };
6
+ }
7
+ export function xtryifyAsyncIterable(fn) {
8
+ return function (...args) {
9
+ return xtryAsyncIterable(fn(...args));
10
+ };
11
+ }
12
+ export function xtryifySync(fn) {
13
+ return function (...args) {
14
+ return xtrySync(() => fn(...args));
15
+ };
16
+ }
17
+ export function xtryifySyncIterable(fn) {
18
+ return function (...args) {
19
+ return xtrySyncIterable(fn(...args));
20
+ };
21
+ }
@@ -1,5 +1,5 @@
1
1
  export type NotPromise<T> = Exclude<T, Promise<unknown>>;
2
- export type NonPromiseCallback<T> = () => NotPromise<T>;
3
- export type PromiseCallback<T> = (() => Promise<T>) | Promise<T>;
4
- export type Callback<T> = NonPromiseCallback<T> | PromiseCallback<T>;
2
+ export type NonPromiseCallback<T, Args extends unknown[] = []> = (...args: Args) => NotPromise<T>;
3
+ export type PromiseCallback<T, Args extends unknown[] = []> = ((...args: Args) => Promise<T>) | Promise<T>;
4
+ export type Callback<T, Args extends unknown[] = []> = NonPromiseCallback<T, Args> | PromiseCallback<T, Args>;
5
5
  export type MaybePromise<T> = T | Promise<T>;
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.7.1",
4
+ "version": "0.8.0",
5
5
  "author": {
6
6
  "name": "Baptiste Augrain",
7
7
  "email": "daiyam@zokugun.org"