@shirudo/result 1.0.1 → 1.1.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/dist/collections.cjs +4 -3
- package/dist/collections.d.cts +2 -2
- package/dist/collections.d.mts +2 -2
- package/dist/collections.mjs +2 -2
- package/dist/errors.cjs +131 -20
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.cts +63 -2
- package/dist/errors.d.cts.map +1 -0
- package/dist/errors.d.mts +63 -2
- package/dist/errors.d.mts.map +1 -0
- package/dist/errors.mjs +109 -2
- package/dist/errors.mjs.map +1 -0
- package/dist/{flatten-Df9U40nO.cjs → flatten-B_XIkaOK.cjs} +29 -3
- package/dist/flatten-B_XIkaOK.cjs.map +1 -0
- package/dist/flatten-C7D6Kttf.d.mts +81 -0
- package/dist/flatten-C7D6Kttf.d.mts.map +1 -0
- package/dist/{flatten-C6Y9hx79.mjs → flatten-ChTL5BfA.mjs} +24 -4
- package/dist/flatten-ChTL5BfA.mjs.map +1 -0
- package/dist/flatten-D0K8UcQH.d.cts +81 -0
- package/dist/flatten-D0K8UcQH.d.cts.map +1 -0
- package/dist/index.cjs +90 -40
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +78 -58
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +78 -58
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +58 -12
- package/dist/index.mjs.map +1 -1
- package/dist/operators.cjs +31 -30
- package/dist/operators.d.cts +2 -2
- package/dist/operators.d.mts +2 -2
- package/dist/operators.mjs +2 -2
- package/dist/{result-CY-KIivk.cjs → result-BBOGxvSH.cjs} +86 -503
- package/dist/result-BBOGxvSH.cjs.map +1 -0
- package/dist/{result-DKKaNdOx.mjs → result-q9Na2bGa.mjs} +87 -372
- package/dist/result-q9Na2bGa.mjs.map +1 -0
- package/dist/sequence-DDwePRLd.d.cts +283 -0
- package/dist/sequence-DDwePRLd.d.cts.map +1 -0
- package/dist/sequence-DDwePRLd.d.mts +283 -0
- package/dist/sequence-DDwePRLd.d.mts.map +1 -0
- package/dist/swap-BnyMBdD_.cjs +552 -0
- package/dist/swap-BnyMBdD_.cjs.map +1 -0
- package/dist/swap-CFD2g1cB.mjs +385 -0
- package/dist/swap-CFD2g1cB.mjs.map +1 -0
- package/dist/swap-CrHQZIax.d.cts +212 -0
- package/dist/swap-CrHQZIax.d.cts.map +1 -0
- package/dist/swap-DT4LdRFV.d.mts +212 -0
- package/dist/swap-DT4LdRFV.d.mts.map +1 -0
- package/package.json +9 -8
- package/dist/errors-2WOswg7r.mjs +0 -95
- package/dist/errors-2WOswg7r.mjs.map +0 -1
- package/dist/errors-BFjY06EV.d.cts +0 -55
- package/dist/errors-BFjY06EV.d.cts.map +0 -1
- package/dist/errors-C5qGMRiU.d.mts +0 -55
- package/dist/errors-C5qGMRiU.d.mts.map +0 -1
- package/dist/errors-D2EMzJQl.cjs +0 -209
- package/dist/errors-D2EMzJQl.cjs.map +0 -1
- package/dist/flatten-B8bN6fiI.d.mts +0 -71
- package/dist/flatten-B8bN6fiI.d.mts.map +0 -1
- package/dist/flatten-C6Y9hx79.mjs.map +0 -1
- package/dist/flatten-DK7eJKPx.d.cts +0 -71
- package/dist/flatten-DK7eJKPx.d.cts.map +0 -1
- package/dist/flatten-Df9U40nO.cjs.map +0 -1
- package/dist/mapOrElse-B0_4r6Jn.mjs +0 -96
- package/dist/mapOrElse-B0_4r6Jn.mjs.map +0 -1
- package/dist/mapOrElse-B5gx9x2E.d.mts +0 -64
- package/dist/mapOrElse-B5gx9x2E.d.mts.map +0 -1
- package/dist/mapOrElse-DIe7LkYV.d.cts +0 -64
- package/dist/mapOrElse-DIe7LkYV.d.cts.map +0 -1
- package/dist/mapOrElse-H-GvAUka.cjs +0 -137
- package/dist/mapOrElse-H-GvAUka.cjs.map +0 -1
- package/dist/result-CY-KIivk.cjs.map +0 -1
- package/dist/result-DKKaNdOx.mjs.map +0 -1
- package/dist/sequence-Br6tAIIu.d.cts +0 -419
- package/dist/sequence-Br6tAIIu.d.cts.map +0 -1
- package/dist/sequence-C0jlR3AY.d.mts +0 -419
- package/dist/sequence-C0jlR3AY.d.mts.map +0 -1
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { S as Awaitable, s as Result } from "./sequence-DDwePRLd.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/sequenceRecord.d.ts
|
|
4
|
+
type OkValueOf$3<R> = R extends Result<infer T, any> ? T : never;
|
|
5
|
+
type ErrValueOf$3<R> = R extends Result<any, infer E> ? E : never;
|
|
6
|
+
/**
|
|
7
|
+
* Like `sequence`, but for Records/Objects.
|
|
8
|
+
* Short-circuits on the first Err.
|
|
9
|
+
*/
|
|
10
|
+
declare function sequenceRecord<const R extends { readonly [K in keyof R]: Result<any, any> }>(record: R): Result<{ [K in keyof R]: OkValueOf$3<R[K]> }, ErrValueOf$3<R[keyof R]>>;
|
|
11
|
+
//#endregion
|
|
12
|
+
//#region src/core/collectFirstOk.d.ts
|
|
13
|
+
type OkValueOf$2<R> = R extends Result<infer T, any> ? T : never;
|
|
14
|
+
type ErrValueOf$2<R> = R extends Result<any, infer E> ? E : never;
|
|
15
|
+
/**
|
|
16
|
+
* Parse a set of `Result`s, short-circuits when an input value is `Ok`.
|
|
17
|
+
* If no `Ok` is found, returns an `Err` containing the collected error values.
|
|
18
|
+
* Useful for "try multiple approaches until one works" patterns.
|
|
19
|
+
*/
|
|
20
|
+
declare function collectFirstOk<const Results extends readonly Result<any, any>[]>(results: Results): Result<OkValueOf$2<Results[number]>, ErrValueOf$2<Results[number]>[]>;
|
|
21
|
+
//#endregion
|
|
22
|
+
//#region src/core/collectFirstOkAsync.d.ts
|
|
23
|
+
type CollectFirstOkAsyncInput$1 = Promise<Result<any, any>> | (() => Awaitable<Result<any, any>>);
|
|
24
|
+
type ResolvedResult$1<I> = I extends (() => infer R) ? Awaited<R> : I extends Promise<infer R> ? R : never;
|
|
25
|
+
type OkValueOfInput$1<I> = ResolvedResult$1<I> extends Result<infer T, any> ? T : never;
|
|
26
|
+
type ErrValueOfInput$1<I> = ResolvedResult$1<I> extends Result<any, infer E> ? E : never;
|
|
27
|
+
/**
|
|
28
|
+
* Async version of collectFirstOk.
|
|
29
|
+
*
|
|
30
|
+
* - Takes either already started Promises or "Thunks" (`() => Awaitable<Result<...>>`).
|
|
31
|
+
* - Processes inputs strictly sequentially (like `for ... of` + `await`).
|
|
32
|
+
* - Returns the first `Ok` and collects all errors if no `Ok` is found.
|
|
33
|
+
*/
|
|
34
|
+
declare function collectFirstOkAsync<const Inputs extends readonly CollectFirstOkAsyncInput$1[]>(inputs: Inputs): Promise<Result<OkValueOfInput$1<Inputs[number]>, ErrValueOfInput$1<Inputs[number]>[]>>;
|
|
35
|
+
//#endregion
|
|
36
|
+
//#region src/core/collectFirstOkParallelAsync.d.ts
|
|
37
|
+
type CollectFirstOkAsyncInput = Promise<Result<any, any>> | (() => Awaitable<Result<any, any>>);
|
|
38
|
+
type ResolvedResult<I> = I extends (() => infer R) ? Awaited<R> : I extends Promise<infer R> ? R : never;
|
|
39
|
+
type OkValueOfInput<I> = ResolvedResult<I> extends Result<infer T, any> ? T : never;
|
|
40
|
+
type ErrValueOfInput<I> = ResolvedResult<I> extends Result<any, infer E> ? E : never;
|
|
41
|
+
/**
|
|
42
|
+
* Parallel version of `collectFirstOkAsync`.
|
|
43
|
+
*
|
|
44
|
+
* - Starts all inputs immediately (Promises or Thunks).
|
|
45
|
+
* - Returns the first `Ok` as soon as it is available.
|
|
46
|
+
* - If no `Ok` is found, returns an `Err` with all error values (in input order).
|
|
47
|
+
* - Rejections are treated as `ErrValue` (`caught as ErrValue`).
|
|
48
|
+
* - If multiple inputs provide an `Ok`, the one that completes first wins.
|
|
49
|
+
* In case of simultaneous completion, the first observed result wins.
|
|
50
|
+
* - If no `Ok` arrives and at least one input never settles, the Promise remains pending.
|
|
51
|
+
*/
|
|
52
|
+
declare function collectFirstOkParallelAsync<const Inputs extends readonly CollectFirstOkAsyncInput[]>(inputs: Inputs): Promise<Result<OkValueOfInput<Inputs[number]>, ErrValueOfInput<Inputs[number]>[]>>;
|
|
53
|
+
//#endregion
|
|
54
|
+
//#region src/core/collectAllErrors.d.ts
|
|
55
|
+
type OkValueOf$1<R> = R extends Result<infer T, any> ? T : never;
|
|
56
|
+
type ErrValueOf$1<R> = R extends Result<any, infer E> ? E : never;
|
|
57
|
+
type CollectionValues<Results extends readonly Result<any, any>[]> = { -readonly [K in keyof Results]: OkValueOf$1<Results[K]> };
|
|
58
|
+
/**
|
|
59
|
+
* Combines a list of Results.
|
|
60
|
+
* Return Ok(values) only if all are Ok, otherwise Err([errors]).
|
|
61
|
+
*/
|
|
62
|
+
declare function collectAllErrors<const Results extends readonly Result<any, any>[]>(results: Results): Result<CollectionValues<Results>, Array<ErrValueOf$1<Results[number]>>>;
|
|
63
|
+
//#endregion
|
|
64
|
+
//#region src/core/partition.d.ts
|
|
65
|
+
type OkValueOf<R> = R extends Result<infer T, any> ? T : never;
|
|
66
|
+
type ErrValueOf<R> = R extends Result<any, infer E> ? E : never;
|
|
67
|
+
/**
|
|
68
|
+
* Partitions Results into Ok values and Err errors.
|
|
69
|
+
*/
|
|
70
|
+
declare function partition<const Results extends readonly Result<any, any>[]>(results: Results): [oks: Array<OkValueOf<Results[number]>>, errs: Array<ErrValueOf<Results[number]>>];
|
|
71
|
+
//#endregion
|
|
72
|
+
//#region src/core/flatten.d.ts
|
|
73
|
+
/**
|
|
74
|
+
* Flattens a nested Result.
|
|
75
|
+
* Result<Result<T, E>, E> → Result<T, E>
|
|
76
|
+
* Corresponds to Rust `flatten`.
|
|
77
|
+
*/
|
|
78
|
+
declare function flatten<T, E>(result: Result<Result<T, E>, E>): Result<T, E>;
|
|
79
|
+
//#endregion
|
|
80
|
+
export { collectFirstOkAsync as a, collectFirstOkParallelAsync as i, partition as n, collectFirstOk as o, collectAllErrors as r, sequenceRecord as s, flatten as t };
|
|
81
|
+
//# sourceMappingURL=flatten-C7D6Kttf.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flatten-C7D6Kttf.d.mts","names":[],"sources":["../src/core/sequenceRecord.ts","../src/core/collectFirstOk.ts","../src/core/collectFirstOkAsync.ts","../src/core/collectFirstOkParallelAsync.ts","../src/core/collectAllErrors.ts","../src/core/partition.ts","../src/core/flatten.ts"],"mappings":";;;KAKK,WAAA,MAAe,CAAA,SAAU,MAAA,iBAAuB,CAAA;AAAA,KAChD,YAAA,MAAgB,CAAA,SAAU,MAAA,iBAAuB,CAAA;AAN1B;;;;AAAA,iBAYZ,cAAA,wCAAsD,CAAA,GAAI,MAAA,cACtE,MAAA,EAAQ,CAAA,GACT,MAAA,eAAqB,CAAA,GAAI,WAAA,CAAU,CAAA,CAAE,CAAA,MAAO,YAAA,CAAW,CAAA,OAAQ,CAAA;;;KCV7D,WAAA,MAAe,CAAA,SAAU,MAAA,iBAAuB,CAAA;AAAA,KAChD,YAAA,MAAgB,CAAA,SAAU,MAAA,iBAAuB,CAAA;ADL1B;;;;;AAAA,iBCYZ,cAAA,gCAA8C,MAAA,cAC1D,OAAA,EAAS,OAAA,GACV,MAAA,CAAO,WAAA,CAAU,OAAA,WAAkB,YAAA,CAAW,OAAA;;;KCT5C,0BAAA,GACC,OAAA,CAAQ,MAAA,qBACD,SAAA,CAAU,MAAA;AAAA,KAElB,gBAAA,MAAoB,CAAA,2BAA0B,OAAA,CAAQ,CAAA,IAAK,CAAA,SAAU,OAAA,YAAmB,CAAA;AAAA,KACxF,gBAAA,MAAoB,gBAAA,CAAe,CAAA,UAAW,MAAA,iBAAuB,CAAA;AAAA,KACrE,iBAAA,MAAqB,gBAAA,CAAe,CAAA,UAAW,MAAA,iBAAuB,CAAA;;;;;;;;iBASrD,mBAAA,+BAAkD,0BAAA,IACpE,MAAA,EAAQ,MAAA,GACT,OAAA,CAAQ,MAAA,CAAO,gBAAA,CAAe,MAAA,WAAiB,iBAAA,CAAgB,MAAA;;;KCjB7D,wBAAA,GAA2B,OAAA,CAAQ,MAAA,qBAA2B,SAAA,CAAU,MAAA;AAAA,KAExE,cAAA,MAAoB,CAAA,2BAA0B,OAAA,CAAQ,CAAA,IAAK,CAAA,SAAU,OAAA,YAAmB,CAAA;AAAA,KACxF,cAAA,MAAoB,cAAA,CAAe,CAAA,UAAW,MAAA,iBAAuB,CAAA;AAAA,KACrE,eAAA,MAAqB,cAAA,CAAe,CAAA,UAAW,MAAA,iBAAuB,CAAA;;;;;;;;AHJtB;AAAA;;;iBGiB/B,2BAAA,+BAA0D,wBAAA,IAC5E,MAAA,EAAQ,MAAA,GACT,OAAA,CAAQ,MAAA,CAAO,cAAA,CAAe,MAAA,WAAiB,eAAA,CAAgB,MAAA;;;KCpB7D,WAAA,MAAe,CAAA,SAAU,MAAA,iBAAuB,CAAA;AAAA,KAChD,YAAA,MAAgB,CAAA,SAAU,MAAA,iBAAuB,CAAA;AAAA,KACjD,gBAAA,0BAA0C,MAAA,wCACrB,OAAA,GAAU,WAAA,CAAU,OAAA,CAAQ,CAAA;;;;;iBAOtC,gBAAA,gCAAgD,MAAA,cAC5D,OAAA,EAAS,OAAA,GACV,MAAA,CAAO,gBAAA,CAAiB,OAAA,GAAU,KAAA,CAAM,YAAA,CAAW,OAAA;;;KCbjD,SAAA,MAAe,CAAA,SAAU,MAAA,iBAAuB,CAAA;AAAA,KAChD,UAAA,MAAgB,CAAA,SAAU,MAAA,iBAAuB,CAAA;ALJ1B;;;AAAA,iBKSZ,SAAA,gCAAyC,MAAA,cACrD,OAAA,EAAS,OAAA,IACT,GAAA,EAAK,KAAA,CAAM,SAAA,CAAU,OAAA,YAAmB,IAAA,EAAM,KAAA,CAAM,UAAA,CAAW,OAAA;;;;;ALXvC;;;iBMQZ,OAAA,OAAc,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,CAAA,GAAI,CAAA,IAAK,MAAA,CAAO,CAAA,EAAG,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { c as ok, i as err, v as isResult } from "./result-q9Na2bGa.mjs";
|
|
2
|
+
import { InvalidResultStateError } from "./errors.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/core/sequenceRecord.ts
|
|
5
5
|
/**
|
|
@@ -21,6 +21,26 @@ function sequenceRecord(record) {
|
|
|
21
21
|
return ok(out);
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
//#endregion
|
|
25
|
+
//#region src/core/collectFirstOk.ts
|
|
26
|
+
/**
|
|
27
|
+
* Parse a set of `Result`s, short-circuits when an input value is `Ok`.
|
|
28
|
+
* If no `Ok` is found, returns an `Err` containing the collected error values.
|
|
29
|
+
* Useful for "try multiple approaches until one works" patterns.
|
|
30
|
+
*/
|
|
31
|
+
function collectFirstOk(results) {
|
|
32
|
+
const errors = [];
|
|
33
|
+
for (const result of results) {
|
|
34
|
+
if (result.isOk()) return ok(result.value);
|
|
35
|
+
if (result.isErr()) {
|
|
36
|
+
errors.push(result.error);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
throw new InvalidResultStateError("collectFirstOk");
|
|
40
|
+
}
|
|
41
|
+
return err(errors);
|
|
42
|
+
}
|
|
43
|
+
|
|
24
44
|
//#endregion
|
|
25
45
|
//#region src/core/collectFirstOkAsync.ts
|
|
26
46
|
/**
|
|
@@ -143,5 +163,5 @@ function flatten(result) {
|
|
|
143
163
|
}
|
|
144
164
|
|
|
145
165
|
//#endregion
|
|
146
|
-
export { collectFirstOkAsync as a, collectFirstOkParallelAsync as i, partition as n,
|
|
147
|
-
//# sourceMappingURL=flatten-
|
|
166
|
+
export { collectFirstOkAsync as a, collectFirstOkParallelAsync as i, partition as n, collectFirstOk as o, collectAllErrors as r, sequenceRecord as s, flatten as t };
|
|
167
|
+
//# sourceMappingURL=flatten-ChTL5BfA.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flatten-ChTL5BfA.mjs","names":[],"sources":["../src/core/sequenceRecord.ts","../src/core/collectFirstOk.ts","../src/core/collectFirstOkAsync.ts","../src/core/collectFirstOkParallelAsync.ts","../src/core/collectAllErrors.ts","../src/core/partition.ts","../src/core/flatten.ts"],"sourcesContent":["import type { Result } from './result';\nimport { ok } from './result';\nimport { InvalidResultStateError } from '../errors';\nimport { isResult } from './isResult';\n\ntype OkValueOf<R> = R extends Result<infer T, any> ? T : never;\ntype ErrValueOf<R> = R extends Result<any, infer E> ? E : never;\n\n/**\n * Like `sequence`, but for Records/Objects.\n * Short-circuits on the first Err.\n */\nexport function sequenceRecord<const R extends { readonly [K in keyof R]: Result<any, any> }>(\n record: R\n): Result<{ [K in keyof R]: OkValueOf<R[K]> }, ErrValueOf<R[keyof R]>> {\n type Out = { [K in keyof R]: OkValueOf<R[K]> };\n type E = ErrValueOf<R[keyof R]>;\n\n const out: Partial<Out> = {};\n\n for (const key of Reflect.ownKeys(record) as Array<keyof R>) {\n const result = record[key];\n if (!isResult(result)) throw new InvalidResultStateError('sequenceRecord');\n if (result.isOk()) {\n out[key] = result.value as Out[typeof key];\n continue;\n }\n if (result.isErr()) return result as unknown as Result<Out, E>;\n throw new InvalidResultStateError('sequenceRecord');\n }\n\n return ok<Out, E>(out as Out);\n}\n","import type { Result } from './result';\nimport { ok, err } from './result';\nimport { InvalidResultStateError } from '../errors';\n\ntype OkValueOf<R> = R extends Result<infer T, any> ? T : never;\ntype ErrValueOf<R> = R extends Result<any, infer E> ? E : never;\n\n/**\n * Parse a set of `Result`s, short-circuits when an input value is `Ok`.\n * If no `Ok` is found, returns an `Err` containing the collected error values.\n * Useful for \"try multiple approaches until one works\" patterns.\n */\nexport function collectFirstOk<const Results extends readonly Result<any, any>[]>(\n results: Results\n): Result<OkValueOf<Results[number]>, ErrValueOf<Results[number]>[]> {\n const errors: Array<ErrValueOf<Results[number]>> = [];\n\n for (const result of results) {\n if (result.isOk()) {\n return ok<OkValueOf<Results[number]>, ErrValueOf<Results[number]>[]>(\n result.value as OkValueOf<Results[number]>\n );\n }\n if (result.isErr()) {\n errors.push(result.error as ErrValueOf<Results[number]>);\n continue;\n }\n throw new InvalidResultStateError('collectFirstOk');\n }\n\n return err<ErrValueOf<Results[number]>[], OkValueOf<Results[number]>>(errors);\n}\n","import type { Result } from './result';\nimport { ok, err } from './result';\nimport type { Awaitable } from './pipeable';\nimport { InvalidResultStateError } from '../errors';\n\ntype CollectFirstOkAsyncInput =\n | Promise<Result<any, any>>\n | (() => Awaitable<Result<any, any>>);\n\ntype ResolvedResult<I> = I extends () => infer R ? Awaited<R> : I extends Promise<infer R> ? R : never;\ntype OkValueOfInput<I> = ResolvedResult<I> extends Result<infer T, any> ? T : never;\ntype ErrValueOfInput<I> = ResolvedResult<I> extends Result<any, infer E> ? E : never;\n\n/**\n * Async version of collectFirstOk.\n *\n * - Takes either already started Promises or \"Thunks\" (`() => Awaitable<Result<...>>`).\n * - Processes inputs strictly sequentially (like `for ... of` + `await`).\n * - Returns the first `Ok` and collects all errors if no `Ok` is found.\n */\nexport async function collectFirstOkAsync<const Inputs extends readonly CollectFirstOkAsyncInput[]>(\n inputs: Inputs\n): Promise<Result<OkValueOfInput<Inputs[number]>, ErrValueOfInput<Inputs[number]>[]>> {\n const errors: Array<ErrValueOfInput<Inputs[number]>> = [];\n\n for (const input of inputs) {\n const pendingResult = typeof input === 'function' ? input() : input;\n let result: Result<any, any>;\n try {\n result = await pendingResult;\n } catch (error) {\n errors.push(error as ErrValueOfInput<Inputs[number]>);\n continue;\n }\n\n if (result.isOk()) {\n return ok<OkValueOfInput<Inputs[number]>, ErrValueOfInput<Inputs[number]>[]>(\n result.value as OkValueOfInput<Inputs[number]>\n );\n }\n if (result.isErr()) {\n errors.push(result.error as ErrValueOfInput<Inputs[number]>);\n continue;\n }\n throw new InvalidResultStateError('collectFirstOkAsync');\n }\n\n return err<ErrValueOfInput<Inputs[number]>[], OkValueOfInput<Inputs[number]>>(errors);\n}\n","import type { Awaitable } from './pipeable';\nimport type { Result } from './result';\nimport { err, ok } from './result';\nimport { InvalidResultStateError } from '../errors';\n\ntype CollectFirstOkAsyncInput = Promise<Result<any, any>> | (() => Awaitable<Result<any, any>>);\n\ntype ResolvedResult<I> = I extends () => infer R ? Awaited<R> : I extends Promise<infer R> ? R : never;\ntype OkValueOfInput<I> = ResolvedResult<I> extends Result<infer T, any> ? T : never;\ntype ErrValueOfInput<I> = ResolvedResult<I> extends Result<any, infer E> ? E : never;\n\n/**\n * Parallel version of `collectFirstOkAsync`.\n *\n * - Starts all inputs immediately (Promises or Thunks).\n * - Returns the first `Ok` as soon as it is available.\n * - If no `Ok` is found, returns an `Err` with all error values (in input order).\n * - Rejections are treated as `ErrValue` (`caught as ErrValue`).\n * - If multiple inputs provide an `Ok`, the one that completes first wins.\n * In case of simultaneous completion, the first observed result wins.\n * - If no `Ok` arrives and at least one input never settles, the Promise remains pending.\n */\nexport async function collectFirstOkParallelAsync<const Inputs extends readonly CollectFirstOkAsyncInput[]>(\n inputs: Inputs\n): Promise<Result<OkValueOfInput<Inputs[number]>, ErrValueOfInput<Inputs[number]>[]>> {\n type OkValue = OkValueOfInput<Inputs[number]>;\n type ErrValue = ErrValueOfInput<Inputs[number]>;\n\n if (inputs.length === 0) {\n return err<ErrValue[], OkValue>([]);\n }\n\n const started = inputs.map((input) =>\n typeof input === 'function' ? Promise.resolve().then(input) : input\n );\n\n const firstOk = new Promise<Result<OkValue, ErrValue[]>>((resolve) => {\n for (const promise of started) {\n promise\n .then((result) => {\n if (result.isOk()) {\n resolve(ok<OkValue, ErrValue[]>(result.value as OkValue));\n }\n })\n .catch(() => {\n // Ignored here; handled in allSettled below.\n });\n }\n });\n\n const allErrors = Promise.allSettled(started).then((settled) => {\n const errors: ErrValue[] = [];\n for (const entry of settled) {\n if (entry.status === 'fulfilled') {\n const result = entry.value;\n if (result.isErr()) {\n errors.push(result.error as ErrValue);\n } else if (!result.isOk()) {\n throw new InvalidResultStateError('collectFirstOkParallelAsync');\n }\n } else {\n errors.push(entry.reason as ErrValue);\n }\n }\n return err<ErrValue[], OkValue>(errors);\n });\n\n return Promise.race([firstOk, allErrors]);\n}\n","import type { Result } from './result';\nimport { ok, err } from './result';\nimport { InvalidResultStateError } from '../errors';\n\ntype OkValueOf<R> = R extends Result<infer T, any> ? T : never;\ntype ErrValueOf<R> = R extends Result<any, infer E> ? E : never;\ntype CollectionValues<Results extends readonly Result<any, any>[]> = {\n -readonly [K in keyof Results]: OkValueOf<Results[K]>;\n};\n\n/**\n * Combines a list of Results.\n * Return Ok(values) only if all are Ok, otherwise Err([errors]).\n */\nexport function collectAllErrors<const Results extends readonly Result<any, any>[]>(\n results: Results\n): Result<CollectionValues<Results>, Array<ErrValueOf<Results[number]>>> {\n const values: Array<OkValueOf<Results[number]>> = [];\n const errors: Array<ErrValueOf<Results[number]>> = [];\n\n for (const result of results) {\n if (result.isOk()) {\n values.push(result.value as OkValueOf<Results[number]>);\n continue;\n }\n if (result.isErr()) {\n errors.push(result.error as ErrValueOf<Results[number]>);\n continue;\n }\n throw new InvalidResultStateError('collectAllErrors');\n }\n\n return errors.length === 0\n ? ok<CollectionValues<Results>, Array<ErrValueOf<Results[number]>>>(values as CollectionValues<Results>)\n : err<Array<ErrValueOf<Results[number]>>, CollectionValues<Results>>(errors);\n}\n","import type { Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\ntype OkValueOf<R> = R extends Result<infer T, any> ? T : never;\ntype ErrValueOf<R> = R extends Result<any, infer E> ? E : never;\n\n/**\n * Partitions Results into Ok values and Err errors.\n */\nexport function partition<const Results extends readonly Result<any, any>[]>(\n results: Results\n): [oks: Array<OkValueOf<Results[number]>>, errs: Array<ErrValueOf<Results[number]>>] {\n const oks: Array<OkValueOf<Results[number]>> = [];\n const errs: Array<ErrValueOf<Results[number]>> = [];\n\n for (const result of results) {\n if (result.isOk()) {\n oks.push(result.value as OkValueOf<Results[number]>);\n continue;\n }\n if (result.isErr()) {\n errs.push(result.error as ErrValueOf<Results[number]>);\n continue;\n }\n throw new InvalidResultStateError('partition');\n }\n\n return [oks, errs];\n}\n","import type { Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Flattens a nested Result.\n * Result<Result<T, E>, E> → Result<T, E>\n * Corresponds to Rust `flatten`.\n */\nexport function flatten<T, E>(result: Result<Result<T, E>, E>): Result<T, E> {\n if (result.isOk()) {\n return result.value;\n }\n if (result.isErr()) return result as unknown as Result<T, E>;\n throw new InvalidResultStateError('flatten');\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { S as Awaitable, s as Result } from "./sequence-DDwePRLd.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/core/sequenceRecord.d.ts
|
|
4
|
+
type OkValueOf$3<R> = R extends Result<infer T, any> ? T : never;
|
|
5
|
+
type ErrValueOf$3<R> = R extends Result<any, infer E> ? E : never;
|
|
6
|
+
/**
|
|
7
|
+
* Like `sequence`, but for Records/Objects.
|
|
8
|
+
* Short-circuits on the first Err.
|
|
9
|
+
*/
|
|
10
|
+
declare function sequenceRecord<const R extends { readonly [K in keyof R]: Result<any, any> }>(record: R): Result<{ [K in keyof R]: OkValueOf$3<R[K]> }, ErrValueOf$3<R[keyof R]>>;
|
|
11
|
+
//#endregion
|
|
12
|
+
//#region src/core/collectFirstOk.d.ts
|
|
13
|
+
type OkValueOf$2<R> = R extends Result<infer T, any> ? T : never;
|
|
14
|
+
type ErrValueOf$2<R> = R extends Result<any, infer E> ? E : never;
|
|
15
|
+
/**
|
|
16
|
+
* Parse a set of `Result`s, short-circuits when an input value is `Ok`.
|
|
17
|
+
* If no `Ok` is found, returns an `Err` containing the collected error values.
|
|
18
|
+
* Useful for "try multiple approaches until one works" patterns.
|
|
19
|
+
*/
|
|
20
|
+
declare function collectFirstOk<const Results extends readonly Result<any, any>[]>(results: Results): Result<OkValueOf$2<Results[number]>, ErrValueOf$2<Results[number]>[]>;
|
|
21
|
+
//#endregion
|
|
22
|
+
//#region src/core/collectFirstOkAsync.d.ts
|
|
23
|
+
type CollectFirstOkAsyncInput$1 = Promise<Result<any, any>> | (() => Awaitable<Result<any, any>>);
|
|
24
|
+
type ResolvedResult$1<I> = I extends (() => infer R) ? Awaited<R> : I extends Promise<infer R> ? R : never;
|
|
25
|
+
type OkValueOfInput$1<I> = ResolvedResult$1<I> extends Result<infer T, any> ? T : never;
|
|
26
|
+
type ErrValueOfInput$1<I> = ResolvedResult$1<I> extends Result<any, infer E> ? E : never;
|
|
27
|
+
/**
|
|
28
|
+
* Async version of collectFirstOk.
|
|
29
|
+
*
|
|
30
|
+
* - Takes either already started Promises or "Thunks" (`() => Awaitable<Result<...>>`).
|
|
31
|
+
* - Processes inputs strictly sequentially (like `for ... of` + `await`).
|
|
32
|
+
* - Returns the first `Ok` and collects all errors if no `Ok` is found.
|
|
33
|
+
*/
|
|
34
|
+
declare function collectFirstOkAsync<const Inputs extends readonly CollectFirstOkAsyncInput$1[]>(inputs: Inputs): Promise<Result<OkValueOfInput$1<Inputs[number]>, ErrValueOfInput$1<Inputs[number]>[]>>;
|
|
35
|
+
//#endregion
|
|
36
|
+
//#region src/core/collectFirstOkParallelAsync.d.ts
|
|
37
|
+
type CollectFirstOkAsyncInput = Promise<Result<any, any>> | (() => Awaitable<Result<any, any>>);
|
|
38
|
+
type ResolvedResult<I> = I extends (() => infer R) ? Awaited<R> : I extends Promise<infer R> ? R : never;
|
|
39
|
+
type OkValueOfInput<I> = ResolvedResult<I> extends Result<infer T, any> ? T : never;
|
|
40
|
+
type ErrValueOfInput<I> = ResolvedResult<I> extends Result<any, infer E> ? E : never;
|
|
41
|
+
/**
|
|
42
|
+
* Parallel version of `collectFirstOkAsync`.
|
|
43
|
+
*
|
|
44
|
+
* - Starts all inputs immediately (Promises or Thunks).
|
|
45
|
+
* - Returns the first `Ok` as soon as it is available.
|
|
46
|
+
* - If no `Ok` is found, returns an `Err` with all error values (in input order).
|
|
47
|
+
* - Rejections are treated as `ErrValue` (`caught as ErrValue`).
|
|
48
|
+
* - If multiple inputs provide an `Ok`, the one that completes first wins.
|
|
49
|
+
* In case of simultaneous completion, the first observed result wins.
|
|
50
|
+
* - If no `Ok` arrives and at least one input never settles, the Promise remains pending.
|
|
51
|
+
*/
|
|
52
|
+
declare function collectFirstOkParallelAsync<const Inputs extends readonly CollectFirstOkAsyncInput[]>(inputs: Inputs): Promise<Result<OkValueOfInput<Inputs[number]>, ErrValueOfInput<Inputs[number]>[]>>;
|
|
53
|
+
//#endregion
|
|
54
|
+
//#region src/core/collectAllErrors.d.ts
|
|
55
|
+
type OkValueOf$1<R> = R extends Result<infer T, any> ? T : never;
|
|
56
|
+
type ErrValueOf$1<R> = R extends Result<any, infer E> ? E : never;
|
|
57
|
+
type CollectionValues<Results extends readonly Result<any, any>[]> = { -readonly [K in keyof Results]: OkValueOf$1<Results[K]> };
|
|
58
|
+
/**
|
|
59
|
+
* Combines a list of Results.
|
|
60
|
+
* Return Ok(values) only if all are Ok, otherwise Err([errors]).
|
|
61
|
+
*/
|
|
62
|
+
declare function collectAllErrors<const Results extends readonly Result<any, any>[]>(results: Results): Result<CollectionValues<Results>, Array<ErrValueOf$1<Results[number]>>>;
|
|
63
|
+
//#endregion
|
|
64
|
+
//#region src/core/partition.d.ts
|
|
65
|
+
type OkValueOf<R> = R extends Result<infer T, any> ? T : never;
|
|
66
|
+
type ErrValueOf<R> = R extends Result<any, infer E> ? E : never;
|
|
67
|
+
/**
|
|
68
|
+
* Partitions Results into Ok values and Err errors.
|
|
69
|
+
*/
|
|
70
|
+
declare function partition<const Results extends readonly Result<any, any>[]>(results: Results): [oks: Array<OkValueOf<Results[number]>>, errs: Array<ErrValueOf<Results[number]>>];
|
|
71
|
+
//#endregion
|
|
72
|
+
//#region src/core/flatten.d.ts
|
|
73
|
+
/**
|
|
74
|
+
* Flattens a nested Result.
|
|
75
|
+
* Result<Result<T, E>, E> → Result<T, E>
|
|
76
|
+
* Corresponds to Rust `flatten`.
|
|
77
|
+
*/
|
|
78
|
+
declare function flatten<T, E>(result: Result<Result<T, E>, E>): Result<T, E>;
|
|
79
|
+
//#endregion
|
|
80
|
+
export { collectFirstOkAsync as a, collectFirstOkParallelAsync as i, partition as n, collectFirstOk as o, collectAllErrors as r, sequenceRecord as s, flatten as t };
|
|
81
|
+
//# sourceMappingURL=flatten-D0K8UcQH.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flatten-D0K8UcQH.d.cts","names":[],"sources":["../src/core/sequenceRecord.ts","../src/core/collectFirstOk.ts","../src/core/collectFirstOkAsync.ts","../src/core/collectFirstOkParallelAsync.ts","../src/core/collectAllErrors.ts","../src/core/partition.ts","../src/core/flatten.ts"],"mappings":";;;KAKK,WAAA,MAAe,CAAA,SAAU,MAAA,iBAAuB,CAAA;AAAA,KAChD,YAAA,MAAgB,CAAA,SAAU,MAAA,iBAAuB,CAAA;AAN1B;;;;AAAA,iBAYZ,cAAA,wCAAsD,CAAA,GAAI,MAAA,cACtE,MAAA,EAAQ,CAAA,GACT,MAAA,eAAqB,CAAA,GAAI,WAAA,CAAU,CAAA,CAAE,CAAA,MAAO,YAAA,CAAW,CAAA,OAAQ,CAAA;;;KCV7D,WAAA,MAAe,CAAA,SAAU,MAAA,iBAAuB,CAAA;AAAA,KAChD,YAAA,MAAgB,CAAA,SAAU,MAAA,iBAAuB,CAAA;ADL1B;;;;;AAAA,iBCYZ,cAAA,gCAA8C,MAAA,cAC1D,OAAA,EAAS,OAAA,GACV,MAAA,CAAO,WAAA,CAAU,OAAA,WAAkB,YAAA,CAAW,OAAA;;;KCT5C,0BAAA,GACC,OAAA,CAAQ,MAAA,qBACD,SAAA,CAAU,MAAA;AAAA,KAElB,gBAAA,MAAoB,CAAA,2BAA0B,OAAA,CAAQ,CAAA,IAAK,CAAA,SAAU,OAAA,YAAmB,CAAA;AAAA,KACxF,gBAAA,MAAoB,gBAAA,CAAe,CAAA,UAAW,MAAA,iBAAuB,CAAA;AAAA,KACrE,iBAAA,MAAqB,gBAAA,CAAe,CAAA,UAAW,MAAA,iBAAuB,CAAA;;;;;;;;iBASrD,mBAAA,+BAAkD,0BAAA,IACpE,MAAA,EAAQ,MAAA,GACT,OAAA,CAAQ,MAAA,CAAO,gBAAA,CAAe,MAAA,WAAiB,iBAAA,CAAgB,MAAA;;;KCjB7D,wBAAA,GAA2B,OAAA,CAAQ,MAAA,qBAA2B,SAAA,CAAU,MAAA;AAAA,KAExE,cAAA,MAAoB,CAAA,2BAA0B,OAAA,CAAQ,CAAA,IAAK,CAAA,SAAU,OAAA,YAAmB,CAAA;AAAA,KACxF,cAAA,MAAoB,cAAA,CAAe,CAAA,UAAW,MAAA,iBAAuB,CAAA;AAAA,KACrE,eAAA,MAAqB,cAAA,CAAe,CAAA,UAAW,MAAA,iBAAuB,CAAA;;;;;;;;AHJtB;AAAA;;;iBGiB/B,2BAAA,+BAA0D,wBAAA,IAC5E,MAAA,EAAQ,MAAA,GACT,OAAA,CAAQ,MAAA,CAAO,cAAA,CAAe,MAAA,WAAiB,eAAA,CAAgB,MAAA;;;KCpB7D,WAAA,MAAe,CAAA,SAAU,MAAA,iBAAuB,CAAA;AAAA,KAChD,YAAA,MAAgB,CAAA,SAAU,MAAA,iBAAuB,CAAA;AAAA,KACjD,gBAAA,0BAA0C,MAAA,wCACrB,OAAA,GAAU,WAAA,CAAU,OAAA,CAAQ,CAAA;;;;;iBAOtC,gBAAA,gCAAgD,MAAA,cAC5D,OAAA,EAAS,OAAA,GACV,MAAA,CAAO,gBAAA,CAAiB,OAAA,GAAU,KAAA,CAAM,YAAA,CAAW,OAAA;;;KCbjD,SAAA,MAAe,CAAA,SAAU,MAAA,iBAAuB,CAAA;AAAA,KAChD,UAAA,MAAgB,CAAA,SAAU,MAAA,iBAAuB,CAAA;ALJ1B;;;AAAA,iBKSZ,SAAA,gCAAyC,MAAA,cACrD,OAAA,EAAS,OAAA,IACT,GAAA,EAAK,KAAA,CAAM,SAAA,CAAU,OAAA,YAAmB,IAAA,EAAM,KAAA,CAAM,UAAA,CAAW,OAAA;;;;;ALXvC;;;iBMQZ,OAAA,OAAc,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,CAAA,GAAI,CAAA,IAAK,MAAA,CAAO,CAAA,EAAG,CAAA"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
const
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_result = require('./result-BBOGxvSH.cjs');
|
|
3
|
+
const require_errors = require('./errors.cjs');
|
|
4
|
+
const require_swap = require('./swap-BnyMBdD_.cjs');
|
|
5
|
+
const require_flatten = require('./flatten-B_XIkaOK.cjs');
|
|
5
6
|
|
|
6
7
|
//#region src/gen.ts
|
|
7
8
|
async function task(makeGenerator, onThrow) {
|
|
8
9
|
const iterator = makeGenerator();
|
|
9
10
|
let input = void 0;
|
|
11
|
+
const runGeneratorReturn = async () => {
|
|
12
|
+
if (typeof iterator.return !== "function") return;
|
|
13
|
+
let step = await iterator.return(void 0);
|
|
14
|
+
while (!step.done) step = await iterator.next(void 0);
|
|
15
|
+
};
|
|
10
16
|
while (true) {
|
|
11
17
|
let step;
|
|
12
18
|
try {
|
|
@@ -24,20 +30,34 @@ async function task(makeGenerator, onThrow) {
|
|
|
24
30
|
return require_result.err(onThrow(caught));
|
|
25
31
|
}
|
|
26
32
|
const yielded = step.value;
|
|
27
|
-
if (!require_result.isResult(yielded))
|
|
33
|
+
if (!require_result.isResult(yielded)) {
|
|
34
|
+
try {
|
|
35
|
+
await runGeneratorReturn();
|
|
36
|
+
} catch (caught) {
|
|
37
|
+
if (!onThrow) throw caught;
|
|
38
|
+
return require_result.err(onThrow(caught));
|
|
39
|
+
}
|
|
40
|
+
throw new require_errors.TaskYieldNotResultError(yielded);
|
|
41
|
+
}
|
|
28
42
|
if (yielded.isOk()) {
|
|
29
43
|
input = yielded.value;
|
|
30
44
|
continue;
|
|
31
45
|
}
|
|
32
46
|
if (yielded.isErr()) {
|
|
33
47
|
try {
|
|
34
|
-
|
|
48
|
+
await runGeneratorReturn();
|
|
35
49
|
} catch (caught) {
|
|
36
50
|
if (!onThrow) throw caught;
|
|
37
51
|
return require_result.err(onThrow(caught));
|
|
38
52
|
}
|
|
39
53
|
return yielded;
|
|
40
54
|
}
|
|
55
|
+
try {
|
|
56
|
+
await runGeneratorReturn();
|
|
57
|
+
} catch (caught) {
|
|
58
|
+
if (!onThrow) throw caught;
|
|
59
|
+
return require_result.err(onThrow(caught));
|
|
60
|
+
}
|
|
41
61
|
throw new require_errors.InvalidResultStateError("task");
|
|
42
62
|
}
|
|
43
63
|
}
|
|
@@ -83,7 +103,11 @@ function unwrapOrElse(result, fn) {
|
|
|
83
103
|
//#region src/core/unwrapOrDefault.ts
|
|
84
104
|
/**
|
|
85
105
|
* Alias for `unwrapOr`.
|
|
86
|
-
*
|
|
106
|
+
*
|
|
107
|
+
* @deprecated Use {@link unwrapOr} instead. The name is misleading: Rust's
|
|
108
|
+
* `unwrap_or_default` takes no argument (it uses the type's `Default`),
|
|
109
|
+
* whereas this function requires an explicit default value — which is exactly
|
|
110
|
+
* what `unwrapOr` does.
|
|
87
111
|
*/
|
|
88
112
|
function unwrapOrDefault(result, defaultValue) {
|
|
89
113
|
return unwrapOr(result, defaultValue);
|
|
@@ -121,7 +145,7 @@ function unwrapErr(result) {
|
|
|
121
145
|
*/
|
|
122
146
|
function expectResult(result, message) {
|
|
123
147
|
if (result.isOk()) return result.value;
|
|
124
|
-
if (result.isErr()) throw new require_errors.ExpectOkError(message);
|
|
148
|
+
if (result.isErr()) throw new require_errors.ExpectOkError(message, result.error);
|
|
125
149
|
throw new require_errors.InvalidResultStateError("expectResult");
|
|
126
150
|
}
|
|
127
151
|
|
|
@@ -133,10 +157,27 @@ function expectResult(result, message) {
|
|
|
133
157
|
*/
|
|
134
158
|
function expectErr(result, message) {
|
|
135
159
|
if (result.isErr()) return result.error;
|
|
136
|
-
if (result.isOk()) throw new require_errors.ExpectErrError(message);
|
|
160
|
+
if (result.isOk()) throw new require_errors.ExpectErrError(message, result.value);
|
|
137
161
|
throw new require_errors.InvalidResultStateError("expectErr");
|
|
138
162
|
}
|
|
139
163
|
|
|
164
|
+
//#endregion
|
|
165
|
+
//#region src/core/fromSerialized.ts
|
|
166
|
+
/**
|
|
167
|
+
* Rebuilds a `Result` from its serialized discriminated form
|
|
168
|
+
* (`{ _tag: 'Ok', value }` / `{ _tag: 'Err', error }`), the shape produced
|
|
169
|
+
* by `Result.toSerialized()` and by `JSON.stringify` on a Result.
|
|
170
|
+
*
|
|
171
|
+
* Throws `InvalidResultStateError` for data that is not in that shape.
|
|
172
|
+
*/
|
|
173
|
+
function fromSerialized(data) {
|
|
174
|
+
if (data !== null && typeof data === "object") {
|
|
175
|
+
if (data._tag === "Ok" && "value" in data) return require_result.ok(data.value);
|
|
176
|
+
if (data._tag === "Err" && "error" in data) return require_result.err(data.error);
|
|
177
|
+
}
|
|
178
|
+
throw new require_errors.InvalidResultStateError("fromSerialized");
|
|
179
|
+
}
|
|
180
|
+
|
|
140
181
|
//#endregion
|
|
141
182
|
//#region src/core/toPromise.ts
|
|
142
183
|
/**
|
|
@@ -190,9 +231,12 @@ function isErr(result) {
|
|
|
190
231
|
/**
|
|
191
232
|
* Checks if the Result contains a specific value.
|
|
192
233
|
* Corresponds to Rust `contains`.
|
|
234
|
+
*
|
|
235
|
+
* Comparison uses `Object.is` (SameValue): `NaN` matches `NaN`, `+0` and
|
|
236
|
+
* `-0` are distinct, and objects are compared by reference.
|
|
193
237
|
*/
|
|
194
238
|
function contains(result, value) {
|
|
195
|
-
if (result.isOk()) return result.value
|
|
239
|
+
if (result.isOk()) return Object.is(result.value, value);
|
|
196
240
|
if (result.isErr()) return false;
|
|
197
241
|
throw new require_errors.InvalidResultStateError("contains");
|
|
198
242
|
}
|
|
@@ -202,9 +246,12 @@ function contains(result, value) {
|
|
|
202
246
|
/**
|
|
203
247
|
* Checks if the Result contains a specific error.
|
|
204
248
|
* Analogous to `contains` for the Err case.
|
|
249
|
+
*
|
|
250
|
+
* Comparison uses `Object.is` (SameValue): `NaN` matches `NaN`, `+0` and
|
|
251
|
+
* `-0` are distinct, and objects are compared by reference.
|
|
205
252
|
*/
|
|
206
253
|
function containsErr(result, error) {
|
|
207
|
-
if (result.isErr()) return result.error
|
|
254
|
+
if (result.isErr()) return Object.is(result.error, error);
|
|
208
255
|
if (result.isOk()) return false;
|
|
209
256
|
throw new require_errors.InvalidResultStateError("containsErr");
|
|
210
257
|
}
|
|
@@ -216,6 +263,7 @@ exports.ERR_INVALID_RESULT_STATE = require_errors.ERR_INVALID_RESULT_STATE;
|
|
|
216
263
|
exports.ERR_INVALID_STATE = require_errors.ERR_INVALID_STATE;
|
|
217
264
|
exports.ERR_MATCH_ERR_HANDLER_NOT_RESULT = require_errors.ERR_MATCH_ERR_HANDLER_NOT_RESULT;
|
|
218
265
|
exports.ERR_MATCH_ON_OK = require_errors.ERR_MATCH_ON_OK;
|
|
266
|
+
exports.ERR_MATCH_TAG_MISSING_HANDLER = require_errors.ERR_MATCH_TAG_MISSING_HANDLER;
|
|
219
267
|
exports.ERR_TASK_YIELD_NOT_RESULT = require_errors.ERR_TASK_YIELD_NOT_RESULT;
|
|
220
268
|
exports.ERR_UNWRAP_ERR_ON_OK = require_errors.ERR_UNWRAP_ERR_ON_OK;
|
|
221
269
|
exports.ERR_UNWRAP_ON_ERR = require_errors.ERR_UNWRAP_ON_ERR;
|
|
@@ -225,6 +273,7 @@ exports.ExpectOkError = require_errors.ExpectOkError;
|
|
|
225
273
|
exports.InvalidResultStateError = require_errors.InvalidResultStateError;
|
|
226
274
|
exports.MatchErrHandlerNotResultError = require_errors.MatchErrHandlerNotResultError;
|
|
227
275
|
exports.MatchOnOkError = require_errors.MatchOnOkError;
|
|
276
|
+
exports.MatchTagMissingHandlerError = require_errors.MatchTagMissingHandlerError;
|
|
228
277
|
exports.Ok = require_result.Ok;
|
|
229
278
|
exports.Result = require_result.Result;
|
|
230
279
|
exports.ResultError = require_errors.ResultError;
|
|
@@ -233,10 +282,10 @@ exports.TaskYieldNotResultError = require_errors.TaskYieldNotResultError;
|
|
|
233
282
|
exports.UnwrapErrOnOkError = require_errors.UnwrapErrOnOkError;
|
|
234
283
|
exports.UnwrapOnErrError = require_errors.UnwrapOnErrError;
|
|
235
284
|
exports.all = require_result.all;
|
|
236
|
-
exports.and =
|
|
237
|
-
exports.bimap =
|
|
285
|
+
exports.and = require_swap.and;
|
|
286
|
+
exports.bimap = require_swap.bimap;
|
|
238
287
|
exports.collectAllErrors = require_flatten.collectAllErrors;
|
|
239
|
-
exports.collectFirstOk =
|
|
288
|
+
exports.collectFirstOk = require_flatten.collectFirstOk;
|
|
240
289
|
exports.collectFirstOkAsync = require_flatten.collectFirstOkAsync;
|
|
241
290
|
exports.collectFirstOkParallelAsync = require_flatten.collectFirstOkParallelAsync;
|
|
242
291
|
exports.combine = require_result.combine;
|
|
@@ -245,52 +294,53 @@ exports.containsErr = containsErr;
|
|
|
245
294
|
exports.err = require_result.err;
|
|
246
295
|
exports.expectErr = expectErr;
|
|
247
296
|
exports.expectResult = expectResult;
|
|
248
|
-
exports.filter =
|
|
249
|
-
exports.filterAsync =
|
|
250
|
-
exports.flatMap =
|
|
251
|
-
exports.flatMapAsync =
|
|
297
|
+
exports.filter = require_swap.filter;
|
|
298
|
+
exports.filterAsync = require_swap.filterAsync;
|
|
299
|
+
exports.flatMap = require_swap.flatMap;
|
|
300
|
+
exports.flatMapAsync = require_swap.flatMapAsync;
|
|
252
301
|
exports.flatten = require_flatten.flatten;
|
|
253
|
-
exports.fold =
|
|
254
|
-
exports.foldAsync =
|
|
302
|
+
exports.fold = require_swap.fold;
|
|
303
|
+
exports.foldAsync = require_swap.foldAsync;
|
|
255
304
|
exports.fromNullable = require_result.fromNullable;
|
|
256
305
|
exports.fromPromise = require_result.fromPromise;
|
|
306
|
+
exports.fromSerialized = fromSerialized;
|
|
257
307
|
exports.fromThrowable = require_result.fromThrowable;
|
|
258
308
|
exports.gen = gen;
|
|
259
309
|
exports.isErr = isErr;
|
|
260
310
|
exports.isOk = isOk;
|
|
261
311
|
exports.isResult = require_result.isResult;
|
|
262
|
-
exports.map =
|
|
263
|
-
exports.mapAsync =
|
|
264
|
-
exports.mapBoth =
|
|
265
|
-
exports.mapErr =
|
|
266
|
-
exports.mapErrAsync =
|
|
267
|
-
exports.mapOr =
|
|
268
|
-
exports.mapOrElse =
|
|
269
|
-
exports.match =
|
|
270
|
-
exports.matchAsync =
|
|
312
|
+
exports.map = require_swap.map;
|
|
313
|
+
exports.mapAsync = require_swap.mapAsync;
|
|
314
|
+
exports.mapBoth = require_swap.mapBoth;
|
|
315
|
+
exports.mapErr = require_swap.mapErr;
|
|
316
|
+
exports.mapErrAsync = require_swap.mapErrAsync;
|
|
317
|
+
exports.mapOr = require_swap.mapOr;
|
|
318
|
+
exports.mapOrElse = require_swap.mapOrElse;
|
|
319
|
+
exports.match = require_swap.match;
|
|
320
|
+
exports.matchAsync = require_swap.matchAsync;
|
|
271
321
|
exports.matchTag = require_result.matchTag;
|
|
272
322
|
exports.ok = require_result.ok;
|
|
273
323
|
exports.okIf = require_result.okIf;
|
|
274
324
|
exports.okIfLazy = require_result.okIfLazy;
|
|
275
|
-
exports.or =
|
|
276
|
-
exports.orElse =
|
|
325
|
+
exports.or = require_swap.or;
|
|
326
|
+
exports.orElse = require_swap.orElse;
|
|
277
327
|
exports.partition = require_flatten.partition;
|
|
278
|
-
exports.recover =
|
|
279
|
-
exports.recoverWith =
|
|
328
|
+
exports.recover = require_swap.recover;
|
|
329
|
+
exports.recoverWith = require_swap.recoverWith;
|
|
280
330
|
exports.sequence = require_result.sequence;
|
|
281
331
|
exports.sequenceRecord = require_flatten.sequenceRecord;
|
|
282
|
-
exports.swap =
|
|
283
|
-
exports.tap =
|
|
284
|
-
exports.tapAsync =
|
|
332
|
+
exports.swap = require_swap.swap;
|
|
333
|
+
exports.tap = require_swap.tap;
|
|
334
|
+
exports.tapAsync = require_swap.tapAsync;
|
|
285
335
|
exports.task = task;
|
|
286
336
|
exports.toNullable = toNullable;
|
|
287
337
|
exports.toPromise = toPromise;
|
|
288
338
|
exports.tryAsync = require_result.tryAsync;
|
|
289
|
-
exports.tryCatch =
|
|
290
|
-
exports.tryCatchAsync =
|
|
339
|
+
exports.tryCatch = require_swap.tryCatch;
|
|
340
|
+
exports.tryCatchAsync = require_swap.tryCatchAsync;
|
|
291
341
|
exports.tryFn = require_result.tryFn;
|
|
292
|
-
exports.tryMap =
|
|
293
|
-
exports.tryMapAsync =
|
|
342
|
+
exports.tryMap = require_swap.tryMap;
|
|
343
|
+
exports.tryMapAsync = require_swap.tryMapAsync;
|
|
294
344
|
exports.unwrap = unwrap;
|
|
295
345
|
exports.unwrapErr = unwrapErr;
|
|
296
346
|
exports.unwrapOr = unwrapOr;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["input: unknown","step: IteratorResult<Y, R>","err","isResult","ok","TaskYieldNotResultError","InvalidResultStateError","UnwrapOnErrError","InvalidResultStateError","InvalidResultStateError","InvalidResultStateError","InvalidResultStateError","UnwrapErrOnOkError","InvalidResultStateError","ExpectOkError","InvalidResultStateError","ExpectErrError","InvalidResultStateError","InvalidResultStateError","InvalidResultStateError","InvalidResultStateError","InvalidResultStateError","InvalidResultStateError","InvalidResultStateError"],"sources":["../src/gen.ts","../src/core/unwrap.ts","../src/core/unwrapOr.ts","../src/core/unwrapOrElse.ts","../src/core/unwrapOrDefault.ts","../src/core/unwrapOrThrow.ts","../src/core/unwrapErr.ts","../src/core/expectResult.ts","../src/core/expectErr.ts","../src/core/toPromise.ts","../src/core/toNullable.ts","../src/core/isOk.ts","../src/core/isErr.ts","../src/core/contains.ts","../src/core/containsErr.ts"],"sourcesContent":["import type { Result } from './core/result';\nimport { err, ok } from './core/result';\nimport { isResult } from './core/isResult';\nimport { InvalidResultStateError, TaskYieldNotResultError } from './errors';\n\ntype AnyGenerator<Y = unknown, R = unknown, N = unknown> = Generator<Y, R, N> | AsyncGenerator<Y, R, N>;\n\ntype ErrorOfYield<Y> = Y extends Result<any, infer E> ? E : never;\n\ntype OnThrow<E> = (error: unknown) => E;\n\ntype AwaitedReturn<R> = Awaited<R>;\ntype OkOfReturn<R> = AwaitedReturn<R> extends Result<infer T, any> ? T : AwaitedReturn<R>;\ntype ErrOfReturn<R> = AwaitedReturn<R> extends Result<any, infer E> ? E : never;\n\n/**\n * Generator-based do-notation for `Result`.\n *\n * Usage:\n * ```ts\n * const out = await task(async function* () {\n * const user = yield* await fromPromise(findUser(1));\n * const email = yield* validate(user.email);\n * return email;\n * });\n * ```\n */\nexport async function task<const Y, const R>(\n makeGenerator: () => AnyGenerator<Y, R, unknown>\n): Promise<Result<OkOfReturn<R>, ErrorOfYield<Y> | ErrOfReturn<R>>>;\nexport async function task<const Y, const R, EThrown>(\n makeGenerator: () => AnyGenerator<Y, R, unknown>,\n onThrow: OnThrow<EThrown>\n): Promise<Result<OkOfReturn<R>, ErrorOfYield<Y> | ErrOfReturn<R> | EThrown>>;\nexport async function task<const Y, const R, EThrown>(\n makeGenerator: () => AnyGenerator<Y, R, unknown>,\n onThrow?: OnThrow<EThrown>\n): Promise<Result<OkOfReturn<R>, ErrorOfYield<Y> | ErrOfReturn<R> | EThrown>> {\n const iterator = makeGenerator();\n let input: unknown = undefined;\n\n while (true) {\n let step: IteratorResult<Y, R>;\n try {\n step = await iterator.next(input);\n } catch (caught) {\n if (!onThrow) throw caught;\n return err<ErrorOfYield<Y> | ErrOfReturn<R> | EThrown, OkOfReturn<R>>(onThrow(caught));\n }\n\n if (step.done) {\n try {\n const awaited = await step.value;\n if (isResult(awaited)) {\n return awaited as Result<OkOfReturn<R>, ErrorOfYield<Y> | ErrOfReturn<R> | EThrown>;\n }\n return ok<OkOfReturn<R>, ErrorOfYield<Y> | ErrOfReturn<R> | EThrown>(awaited as OkOfReturn<R>);\n } catch (caught) {\n if (!onThrow) throw caught;\n return err<ErrorOfYield<Y> | ErrOfReturn<R> | EThrown, OkOfReturn<R>>(onThrow(caught));\n }\n }\n\n const yielded = step.value as unknown;\n if (!isResult(yielded)) {\n throw new TaskYieldNotResultError(yielded);\n }\n\n if (yielded.isOk()) {\n input = yielded.value;\n continue;\n }\n\n if (yielded.isErr()) {\n try {\n if (typeof iterator.return === 'function') {\n await iterator.return(undefined as unknown as R);\n }\n } catch (caught) {\n if (!onThrow) throw caught;\n return err<ErrorOfYield<Y> | ErrOfReturn<R> | EThrown, OkOfReturn<R>>(onThrow(caught));\n }\n\n return yielded as Result<OkOfReturn<R>, ErrorOfYield<Y> | ErrOfReturn<R> | EThrown>;\n }\n\n throw new InvalidResultStateError('task');\n }\n}\n\nexport const gen = task;\n","import type { Result } from './result';\nimport { InvalidResultStateError, UnwrapOnErrError } from '../errors';\n\n/**\n * Returns the value or throws an Error.\n * Corresponds to Rust `unwrap`.\n */\nexport function unwrap<T, E>(result: Result<T, E>): T {\n if (result.isOk()) {\n return result.value;\n }\n if (result.isErr()) throw new UnwrapOnErrError(result.error);\n throw new InvalidResultStateError('unwrap');\n}\n","import type { Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Returns the value or a default value.\n * Pure function alternative to the instance method.\n */\nexport function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\n if (result.isOk()) return result.value;\n if (result.isErr()) return defaultValue;\n throw new InvalidResultStateError('unwrapOr');\n}\n","import type { Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Returns the value or calculates a default value using a function.\n * Corresponds to Rust `unwrap_or_else`.\n */\nexport function unwrapOrElse<T, E>(result: Result<T, E>, fn: (error: E) => T): T {\n if (result.isOk()) return result.value;\n if (result.isErr()) return fn(result.error);\n throw new InvalidResultStateError('unwrapOrElse');\n}\n","import type { Result } from './result';\nimport { unwrapOr } from './unwrapOr';\n\n/**\n * Alias for `unwrapOr`.\n * Corresponds to Rust `unwrap_or_default` (with explicit default value).\n */\nexport function unwrapOrDefault<T, E>(result: Result<T, E>, defaultValue: T): T {\n return unwrapOr(result, defaultValue);\n}\n\n","import type { Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Returns the value or throws the original Err value (not wrapped).\n * Useful to preserve `Error` instances including stack traces.\n */\nexport function unwrapOrThrow<T, E>(result: Result<T, E>): T {\n if (result.isOk()) return result.value;\n if (result.isErr()) throw result.error;\n throw new InvalidResultStateError('unwrapOrThrow');\n}\n","import type { Result } from './result';\nimport { InvalidResultStateError, UnwrapErrOnOkError } from '../errors';\n\n/**\n * Returns the error or throws an Error.\n * Corresponds to Rust `unwrap_err`.\n */\nexport function unwrapErr<T, E>(result: Result<T, E>): E {\n if (result.isErr()) {\n return result.error;\n }\n if (result.isOk()) throw new UnwrapErrOnOkError(result.value);\n throw new InvalidResultStateError('unwrapErr');\n}\n","import type { Result } from './result';\nimport { ExpectOkError, InvalidResultStateError } from '../errors';\n\n/**\n * Returns the value or throws an Error with a custom message.\n * Corresponds to Rust `expect`.\n */\nexport function expectResult<T, E>(result: Result<T, E>, message: string): T {\n if (result.isOk()) {\n return result.value;\n }\n if (result.isErr()) {\n throw new ExpectOkError(message);\n }\n throw new InvalidResultStateError('expectResult');\n}\n","import type { Result } from './result';\nimport { ExpectErrError, InvalidResultStateError } from '../errors';\n\n/**\n * Returns the error or throws an Error with a custom message.\n * Corresponds to Rust `expect_err`.\n */\nexport function expectErr<T, E>(result: Result<T, E>, message: string): E {\n if (result.isErr()) {\n return result.error;\n }\n if (result.isOk()) {\n throw new ExpectErrError(message);\n }\n throw new InvalidResultStateError('expectErr');\n}\n","import type { Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Converts a Result to a Promise.\n * Ok → resolve(value), Err → reject(error)\n */\nexport function toPromise<T, E>(result: Result<T, E>): Promise<T> {\n if (result.isOk()) {\n return Promise.resolve(result.value);\n }\n if (result.isErr()) return Promise.reject(result.error);\n throw new InvalidResultStateError('toPromise');\n}\n","import type { Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Converts a Result to `T | null`.\n * Ok → value, Err → null\n */\nexport function toNullable<T, E>(result: Result<T, E>): T | null {\n if (result.isOk()) return result.value;\n if (result.isErr()) return null;\n throw new InvalidResultStateError('toNullable');\n}\n","import type { Ok, Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Checks if a Result is Ok.\n * Pure function alternative to the instance method.\n */\nexport function isOk<T, E>(result: Result<T, E>): result is Ok<T, E> {\n if (result.isOk()) return true;\n if (result.isErr()) return false;\n throw new InvalidResultStateError('isOk');\n}\n","import type { Err, Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Checks if a Result is Err.\n * Pure function alternative to the instance method.\n */\nexport function isErr<T, E>(result: Result<T, E>): result is Err<T, E> {\n if (result.isErr()) return true;\n if (result.isOk()) return false;\n throw new InvalidResultStateError('isErr');\n}\n","import type { Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Checks if the Result contains a specific value.\n * Corresponds to Rust `contains`.\n */\nexport function contains<T, E>(result: Result<T, E>, value: T): boolean {\n if (result.isOk()) return result.value === value;\n if (result.isErr()) return false;\n throw new InvalidResultStateError('contains');\n}\n","import type { Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Checks if the Result contains a specific error.\n * Analogous to `contains` for the Err case.\n */\nexport function containsErr<T, E>(result: Result<T, E>, error: E): boolean {\n if (result.isErr()) return result.error === error;\n if (result.isOk()) return false;\n throw new InvalidResultStateError('containsErr');\n}\n"],"mappings":";;;;;;AAkCA,eAAsB,KAClB,eACA,SAC0E;CAC1E,MAAM,WAAW,eAAe;CAChC,IAAIA,QAAiB;AAErB,QAAO,MAAM;EACT,IAAIC;AACJ,MAAI;AACA,UAAO,MAAM,SAAS,KAAK,MAAM;WAC5B,QAAQ;AACb,OAAI,CAAC,QAAS,OAAM;AACpB,UAAOC,mBAA+D,QAAQ,OAAO,CAAC;;AAG1F,MAAI,KAAK,KACL,KAAI;GACA,MAAM,UAAU,MAAM,KAAK;AAC3B,OAAIC,wBAAS,QAAQ,CACjB,QAAO;AAEX,UAAOC,kBAA8D,QAAyB;WACzF,QAAQ;AACb,OAAI,CAAC,QAAS,OAAM;AACpB,UAAOF,mBAA+D,QAAQ,OAAO,CAAC;;EAI9F,MAAM,UAAU,KAAK;AACrB,MAAI,CAACC,wBAAS,QAAQ,CAClB,OAAM,IAAIE,uCAAwB,QAAQ;AAG9C,MAAI,QAAQ,MAAM,EAAE;AAChB,WAAQ,QAAQ;AAChB;;AAGJ,MAAI,QAAQ,OAAO,EAAE;AACjB,OAAI;AACA,QAAI,OAAO,SAAS,WAAW,WAC3B,OAAM,SAAS,OAAO,OAA0B;YAE/C,QAAQ;AACb,QAAI,CAAC,QAAS,OAAM;AACpB,WAAOH,mBAA+D,QAAQ,OAAO,CAAC;;AAG1F,UAAO;;AAGX,QAAM,IAAII,uCAAwB,OAAO;;;AAIjD,MAAa,MAAM;;;;;;;;ACnFnB,SAAgB,OAAa,QAAyB;AAClD,KAAI,OAAO,MAAM,CACb,QAAO,OAAO;AAElB,KAAI,OAAO,OAAO,CAAE,OAAM,IAAIC,gCAAiB,OAAO,MAAM;AAC5D,OAAM,IAAIC,uCAAwB,SAAS;;;;;;;;;ACL/C,SAAgB,SAAe,QAAsB,cAAoB;AACrE,KAAI,OAAO,MAAM,CAAE,QAAO,OAAO;AACjC,KAAI,OAAO,OAAO,CAAE,QAAO;AAC3B,OAAM,IAAIC,uCAAwB,WAAW;;;;;;;;;ACHjD,SAAgB,aAAmB,QAAsB,IAAwB;AAC7E,KAAI,OAAO,MAAM,CAAE,QAAO,OAAO;AACjC,KAAI,OAAO,OAAO,CAAE,QAAO,GAAG,OAAO,MAAM;AAC3C,OAAM,IAAIC,uCAAwB,eAAe;;;;;;;;;ACHrD,SAAgB,gBAAsB,QAAsB,cAAoB;AAC5E,QAAO,SAAS,QAAQ,aAAa;;;;;;;;;ACDzC,SAAgB,cAAoB,QAAyB;AACzD,KAAI,OAAO,MAAM,CAAE,QAAO,OAAO;AACjC,KAAI,OAAO,OAAO,CAAE,OAAM,OAAO;AACjC,OAAM,IAAIC,uCAAwB,gBAAgB;;;;;;;;;ACHtD,SAAgB,UAAgB,QAAyB;AACrD,KAAI,OAAO,OAAO,CACd,QAAO,OAAO;AAElB,KAAI,OAAO,MAAM,CAAE,OAAM,IAAIC,kCAAmB,OAAO,MAAM;AAC7D,OAAM,IAAIC,uCAAwB,YAAY;;;;;;;;;ACLlD,SAAgB,aAAmB,QAAsB,SAAoB;AACzE,KAAI,OAAO,MAAM,CACb,QAAO,OAAO;AAElB,KAAI,OAAO,OAAO,CACd,OAAM,IAAIC,6BAAc,QAAQ;AAEpC,OAAM,IAAIC,uCAAwB,eAAe;;;;;;;;;ACPrD,SAAgB,UAAgB,QAAsB,SAAoB;AACtE,KAAI,OAAO,OAAO,CACd,QAAO,OAAO;AAElB,KAAI,OAAO,MAAM,CACb,OAAM,IAAIC,8BAAe,QAAQ;AAErC,OAAM,IAAIC,uCAAwB,YAAY;;;;;;;;;ACPlD,SAAgB,UAAgB,QAAkC;AAC9D,KAAI,OAAO,MAAM,CACb,QAAO,QAAQ,QAAQ,OAAO,MAAM;AAExC,KAAI,OAAO,OAAO,CAAE,QAAO,QAAQ,OAAO,OAAO,MAAM;AACvD,OAAM,IAAIC,uCAAwB,YAAY;;;;;;;;;ACLlD,SAAgB,WAAiB,QAAgC;AAC7D,KAAI,OAAO,MAAM,CAAE,QAAO,OAAO;AACjC,KAAI,OAAO,OAAO,CAAE,QAAO;AAC3B,OAAM,IAAIC,uCAAwB,aAAa;;;;;;;;;ACHnD,SAAgB,KAAW,QAA0C;AACjE,KAAI,OAAO,MAAM,CAAE,QAAO;AAC1B,KAAI,OAAO,OAAO,CAAE,QAAO;AAC3B,OAAM,IAAIC,uCAAwB,OAAO;;;;;;;;;ACH7C,SAAgB,MAAY,QAA2C;AACnE,KAAI,OAAO,OAAO,CAAE,QAAO;AAC3B,KAAI,OAAO,MAAM,CAAE,QAAO;AAC1B,OAAM,IAAIC,uCAAwB,QAAQ;;;;;;;;;ACH9C,SAAgB,SAAe,QAAsB,OAAmB;AACpE,KAAI,OAAO,MAAM,CAAE,QAAO,OAAO,UAAU;AAC3C,KAAI,OAAO,OAAO,CAAE,QAAO;AAC3B,OAAM,IAAIC,uCAAwB,WAAW;;;;;;;;;ACHjD,SAAgB,YAAkB,QAAsB,OAAmB;AACvE,KAAI,OAAO,OAAO,CAAE,QAAO,OAAO,UAAU;AAC5C,KAAI,OAAO,MAAM,CAAE,QAAO;AAC1B,OAAM,IAAIC,uCAAwB,cAAc"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["err","isResult","ok","TaskYieldNotResultError","InvalidResultStateError","UnwrapOnErrError","InvalidResultStateError","InvalidResultStateError","InvalidResultStateError","InvalidResultStateError","UnwrapErrOnOkError","InvalidResultStateError","ExpectOkError","InvalidResultStateError","ExpectErrError","InvalidResultStateError","ok","err","InvalidResultStateError","InvalidResultStateError","InvalidResultStateError","InvalidResultStateError","InvalidResultStateError","InvalidResultStateError","InvalidResultStateError"],"sources":["../src/gen.ts","../src/core/unwrap.ts","../src/core/unwrapOr.ts","../src/core/unwrapOrElse.ts","../src/core/unwrapOrDefault.ts","../src/core/unwrapOrThrow.ts","../src/core/unwrapErr.ts","../src/core/expectResult.ts","../src/core/expectErr.ts","../src/core/fromSerialized.ts","../src/core/toPromise.ts","../src/core/toNullable.ts","../src/core/isOk.ts","../src/core/isErr.ts","../src/core/contains.ts","../src/core/containsErr.ts"],"sourcesContent":["import type { Result } from './core/result';\nimport { err, ok } from './core/result';\nimport { isResult } from './core/isResult';\nimport { InvalidResultStateError, TaskYieldNotResultError } from './errors';\n\ntype AnyGenerator<Y = unknown, R = unknown, N = unknown> = Generator<Y, R, N> | AsyncGenerator<Y, R, N>;\n\ntype ErrorOfYield<Y> = Y extends Result<any, infer E> ? E : never;\n\ntype OnThrow<E> = (error: unknown) => E;\n\ntype AwaitedReturn<R> = Awaited<R>;\ntype OkOfReturn<R> = AwaitedReturn<R> extends Result<infer T, any> ? T : AwaitedReturn<R>;\ntype ErrOfReturn<R> = AwaitedReturn<R> extends Result<any, infer E> ? E : never;\n\n/**\n * Generator-based do-notation for `Result`.\n *\n * Usage:\n * ```ts\n * const out = await task(async function* () {\n * const user = yield* await fromPromise(findUser(1));\n * const email = yield* validate(user.email);\n * return email;\n * });\n * ```\n */\nexport async function task<const Y, const R>(\n makeGenerator: () => AnyGenerator<Y, R, unknown>\n): Promise<Result<OkOfReturn<R>, ErrorOfYield<Y> | ErrOfReturn<R>>>;\nexport async function task<const Y, const R, EThrown>(\n makeGenerator: () => AnyGenerator<Y, R, unknown>,\n onThrow: OnThrow<EThrown>\n): Promise<Result<OkOfReturn<R>, ErrorOfYield<Y> | ErrOfReturn<R> | EThrown>>;\nexport async function task<const Y, const R, EThrown>(\n makeGenerator: () => AnyGenerator<Y, R, unknown>,\n onThrow?: OnThrow<EThrown>\n): Promise<Result<OkOfReturn<R>, ErrorOfYield<Y> | ErrOfReturn<R> | EThrown>> {\n const iterator = makeGenerator();\n let input: unknown = undefined;\n\n // Resume the suspended generator as if it returned, so its `finally`\n // blocks run before we abort the workflow (short-circuit or error path).\n const runGeneratorReturn = async (): Promise<void> => {\n if (typeof iterator.return !== 'function') return;\n // A `yield` inside a `finally` block suspends the generator again\n // ({done: false}). Resume with next() so the remaining cleanup code\n // still runs — calling return() again would abort the rest of that\n // finally block. The pending return completion ends the generator\n // once all finally blocks have finished.\n let step = await iterator.return(undefined as unknown as R);\n while (!step.done) {\n step = await iterator.next(undefined);\n }\n };\n\n while (true) {\n let step: IteratorResult<Y, R>;\n try {\n step = await iterator.next(input);\n } catch (caught) {\n if (!onThrow) throw caught;\n return err<ErrorOfYield<Y> | ErrOfReturn<R> | EThrown, OkOfReturn<R>>(onThrow(caught));\n }\n\n if (step.done) {\n try {\n const awaited = await step.value;\n if (isResult(awaited)) {\n return awaited as Result<OkOfReturn<R>, ErrorOfYield<Y> | ErrOfReturn<R> | EThrown>;\n }\n return ok<OkOfReturn<R>, ErrorOfYield<Y> | ErrOfReturn<R> | EThrown>(awaited as OkOfReturn<R>);\n } catch (caught) {\n if (!onThrow) throw caught;\n return err<ErrorOfYield<Y> | ErrOfReturn<R> | EThrown, OkOfReturn<R>>(onThrow(caught));\n }\n }\n\n const yielded = step.value as unknown;\n if (!isResult(yielded)) {\n try {\n await runGeneratorReturn();\n } catch (caught) {\n if (!onThrow) throw caught;\n return err<ErrorOfYield<Y> | ErrOfReturn<R> | EThrown, OkOfReturn<R>>(onThrow(caught));\n }\n throw new TaskYieldNotResultError(yielded);\n }\n\n if (yielded.isOk()) {\n input = yielded.value;\n continue;\n }\n\n if (yielded.isErr()) {\n try {\n await runGeneratorReturn();\n } catch (caught) {\n if (!onThrow) throw caught;\n return err<ErrorOfYield<Y> | ErrOfReturn<R> | EThrown, OkOfReturn<R>>(onThrow(caught));\n }\n\n return yielded as Result<OkOfReturn<R>, ErrorOfYield<Y> | ErrOfReturn<R> | EThrown>;\n }\n\n try {\n await runGeneratorReturn();\n } catch (caught) {\n if (!onThrow) throw caught;\n return err<ErrorOfYield<Y> | ErrOfReturn<R> | EThrown, OkOfReturn<R>>(onThrow(caught));\n }\n throw new InvalidResultStateError('task');\n }\n}\n\nexport const gen: typeof task = task;\n","import type { Result } from './result';\nimport { InvalidResultStateError, UnwrapOnErrError } from '../errors';\n\n/**\n * Returns the value or throws an Error.\n * Corresponds to Rust `unwrap`.\n */\nexport function unwrap<T, E>(result: Result<T, E>): T {\n if (result.isOk()) {\n return result.value;\n }\n if (result.isErr()) throw new UnwrapOnErrError(result.error);\n throw new InvalidResultStateError('unwrap');\n}\n","import type { Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Returns the value or a default value.\n * Pure function alternative to the instance method.\n */\nexport function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\n if (result.isOk()) return result.value;\n if (result.isErr()) return defaultValue;\n throw new InvalidResultStateError('unwrapOr');\n}\n","import type { Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Returns the value or calculates a default value using a function.\n * Corresponds to Rust `unwrap_or_else`.\n */\nexport function unwrapOrElse<T, E>(result: Result<T, E>, fn: (error: E) => T): T {\n if (result.isOk()) return result.value;\n if (result.isErr()) return fn(result.error);\n throw new InvalidResultStateError('unwrapOrElse');\n}\n","import type { Result } from './result';\nimport { unwrapOr } from './unwrapOr';\n\n/**\n * Alias for `unwrapOr`.\n *\n * @deprecated Use {@link unwrapOr} instead. The name is misleading: Rust's\n * `unwrap_or_default` takes no argument (it uses the type's `Default`),\n * whereas this function requires an explicit default value — which is exactly\n * what `unwrapOr` does.\n */\nexport function unwrapOrDefault<T, E>(result: Result<T, E>, defaultValue: T): T {\n return unwrapOr(result, defaultValue);\n}\n\n","import type { Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Returns the value or throws the original Err value (not wrapped).\n * Useful to preserve `Error` instances including stack traces.\n */\nexport function unwrapOrThrow<T, E>(result: Result<T, E>): T {\n if (result.isOk()) return result.value;\n if (result.isErr()) throw result.error;\n throw new InvalidResultStateError('unwrapOrThrow');\n}\n","import type { Result } from './result';\nimport { InvalidResultStateError, UnwrapErrOnOkError } from '../errors';\n\n/**\n * Returns the error or throws an Error.\n * Corresponds to Rust `unwrap_err`.\n */\nexport function unwrapErr<T, E>(result: Result<T, E>): E {\n if (result.isErr()) {\n return result.error;\n }\n if (result.isOk()) throw new UnwrapErrOnOkError(result.value);\n throw new InvalidResultStateError('unwrapErr');\n}\n","import type { Result } from './result';\nimport { ExpectOkError, InvalidResultStateError } from '../errors';\n\n/**\n * Returns the value or throws an Error with a custom message.\n * Corresponds to Rust `expect`.\n */\nexport function expectResult<T, E>(result: Result<T, E>, message: string): T {\n if (result.isOk()) {\n return result.value;\n }\n if (result.isErr()) {\n throw new ExpectOkError(message, result.error);\n }\n throw new InvalidResultStateError('expectResult');\n}\n","import type { Result } from './result';\nimport { ExpectErrError, InvalidResultStateError } from '../errors';\n\n/**\n * Returns the error or throws an Error with a custom message.\n * Corresponds to Rust `expect_err`.\n */\nexport function expectErr<T, E>(result: Result<T, E>, message: string): E {\n if (result.isErr()) {\n return result.error;\n }\n if (result.isOk()) {\n throw new ExpectErrError(message, result.value);\n }\n throw new InvalidResultStateError('expectErr');\n}\n","import type { Result, ResultType } from './result';\nimport { err, ok } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Rebuilds a `Result` from its serialized discriminated form\n * (`{ _tag: 'Ok', value }` / `{ _tag: 'Err', error }`), the shape produced\n * by `Result.toSerialized()` and by `JSON.stringify` on a Result.\n *\n * Throws `InvalidResultStateError` for data that is not in that shape.\n */\nexport function fromSerialized<T, E>(data: ResultType<T, E>): Result<T, E> {\n if (data !== null && typeof data === 'object') {\n if (data._tag === 'Ok' && 'value' in data) return ok<T, E>(data.value);\n if (data._tag === 'Err' && 'error' in data) return err<E, T>(data.error);\n }\n throw new InvalidResultStateError('fromSerialized');\n}\n","import type { Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Converts a Result to a Promise.\n * Ok → resolve(value), Err → reject(error)\n */\nexport function toPromise<T, E>(result: Result<T, E>): Promise<T> {\n if (result.isOk()) {\n return Promise.resolve(result.value);\n }\n if (result.isErr()) return Promise.reject(result.error);\n throw new InvalidResultStateError('toPromise');\n}\n","import type { Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Converts a Result to `T | null`.\n * Ok → value, Err → null\n */\nexport function toNullable<T, E>(result: Result<T, E>): T | null {\n if (result.isOk()) return result.value;\n if (result.isErr()) return null;\n throw new InvalidResultStateError('toNullable');\n}\n","import type { Ok, Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Checks if a Result is Ok.\n * Pure function alternative to the instance method.\n */\nexport function isOk<T, E>(result: Result<T, E>): result is Ok<T, E> {\n if (result.isOk()) return true;\n if (result.isErr()) return false;\n throw new InvalidResultStateError('isOk');\n}\n","import type { Err, Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Checks if a Result is Err.\n * Pure function alternative to the instance method.\n */\nexport function isErr<T, E>(result: Result<T, E>): result is Err<T, E> {\n if (result.isErr()) return true;\n if (result.isOk()) return false;\n throw new InvalidResultStateError('isErr');\n}\n","import type { Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Checks if the Result contains a specific value.\n * Corresponds to Rust `contains`.\n *\n * Comparison uses `Object.is` (SameValue): `NaN` matches `NaN`, `+0` and\n * `-0` are distinct, and objects are compared by reference.\n */\nexport function contains<T, E>(result: Result<T, E>, value: T): boolean {\n if (result.isOk()) return Object.is(result.value, value);\n if (result.isErr()) return false;\n throw new InvalidResultStateError('contains');\n}\n","import type { Result } from './result';\nimport { InvalidResultStateError } from '../errors';\n\n/**\n * Checks if the Result contains a specific error.\n * Analogous to `contains` for the Err case.\n *\n * Comparison uses `Object.is` (SameValue): `NaN` matches `NaN`, `+0` and\n * `-0` are distinct, and objects are compared by reference.\n */\nexport function containsErr<T, E>(result: Result<T, E>, error: E): boolean {\n if (result.isErr()) return Object.is(result.error, error);\n if (result.isOk()) return false;\n throw new InvalidResultStateError('containsErr');\n}\n"],"mappings":"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"}
|