resultar 1.1.5 → 1.3.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.
@@ -1,131 +1,82 @@
1
- type Dedup<T> = T extends Result<infer RL, infer RR> ? Result<RL, RR> : T;
2
- type MemberListOf<T> = ((T extends unknown ? (t: T) => T : never) extends infer U ? (U extends unknown ? (u: U) => unknown : never) extends (v: infer V) => unknown ? V : never : never) extends (_: unknown) => infer W ? [...MemberListOf<Exclude<T, W>>, W] : [];
3
- type ExtractOkTypes<T extends ReadonlyArray<Result<unknown, unknown>>> = {
1
+ type ExtractOkTypes<T extends readonly Result<unknown, unknown>[]> = {
4
2
  [idx in keyof T]: T[idx] extends Result<infer U, unknown> ? U : never;
5
3
  };
6
- type ExtractOkAsyncTypes<T extends ReadonlyArray<ResultAsync<unknown, unknown>>> = {
4
+ type ExtractOkAsyncTypes<T extends readonly ResultAsync<unknown, unknown>[]> = {
7
5
  [idx in keyof T]: T[idx] extends ResultAsync<infer U, unknown> ? U : never;
8
6
  };
9
- type ExtractErrTypes<T extends ReadonlyArray<Result<unknown, unknown>>> = {
7
+ type ExtractErrTypes<T extends readonly Result<unknown, unknown>[]> = {
10
8
  [idx in keyof T]: T[idx] extends Result<unknown, infer E> ? E : never;
11
9
  };
12
- type ExtractErrAsyncTypes<T extends ReadonlyArray<ResultAsync<unknown, unknown>>> = {
10
+ type ExtractErrAsyncTypes<T extends readonly ResultAsync<unknown, unknown>[]> = {
13
11
  [idx in keyof T]: T[idx] extends ResultAsync<unknown, infer E> ? E : never;
14
12
  };
15
13
  type InferOkTypes<R> = R extends Result<infer T, unknown> ? T : never;
16
14
  type InferErrTypes<R> = R extends Result<unknown, infer E> ? E : never;
17
15
  type InferAsyncOkTypes<R> = R extends ResultAsync<infer T, unknown> ? T : never;
18
16
  type InferAsyncErrTypes<R> = R extends ResultAsync<unknown, infer E> ? E : never;
19
- type IsLiteralArray<T> = T extends {
20
- length: infer L;
21
- } ? L extends number ? number extends L ? 0 : 1 : 0 : 0;
22
- type EmptyArrayToNever<T, NeverArrayToNever extends number = 0> = T extends [] ? never : NeverArrayToNever extends 1 ? T extends [never, ...infer Rest] ? [EmptyArrayToNever<Rest>] extends [never] ? never : T : T : T;
23
- type Prev = [
24
- never,
25
- 0,
26
- 1,
27
- 2,
28
- 3,
29
- 4,
30
- 5,
31
- 6,
32
- 7,
33
- 8,
34
- 9,
35
- 10,
36
- 11,
37
- 12,
38
- 13,
39
- 14,
40
- 15,
41
- 16,
42
- 17,
43
- 18,
44
- 19,
45
- 20,
46
- 21,
47
- 22,
48
- 23,
49
- 24,
50
- 25,
51
- 26,
52
- 27,
53
- 28,
54
- 29,
55
- 30,
56
- 31,
57
- 32,
58
- 33,
59
- 34,
60
- 35,
61
- 36,
62
- 37,
63
- 38,
64
- 39,
65
- 40,
66
- 41,
67
- 42,
68
- 43,
69
- 44,
70
- 45,
71
- 46,
72
- 47,
73
- 48,
74
- 49,
75
- ...Array<0>
76
- ];
77
- type Transpose<A, Transposed extends unknown[][] = [], Depth extends number = 10> = A extends [infer T, ...infer Rest] ? T extends [infer L, infer R] ? Transposed extends [infer PL, infer PR] ? PL extends unknown[] ? PR extends unknown[] ? Transpose<Rest, [[...PL, L], [...PR, R]], Prev[Depth]> : never : never : Transpose<Rest, [[L], [R]], Prev[Depth]> : Transposed : Transposed;
78
- type CollectResults<T, Collected extends unknown[] = [], Depth extends number = 50> = [
79
- Depth
80
- ] extends [never] ? [] : T extends [infer H, ...infer Rest] ? H extends Result<infer L, infer R> ? CollectResults<Rest, [
81
- ...Collected,
82
- [L, R]
83
- ], Prev[Depth]> : never : Collected;
84
- type UnknownMembersToNever<T> = T extends [infer H, ...infer R] ? [[unknown] extends [H] ? never : H, ...UnknownMembersToNever<R>] : T;
85
- type MembersToUnion<T> = T extends unknown[] ? T[number] : never;
86
- type Combine<T, Depth extends number = 5> = Transpose<CollectResults<T>, [], Depth> extends [
87
- infer L,
88
- infer R
89
- ] ? [UnknownMembersToNever<L>, UnknownMembersToNever<R>] : Transpose<CollectResults<T>, [], Depth> extends [] ? [[], []] : never;
90
- type Traverse<T, Depth extends number = 5> = Combine<T, Depth> extends [infer Oks, infer Errs] ? Result<EmptyArrayToNever<Oks, 1>, MembersToUnion<Errs>> : never;
91
- type TraverseWithAllErrors<T, Depth extends number = 5> = Combine<T, Depth> extends [
92
- infer Oks,
93
- infer Errs
94
- ] ? Result<EmptyArrayToNever<Oks>, EmptyArrayToNever<Errs>> : never;
95
- type CombineResults<T extends ReadonlyArray<Result<unknown, unknown>>> = IsLiteralArray<T> extends 1 ? Traverse<T> : Result<ExtractOkTypes<T>, ExtractErrTypes<T>[number]>;
96
- type CombineResultsWithAllErrorsArray<T extends ReadonlyArray<Result<unknown, unknown>>> = IsLiteralArray<T> extends 1 ? TraverseWithAllErrors<T> : Result<ExtractOkTypes<T>, Array<ExtractErrTypes<T>[number]>>;
97
- declare const combineResultAsyncList: <T, E>(asyncResultList: ReadonlyArray<ResultAsync<T, E>>) => ResultAsync<readonly T[], E>;
98
17
  /**
99
18
  * Short circuits on the FIRST Err value that we find
100
19
  */
101
- declare const combineResultList: <T, E>(resultList: ReadonlyArray<Result<T, E>>) => Result<readonly T[], E>;
102
- declare const combineResultAsyncListWithAllErrors: <T, E>(asyncResultList: ReadonlyArray<ResultAsync<T, E>>) => ResultAsync<readonly T[], E[]>;
20
+ declare const combineResultList: <T, E>(resultList: readonly Result<T, E>[]) => Result<readonly T[], E>;
21
+ declare const combineResultAsyncList: <T, E>(asyncResultList: readonly ResultAsync<T, E>[]) => ResultAsync<readonly T[], E>;
103
22
  /**
104
23
  * Give a list of all the errors we find
105
24
  */
106
- declare const combineResultListWithAllErrors: <T, E>(resultList: ReadonlyArray<Result<T, E>>) => Result<readonly T[], E[]>;
25
+ declare const combineResultListWithAllErrors: <T, E>(resultList: readonly Result<T, E>[]) => Result<readonly T[], E[]>;
26
+ declare const combineResultAsyncListWithAllErrors: <T, E>(asyncResultList: readonly ResultAsync<T, E>[]) => ResultAsync<readonly T[], E[]>;
107
27
 
108
- type CombineResultAsyncs<T extends ReadonlyArray<ResultAsync<unknown, unknown>>> = IsLiteralArray<T> extends 1 ? TraverseAsync<UnwrapAsync<T>> : ResultAsync<ExtractOkAsyncTypes<T>, ExtractErrAsyncTypes<T>[number]>;
109
- type CombineResultsWithAllErrorsArrayAsync<T extends ReadonlyArray<ResultAsync<unknown, unknown>>> = IsLiteralArray<T> extends 1 ? TraverseWithAllErrorsAsync<UnwrapAsync<T>> : ResultAsync<ExtractOkAsyncTypes<T>, Array<ExtractErrAsyncTypes<T>[number]>>;
110
- type UnwrapAsync<T> = IsLiteralArray<T> extends 1 ? Writable<T> extends [infer H, ...infer Rest] ? H extends PromiseLike<infer HI> ? HI extends Result<unknown, unknown> ? [Dedup<HI>, ...UnwrapAsync<Rest>] : never : never : [] : T extends Array<infer A> ? A extends PromiseLike<infer HI> ? HI extends Result<infer L, infer R> ? Array<Result<L, R>> : never : never : never;
111
- type TraverseAsync<T, Depth extends number = 5> = IsLiteralArray<T> extends 1 ? Combine<T, Depth> extends [infer Oks, infer Errs] ? ResultAsync<EmptyArrayToNever<Oks>, MembersToUnion<Errs>> : never : T extends Array<infer I> ? Combine<MemberListOf<I>, Depth> extends [infer Oks, infer Errs] ? Oks extends unknown[] ? Errs extends unknown[] ? ResultAsync<EmptyArrayToNever<Array<Oks[number]>>, MembersToUnion<Array<Errs[number]>>> : ResultAsync<EmptyArrayToNever<Array<Oks[number]>>, Errs> : Errs extends unknown[] ? ResultAsync<Oks, MembersToUnion<Array<Errs[number]>>> : ResultAsync<Oks, Errs> : never : never;
112
- type TraverseWithAllErrorsAsync<T, Depth extends number = 5> = IsLiteralArray<T> extends 1 ? Combine<T, Depth> extends [infer Oks, infer Errs] ? ResultAsync<EmptyArrayToNever<Oks>, EmptyArrayToNever<Errs>> : never : Writable<T> extends Array<infer I> ? Combine<MemberListOf<I>, Depth> extends [infer Oks, infer Errs] ? Oks extends unknown[] ? Errs extends unknown[] ? ResultAsync<EmptyArrayToNever<Array<Oks[number]>>, EmptyArrayToNever<Array<Errs[number]>>> : ResultAsync<EmptyArrayToNever<Array<Oks[number]>>, Errs> : Errs extends unknown[] ? ResultAsync<Oks, EmptyArrayToNever<Array<Errs[number]>>> : ResultAsync<Oks, Errs> : never : never;
113
- type Writable<T> = T extends readonly unknown[] ? [...T] : T;
114
28
  declare class DisposableResultAsync<T, E> implements PromiseLike<Result<T, E>> {
115
29
  private readonly innerPromise;
116
30
  constructor(res: Promise<Result<T, E>>);
117
31
  then<A, B>(// eslint-disable-line unicorn/no-thenable
118
32
  successCallback?: (res: Result<T, E>) => A | PromiseLike<A>, failureCallback?: (reason: unknown) => B | PromiseLike<B>): PromiseLike<A | B>;
119
33
  }
34
+ /**
35
+ * The ResultAsync type.
36
+ * This is a union of `Result` and `PromiseLike<Result>`
37
+ */
120
38
  declare class ResultAsync<T, E> implements PromiseLike<Result<T, E>> {
39
+ /**
40
+ * Returns a ResultAsync instance that is immediately resolved with a Result.ok(value).
41
+ *
42
+ * @param {T} value - The value to be wrapped in a Result.ok.
43
+ * @return {ResultAsync<T, E>} A ResultAsync instance with the given value and error type E.
44
+ */
121
45
  static okAsync<T, E = never>(value: T): ResultAsync<T, E>;
46
+ /**
47
+ * Returns a ResultAsync that is immediately resolved with a Result.ok(undefined) value.
48
+ *
49
+ * @return {ResultAsync<undefined, E>} A ResultAsync instance with undefined as the value type and E as the error type.
50
+ */
51
+ static unitAsync<E = never>(): ResultAsync<undefined, E>;
52
+ /**
53
+ * Returns a ResultAsync instance that is immediately resolved with a Result.err(error).
54
+ *
55
+ * @param {E} error - The error to be wrapped in a Result.err.
56
+ * @return {ResultAsync<T, E>} A ResultAsync instance with the given error and value type T.
57
+ */
122
58
  static errAsync<T = never, E = unknown>(error: E): ResultAsync<T, E>;
59
+ /**
60
+ * Returns a ResultAsync instance that is resolved with a Result.ok(value) or Result.err(error)
61
+ * based on the provided promise.
62
+ *
63
+ * @param {Promise<T>} promise - The promise to be wrapped in a ResultAsync.
64
+ * @return {ResultAsync<T, E>} A ResultAsync instance with the given promise and error type E.
65
+ */
123
66
  static fromSafePromise<T, E = never>(promise: PromiseLike<T>): ResultAsync<T, E>;
67
+ /**
68
+ * Returns a ResultAsync instance that is resolved with a Result.ok(value) or Result.err(error)
69
+ * based on the provided promise.
70
+ *
71
+ * @param {Promise<T>} promise - The promise to be wrapped in a ResultAsync.
72
+ * @param {(e: unknown) => E} errorFn - A function that transforms the error from the promise into the error type E.
73
+ * @return {ResultAsync<T, E>} A ResultAsync instance with the given promise and error type E.
74
+ */
124
75
  static fromPromise<T, E>(promise: PromiseLike<T>, errorFn: (e: unknown) => E): ResultAsync<T, E>;
125
- static combine<T extends readonly [ResultAsync<unknown, unknown>, ...Array<ResultAsync<unknown, unknown>>]>(asyncResultList: T): CombineResultAsyncs<T>;
126
- static combine<T extends ReadonlyArray<ResultAsync<unknown, unknown>>>(asyncResultList: T): CombineResultAsyncs<T>;
127
- static combineWithAllErrors<T extends readonly [ResultAsync<unknown, unknown>, ...Array<ResultAsync<unknown, unknown>>]>(asyncResultList: T): CombineResultsWithAllErrorsArrayAsync<T>;
128
- static combineWithAllErrors<T extends ReadonlyArray<ResultAsync<unknown, unknown>>>(asyncResultList: T): CombineResultsWithAllErrorsArrayAsync<T>;
76
+ static combine<T extends readonly [ResultAsync<unknown, unknown>, ...ResultAsync<unknown, unknown>[]]>(asyncResultList: T): CombineResultAsyncs<T>;
77
+ static combine<T extends readonly ResultAsync<unknown, unknown>[]>(asyncResultList: T): CombineResultAsyncs<T>;
78
+ static combineWithAllErrors<T extends readonly [ResultAsync<unknown, unknown>, ...ResultAsync<unknown, unknown>[]]>(asyncResultList: T): CombineResultsWithAllErrorsArrayAsync<T>;
79
+ static combineWithAllErrors<T extends readonly ResultAsync<unknown, unknown>[]>(asyncResultList: T): CombineResultsWithAllErrorsArrayAsync<T>;
129
80
  /**
130
81
  * Wraps a async function with a try catch, creating a new function with the same
131
82
  * arguments but returning `Ok` if successful, `Err` if the function throws
@@ -152,7 +103,7 @@ declare class ResultAsync<T, E> implements PromiseLike<Result<T, E>> {
152
103
  orElse<R extends Result<unknown, unknown>>(f: (e: E) => R): ResultAsync<InferOkTypes<R> | T, InferErrTypes<R>>;
153
104
  orElse<R extends ResultAsync<unknown, unknown>>(f: (e: E) => R): ResultAsync<InferAsyncOkTypes<R> | T, InferAsyncErrTypes<R>>;
154
105
  orElse<U, A>(f: (e: E) => Result<U, A> | ResultAsync<U, A>): ResultAsync<U | T, A>;
155
- match<X>(ok: (t: T) => X, err: (e: E) => X): Promise<X>;
106
+ match<A, B = A>(ok: (t: T) => A, fnErr: (e: E) => B): Promise<A | B>;
156
107
  unwrapOr<A>(t: A): Promise<T | A>;
157
108
  /**
158
109
  * Performs a side effect for the `Ok` variant of `ResultAsync`.
@@ -182,24 +133,25 @@ declare class ResultAsync<T, E> implements PromiseLike<Result<T, E>> {
182
133
  */
183
134
  safeUnwrap(): AsyncGenerator<Result<never, E>, T>;
184
135
  }
136
+ /**
137
+ * @deprecated Use `safeTry` instead.
138
+ * @see `safeTry`
139
+ *
140
+ * This will be removed in the next major version.
141
+ */
142
+ declare function safeTryAsync<T, E>(body: () => AsyncGenerator<Result<never, E>, Result<T, E>>): ResultAsync<T, E>;
185
143
  declare const okAsync: typeof ResultAsync.okAsync;
186
144
  declare const errAsync: typeof ResultAsync.errAsync;
187
145
  declare const fromPromise: typeof ResultAsync.fromPromise;
188
146
  declare const fromSafePromise: typeof ResultAsync.fromSafePromise;
147
+ declare const unitAsync: typeof ResultAsync.unitAsync;
189
148
  declare const fromThrowableAsync: typeof ResultAsync.fromThrowable;
190
- /**
191
- * Evaluates the given generator to a Result returned or an Err yielded from it,
192
- * whichever comes first.
193
- *
194
- * This function, in combination with `Result.safeUnwrap()`, is intended to emulate
195
- * Rust's ? operator.
196
- * See `/tests/safeTry.test.ts` for examples.
197
- *
198
- * @param body - What is evaluated. In body, `yield* result.safeUnwrap()` works as
199
- * Rust's `result?` expression.
200
- * @returns The first occurence of either an yielded Err or a returned `ResultAsync`.
201
- */
202
- declare function safeTryAsync<T, E>(body: () => AsyncGenerator<Result<never, E>, Result<T, E>>): ResultAsync<T, E>;
149
+ type CombineResultAsyncs<T extends readonly ResultAsync<unknown, unknown>[]> = IsLiteralArray<T> extends 1 ? TraverseAsync<UnwrapAsync<T>> : ResultAsync<ExtractOkAsyncTypes<T>, ExtractErrAsyncTypes<T>[number]>;
150
+ type CombineResultsWithAllErrorsArrayAsync<T extends readonly ResultAsync<unknown, unknown>[]> = IsLiteralArray<T> extends 1 ? TraverseWithAllErrorsAsync<UnwrapAsync<T>> : ResultAsync<ExtractOkAsyncTypes<T>, ExtractErrAsyncTypes<T>[number][]>;
151
+ type UnwrapAsync<T> = IsLiteralArray<T> extends 1 ? Writable<T> extends [infer H, ...infer Rest] ? H extends PromiseLike<infer HI> ? HI extends Result<unknown, unknown> ? [Dedup<HI>, ...UnwrapAsync<Rest>] : never : never : [] : T extends (infer A)[] ? A extends PromiseLike<infer HI> ? HI extends Result<infer L, infer R> ? Result<L, R>[] : never : never : never;
152
+ type TraverseAsync<T, Depth extends number = 5> = IsLiteralArray<T> extends 1 ? Combine<T, Depth> extends [infer Oks, infer Errs] ? ResultAsync<EmptyArrayToNever<Oks>, MembersToUnion<Errs>> : never : T extends (infer I)[] ? Combine<MemberListOf<I>, Depth> extends [infer Oks, infer Errs] ? Oks extends unknown[] ? Errs extends unknown[] ? ResultAsync<EmptyArrayToNever<Oks[number][]>, MembersToUnion<Errs[number][]>> : ResultAsync<EmptyArrayToNever<Oks[number][]>, Errs> : Errs extends unknown[] ? ResultAsync<Oks, MembersToUnion<Errs[number][]>> : ResultAsync<Oks, Errs> : never : never;
153
+ type TraverseWithAllErrorsAsync<T, Depth extends number = 5> = TraverseAsync<T, Depth> extends ResultAsync<infer Oks, infer Errs> ? ResultAsync<Oks, Errs[]> : never;
154
+ type Writable<T> = T extends readonly unknown[] ? [...T] : T;
203
155
 
204
156
  /**
205
157
  * A Result interface that is used to define the methods that are available on a
@@ -262,12 +214,24 @@ declare class Result<T, E> implements Resultable<T, E> {
262
214
  * @param errorFn when an error is thrown, this will wrap the error result if provided
263
215
  */
264
216
  static fromThrowable<Fn extends (...args: readonly any[]) => unknown, E>(fn: Fn, errorFn?: (e: any) => E): (...args: Parameters<Fn>) => Result<ReturnType<Fn>, E>;
217
+ /**
218
+ * Creates a new `Result` instance representing a successful operation.
219
+ *
220
+ * @param {T} value - The value to be wrapped in the `Result` instance.
221
+ * @return {Result<T, E>} A new `Result` instance with the provided value.
222
+ */
265
223
  static ok<T, E = never>(value: T): Result<T, E>;
224
+ /**
225
+ * Creates a new `Result` instance representing a successful operation with an undefined value.
226
+ *
227
+ * @return {Result<undefined, E>} A new `Result` instance with an undefined value.
228
+ */
229
+ static unit<E = never>(): Result<undefined, E>;
266
230
  static err<T = never, E = unknown>(error: E): Result<T, E>;
267
- static combine<T extends readonly [Result<unknown, unknown>, ...Array<Result<unknown, unknown>>]>(resultList: T): CombineResults<T>;
268
- static combine<T extends ReadonlyArray<Result<unknown, unknown>>>(resultList: T): CombineResults<T>;
269
- static combineWithAllErrors<T extends readonly [Result<unknown, unknown>, ...Array<Result<unknown, unknown>>]>(resultList: T): CombineResultsWithAllErrorsArray<T>;
270
- static combineWithAllErrors<T extends ReadonlyArray<Result<unknown, unknown>>>(resultList: T): CombineResultsWithAllErrorsArray<T>;
231
+ static combine<T extends readonly [Result<unknown, unknown>, ...Result<unknown, unknown>[]]>(resultList: T): CombineResults<T>;
232
+ static combine<T extends readonly Result<unknown, unknown>[]>(resultList: T): CombineResults<T>;
233
+ static combineWithAllErrors<T extends readonly [Result<unknown, unknown>, ...Result<unknown, unknown>[]]>(resultList: T): CombineResultsWithAllErrorsArray<T>;
234
+ static combineWithAllErrors<T extends readonly Result<unknown, unknown>[]>(resultList: T): CombineResultsWithAllErrorsArray<T>;
271
235
  readonly value: T;
272
236
  readonly error: E;
273
237
  private constructor();
@@ -364,9 +328,9 @@ declare class Result<T, E> implements Resultable<T, E> {
364
328
  * @param ok
365
329
  * @param err
366
330
  */
367
- match<X>(fnOk: (t: T) => X, fnErr: (e: E) => X): X;
331
+ match<A, B = A>(fnOk: (t: T) => A, fnErr: (e: E) => B): A | B;
368
332
  /**
369
- * Performs a side effect no matter what the `Result` variant is.
333
+ * Performs a side effect for the `Ok` or `Err` variant of `Result`.
370
334
  *
371
335
  * @param fn The function to apply an `OK` value
372
336
  * @returns the result of applying `f` or an `Err` untouched
@@ -420,16 +384,13 @@ declare class DisposableResult<T, E> implements Resultable<T, E>, Disposable {
420
384
  constructor(result: Resultable<T, E>, finalizer: (value: T, error: E) => void);
421
385
  get value(): T;
422
386
  get error(): E;
423
- _unsafeUnwrap(config?: ErrorConfig | undefined): T;
424
- _unsafeUnwrapErr(config?: ErrorConfig | undefined): E;
387
+ _unsafeUnwrap(config?: ErrorConfig): T;
388
+ _unsafeUnwrapErr(config?: ErrorConfig): E;
425
389
  isOk(): boolean;
426
390
  isErr(): boolean;
427
391
  unwrapOr<A>(defaultValue: A): T | A;
428
392
  [Symbol.dispose](): void;
429
393
  }
430
- declare const ok: typeof Result.ok;
431
- declare const err: typeof Result.err;
432
- declare const fromThrowable: typeof Result.fromThrowable;
433
394
  /**
434
395
  * Evaluates the given generator to a Result returned or an Err yielded from it,
435
396
  * whichever comes first.
@@ -443,6 +404,7 @@ declare const fromThrowable: typeof Result.fromThrowable;
443
404
  * @returns The first occurence of either an yielded Err or a returned Result.
444
405
  */
445
406
  declare function safeTry<T, E>(body: () => Generator<Result<never, E>, Result<T, E>>): Result<T, E>;
407
+ declare function safeTry<YieldErr extends Result<never, unknown>, GeneratorReturnResult extends Result<unknown, unknown>>(body: () => Generator<YieldErr, GeneratorReturnResult>): Result<InferOkTypes<GeneratorReturnResult>, InferErrTypes<YieldErr> | InferErrTypes<GeneratorReturnResult>>;
446
408
  /**
447
409
  * Evaluates the given generator to a Result returned or an Err yielded from it,
448
410
  * whichever comes first.
@@ -455,12 +417,94 @@ declare function safeTry<T, E>(body: () => Generator<Result<never, E>, Result<T,
455
417
  * `yield* resultAsync.safeUnwrap()` work as Rust's `result?` expression.
456
418
  * @returns The first occurence of either an yielded Err or a returned Result.
457
419
  */
458
- declare function safeTry<T, E>(body: () => AsyncGenerator<Result<never, E>, Result<T, E>>): Promise<Result<T, E>>;
420
+ declare function safeTry<T, E>(body: () => AsyncGenerator<Result<never, E>, Result<T, E>>): ResultAsync<T, E>;
421
+ declare function safeTry<YieldErr extends Result<never, unknown>, GeneratorReturnResult extends Result<unknown, unknown>>(body: () => AsyncGenerator<YieldErr, GeneratorReturnResult>): ResultAsync<InferOkTypes<GeneratorReturnResult>, InferErrTypes<YieldErr> | InferErrTypes<GeneratorReturnResult>>;
422
+ declare const ok: typeof Result.ok;
423
+ declare const err: typeof Result.err;
424
+ declare const fromThrowable: typeof Result.fromThrowable;
425
+ declare const unit: typeof Result.unit;
426
+ type Prev = [
427
+ never,
428
+ 0,
429
+ 1,
430
+ 2,
431
+ 3,
432
+ 4,
433
+ 5,
434
+ 6,
435
+ 7,
436
+ 8,
437
+ 9,
438
+ 10,
439
+ 11,
440
+ 12,
441
+ 13,
442
+ 14,
443
+ 15,
444
+ 16,
445
+ 17,
446
+ 18,
447
+ 19,
448
+ 20,
449
+ 21,
450
+ 22,
451
+ 23,
452
+ 24,
453
+ 25,
454
+ 26,
455
+ 27,
456
+ 28,
457
+ 29,
458
+ 30,
459
+ 31,
460
+ 32,
461
+ 33,
462
+ 34,
463
+ 35,
464
+ 36,
465
+ 37,
466
+ 38,
467
+ 39,
468
+ 40,
469
+ 41,
470
+ 42,
471
+ 43,
472
+ 44,
473
+ 45,
474
+ 46,
475
+ 47,
476
+ 48,
477
+ 49,
478
+ ...0[]
479
+ ];
480
+ type CollectResults<T, Collected extends unknown[] = [], Depth extends number = 50> = [
481
+ Depth
482
+ ] extends [never] ? [] : T extends [infer H, ...infer Rest] ? H extends Result<infer L, infer R> ? CollectResults<Rest, [
483
+ ...Collected,
484
+ [L, R]
485
+ ], Prev[Depth]> : never : Collected;
486
+ type Transpose<A, Transposed extends unknown[][] = [], Depth extends number = 10> = A extends [infer T, ...infer Rest] ? T extends [infer L, infer R] ? Transposed extends [infer PL, infer PR] ? PL extends unknown[] ? PR extends unknown[] ? Transpose<Rest, [[...PL, L], [...PR, R]], Prev[Depth]> : never : never : Transpose<Rest, [[L], [R]], Prev[Depth]> : Transposed : Transposed;
487
+ type Combine<T, Depth extends number = 5> = Transpose<CollectResults<T>, [], Depth> extends [
488
+ infer L,
489
+ infer R
490
+ ] ? [UnknownMembersToNever<L>, UnknownMembersToNever<R>] : Transpose<CollectResults<T>, [], Depth> extends [] ? [[], []] : never;
491
+ type Dedup<T> = T extends Result<infer RL, infer RR> ? Result<RL, RR> : T;
492
+ type MemberListOf<T> = ((T extends unknown ? (t: T) => T : never) extends infer U ? (U extends unknown ? (u: U) => unknown : never) extends (v: infer V) => unknown ? V : never : never) extends (_: unknown) => infer W ? [...MemberListOf<Exclude<T, W>>, W] : [];
493
+ type EmptyArrayToNever<T, NeverArrayToNever extends number = 0> = T extends [] ? never : NeverArrayToNever extends 1 ? T extends [never, ...infer Rest] ? [EmptyArrayToNever<Rest>] extends [never] ? never : T : T : T;
494
+ type UnknownMembersToNever<T> = T extends [infer H, ...infer R] ? [[unknown] extends [H] ? never : H, ...UnknownMembersToNever<R>] : T;
495
+ type MembersToUnion<T> = T extends unknown[] ? T[number] : never;
496
+ type IsLiteralArray<T> = T extends {
497
+ length: infer L;
498
+ } ? L extends number ? number extends L ? 0 : 1 : 0 : 0;
499
+ type Traverse<T, Depth extends number = 5> = Combine<T, Depth> extends [infer Oks, infer Errs] ? Result<EmptyArrayToNever<Oks, 1>, MembersToUnion<Errs>> : never;
500
+ type TraverseWithAllErrors<T, Depth extends number = 5> = Traverse<T, Depth> extends Result<infer Oks, infer Errs> ? Result<Oks, Errs[]> : never;
501
+ type CombineResults<T extends readonly Result<unknown, unknown>[]> = IsLiteralArray<T> extends 1 ? Traverse<T> : Result<ExtractOkTypes<T>, ExtractErrTypes<T>[number]>;
502
+ type CombineResultsWithAllErrorsArray<T extends readonly Result<unknown, unknown>[]> = IsLiteralArray<T> extends 1 ? TraverseWithAllErrors<T> : Result<ExtractOkTypes<T>, ExtractErrTypes<T>[number][]>;
459
503
 
460
504
  interface ErrorConfig {
461
505
  withStackTrace: boolean;
462
506
  }
463
- interface ResultarError<T, E> {
507
+ interface ResultarError<T, E> extends Error {
464
508
  data: {
465
509
  type: string;
466
510
  value: T | undefined;
@@ -473,4 +517,4 @@ interface ResultarError<T, E> {
473
517
  }
474
518
  declare const createResultarError: <T, E>(message: string, result: Result<T, E>, config?: ErrorConfig) => ResultarError<T, E>;
475
519
 
476
- export { ok as A, err as B, type Combine as C, type Dedup as D, type ExtractOkTypes as E, fromThrowable as F, safeTry as G, type ErrorConfig as H, type InferOkTypes as I, createResultarError as J, type MemberListOf as M, ResultAsync as R, type Transpose as T, type ExtractOkAsyncTypes as a, type ExtractErrTypes as b, type ExtractErrAsyncTypes as c, type InferErrTypes as d, type InferAsyncOkTypes as e, type InferAsyncErrTypes as f, type IsLiteralArray as g, type EmptyArrayToNever as h, type MembersToUnion as i, type CombineResults as j, type CombineResultsWithAllErrorsArray as k, combineResultAsyncList as l, combineResultList as m, combineResultAsyncListWithAllErrors as n, combineResultListWithAllErrors as o, type CombineResultAsyncs as p, type CombineResultsWithAllErrorsArrayAsync as q, DisposableResultAsync as r, okAsync as s, errAsync as t, fromPromise as u, fromSafePromise as v, fromThrowableAsync as w, safeTryAsync as x, Result as y, DisposableResult as z };
520
+ export { type Dedup as A, type EmptyArrayToNever as B, type CombineResultAsyncs as C, DisposableResultAsync as D, type ExtractOkTypes as E, type MembersToUnion as F, type IsLiteralArray as G, type CombineResults as H, type InferOkTypes as I, type CombineResultsWithAllErrorsArray as J, type ErrorConfig as K, createResultarError as L, type MemberListOf as M, ResultAsync as R, type Transpose as T, type ExtractOkAsyncTypes as a, type ExtractErrTypes as b, type ExtractErrAsyncTypes as c, type InferErrTypes as d, type InferAsyncOkTypes as e, type InferAsyncErrTypes as f, combineResultList as g, combineResultAsyncList as h, combineResultListWithAllErrors as i, combineResultAsyncListWithAllErrors as j, errAsync as k, fromPromise as l, fromSafePromise as m, fromThrowableAsync as n, okAsync as o, type CombineResultsWithAllErrorsArrayAsync as p, Result as q, DisposableResult as r, safeTryAsync as s, safeTry as t, unitAsync as u, ok as v, err as w, fromThrowable as x, unit as y, type Combine as z };
package/dist/index.cjs CHANGED
@@ -31,7 +31,9 @@ __export(src_exports, {
31
31
  ok: () => ok,
32
32
  okAsync: () => okAsync,
33
33
  safeTry: () => safeTry,
34
- safeTryAsync: () => safeTryAsync
34
+ safeTryAsync: () => safeTryAsync,
35
+ unit: () => unit,
36
+ unitAsync: () => unitAsync
35
37
  });
36
38
  module.exports = __toCommonJS(src_exports);
37
39
 
@@ -43,6 +45,7 @@ var createResultarError = (message, result, config = defaultErrorConfig) => {
43
45
  const data = result.isOk() ? { type: "Ok", value: result.value } : { type: "Err", value: result.error };
44
46
  const maybeStack = config.withStackTrace ? new Error().stack : void 0;
45
47
  return {
48
+ name: "ResultarError",
46
49
  data,
47
50
  message,
48
51
  stack: maybeStack
@@ -50,9 +53,6 @@ var createResultarError = (message, result, config = defaultErrorConfig) => {
50
53
  };
51
54
 
52
55
  // src/utils.ts
53
- var combineResultAsyncList = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(
54
- combineResultList
55
- );
56
56
  var combineResultList = (resultList) => {
57
57
  let acc = ok([]);
58
58
  for (const result of resultList) {
@@ -65,12 +65,9 @@ var combineResultList = (resultList) => {
65
65
  }
66
66
  return acc;
67
67
  };
68
- var combineResultAsyncListWithAllErrors = (asyncResultList) => {
69
- const x = ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(
70
- combineResultListWithAllErrors
71
- );
72
- return x;
73
- };
68
+ var combineResultAsyncList = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(
69
+ combineResultList
70
+ );
74
71
  var combineResultListWithAllErrors = (resultList) => {
75
72
  let acc = ok([]);
76
73
  for (const result of resultList) {
@@ -84,6 +81,9 @@ var combineResultListWithAllErrors = (resultList) => {
84
81
  }
85
82
  return acc;
86
83
  };
84
+ var combineResultAsyncListWithAllErrors = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(
85
+ combineResultListWithAllErrors
86
+ );
87
87
 
88
88
  // src/result.ts
89
89
  var Ok = class {
@@ -130,9 +130,23 @@ var Result = class _Result {
130
130
  }
131
131
  };
132
132
  }
133
+ /**
134
+ * Creates a new `Result` instance representing a successful operation.
135
+ *
136
+ * @param {T} value - The value to be wrapped in the `Result` instance.
137
+ * @return {Result<T, E>} A new `Result` instance with the provided value.
138
+ */
133
139
  static ok(value) {
134
140
  return new _Result(new Ok(value));
135
141
  }
142
+ /**
143
+ * Creates a new `Result` instance representing a successful operation with an undefined value.
144
+ *
145
+ * @return {Result<undefined, E>} A new `Result` instance with an undefined value.
146
+ */
147
+ static unit() {
148
+ return new _Result(new Ok(void 0));
149
+ }
136
150
  static err(error) {
137
151
  return new _Result(new Err(error));
138
152
  }
@@ -275,7 +289,7 @@ var Result = class _Result {
275
289
  return fnErr(this.error);
276
290
  }
277
291
  /**
278
- * Performs a side effect no matter what the `Result` variant is.
292
+ * Performs a side effect for the `Ok` or `Err` variant of `Result`.
279
293
  *
280
294
  * @param fn The function to apply an `OK` value
281
295
  * @returns the result of applying `f` or an `Err` untouched
@@ -396,14 +410,14 @@ var DisposableResult = class {
396
410
  this.finalizer(this.result.value, this.result.error);
397
411
  }
398
412
  };
399
- var { ok, err, fromThrowable } = Result;
400
413
  function safeTry(body) {
401
414
  const n = body().next();
402
415
  if (n instanceof Promise) {
403
- return n.then((r) => r.value);
416
+ return new ResultAsync(n.then((r) => r.value));
404
417
  }
405
418
  return n.value;
406
419
  }
420
+ var { ok, err, fromThrowable, unit } = Result;
407
421
 
408
422
  // src/result-async.ts
409
423
  var DisposableResultAsync = class {
@@ -416,9 +430,29 @@ var DisposableResultAsync = class {
416
430
  }
417
431
  };
418
432
  var ResultAsync = class _ResultAsync {
433
+ /**
434
+ * Returns a ResultAsync instance that is immediately resolved with a Result.ok(value).
435
+ *
436
+ * @param {T} value - The value to be wrapped in a Result.ok.
437
+ * @return {ResultAsync<T, E>} A ResultAsync instance with the given value and error type E.
438
+ */
419
439
  static okAsync(value) {
420
440
  return new _ResultAsync(Promise.resolve(Result.ok(value)));
421
441
  }
442
+ /**
443
+ * Returns a ResultAsync that is immediately resolved with a Result.ok(undefined) value.
444
+ *
445
+ * @return {ResultAsync<undefined, E>} A ResultAsync instance with undefined as the value type and E as the error type.
446
+ */
447
+ static unitAsync() {
448
+ return new _ResultAsync(Promise.resolve(Result.unit()));
449
+ }
450
+ /**
451
+ * Returns a ResultAsync instance that is immediately resolved with a Result.err(error).
452
+ *
453
+ * @param {E} error - The error to be wrapped in a Result.err.
454
+ * @return {ResultAsync<T, E>} A ResultAsync instance with the given error and value type T.
455
+ */
422
456
  static errAsync(error) {
423
457
  return new _ResultAsync(Promise.resolve(Result.err(error)));
424
458
  }
@@ -523,8 +557,8 @@ var ResultAsync = class _ResultAsync {
523
557
  })
524
558
  );
525
559
  }
526
- async match(ok2, err2) {
527
- return this.innerPromise.then((res) => res.match(ok2, err2));
560
+ async match(ok2, fnErr) {
561
+ return this.innerPromise.then((res) => res.match(ok2, fnErr));
528
562
  }
529
563
  async unwrapOr(t) {
530
564
  return this.innerPromise.then((res) => res.unwrapOr(t));
@@ -613,8 +647,6 @@ var ResultAsync = class _ResultAsync {
613
647
  return yield* await this.innerPromise.then((res) => res.safeUnwrap());
614
648
  }
615
649
  };
616
- var { okAsync, errAsync, fromPromise, fromSafePromise } = ResultAsync;
617
- var fromThrowableAsync = ResultAsync.fromThrowable;
618
650
  function safeTryAsync(body) {
619
651
  return new ResultAsync(
620
652
  (async () => {
@@ -626,6 +658,8 @@ function safeTryAsync(body) {
626
658
  })()
627
659
  );
628
660
  }
661
+ var { okAsync, errAsync, fromPromise, fromSafePromise, unitAsync } = ResultAsync;
662
+ var fromThrowableAsync = ResultAsync.fromThrowable;
629
663
  // Annotate the CommonJS export names for ESM import in node:
630
664
  0 && (module.exports = {
631
665
  Result,
@@ -639,6 +673,8 @@ function safeTryAsync(body) {
639
673
  ok,
640
674
  okAsync,
641
675
  safeTry,
642
- safeTryAsync
676
+ safeTryAsync,
677
+ unit,
678
+ unitAsync
643
679
  });
644
680
  //# sourceMappingURL=index.cjs.map