@praha/byethrow 0.7.2 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/exports.cjs +26 -17
- package/dist/cjs/exports.d.ts +2 -1
- package/dist/cjs/functions/collect.cjs +64 -0
- package/dist/cjs/functions/collect.d.ts +103 -0
- package/dist/cjs/functions/fail.d.ts +2 -2
- package/dist/cjs/functions/map-error.d.ts +2 -2
- package/dist/cjs/functions/map.d.ts +2 -2
- package/dist/cjs/functions/sequence.cjs +69 -0
- package/dist/cjs/functions/sequence.d.ts +101 -0
- package/dist/cjs/functions/succeed.d.ts +2 -2
- package/dist/esm/exports.d.ts +2 -1
- package/dist/esm/exports.js +2 -1
- package/dist/esm/functions/collect.d.ts +103 -0
- package/dist/esm/functions/collect.js +30 -0
- package/dist/esm/functions/fail.d.ts +2 -2
- package/dist/esm/functions/map-error.d.ts +2 -2
- package/dist/esm/functions/map.d.ts +2 -2
- package/dist/esm/functions/sequence.d.ts +101 -0
- package/dist/esm/functions/sequence.js +35 -0
- package/dist/esm/functions/succeed.d.ts +2 -2
- package/package.json +6 -3
- package/dist/cjs/functions/combine.cjs +0 -89
- package/dist/cjs/functions/combine.d.ts +0 -54
- package/dist/esm/functions/combine.d.ts +0 -54
- package/dist/esm/functions/combine.js +0 -55
package/dist/cjs/exports.cjs
CHANGED
|
@@ -15,8 +15,8 @@ var __webpack_modules__ = {
|
|
|
15
15
|
"./functions/bind": function(module) {
|
|
16
16
|
module.exports = require("./functions/bind.cjs");
|
|
17
17
|
},
|
|
18
|
-
"./functions/
|
|
19
|
-
module.exports = require("./functions/
|
|
18
|
+
"./functions/collect": function(module) {
|
|
19
|
+
module.exports = require("./functions/collect.cjs");
|
|
20
20
|
},
|
|
21
21
|
"./functions/do": function(module) {
|
|
22
22
|
module.exports = require("./functions/do.cjs");
|
|
@@ -54,6 +54,9 @@ var __webpack_modules__ = {
|
|
|
54
54
|
"./functions/pipe": function(module) {
|
|
55
55
|
module.exports = require("./functions/pipe.cjs");
|
|
56
56
|
},
|
|
57
|
+
"./functions/sequence": function(module) {
|
|
58
|
+
module.exports = require("./functions/sequence.cjs");
|
|
59
|
+
},
|
|
57
60
|
"./functions/succeed": function(module) {
|
|
58
61
|
module.exports = require("./functions/succeed.cjs");
|
|
59
62
|
},
|
|
@@ -149,10 +152,10 @@ var __webpack_exports__ = {};
|
|
|
149
152
|
return _functions_bind__WEBPACK_IMPORTED_MODULE_5__[key];
|
|
150
153
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
|
151
154
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
|
152
|
-
var
|
|
155
|
+
var _functions_collect__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__("./functions/collect");
|
|
153
156
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
|
154
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
|
155
|
-
return
|
|
157
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_collect__WEBPACK_IMPORTED_MODULE_6__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
|
158
|
+
return _functions_collect__WEBPACK_IMPORTED_MODULE_6__[key];
|
|
156
159
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
|
157
160
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
|
158
161
|
var _functions_do__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__("./functions/do");
|
|
@@ -227,28 +230,34 @@ var __webpack_exports__ = {};
|
|
|
227
230
|
return _functions_pipe__WEBPACK_IMPORTED_MODULE_18__[key];
|
|
228
231
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
|
229
232
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
|
230
|
-
var
|
|
233
|
+
var _functions_sequence__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__("./functions/sequence");
|
|
234
|
+
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
|
235
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_sequence__WEBPACK_IMPORTED_MODULE_19__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
|
236
|
+
return _functions_sequence__WEBPACK_IMPORTED_MODULE_19__[key];
|
|
237
|
+
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
|
238
|
+
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
|
239
|
+
var _functions_succeed__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__("./functions/succeed");
|
|
231
240
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
|
232
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
|
233
|
-
return
|
|
241
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_succeed__WEBPACK_IMPORTED_MODULE_20__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
|
242
|
+
return _functions_succeed__WEBPACK_IMPORTED_MODULE_20__[key];
|
|
234
243
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
|
235
244
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
|
236
|
-
var
|
|
245
|
+
var _functions_try__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__("./functions/try");
|
|
237
246
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
|
238
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
|
239
|
-
return
|
|
247
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_try__WEBPACK_IMPORTED_MODULE_21__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
|
248
|
+
return _functions_try__WEBPACK_IMPORTED_MODULE_21__[key];
|
|
240
249
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
|
241
250
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
|
242
|
-
var
|
|
251
|
+
var _functions_unwrap__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__("./functions/unwrap");
|
|
243
252
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
|
244
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
|
245
|
-
return
|
|
253
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_unwrap__WEBPACK_IMPORTED_MODULE_22__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
|
254
|
+
return _functions_unwrap__WEBPACK_IMPORTED_MODULE_22__[key];
|
|
246
255
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
|
247
256
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
|
248
|
-
var
|
|
257
|
+
var _functions_unwrap_error__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__("./functions/unwrap-error");
|
|
249
258
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
|
250
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
|
251
|
-
return
|
|
259
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_unwrap_error__WEBPACK_IMPORTED_MODULE_23__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
|
260
|
+
return _functions_unwrap_error__WEBPACK_IMPORTED_MODULE_23__[key];
|
|
252
261
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
|
253
262
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
|
254
263
|
})();
|
package/dist/cjs/exports.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export * from './functions/and-through.js';
|
|
|
4
4
|
export * from './functions/assert-failure.js';
|
|
5
5
|
export * from './functions/assert-success.js';
|
|
6
6
|
export * from './functions/bind.js';
|
|
7
|
-
export * from './functions/
|
|
7
|
+
export * from './functions/collect.js';
|
|
8
8
|
export * from './functions/do.js';
|
|
9
9
|
export * from './functions/fail.js';
|
|
10
10
|
export * from './functions/inspect.js';
|
|
@@ -17,6 +17,7 @@ export * from './functions/map-error.js';
|
|
|
17
17
|
export * from './functions/or-else.js';
|
|
18
18
|
export * from './functions/parse.js';
|
|
19
19
|
export * from './functions/pipe.js';
|
|
20
|
+
export * from './functions/sequence.js';
|
|
20
21
|
export * from './functions/succeed.js';
|
|
21
22
|
export * from './functions/try.js';
|
|
22
23
|
export * from './functions/unwrap.js';
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
collect: ()=>collect
|
|
28
|
+
});
|
|
29
|
+
const external_fail_cjs_namespaceObject = require("./fail.cjs");
|
|
30
|
+
const external_is_failure_cjs_namespaceObject = require("./is-failure.cjs");
|
|
31
|
+
const external_succeed_cjs_namespaceObject = require("./succeed.cjs");
|
|
32
|
+
const is_promise_cjs_namespaceObject = require("../internals/helpers/is-promise.cjs");
|
|
33
|
+
const collect = (value, fn)=>{
|
|
34
|
+
const reduce = (entries, callback, initialValue)=>{
|
|
35
|
+
const errors = [];
|
|
36
|
+
const results = entries.map(([, entry])=>fn ? fn(entry) : entry);
|
|
37
|
+
if (results.some(is_promise_cjs_namespaceObject.isPromise)) return Promise.all(results).then((results)=>{
|
|
38
|
+
const accumulator = initialValue;
|
|
39
|
+
for (const [index, result] of results.entries())if ((0, external_is_failure_cjs_namespaceObject.isFailure)(result)) errors.push(result.error);
|
|
40
|
+
else callback(accumulator, result.value, entries[index]);
|
|
41
|
+
return errors.length > 0 ? (0, external_fail_cjs_namespaceObject.fail)(errors) : (0, external_succeed_cjs_namespaceObject.succeed)(accumulator);
|
|
42
|
+
});
|
|
43
|
+
const accumulator = initialValue;
|
|
44
|
+
for (const [index, result] of results.entries())if ((0, external_is_failure_cjs_namespaceObject.isFailure)(result)) errors.push(result.error);
|
|
45
|
+
else callback(accumulator, result.value, entries[index]);
|
|
46
|
+
return errors.length > 0 ? (0, external_fail_cjs_namespaceObject.fail)(errors) : (0, external_succeed_cjs_namespaceObject.succeed)(accumulator);
|
|
47
|
+
};
|
|
48
|
+
if (!Array.isArray(value)) return reduce(Object.entries(value), (accumulator, value, [key])=>{
|
|
49
|
+
accumulator[key] = value;
|
|
50
|
+
}, {});
|
|
51
|
+
if (fn) return reduce([
|
|
52
|
+
...value.entries()
|
|
53
|
+
], (accumulator, value)=>accumulator.push(value), []);
|
|
54
|
+
return reduce([
|
|
55
|
+
...value.entries()
|
|
56
|
+
], (accumulator, value)=>accumulator.push(value), []);
|
|
57
|
+
};
|
|
58
|
+
exports.collect = __webpack_exports__.collect;
|
|
59
|
+
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
60
|
+
"collect"
|
|
61
|
+
].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
|
|
62
|
+
Object.defineProperty(exports, '__esModule', {
|
|
63
|
+
value: true
|
|
64
|
+
});
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '../result.js';
|
|
2
|
+
/**
|
|
3
|
+
* Processes multiple {@link Result} or {@link ResultAsync} values into a single result.
|
|
4
|
+
* If all results are {@link Success}, returns a {@link Success} containing all values.
|
|
5
|
+
* If any result is a {@link Failure}, returns a {@link Failure} containing an array of all errors.
|
|
6
|
+
*
|
|
7
|
+
* Unlike {@link sequence}, which stops at the first error and returns only that error,
|
|
8
|
+
* `collect` processes all results and collects all errors.
|
|
9
|
+
*
|
|
10
|
+
* @function
|
|
11
|
+
* @typeParam X - The input type (object or array of Results).
|
|
12
|
+
*
|
|
13
|
+
* @example Object of Results (all succeed)
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { Result } from '@praha/byethrow';
|
|
16
|
+
*
|
|
17
|
+
* const result = Result.collect({
|
|
18
|
+
* name: Result.succeed('Alice'),
|
|
19
|
+
* age: Result.succeed(20),
|
|
20
|
+
* });
|
|
21
|
+
* // { type: 'Success', value: { name: 'Alice', age: 20 } }
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @example Object of Results (some fail)
|
|
25
|
+
* ```ts
|
|
26
|
+
* import { Result } from '@praha/byethrow';
|
|
27
|
+
*
|
|
28
|
+
* const result = Result.collect({
|
|
29
|
+
* name: Result.succeed('Alice'),
|
|
30
|
+
* age: Result.fail('Invalid age'),
|
|
31
|
+
* });
|
|
32
|
+
* // { type: 'Failure', error: ['Invalid age'] }
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* @example Array of Results (all succeed)
|
|
36
|
+
* ```ts
|
|
37
|
+
* import { Result } from '@praha/byethrow';
|
|
38
|
+
*
|
|
39
|
+
* const result = Result.collect([
|
|
40
|
+
* Result.succeed(1),
|
|
41
|
+
* Result.succeed(2),
|
|
42
|
+
* Result.succeed(3),
|
|
43
|
+
* ]);
|
|
44
|
+
* // { type: 'Success', value: [1, 2, 3] }
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @example Array of Results (some fail)
|
|
48
|
+
* ```ts
|
|
49
|
+
* import { Result } from '@praha/byethrow';
|
|
50
|
+
*
|
|
51
|
+
* const result = Result.collect([
|
|
52
|
+
* Result.succeed(1),
|
|
53
|
+
* Result.fail('error1'),
|
|
54
|
+
* Result.fail('error2'),
|
|
55
|
+
* ]);
|
|
56
|
+
* // { type: 'Failure', error: ['error1', 'error2'] }
|
|
57
|
+
* ```
|
|
58
|
+
*
|
|
59
|
+
* @example Using a mapper function (all succeed)
|
|
60
|
+
* ```ts
|
|
61
|
+
* import { Result } from '@praha/byethrow';
|
|
62
|
+
*
|
|
63
|
+
* const result = Result.collect(['1', '2', '3'], (value) => {
|
|
64
|
+
* const number = Number(value);
|
|
65
|
+
* return Number.isNaN(number)
|
|
66
|
+
* ? Result.fail(`Invalid number: ${value}`)
|
|
67
|
+
* : Result.succeed(number);
|
|
68
|
+
* });
|
|
69
|
+
* // { type: 'Success', value: [1, 2, 3] }
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* @example Using a mapper function (some fail)
|
|
73
|
+
* ```ts
|
|
74
|
+
* import { Result } from '@praha/byethrow';
|
|
75
|
+
*
|
|
76
|
+
* const result = Result.collect(['1', 'invalid', '3'], (value) => {
|
|
77
|
+
* const number = Number(value);
|
|
78
|
+
* return Number.isNaN(number)
|
|
79
|
+
* ? Result.fail(`Invalid number: ${value}`)
|
|
80
|
+
* : Result.succeed(number);
|
|
81
|
+
* });
|
|
82
|
+
* // { type: 'Failure', error: ['Invalid number: invalid'] }
|
|
83
|
+
* ```
|
|
84
|
+
*
|
|
85
|
+
* @category Utilities
|
|
86
|
+
*/
|
|
87
|
+
export declare const collect: {
|
|
88
|
+
<X extends Record<string, ResultMaybeAsync<any, any>>>(x: X): ResultFor<X[keyof X], {
|
|
89
|
+
[K in keyof X]: InferSuccess<X[K]>;
|
|
90
|
+
}, InferFailure<X[keyof X]>[]>;
|
|
91
|
+
<const X extends Array<ResultMaybeAsync<any, any>>>(x: X): ResultFor<X[number], {
|
|
92
|
+
[K in keyof X]: InferSuccess<X[K]>;
|
|
93
|
+
}, InferFailure<X[number]>[]>;
|
|
94
|
+
<const X extends ReadonlyArray<ResultMaybeAsync<any, any>>>(x: X): ResultFor<X[number], {
|
|
95
|
+
[K in keyof X]: InferSuccess<X[K]>;
|
|
96
|
+
}, InferFailure<X[number]>[]>;
|
|
97
|
+
<const X extends Array<unknown>, Fn extends (value: X[number]) => ResultMaybeAsync<any, any>>(x: X, fn: Fn): ResultFor<ReturnType<Fn>, {
|
|
98
|
+
[K in keyof X]: InferSuccess<Fn>;
|
|
99
|
+
}, InferFailure<Fn>[]>;
|
|
100
|
+
<const X extends ReadonlyArray<unknown>, Fn extends (value: X[number]) => ResultMaybeAsync<any, any>>(x: X, fn: Fn): ResultFor<ReturnType<Fn>, {
|
|
101
|
+
[K in keyof X]: InferSuccess<Fn>;
|
|
102
|
+
}, InferFailure<Fn>[]>;
|
|
103
|
+
};
|
|
@@ -31,11 +31,11 @@ import type { ResultFor } from '../result.js';
|
|
|
31
31
|
* // Result.Result<never, void>
|
|
32
32
|
* ```
|
|
33
33
|
*
|
|
34
|
-
* @see {@link
|
|
34
|
+
* @see {@link collect} - For collect multiple Results into a single Result.
|
|
35
35
|
*
|
|
36
36
|
* @category Creators
|
|
37
37
|
*/
|
|
38
38
|
export declare const fail: {
|
|
39
39
|
(): ResultFor<never, never, void>;
|
|
40
|
-
<E>(error: E): ResultFor<E, never, Awaited<E>>;
|
|
40
|
+
<const E>(error: E): ResultFor<E, never, Awaited<E>>;
|
|
41
41
|
};
|
|
@@ -34,6 +34,6 @@ import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '..
|
|
|
34
34
|
* @category Combinators
|
|
35
35
|
*/
|
|
36
36
|
export declare const mapError: {
|
|
37
|
-
<R1 extends ResultMaybeAsync<any, any>, E2>(fn: (a: InferFailure<R1>) => E2): (result: R1) => ResultFor<R1, InferSuccess<R1>, E2>;
|
|
38
|
-
<E1, E2>(fn: (a: E1) => E2): <R1 extends ResultMaybeAsync<any, E1>>(result: R1) => ResultFor<R1, InferSuccess<R1>, E2>;
|
|
37
|
+
<R1 extends ResultMaybeAsync<any, any>, const E2>(fn: (a: InferFailure<R1>) => E2): (result: R1) => ResultFor<R1, InferSuccess<R1>, E2>;
|
|
38
|
+
<E1, const E2>(fn: (a: E1) => E2): <R1 extends ResultMaybeAsync<any, E1>>(result: R1) => ResultFor<R1, InferSuccess<R1>, E2>;
|
|
39
39
|
};
|
|
@@ -34,6 +34,6 @@ import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '..
|
|
|
34
34
|
* @category Combinators
|
|
35
35
|
*/
|
|
36
36
|
export declare const map: {
|
|
37
|
-
<R1 extends ResultMaybeAsync<any, any>, T2>(fn: (a: InferSuccess<R1>) => T2): (result: R1) => ResultFor<R1, T2, InferFailure<R1>>;
|
|
38
|
-
<T1, T2>(fn: (a: T1) => T2): <R1 extends ResultMaybeAsync<T1, any>>(result: R1) => ResultFor<R1, T2, InferFailure<R1>>;
|
|
37
|
+
<R1 extends ResultMaybeAsync<any, any>, const T2>(fn: (a: InferSuccess<R1>) => T2): (result: R1) => ResultFor<R1, T2, InferFailure<R1>>;
|
|
38
|
+
<T1, const T2>(fn: (a: T1) => T2): <R1 extends ResultMaybeAsync<T1, any>>(result: R1) => ResultFor<R1, T2, InferFailure<R1>>;
|
|
39
39
|
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
sequence: ()=>sequence
|
|
28
|
+
});
|
|
29
|
+
const external_fail_cjs_namespaceObject = require("./fail.cjs");
|
|
30
|
+
const external_is_failure_cjs_namespaceObject = require("./is-failure.cjs");
|
|
31
|
+
const external_succeed_cjs_namespaceObject = require("./succeed.cjs");
|
|
32
|
+
const is_promise_cjs_namespaceObject = require("../internals/helpers/is-promise.cjs");
|
|
33
|
+
const sequence = (value, fn)=>{
|
|
34
|
+
const reduce = (entries, callback, initialValue)=>{
|
|
35
|
+
const accumulator = initialValue;
|
|
36
|
+
for (const [index, entry] of entries.entries()){
|
|
37
|
+
const result = fn ? fn(entry[1]) : entry[1];
|
|
38
|
+
if ((0, is_promise_cjs_namespaceObject.isPromise)(result)) return result.then(async (result)=>{
|
|
39
|
+
if ((0, external_is_failure_cjs_namespaceObject.isFailure)(result)) return (0, external_fail_cjs_namespaceObject.fail)(result.error);
|
|
40
|
+
callback(accumulator, result.value, entry);
|
|
41
|
+
for (const entry of entries.slice(index + 1)){
|
|
42
|
+
const result = await (fn ? fn(entry[1]) : entry[1]);
|
|
43
|
+
if ((0, external_is_failure_cjs_namespaceObject.isFailure)(result)) return (0, external_fail_cjs_namespaceObject.fail)(result.error);
|
|
44
|
+
callback(accumulator, result.value, entry);
|
|
45
|
+
}
|
|
46
|
+
return (0, external_succeed_cjs_namespaceObject.succeed)(accumulator);
|
|
47
|
+
});
|
|
48
|
+
if ((0, external_is_failure_cjs_namespaceObject.isFailure)(result)) return (0, external_fail_cjs_namespaceObject.fail)(result.error);
|
|
49
|
+
callback(accumulator, result.value, entry);
|
|
50
|
+
}
|
|
51
|
+
return (0, external_succeed_cjs_namespaceObject.succeed)(accumulator);
|
|
52
|
+
};
|
|
53
|
+
if (!Array.isArray(value)) return reduce(Object.entries(value), (accumulator, value, [key])=>{
|
|
54
|
+
accumulator[key] = value;
|
|
55
|
+
}, {});
|
|
56
|
+
if (fn) return reduce([
|
|
57
|
+
...value.entries()
|
|
58
|
+
], (accumulator, value)=>accumulator.push(value), []);
|
|
59
|
+
return reduce([
|
|
60
|
+
...value.entries()
|
|
61
|
+
], (accumulator, value)=>accumulator.push(value), []);
|
|
62
|
+
};
|
|
63
|
+
exports.sequence = __webpack_exports__.sequence;
|
|
64
|
+
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
65
|
+
"sequence"
|
|
66
|
+
].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
|
|
67
|
+
Object.defineProperty(exports, '__esModule', {
|
|
68
|
+
value: true
|
|
69
|
+
});
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '../result.js';
|
|
2
|
+
/**
|
|
3
|
+
* Processes multiple {@link Result} or {@link ResultAsync} values into a single result.
|
|
4
|
+
* If all results are {@link Success}, returns a {@link Success} containing all values.
|
|
5
|
+
* If any result is a {@link Failure}, immediately stops processing and returns a {@link Failure} with that single error.
|
|
6
|
+
*
|
|
7
|
+
* Unlike {@link collect}, which processes all results and collects all errors,
|
|
8
|
+
* `sequence` stops at the first error and returns only that error.
|
|
9
|
+
*
|
|
10
|
+
* @function
|
|
11
|
+
* @typeParam X - The input type (object or array of Results).
|
|
12
|
+
*
|
|
13
|
+
* @example Object of Results (all succeed)
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { Result } from '@praha/byethrow';
|
|
16
|
+
*
|
|
17
|
+
* const result = Result.sequence({
|
|
18
|
+
* name: Result.succeed('Alice'),
|
|
19
|
+
* age: Result.succeed(20),
|
|
20
|
+
* });
|
|
21
|
+
* // { type: 'Success', value: { name: 'Alice', age: 20 } }
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @example Object of Results (stops at first failure)
|
|
25
|
+
* ```ts
|
|
26
|
+
* import { Result } from '@praha/byethrow';
|
|
27
|
+
*
|
|
28
|
+
* const result = Result.sequence({
|
|
29
|
+
* name: Result.succeed('Alice'),
|
|
30
|
+
* age: Result.fail('Invalid age'),
|
|
31
|
+
* });
|
|
32
|
+
* // { type: 'Failure', error: 'Invalid age' }
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* @example Array of Results (all succeed)
|
|
36
|
+
* ```ts
|
|
37
|
+
* import { Result } from '@praha/byethrow';
|
|
38
|
+
*
|
|
39
|
+
* const result = Result.sequence([
|
|
40
|
+
* Result.succeed(1),
|
|
41
|
+
* Result.succeed(2),
|
|
42
|
+
* ]);
|
|
43
|
+
* // { type: 'Success', value: [1, 2, 3] }
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @example Array of Results (stops at first failure)
|
|
47
|
+
* ```ts
|
|
48
|
+
* import { Result } from '@praha/byethrow';
|
|
49
|
+
*
|
|
50
|
+
* const result = Result.sequence([
|
|
51
|
+
* Result.succeed(1),
|
|
52
|
+
* Result.fail('error1'),
|
|
53
|
+
* ]);
|
|
54
|
+
* // { type: 'Failure', error: 'error1' }
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* @example Using a mapper function (all succeed)
|
|
58
|
+
* ```ts
|
|
59
|
+
* import { Result } from '@praha/byethrow';
|
|
60
|
+
*
|
|
61
|
+
* const result = Result.sequence(['1', '2', '3'], (value) => {
|
|
62
|
+
* const number = Number(value);
|
|
63
|
+
* return Number.isNaN(number)
|
|
64
|
+
* ? Result.fail(`Invalid number: ${value}`)
|
|
65
|
+
* : Result.succeed(number);
|
|
66
|
+
* });
|
|
67
|
+
* // { type: 'Success', value: [1, 2, 3] }
|
|
68
|
+
* ```
|
|
69
|
+
*
|
|
70
|
+
* @example Using a mapper function (stops at first failure)
|
|
71
|
+
* ```ts
|
|
72
|
+
* import { Result } from '@praha/byethrow';
|
|
73
|
+
*
|
|
74
|
+
* const result = Result.sequence(['1', 'invalid', '3'], (value) => {
|
|
75
|
+
* const number = Number(value);
|
|
76
|
+
* return Number.isNaN(number)
|
|
77
|
+
* ? Result.fail(`Invalid number: ${value}`)
|
|
78
|
+
* : Result.succeed(number);
|
|
79
|
+
* });
|
|
80
|
+
* // { type: 'Failure', error: 'Invalid number: invalid' }
|
|
81
|
+
* ```
|
|
82
|
+
*
|
|
83
|
+
* @category Utilities
|
|
84
|
+
*/
|
|
85
|
+
export declare const sequence: {
|
|
86
|
+
<X extends Record<string, ResultMaybeAsync<any, any>>>(x: X): ResultFor<X[keyof X], {
|
|
87
|
+
[K in keyof X]: InferSuccess<X[K]>;
|
|
88
|
+
}, InferFailure<X[keyof X]>>;
|
|
89
|
+
<const X extends Array<ResultMaybeAsync<any, any>>>(x: X): ResultFor<X[number], {
|
|
90
|
+
[K in keyof X]: InferSuccess<X[K]>;
|
|
91
|
+
}, InferFailure<X[number]>>;
|
|
92
|
+
<const X extends ReadonlyArray<ResultMaybeAsync<any, any>>>(x: X): ResultFor<X[number], {
|
|
93
|
+
[K in keyof X]: InferSuccess<X[K]>;
|
|
94
|
+
}, InferFailure<X[number]>>;
|
|
95
|
+
<const X extends Array<unknown>, Fn extends (value: X[number]) => ResultMaybeAsync<any, any>>(x: X, fn: Fn): ResultFor<ReturnType<Fn>, {
|
|
96
|
+
[K in keyof X]: InferSuccess<Fn>;
|
|
97
|
+
}, InferFailure<Fn>>;
|
|
98
|
+
<const X extends ReadonlyArray<unknown>, Fn extends (value: X[number]) => ResultMaybeAsync<any, any>>(x: X, fn: Fn): ResultFor<ReturnType<Fn>, {
|
|
99
|
+
[K in keyof X]: InferSuccess<Fn>;
|
|
100
|
+
}, InferFailure<Fn>>;
|
|
101
|
+
};
|
|
@@ -31,11 +31,11 @@ import type { ResultFor } from '../result.js';
|
|
|
31
31
|
* // Result.Result<void, never>
|
|
32
32
|
* ```
|
|
33
33
|
*
|
|
34
|
-
* @see {@link
|
|
34
|
+
* @see {@link collect} - For collect multiple Results into a single Result.
|
|
35
35
|
*
|
|
36
36
|
* @category Creators
|
|
37
37
|
*/
|
|
38
38
|
export declare const succeed: {
|
|
39
39
|
(): ResultFor<never, void, never>;
|
|
40
|
-
<T>(value: T): ResultFor<T, Awaited<T>, never>;
|
|
40
|
+
<const T>(value: T): ResultFor<T, Awaited<T>, never>;
|
|
41
41
|
};
|
package/dist/esm/exports.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export * from './functions/and-through.js';
|
|
|
4
4
|
export * from './functions/assert-failure.js';
|
|
5
5
|
export * from './functions/assert-success.js';
|
|
6
6
|
export * from './functions/bind.js';
|
|
7
|
-
export * from './functions/
|
|
7
|
+
export * from './functions/collect.js';
|
|
8
8
|
export * from './functions/do.js';
|
|
9
9
|
export * from './functions/fail.js';
|
|
10
10
|
export * from './functions/inspect.js';
|
|
@@ -17,6 +17,7 @@ export * from './functions/map-error.js';
|
|
|
17
17
|
export * from './functions/or-else.js';
|
|
18
18
|
export * from './functions/parse.js';
|
|
19
19
|
export * from './functions/pipe.js';
|
|
20
|
+
export * from './functions/sequence.js';
|
|
20
21
|
export * from './functions/succeed.js';
|
|
21
22
|
export * from './functions/try.js';
|
|
22
23
|
export * from './functions/unwrap.js';
|
package/dist/esm/exports.js
CHANGED
|
@@ -4,7 +4,7 @@ export * from "./functions/and-through.js";
|
|
|
4
4
|
export * from "./functions/assert-failure.js";
|
|
5
5
|
export * from "./functions/assert-success.js";
|
|
6
6
|
export * from "./functions/bind.js";
|
|
7
|
-
export * from "./functions/
|
|
7
|
+
export * from "./functions/collect.js";
|
|
8
8
|
export * from "./functions/do.js";
|
|
9
9
|
export * from "./functions/fail.js";
|
|
10
10
|
export * from "./functions/inspect.js";
|
|
@@ -17,6 +17,7 @@ export * from "./functions/map-error.js";
|
|
|
17
17
|
export * from "./functions/or-else.js";
|
|
18
18
|
export * from "./functions/parse.js";
|
|
19
19
|
export * from "./functions/pipe.js";
|
|
20
|
+
export * from "./functions/sequence.js";
|
|
20
21
|
export * from "./functions/succeed.js";
|
|
21
22
|
export * from "./functions/try.js";
|
|
22
23
|
export * from "./functions/unwrap.js";
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '../result.js';
|
|
2
|
+
/**
|
|
3
|
+
* Processes multiple {@link Result} or {@link ResultAsync} values into a single result.
|
|
4
|
+
* If all results are {@link Success}, returns a {@link Success} containing all values.
|
|
5
|
+
* If any result is a {@link Failure}, returns a {@link Failure} containing an array of all errors.
|
|
6
|
+
*
|
|
7
|
+
* Unlike {@link sequence}, which stops at the first error and returns only that error,
|
|
8
|
+
* `collect` processes all results and collects all errors.
|
|
9
|
+
*
|
|
10
|
+
* @function
|
|
11
|
+
* @typeParam X - The input type (object or array of Results).
|
|
12
|
+
*
|
|
13
|
+
* @example Object of Results (all succeed)
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { Result } from '@praha/byethrow';
|
|
16
|
+
*
|
|
17
|
+
* const result = Result.collect({
|
|
18
|
+
* name: Result.succeed('Alice'),
|
|
19
|
+
* age: Result.succeed(20),
|
|
20
|
+
* });
|
|
21
|
+
* // { type: 'Success', value: { name: 'Alice', age: 20 } }
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @example Object of Results (some fail)
|
|
25
|
+
* ```ts
|
|
26
|
+
* import { Result } from '@praha/byethrow';
|
|
27
|
+
*
|
|
28
|
+
* const result = Result.collect({
|
|
29
|
+
* name: Result.succeed('Alice'),
|
|
30
|
+
* age: Result.fail('Invalid age'),
|
|
31
|
+
* });
|
|
32
|
+
* // { type: 'Failure', error: ['Invalid age'] }
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* @example Array of Results (all succeed)
|
|
36
|
+
* ```ts
|
|
37
|
+
* import { Result } from '@praha/byethrow';
|
|
38
|
+
*
|
|
39
|
+
* const result = Result.collect([
|
|
40
|
+
* Result.succeed(1),
|
|
41
|
+
* Result.succeed(2),
|
|
42
|
+
* Result.succeed(3),
|
|
43
|
+
* ]);
|
|
44
|
+
* // { type: 'Success', value: [1, 2, 3] }
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @example Array of Results (some fail)
|
|
48
|
+
* ```ts
|
|
49
|
+
* import { Result } from '@praha/byethrow';
|
|
50
|
+
*
|
|
51
|
+
* const result = Result.collect([
|
|
52
|
+
* Result.succeed(1),
|
|
53
|
+
* Result.fail('error1'),
|
|
54
|
+
* Result.fail('error2'),
|
|
55
|
+
* ]);
|
|
56
|
+
* // { type: 'Failure', error: ['error1', 'error2'] }
|
|
57
|
+
* ```
|
|
58
|
+
*
|
|
59
|
+
* @example Using a mapper function (all succeed)
|
|
60
|
+
* ```ts
|
|
61
|
+
* import { Result } from '@praha/byethrow';
|
|
62
|
+
*
|
|
63
|
+
* const result = Result.collect(['1', '2', '3'], (value) => {
|
|
64
|
+
* const number = Number(value);
|
|
65
|
+
* return Number.isNaN(number)
|
|
66
|
+
* ? Result.fail(`Invalid number: ${value}`)
|
|
67
|
+
* : Result.succeed(number);
|
|
68
|
+
* });
|
|
69
|
+
* // { type: 'Success', value: [1, 2, 3] }
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* @example Using a mapper function (some fail)
|
|
73
|
+
* ```ts
|
|
74
|
+
* import { Result } from '@praha/byethrow';
|
|
75
|
+
*
|
|
76
|
+
* const result = Result.collect(['1', 'invalid', '3'], (value) => {
|
|
77
|
+
* const number = Number(value);
|
|
78
|
+
* return Number.isNaN(number)
|
|
79
|
+
* ? Result.fail(`Invalid number: ${value}`)
|
|
80
|
+
* : Result.succeed(number);
|
|
81
|
+
* });
|
|
82
|
+
* // { type: 'Failure', error: ['Invalid number: invalid'] }
|
|
83
|
+
* ```
|
|
84
|
+
*
|
|
85
|
+
* @category Utilities
|
|
86
|
+
*/
|
|
87
|
+
export declare const collect: {
|
|
88
|
+
<X extends Record<string, ResultMaybeAsync<any, any>>>(x: X): ResultFor<X[keyof X], {
|
|
89
|
+
[K in keyof X]: InferSuccess<X[K]>;
|
|
90
|
+
}, InferFailure<X[keyof X]>[]>;
|
|
91
|
+
<const X extends Array<ResultMaybeAsync<any, any>>>(x: X): ResultFor<X[number], {
|
|
92
|
+
[K in keyof X]: InferSuccess<X[K]>;
|
|
93
|
+
}, InferFailure<X[number]>[]>;
|
|
94
|
+
<const X extends ReadonlyArray<ResultMaybeAsync<any, any>>>(x: X): ResultFor<X[number], {
|
|
95
|
+
[K in keyof X]: InferSuccess<X[K]>;
|
|
96
|
+
}, InferFailure<X[number]>[]>;
|
|
97
|
+
<const X extends Array<unknown>, Fn extends (value: X[number]) => ResultMaybeAsync<any, any>>(x: X, fn: Fn): ResultFor<ReturnType<Fn>, {
|
|
98
|
+
[K in keyof X]: InferSuccess<Fn>;
|
|
99
|
+
}, InferFailure<Fn>[]>;
|
|
100
|
+
<const X extends ReadonlyArray<unknown>, Fn extends (value: X[number]) => ResultMaybeAsync<any, any>>(x: X, fn: Fn): ResultFor<ReturnType<Fn>, {
|
|
101
|
+
[K in keyof X]: InferSuccess<Fn>;
|
|
102
|
+
}, InferFailure<Fn>[]>;
|
|
103
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { fail } from "./fail.js";
|
|
2
|
+
import { isFailure } from "./is-failure.js";
|
|
3
|
+
import { succeed } from "./succeed.js";
|
|
4
|
+
import { isPromise } from "../internals/helpers/is-promise.js";
|
|
5
|
+
const collect = (value, fn)=>{
|
|
6
|
+
const reduce = (entries, callback, initialValue)=>{
|
|
7
|
+
const errors = [];
|
|
8
|
+
const results = entries.map(([, entry])=>fn ? fn(entry) : entry);
|
|
9
|
+
if (results.some(isPromise)) return Promise.all(results).then((results)=>{
|
|
10
|
+
const accumulator = initialValue;
|
|
11
|
+
for (const [index, result] of results.entries())if (isFailure(result)) errors.push(result.error);
|
|
12
|
+
else callback(accumulator, result.value, entries[index]);
|
|
13
|
+
return errors.length > 0 ? fail(errors) : succeed(accumulator);
|
|
14
|
+
});
|
|
15
|
+
const accumulator = initialValue;
|
|
16
|
+
for (const [index, result] of results.entries())if (isFailure(result)) errors.push(result.error);
|
|
17
|
+
else callback(accumulator, result.value, entries[index]);
|
|
18
|
+
return errors.length > 0 ? fail(errors) : succeed(accumulator);
|
|
19
|
+
};
|
|
20
|
+
if (!Array.isArray(value)) return reduce(Object.entries(value), (accumulator, value, [key])=>{
|
|
21
|
+
accumulator[key] = value;
|
|
22
|
+
}, {});
|
|
23
|
+
if (fn) return reduce([
|
|
24
|
+
...value.entries()
|
|
25
|
+
], (accumulator, value)=>accumulator.push(value), []);
|
|
26
|
+
return reduce([
|
|
27
|
+
...value.entries()
|
|
28
|
+
], (accumulator, value)=>accumulator.push(value), []);
|
|
29
|
+
};
|
|
30
|
+
export { collect };
|
|
@@ -31,11 +31,11 @@ import type { ResultFor } from '../result.js';
|
|
|
31
31
|
* // Result.Result<never, void>
|
|
32
32
|
* ```
|
|
33
33
|
*
|
|
34
|
-
* @see {@link
|
|
34
|
+
* @see {@link collect} - For collect multiple Results into a single Result.
|
|
35
35
|
*
|
|
36
36
|
* @category Creators
|
|
37
37
|
*/
|
|
38
38
|
export declare const fail: {
|
|
39
39
|
(): ResultFor<never, never, void>;
|
|
40
|
-
<E>(error: E): ResultFor<E, never, Awaited<E>>;
|
|
40
|
+
<const E>(error: E): ResultFor<E, never, Awaited<E>>;
|
|
41
41
|
};
|
|
@@ -34,6 +34,6 @@ import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '..
|
|
|
34
34
|
* @category Combinators
|
|
35
35
|
*/
|
|
36
36
|
export declare const mapError: {
|
|
37
|
-
<R1 extends ResultMaybeAsync<any, any>, E2>(fn: (a: InferFailure<R1>) => E2): (result: R1) => ResultFor<R1, InferSuccess<R1>, E2>;
|
|
38
|
-
<E1, E2>(fn: (a: E1) => E2): <R1 extends ResultMaybeAsync<any, E1>>(result: R1) => ResultFor<R1, InferSuccess<R1>, E2>;
|
|
37
|
+
<R1 extends ResultMaybeAsync<any, any>, const E2>(fn: (a: InferFailure<R1>) => E2): (result: R1) => ResultFor<R1, InferSuccess<R1>, E2>;
|
|
38
|
+
<E1, const E2>(fn: (a: E1) => E2): <R1 extends ResultMaybeAsync<any, E1>>(result: R1) => ResultFor<R1, InferSuccess<R1>, E2>;
|
|
39
39
|
};
|
|
@@ -34,6 +34,6 @@ import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '..
|
|
|
34
34
|
* @category Combinators
|
|
35
35
|
*/
|
|
36
36
|
export declare const map: {
|
|
37
|
-
<R1 extends ResultMaybeAsync<any, any>, T2>(fn: (a: InferSuccess<R1>) => T2): (result: R1) => ResultFor<R1, T2, InferFailure<R1>>;
|
|
38
|
-
<T1, T2>(fn: (a: T1) => T2): <R1 extends ResultMaybeAsync<T1, any>>(result: R1) => ResultFor<R1, T2, InferFailure<R1>>;
|
|
37
|
+
<R1 extends ResultMaybeAsync<any, any>, const T2>(fn: (a: InferSuccess<R1>) => T2): (result: R1) => ResultFor<R1, T2, InferFailure<R1>>;
|
|
38
|
+
<T1, const T2>(fn: (a: T1) => T2): <R1 extends ResultMaybeAsync<T1, any>>(result: R1) => ResultFor<R1, T2, InferFailure<R1>>;
|
|
39
39
|
};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '../result.js';
|
|
2
|
+
/**
|
|
3
|
+
* Processes multiple {@link Result} or {@link ResultAsync} values into a single result.
|
|
4
|
+
* If all results are {@link Success}, returns a {@link Success} containing all values.
|
|
5
|
+
* If any result is a {@link Failure}, immediately stops processing and returns a {@link Failure} with that single error.
|
|
6
|
+
*
|
|
7
|
+
* Unlike {@link collect}, which processes all results and collects all errors,
|
|
8
|
+
* `sequence` stops at the first error and returns only that error.
|
|
9
|
+
*
|
|
10
|
+
* @function
|
|
11
|
+
* @typeParam X - The input type (object or array of Results).
|
|
12
|
+
*
|
|
13
|
+
* @example Object of Results (all succeed)
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { Result } from '@praha/byethrow';
|
|
16
|
+
*
|
|
17
|
+
* const result = Result.sequence({
|
|
18
|
+
* name: Result.succeed('Alice'),
|
|
19
|
+
* age: Result.succeed(20),
|
|
20
|
+
* });
|
|
21
|
+
* // { type: 'Success', value: { name: 'Alice', age: 20 } }
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @example Object of Results (stops at first failure)
|
|
25
|
+
* ```ts
|
|
26
|
+
* import { Result } from '@praha/byethrow';
|
|
27
|
+
*
|
|
28
|
+
* const result = Result.sequence({
|
|
29
|
+
* name: Result.succeed('Alice'),
|
|
30
|
+
* age: Result.fail('Invalid age'),
|
|
31
|
+
* });
|
|
32
|
+
* // { type: 'Failure', error: 'Invalid age' }
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* @example Array of Results (all succeed)
|
|
36
|
+
* ```ts
|
|
37
|
+
* import { Result } from '@praha/byethrow';
|
|
38
|
+
*
|
|
39
|
+
* const result = Result.sequence([
|
|
40
|
+
* Result.succeed(1),
|
|
41
|
+
* Result.succeed(2),
|
|
42
|
+
* ]);
|
|
43
|
+
* // { type: 'Success', value: [1, 2, 3] }
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @example Array of Results (stops at first failure)
|
|
47
|
+
* ```ts
|
|
48
|
+
* import { Result } from '@praha/byethrow';
|
|
49
|
+
*
|
|
50
|
+
* const result = Result.sequence([
|
|
51
|
+
* Result.succeed(1),
|
|
52
|
+
* Result.fail('error1'),
|
|
53
|
+
* ]);
|
|
54
|
+
* // { type: 'Failure', error: 'error1' }
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* @example Using a mapper function (all succeed)
|
|
58
|
+
* ```ts
|
|
59
|
+
* import { Result } from '@praha/byethrow';
|
|
60
|
+
*
|
|
61
|
+
* const result = Result.sequence(['1', '2', '3'], (value) => {
|
|
62
|
+
* const number = Number(value);
|
|
63
|
+
* return Number.isNaN(number)
|
|
64
|
+
* ? Result.fail(`Invalid number: ${value}`)
|
|
65
|
+
* : Result.succeed(number);
|
|
66
|
+
* });
|
|
67
|
+
* // { type: 'Success', value: [1, 2, 3] }
|
|
68
|
+
* ```
|
|
69
|
+
*
|
|
70
|
+
* @example Using a mapper function (stops at first failure)
|
|
71
|
+
* ```ts
|
|
72
|
+
* import { Result } from '@praha/byethrow';
|
|
73
|
+
*
|
|
74
|
+
* const result = Result.sequence(['1', 'invalid', '3'], (value) => {
|
|
75
|
+
* const number = Number(value);
|
|
76
|
+
* return Number.isNaN(number)
|
|
77
|
+
* ? Result.fail(`Invalid number: ${value}`)
|
|
78
|
+
* : Result.succeed(number);
|
|
79
|
+
* });
|
|
80
|
+
* // { type: 'Failure', error: 'Invalid number: invalid' }
|
|
81
|
+
* ```
|
|
82
|
+
*
|
|
83
|
+
* @category Utilities
|
|
84
|
+
*/
|
|
85
|
+
export declare const sequence: {
|
|
86
|
+
<X extends Record<string, ResultMaybeAsync<any, any>>>(x: X): ResultFor<X[keyof X], {
|
|
87
|
+
[K in keyof X]: InferSuccess<X[K]>;
|
|
88
|
+
}, InferFailure<X[keyof X]>>;
|
|
89
|
+
<const X extends Array<ResultMaybeAsync<any, any>>>(x: X): ResultFor<X[number], {
|
|
90
|
+
[K in keyof X]: InferSuccess<X[K]>;
|
|
91
|
+
}, InferFailure<X[number]>>;
|
|
92
|
+
<const X extends ReadonlyArray<ResultMaybeAsync<any, any>>>(x: X): ResultFor<X[number], {
|
|
93
|
+
[K in keyof X]: InferSuccess<X[K]>;
|
|
94
|
+
}, InferFailure<X[number]>>;
|
|
95
|
+
<const X extends Array<unknown>, Fn extends (value: X[number]) => ResultMaybeAsync<any, any>>(x: X, fn: Fn): ResultFor<ReturnType<Fn>, {
|
|
96
|
+
[K in keyof X]: InferSuccess<Fn>;
|
|
97
|
+
}, InferFailure<Fn>>;
|
|
98
|
+
<const X extends ReadonlyArray<unknown>, Fn extends (value: X[number]) => ResultMaybeAsync<any, any>>(x: X, fn: Fn): ResultFor<ReturnType<Fn>, {
|
|
99
|
+
[K in keyof X]: InferSuccess<Fn>;
|
|
100
|
+
}, InferFailure<Fn>>;
|
|
101
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { fail } from "./fail.js";
|
|
2
|
+
import { isFailure } from "./is-failure.js";
|
|
3
|
+
import { succeed } from "./succeed.js";
|
|
4
|
+
import { isPromise } from "../internals/helpers/is-promise.js";
|
|
5
|
+
const sequence = (value, fn)=>{
|
|
6
|
+
const reduce = (entries, callback, initialValue)=>{
|
|
7
|
+
const accumulator = initialValue;
|
|
8
|
+
for (const [index, entry] of entries.entries()){
|
|
9
|
+
const result = fn ? fn(entry[1]) : entry[1];
|
|
10
|
+
if (isPromise(result)) return result.then(async (result)=>{
|
|
11
|
+
if (isFailure(result)) return fail(result.error);
|
|
12
|
+
callback(accumulator, result.value, entry);
|
|
13
|
+
for (const entry of entries.slice(index + 1)){
|
|
14
|
+
const result = await (fn ? fn(entry[1]) : entry[1]);
|
|
15
|
+
if (isFailure(result)) return fail(result.error);
|
|
16
|
+
callback(accumulator, result.value, entry);
|
|
17
|
+
}
|
|
18
|
+
return succeed(accumulator);
|
|
19
|
+
});
|
|
20
|
+
if (isFailure(result)) return fail(result.error);
|
|
21
|
+
callback(accumulator, result.value, entry);
|
|
22
|
+
}
|
|
23
|
+
return succeed(accumulator);
|
|
24
|
+
};
|
|
25
|
+
if (!Array.isArray(value)) return reduce(Object.entries(value), (accumulator, value, [key])=>{
|
|
26
|
+
accumulator[key] = value;
|
|
27
|
+
}, {});
|
|
28
|
+
if (fn) return reduce([
|
|
29
|
+
...value.entries()
|
|
30
|
+
], (accumulator, value)=>accumulator.push(value), []);
|
|
31
|
+
return reduce([
|
|
32
|
+
...value.entries()
|
|
33
|
+
], (accumulator, value)=>accumulator.push(value), []);
|
|
34
|
+
};
|
|
35
|
+
export { sequence };
|
|
@@ -31,11 +31,11 @@ import type { ResultFor } from '../result.js';
|
|
|
31
31
|
* // Result.Result<void, never>
|
|
32
32
|
* ```
|
|
33
33
|
*
|
|
34
|
-
* @see {@link
|
|
34
|
+
* @see {@link collect} - For collect multiple Results into a single Result.
|
|
35
35
|
*
|
|
36
36
|
* @category Creators
|
|
37
37
|
*/
|
|
38
38
|
export declare const succeed: {
|
|
39
39
|
(): ResultFor<never, void, never>;
|
|
40
|
-
<T>(value: T): ResultFor<T, Awaited<T>, never>;
|
|
40
|
+
<const T>(value: T): ResultFor<T, Awaited<T>, never>;
|
|
41
41
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praha/byethrow",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "A lightweight, tree-shakable Result type package with a simple, consistent API designed",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"javascript",
|
|
@@ -44,13 +44,16 @@
|
|
|
44
44
|
"@standard-schema/spec": "^1.0.0"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"@rslib/core": "0.15.
|
|
47
|
+
"@rslib/core": "0.15.1",
|
|
48
48
|
"eslint": "9.37.0",
|
|
49
|
-
"typedoc": "0.28.
|
|
49
|
+
"typedoc": "0.28.14",
|
|
50
50
|
"typedoc-plugin-markdown": "4.9.0",
|
|
51
51
|
"typescript": "5.9.3",
|
|
52
52
|
"vitest": "3.2.4"
|
|
53
53
|
},
|
|
54
|
+
"peerDependencies": {
|
|
55
|
+
"typescript": ">=5.0.0"
|
|
56
|
+
},
|
|
54
57
|
"publishConfig": {
|
|
55
58
|
"provenance": true
|
|
56
59
|
},
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __webpack_require__ = {};
|
|
3
|
-
(()=>{
|
|
4
|
-
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
-
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: definition[key]
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
})();
|
|
11
|
-
(()=>{
|
|
12
|
-
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
-
})();
|
|
14
|
-
(()=>{
|
|
15
|
-
__webpack_require__.r = (exports1)=>{
|
|
16
|
-
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
-
value: 'Module'
|
|
18
|
-
});
|
|
19
|
-
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
-
value: true
|
|
21
|
-
});
|
|
22
|
-
};
|
|
23
|
-
})();
|
|
24
|
-
var __webpack_exports__ = {};
|
|
25
|
-
__webpack_require__.r(__webpack_exports__);
|
|
26
|
-
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
-
combine: ()=>combine
|
|
28
|
-
});
|
|
29
|
-
const external_fail_cjs_namespaceObject = require("./fail.cjs");
|
|
30
|
-
const external_is_failure_cjs_namespaceObject = require("./is-failure.cjs");
|
|
31
|
-
const external_succeed_cjs_namespaceObject = require("./succeed.cjs");
|
|
32
|
-
const is_promise_cjs_namespaceObject = require("../internals/helpers/is-promise.cjs");
|
|
33
|
-
const combine = (value)=>{
|
|
34
|
-
if (Array.isArray(value)) {
|
|
35
|
-
const group = (results)=>{
|
|
36
|
-
const errors = [];
|
|
37
|
-
const successes = [];
|
|
38
|
-
for (const result of results)if ((0, external_is_failure_cjs_namespaceObject.isFailure)(result)) errors.push(result.error);
|
|
39
|
-
else successes.push(result.value);
|
|
40
|
-
return {
|
|
41
|
-
errors,
|
|
42
|
-
successes
|
|
43
|
-
};
|
|
44
|
-
};
|
|
45
|
-
if (value.some(is_promise_cjs_namespaceObject.isPromise)) {
|
|
46
|
-
const results = value;
|
|
47
|
-
return Promise.all(results).then((results)=>{
|
|
48
|
-
const { successes, errors } = group(results);
|
|
49
|
-
return errors.length > 0 ? (0, external_fail_cjs_namespaceObject.fail)(errors) : (0, external_succeed_cjs_namespaceObject.succeed)(successes);
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
const results = value;
|
|
53
|
-
const { successes, errors } = group(results);
|
|
54
|
-
return errors.length > 0 ? (0, external_fail_cjs_namespaceObject.fail)(errors) : (0, external_succeed_cjs_namespaceObject.succeed)(successes);
|
|
55
|
-
}
|
|
56
|
-
{
|
|
57
|
-
const group = (entries)=>{
|
|
58
|
-
const errors = [];
|
|
59
|
-
const successes = {};
|
|
60
|
-
for (const [key, result] of entries)if ((0, external_is_failure_cjs_namespaceObject.isFailure)(result)) errors.push(result.error);
|
|
61
|
-
else successes[key] = result.value;
|
|
62
|
-
return {
|
|
63
|
-
errors,
|
|
64
|
-
successes
|
|
65
|
-
};
|
|
66
|
-
};
|
|
67
|
-
const entries = Object.entries(value);
|
|
68
|
-
if (entries.some(([, result])=>(0, is_promise_cjs_namespaceObject.isPromise)(result))) {
|
|
69
|
-
const results = entries;
|
|
70
|
-
const promises = results.map(async ([key, result])=>[
|
|
71
|
-
key,
|
|
72
|
-
await result
|
|
73
|
-
]);
|
|
74
|
-
return Promise.all(promises).then((entries)=>{
|
|
75
|
-
const { successes, errors } = group(entries);
|
|
76
|
-
return errors.length > 0 ? (0, external_fail_cjs_namespaceObject.fail)(errors) : (0, external_succeed_cjs_namespaceObject.succeed)(successes);
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
const { successes, errors } = group(entries);
|
|
80
|
-
return errors.length > 0 ? (0, external_fail_cjs_namespaceObject.fail)(errors) : (0, external_succeed_cjs_namespaceObject.succeed)(successes);
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
exports.combine = __webpack_exports__.combine;
|
|
84
|
-
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
85
|
-
"combine"
|
|
86
|
-
].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
|
|
87
|
-
Object.defineProperty(exports, '__esModule', {
|
|
88
|
-
value: true
|
|
89
|
-
});
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '../result.js';
|
|
2
|
-
/**
|
|
3
|
-
* Combines multiple {@link Result} or {@link ResultAsync} values into a single result.
|
|
4
|
-
* If all inputs are {@link Success}, returns a {@link Success} with combined values.
|
|
5
|
-
* If any input is a {@link Failure}, returns a {@link Failure} with an array of all errors.
|
|
6
|
-
*
|
|
7
|
-
* @function
|
|
8
|
-
* @typeParam X - The input type (object or array of Results).
|
|
9
|
-
*
|
|
10
|
-
* @example Object Input
|
|
11
|
-
* ```ts
|
|
12
|
-
* import { Result } from '@praha/byethrow';
|
|
13
|
-
*
|
|
14
|
-
* const result = Result.combine({
|
|
15
|
-
* a: Result.succeed(1),
|
|
16
|
-
* b: Result.succeed('hello'),
|
|
17
|
-
* });
|
|
18
|
-
* // { type: 'Success', value: { a: 1, b: 'hello' } }
|
|
19
|
-
* ```
|
|
20
|
-
*
|
|
21
|
-
* @example Array Input
|
|
22
|
-
* ```ts
|
|
23
|
-
* import { Result } from '@praha/byethrow';
|
|
24
|
-
*
|
|
25
|
-
* const result = Result.combine([
|
|
26
|
-
* Result.succeed(1),
|
|
27
|
-
* Result.succeed(2),
|
|
28
|
-
* Result.succeed(3),
|
|
29
|
-
* ]);
|
|
30
|
-
* // { type: 'Success', value: [1, 2, 3] }
|
|
31
|
-
* ```
|
|
32
|
-
*
|
|
33
|
-
* @example With Failures
|
|
34
|
-
* ```ts
|
|
35
|
-
* import { Result } from '@praha/byethrow';
|
|
36
|
-
*
|
|
37
|
-
* const result = Result.combine([
|
|
38
|
-
* Result.succeed(1),
|
|
39
|
-
* Result.fail('error1'),
|
|
40
|
-
* Result.fail('error2'),
|
|
41
|
-
* ]);
|
|
42
|
-
* // { type: 'Failure', error: ['error1', 'error2'] }
|
|
43
|
-
* ```
|
|
44
|
-
*
|
|
45
|
-
* @category Utilities
|
|
46
|
-
*/
|
|
47
|
-
export declare const combine: {
|
|
48
|
-
<X extends Record<string, ResultMaybeAsync<any, any>>>(x: X): ResultFor<X[keyof X], {
|
|
49
|
-
[K in keyof X]: InferSuccess<X[K]>;
|
|
50
|
-
}, InferFailure<X[keyof X]>[]>;
|
|
51
|
-
<const X extends Array<ResultMaybeAsync<any, any>>>(x: X): ResultFor<X[number], {
|
|
52
|
-
[K in keyof X]: InferSuccess<X[K]>;
|
|
53
|
-
}, InferFailure<X[number]>[]>;
|
|
54
|
-
};
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '../result.js';
|
|
2
|
-
/**
|
|
3
|
-
* Combines multiple {@link Result} or {@link ResultAsync} values into a single result.
|
|
4
|
-
* If all inputs are {@link Success}, returns a {@link Success} with combined values.
|
|
5
|
-
* If any input is a {@link Failure}, returns a {@link Failure} with an array of all errors.
|
|
6
|
-
*
|
|
7
|
-
* @function
|
|
8
|
-
* @typeParam X - The input type (object or array of Results).
|
|
9
|
-
*
|
|
10
|
-
* @example Object Input
|
|
11
|
-
* ```ts
|
|
12
|
-
* import { Result } from '@praha/byethrow';
|
|
13
|
-
*
|
|
14
|
-
* const result = Result.combine({
|
|
15
|
-
* a: Result.succeed(1),
|
|
16
|
-
* b: Result.succeed('hello'),
|
|
17
|
-
* });
|
|
18
|
-
* // { type: 'Success', value: { a: 1, b: 'hello' } }
|
|
19
|
-
* ```
|
|
20
|
-
*
|
|
21
|
-
* @example Array Input
|
|
22
|
-
* ```ts
|
|
23
|
-
* import { Result } from '@praha/byethrow';
|
|
24
|
-
*
|
|
25
|
-
* const result = Result.combine([
|
|
26
|
-
* Result.succeed(1),
|
|
27
|
-
* Result.succeed(2),
|
|
28
|
-
* Result.succeed(3),
|
|
29
|
-
* ]);
|
|
30
|
-
* // { type: 'Success', value: [1, 2, 3] }
|
|
31
|
-
* ```
|
|
32
|
-
*
|
|
33
|
-
* @example With Failures
|
|
34
|
-
* ```ts
|
|
35
|
-
* import { Result } from '@praha/byethrow';
|
|
36
|
-
*
|
|
37
|
-
* const result = Result.combine([
|
|
38
|
-
* Result.succeed(1),
|
|
39
|
-
* Result.fail('error1'),
|
|
40
|
-
* Result.fail('error2'),
|
|
41
|
-
* ]);
|
|
42
|
-
* // { type: 'Failure', error: ['error1', 'error2'] }
|
|
43
|
-
* ```
|
|
44
|
-
*
|
|
45
|
-
* @category Utilities
|
|
46
|
-
*/
|
|
47
|
-
export declare const combine: {
|
|
48
|
-
<X extends Record<string, ResultMaybeAsync<any, any>>>(x: X): ResultFor<X[keyof X], {
|
|
49
|
-
[K in keyof X]: InferSuccess<X[K]>;
|
|
50
|
-
}, InferFailure<X[keyof X]>[]>;
|
|
51
|
-
<const X extends Array<ResultMaybeAsync<any, any>>>(x: X): ResultFor<X[number], {
|
|
52
|
-
[K in keyof X]: InferSuccess<X[K]>;
|
|
53
|
-
}, InferFailure<X[number]>[]>;
|
|
54
|
-
};
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { fail } from "./fail.js";
|
|
2
|
-
import { isFailure } from "./is-failure.js";
|
|
3
|
-
import { succeed } from "./succeed.js";
|
|
4
|
-
import { isPromise } from "../internals/helpers/is-promise.js";
|
|
5
|
-
const combine = (value)=>{
|
|
6
|
-
if (Array.isArray(value)) {
|
|
7
|
-
const group = (results)=>{
|
|
8
|
-
const errors = [];
|
|
9
|
-
const successes = [];
|
|
10
|
-
for (const result of results)if (isFailure(result)) errors.push(result.error);
|
|
11
|
-
else successes.push(result.value);
|
|
12
|
-
return {
|
|
13
|
-
errors,
|
|
14
|
-
successes
|
|
15
|
-
};
|
|
16
|
-
};
|
|
17
|
-
if (value.some(isPromise)) {
|
|
18
|
-
const results = value;
|
|
19
|
-
return Promise.all(results).then((results)=>{
|
|
20
|
-
const { successes, errors } = group(results);
|
|
21
|
-
return errors.length > 0 ? fail(errors) : succeed(successes);
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
const results = value;
|
|
25
|
-
const { successes, errors } = group(results);
|
|
26
|
-
return errors.length > 0 ? fail(errors) : succeed(successes);
|
|
27
|
-
}
|
|
28
|
-
{
|
|
29
|
-
const group = (entries)=>{
|
|
30
|
-
const errors = [];
|
|
31
|
-
const successes = {};
|
|
32
|
-
for (const [key, result] of entries)if (isFailure(result)) errors.push(result.error);
|
|
33
|
-
else successes[key] = result.value;
|
|
34
|
-
return {
|
|
35
|
-
errors,
|
|
36
|
-
successes
|
|
37
|
-
};
|
|
38
|
-
};
|
|
39
|
-
const entries = Object.entries(value);
|
|
40
|
-
if (entries.some(([, result])=>isPromise(result))) {
|
|
41
|
-
const results = entries;
|
|
42
|
-
const promises = results.map(async ([key, result])=>[
|
|
43
|
-
key,
|
|
44
|
-
await result
|
|
45
|
-
]);
|
|
46
|
-
return Promise.all(promises).then((entries)=>{
|
|
47
|
-
const { successes, errors } = group(entries);
|
|
48
|
-
return errors.length > 0 ? fail(errors) : succeed(successes);
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
const { successes, errors } = group(entries);
|
|
52
|
-
return errors.length > 0 ? fail(errors) : succeed(successes);
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
export { combine };
|