@praha/byethrow 0.0.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cjs/exports.cjs +51 -33
- package/dist/cjs/exports.d.ts +2 -0
- package/dist/cjs/functions/and-then.d.ts +2 -0
- package/dist/cjs/functions/and-through.d.ts +2 -0
- package/dist/cjs/functions/bind.d.ts +2 -0
- package/dist/cjs/functions/combine.cjs +89 -0
- package/dist/cjs/functions/combine.d.ts +54 -0
- package/dist/cjs/functions/fail.d.ts +3 -0
- package/dist/cjs/functions/map-error.d.ts +2 -0
- package/dist/cjs/functions/map.d.ts +2 -0
- package/dist/cjs/functions/or-else.cjs +44 -0
- package/dist/cjs/functions/or-else.d.ts +47 -0
- package/dist/cjs/functions/succeed.d.ts +2 -0
- package/dist/esm/exports.d.ts +2 -0
- package/dist/esm/exports.js +2 -0
- package/dist/esm/functions/and-then.d.ts +2 -0
- package/dist/esm/functions/and-through.d.ts +2 -0
- package/dist/esm/functions/bind.d.ts +2 -0
- package/dist/esm/functions/combine.d.ts +54 -0
- package/dist/esm/functions/combine.js +55 -0
- package/dist/esm/functions/fail.d.ts +3 -0
- package/dist/esm/functions/map-error.d.ts +2 -0
- package/dist/esm/functions/map.d.ts +2 -0
- package/dist/esm/functions/or-else.d.ts +47 -0
- package/dist/esm/functions/or-else.js +10 -0
- package/dist/esm/functions/succeed.d.ts +2 -0
- package/package.json +3 -3
package/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
[](https://www.npmjs.com/package/@praha/byethrow)
|
4
4
|
[](https://www.npmjs.com/package/@praha/byethrow)
|
5
|
-
[](https://github.com/praha-inc/byethrow/blob/main/LICENSE)
|
5
|
+
[](https://github.com/praha-inc/byethrow/blob/main/packages/byethrow/LICENSE)
|
6
6
|
[](https://github.com/orgs/praha-inc/followers)
|
7
7
|
|
8
8
|
A lightweight, tree-shakable Result type package with a simple, consistent API designed.
|
package/dist/cjs/exports.cjs
CHANGED
@@ -9,6 +9,9 @@ var __webpack_modules__ = {
|
|
9
9
|
"./functions/bind": function(module) {
|
10
10
|
module.exports = require("./functions/bind.cjs");
|
11
11
|
},
|
12
|
+
"./functions/combine": function(module) {
|
13
|
+
module.exports = require("./functions/combine.cjs");
|
14
|
+
},
|
12
15
|
"./functions/do": function(module) {
|
13
16
|
module.exports = require("./functions/do.cjs");
|
14
17
|
},
|
@@ -27,6 +30,9 @@ var __webpack_modules__ = {
|
|
27
30
|
"./functions/map": function(module) {
|
28
31
|
module.exports = require("./functions/map.cjs");
|
29
32
|
},
|
33
|
+
"./functions/or-else": function(module) {
|
34
|
+
module.exports = require("./functions/or-else.cjs");
|
35
|
+
},
|
30
36
|
"./functions/pipe": function(module) {
|
31
37
|
module.exports = require("./functions/pipe.cjs");
|
32
38
|
},
|
@@ -113,70 +119,82 @@ var __webpack_exports__ = {};
|
|
113
119
|
return _functions_bind__WEBPACK_IMPORTED_MODULE_3__[key];
|
114
120
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
115
121
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
116
|
-
var
|
122
|
+
var _functions_combine__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__("./functions/combine");
|
123
|
+
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
124
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_combine__WEBPACK_IMPORTED_MODULE_4__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
125
|
+
return _functions_combine__WEBPACK_IMPORTED_MODULE_4__[key];
|
126
|
+
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
127
|
+
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
128
|
+
var _functions_do__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__("./functions/do");
|
129
|
+
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
130
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_do__WEBPACK_IMPORTED_MODULE_5__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
131
|
+
return _functions_do__WEBPACK_IMPORTED_MODULE_5__[key];
|
132
|
+
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
133
|
+
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
134
|
+
var _functions_fail__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__("./functions/fail");
|
117
135
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
118
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
119
|
-
return
|
136
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_fail__WEBPACK_IMPORTED_MODULE_6__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
137
|
+
return _functions_fail__WEBPACK_IMPORTED_MODULE_6__[key];
|
120
138
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
121
139
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
122
|
-
var
|
140
|
+
var _functions_is_failure__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__("./functions/is-failure");
|
123
141
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
124
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
125
|
-
return
|
142
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_is_failure__WEBPACK_IMPORTED_MODULE_7__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
143
|
+
return _functions_is_failure__WEBPACK_IMPORTED_MODULE_7__[key];
|
126
144
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
127
145
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
128
|
-
var
|
146
|
+
var _functions_is_success__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__("./functions/is-success");
|
129
147
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
130
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
131
|
-
return
|
148
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_is_success__WEBPACK_IMPORTED_MODULE_8__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
149
|
+
return _functions_is_success__WEBPACK_IMPORTED_MODULE_8__[key];
|
132
150
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
133
151
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
134
|
-
var
|
152
|
+
var _functions_map__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__("./functions/map");
|
135
153
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
136
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
137
|
-
return
|
154
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_map__WEBPACK_IMPORTED_MODULE_9__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
155
|
+
return _functions_map__WEBPACK_IMPORTED_MODULE_9__[key];
|
138
156
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
139
157
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
140
|
-
var
|
158
|
+
var _functions_map_error__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__("./functions/map-error");
|
141
159
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
142
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
143
|
-
return
|
160
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_map_error__WEBPACK_IMPORTED_MODULE_10__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
161
|
+
return _functions_map_error__WEBPACK_IMPORTED_MODULE_10__[key];
|
144
162
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
145
163
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
146
|
-
var
|
164
|
+
var _functions_or_else__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__("./functions/or-else");
|
147
165
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
148
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
149
|
-
return
|
166
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_or_else__WEBPACK_IMPORTED_MODULE_11__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
167
|
+
return _functions_or_else__WEBPACK_IMPORTED_MODULE_11__[key];
|
150
168
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
151
169
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
152
|
-
var
|
170
|
+
var _functions_pipe__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__("./functions/pipe");
|
153
171
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
154
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
155
|
-
return
|
172
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_pipe__WEBPACK_IMPORTED_MODULE_12__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
173
|
+
return _functions_pipe__WEBPACK_IMPORTED_MODULE_12__[key];
|
156
174
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
157
175
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
158
|
-
var
|
176
|
+
var _functions_succeed__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__("./functions/succeed");
|
159
177
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
160
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
161
|
-
return
|
178
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_succeed__WEBPACK_IMPORTED_MODULE_13__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
179
|
+
return _functions_succeed__WEBPACK_IMPORTED_MODULE_13__[key];
|
162
180
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
163
181
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
164
|
-
var
|
182
|
+
var _functions_try__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__("./functions/try");
|
165
183
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
166
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
167
|
-
return
|
184
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_try__WEBPACK_IMPORTED_MODULE_14__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
185
|
+
return _functions_try__WEBPACK_IMPORTED_MODULE_14__[key];
|
168
186
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
169
187
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
170
|
-
var
|
188
|
+
var _functions_unwrap__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__("./functions/unwrap");
|
171
189
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
172
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
173
|
-
return
|
190
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_unwrap__WEBPACK_IMPORTED_MODULE_15__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
191
|
+
return _functions_unwrap__WEBPACK_IMPORTED_MODULE_15__[key];
|
174
192
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
175
193
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
176
|
-
var
|
194
|
+
var _functions_unwrap_error__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__("./functions/unwrap-error");
|
177
195
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
178
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
179
|
-
return
|
196
|
+
for(var __WEBPACK_IMPORT_KEY__ in _functions_unwrap_error__WEBPACK_IMPORTED_MODULE_16__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
197
|
+
return _functions_unwrap_error__WEBPACK_IMPORTED_MODULE_16__[key];
|
180
198
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
181
199
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
182
200
|
})();
|
package/dist/cjs/exports.d.ts
CHANGED
@@ -2,12 +2,14 @@ export * from './result';
|
|
2
2
|
export * from './functions/and-then';
|
3
3
|
export * from './functions/and-through';
|
4
4
|
export * from './functions/bind';
|
5
|
+
export * from './functions/combine';
|
5
6
|
export * from './functions/do';
|
6
7
|
export * from './functions/fail';
|
7
8
|
export * from './functions/is-failure';
|
8
9
|
export * from './functions/is-success';
|
9
10
|
export * from './functions/map';
|
10
11
|
export * from './functions/map-error';
|
12
|
+
export * from './functions/or-else';
|
11
13
|
export * from './functions/pipe';
|
12
14
|
export * from './functions/succeed';
|
13
15
|
export * from './functions/try';
|
@@ -37,6 +37,8 @@ import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '..
|
|
37
37
|
* // result: { type: 'Failure', error: 'error: 3' }
|
38
38
|
* ```
|
39
39
|
*
|
40
|
+
* @see {@link pipe} - It is recommended to use this function with the {@link pipe} function for better readability and composability.
|
41
|
+
*
|
40
42
|
* @category Combinators
|
41
43
|
*/
|
42
44
|
export declare const andThen: {
|
@@ -49,6 +49,8 @@ import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '..
|
|
49
49
|
* // { type: 'Failure', error: 'Must be > 0' }
|
50
50
|
* ```
|
51
51
|
*
|
52
|
+
* @see {@link pipe} - It is recommended to use this function with the {@link pipe} function for better readability and composability.
|
53
|
+
*
|
52
54
|
* @category Combinators
|
53
55
|
*/
|
54
56
|
export declare const andThrough: {
|
@@ -49,6 +49,8 @@ import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '..
|
|
49
49
|
* // { type: 'Failure', error: 'error' }
|
50
50
|
* ```
|
51
51
|
*
|
52
|
+
* @see {@link pipe} - It is recommended to use this function with the {@link pipe} function for better readability and composability.
|
53
|
+
*
|
52
54
|
* @category Combinators
|
53
55
|
*/
|
54
56
|
export declare const bind: {
|
@@ -0,0 +1,89 @@
|
|
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
|
+
});
|
@@ -0,0 +1,54 @@
|
|
1
|
+
import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '../result';
|
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
|
+
};
|
@@ -30,6 +30,9 @@ import type { ResultFor } from '../result';
|
|
30
30
|
* const result = Result.fail();
|
31
31
|
* // Result.Result<never, void>
|
32
32
|
* ```
|
33
|
+
*
|
34
|
+
* @see {@link combine} - For combining multiple Results into a single Result.
|
35
|
+
*
|
33
36
|
* @category Creators
|
34
37
|
*/
|
35
38
|
export declare const fail: {
|
@@ -29,6 +29,8 @@ import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '..
|
|
29
29
|
* // { type: 'Success', value: 123 }
|
30
30
|
* ```
|
31
31
|
*
|
32
|
+
* @see {@link pipe} - It is recommended to use this function with the {@link pipe} function for better readability and composability.
|
33
|
+
*
|
32
34
|
* @category Combinators
|
33
35
|
*/
|
34
36
|
export declare const mapError: {
|
@@ -29,6 +29,8 @@ import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '..
|
|
29
29
|
* // { type: 'Failure', error: 'error' }
|
30
30
|
* ```
|
31
31
|
*
|
32
|
+
* @see {@link pipe} - It is recommended to use this function with the {@link pipe} function for better readability and composability.
|
33
|
+
*
|
32
34
|
* @category Combinators
|
33
35
|
*/
|
34
36
|
export declare const map: {
|
@@ -0,0 +1,44 @@
|
|
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
|
+
orElse: ()=>orElse
|
28
|
+
});
|
29
|
+
const external_is_success_cjs_namespaceObject = require("./is-success.cjs");
|
30
|
+
const is_promise_cjs_namespaceObject = require("../internals/helpers/is-promise.cjs");
|
31
|
+
const orElse = (fn)=>(result)=>{
|
32
|
+
const apply = (r)=>{
|
33
|
+
if ((0, external_is_success_cjs_namespaceObject.isSuccess)(r)) return r;
|
34
|
+
return fn(r.error);
|
35
|
+
};
|
36
|
+
return (0, is_promise_cjs_namespaceObject.isPromise)(result) ? result.then(apply) : apply(result);
|
37
|
+
};
|
38
|
+
exports.orElse = __webpack_exports__.orElse;
|
39
|
+
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
40
|
+
"orElse"
|
41
|
+
].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
|
42
|
+
Object.defineProperty(exports, '__esModule', {
|
43
|
+
value: true
|
44
|
+
});
|
@@ -0,0 +1,47 @@
|
|
1
|
+
import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '../result';
|
2
|
+
/**
|
3
|
+
* Chains the next computation using the error value of a {@link Result} or {@link ResultAsync}.
|
4
|
+
* If the original result is a {@link Success}, it is returned unchanged.
|
5
|
+
* Otherwise, the provided function is called, and its result is returned as-is.
|
6
|
+
*
|
7
|
+
* @function
|
8
|
+
* @typeParam R1 - The input {@link Result} or {@link ResultAsync}.
|
9
|
+
* @typeParam R2 - The result type returned by `fn`.
|
10
|
+
*
|
11
|
+
* @example Success Case
|
12
|
+
* ```ts
|
13
|
+
* import { Result } from '@praha/byethrow';
|
14
|
+
*
|
15
|
+
* const result = Result.pipe(
|
16
|
+
* Result.succeed(42),
|
17
|
+
* Result.orElse((error) => Result.succeed(0)),
|
18
|
+
* );
|
19
|
+
* // { type: 'Success', value: 42 }
|
20
|
+
* ```
|
21
|
+
*
|
22
|
+
* @example Failure Case (function returns a Success)
|
23
|
+
* ```ts
|
24
|
+
* const result = Result.pipe(
|
25
|
+
* Result.fail('original error'),
|
26
|
+
* Result.orElse((error) => Result.succeed('default value')),
|
27
|
+
* );
|
28
|
+
* // result: { type: 'Success', value: 'default value' }
|
29
|
+
* ```
|
30
|
+
*
|
31
|
+
* @example Failure Case (function returns a Failure)
|
32
|
+
* ```ts
|
33
|
+
* const result = Result.pipe(
|
34
|
+
* Result.fail('original error'),
|
35
|
+
* Result.orElse((error) => Result.fail('new error: ' + error)),
|
36
|
+
* );
|
37
|
+
* // result: { type: 'Failure', error: 'new error: original error' }
|
38
|
+
* ```
|
39
|
+
*
|
40
|
+
* @see {@link pipe} - It is recommended to use this function with the {@link pipe} function for better readability and composability.
|
41
|
+
*
|
42
|
+
* @category Combinators
|
43
|
+
*/
|
44
|
+
export declare const orElse: {
|
45
|
+
<R1 extends ResultMaybeAsync<any, any>, R2 extends ResultMaybeAsync<any, any>>(fn: (a: InferFailure<R1>) => R2): (result: R1) => ResultFor<R1 | R2, InferSuccess<R1> | InferSuccess<R2>, InferFailure<R2>>;
|
46
|
+
<F extends (a: any) => ResultMaybeAsync<any, any>>(fn: F): <R1 extends ResultMaybeAsync<any, Parameters<F>[0]>>(result: R1) => ResultFor<R1 | ReturnType<F>, InferSuccess<R1> | InferSuccess<F>, InferFailure<F>>;
|
47
|
+
};
|
package/dist/esm/exports.d.ts
CHANGED
@@ -2,12 +2,14 @@ export * from './result';
|
|
2
2
|
export * from './functions/and-then';
|
3
3
|
export * from './functions/and-through';
|
4
4
|
export * from './functions/bind';
|
5
|
+
export * from './functions/combine';
|
5
6
|
export * from './functions/do';
|
6
7
|
export * from './functions/fail';
|
7
8
|
export * from './functions/is-failure';
|
8
9
|
export * from './functions/is-success';
|
9
10
|
export * from './functions/map';
|
10
11
|
export * from './functions/map-error';
|
12
|
+
export * from './functions/or-else';
|
11
13
|
export * from './functions/pipe';
|
12
14
|
export * from './functions/succeed';
|
13
15
|
export * from './functions/try';
|
package/dist/esm/exports.js
CHANGED
@@ -2,12 +2,14 @@ export * from "./result.js";
|
|
2
2
|
export * from "./functions/and-then.js";
|
3
3
|
export * from "./functions/and-through.js";
|
4
4
|
export * from "./functions/bind.js";
|
5
|
+
export * from "./functions/combine.js";
|
5
6
|
export * from "./functions/do.js";
|
6
7
|
export * from "./functions/fail.js";
|
7
8
|
export * from "./functions/is-failure.js";
|
8
9
|
export * from "./functions/is-success.js";
|
9
10
|
export * from "./functions/map.js";
|
10
11
|
export * from "./functions/map-error.js";
|
12
|
+
export * from "./functions/or-else.js";
|
11
13
|
export * from "./functions/pipe.js";
|
12
14
|
export * from "./functions/succeed.js";
|
13
15
|
export * from "./functions/try.js";
|
@@ -37,6 +37,8 @@ import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '..
|
|
37
37
|
* // result: { type: 'Failure', error: 'error: 3' }
|
38
38
|
* ```
|
39
39
|
*
|
40
|
+
* @see {@link pipe} - It is recommended to use this function with the {@link pipe} function for better readability and composability.
|
41
|
+
*
|
40
42
|
* @category Combinators
|
41
43
|
*/
|
42
44
|
export declare const andThen: {
|
@@ -49,6 +49,8 @@ import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '..
|
|
49
49
|
* // { type: 'Failure', error: 'Must be > 0' }
|
50
50
|
* ```
|
51
51
|
*
|
52
|
+
* @see {@link pipe} - It is recommended to use this function with the {@link pipe} function for better readability and composability.
|
53
|
+
*
|
52
54
|
* @category Combinators
|
53
55
|
*/
|
54
56
|
export declare const andThrough: {
|
@@ -49,6 +49,8 @@ import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '..
|
|
49
49
|
* // { type: 'Failure', error: 'error' }
|
50
50
|
* ```
|
51
51
|
*
|
52
|
+
* @see {@link pipe} - It is recommended to use this function with the {@link pipe} function for better readability and composability.
|
53
|
+
*
|
52
54
|
* @category Combinators
|
53
55
|
*/
|
54
56
|
export declare const bind: {
|
@@ -0,0 +1,54 @@
|
|
1
|
+
import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '../result';
|
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
|
+
};
|
@@ -0,0 +1,55 @@
|
|
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 };
|
@@ -30,6 +30,9 @@ import type { ResultFor } from '../result';
|
|
30
30
|
* const result = Result.fail();
|
31
31
|
* // Result.Result<never, void>
|
32
32
|
* ```
|
33
|
+
*
|
34
|
+
* @see {@link combine} - For combining multiple Results into a single Result.
|
35
|
+
*
|
33
36
|
* @category Creators
|
34
37
|
*/
|
35
38
|
export declare const fail: {
|
@@ -29,6 +29,8 @@ import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '..
|
|
29
29
|
* // { type: 'Success', value: 123 }
|
30
30
|
* ```
|
31
31
|
*
|
32
|
+
* @see {@link pipe} - It is recommended to use this function with the {@link pipe} function for better readability and composability.
|
33
|
+
*
|
32
34
|
* @category Combinators
|
33
35
|
*/
|
34
36
|
export declare const mapError: {
|
@@ -29,6 +29,8 @@ import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '..
|
|
29
29
|
* // { type: 'Failure', error: 'error' }
|
30
30
|
* ```
|
31
31
|
*
|
32
|
+
* @see {@link pipe} - It is recommended to use this function with the {@link pipe} function for better readability and composability.
|
33
|
+
*
|
32
34
|
* @category Combinators
|
33
35
|
*/
|
34
36
|
export declare const map: {
|
@@ -0,0 +1,47 @@
|
|
1
|
+
import type { InferFailure, InferSuccess, ResultFor, ResultMaybeAsync } from '../result';
|
2
|
+
/**
|
3
|
+
* Chains the next computation using the error value of a {@link Result} or {@link ResultAsync}.
|
4
|
+
* If the original result is a {@link Success}, it is returned unchanged.
|
5
|
+
* Otherwise, the provided function is called, and its result is returned as-is.
|
6
|
+
*
|
7
|
+
* @function
|
8
|
+
* @typeParam R1 - The input {@link Result} or {@link ResultAsync}.
|
9
|
+
* @typeParam R2 - The result type returned by `fn`.
|
10
|
+
*
|
11
|
+
* @example Success Case
|
12
|
+
* ```ts
|
13
|
+
* import { Result } from '@praha/byethrow';
|
14
|
+
*
|
15
|
+
* const result = Result.pipe(
|
16
|
+
* Result.succeed(42),
|
17
|
+
* Result.orElse((error) => Result.succeed(0)),
|
18
|
+
* );
|
19
|
+
* // { type: 'Success', value: 42 }
|
20
|
+
* ```
|
21
|
+
*
|
22
|
+
* @example Failure Case (function returns a Success)
|
23
|
+
* ```ts
|
24
|
+
* const result = Result.pipe(
|
25
|
+
* Result.fail('original error'),
|
26
|
+
* Result.orElse((error) => Result.succeed('default value')),
|
27
|
+
* );
|
28
|
+
* // result: { type: 'Success', value: 'default value' }
|
29
|
+
* ```
|
30
|
+
*
|
31
|
+
* @example Failure Case (function returns a Failure)
|
32
|
+
* ```ts
|
33
|
+
* const result = Result.pipe(
|
34
|
+
* Result.fail('original error'),
|
35
|
+
* Result.orElse((error) => Result.fail('new error: ' + error)),
|
36
|
+
* );
|
37
|
+
* // result: { type: 'Failure', error: 'new error: original error' }
|
38
|
+
* ```
|
39
|
+
*
|
40
|
+
* @see {@link pipe} - It is recommended to use this function with the {@link pipe} function for better readability and composability.
|
41
|
+
*
|
42
|
+
* @category Combinators
|
43
|
+
*/
|
44
|
+
export declare const orElse: {
|
45
|
+
<R1 extends ResultMaybeAsync<any, any>, R2 extends ResultMaybeAsync<any, any>>(fn: (a: InferFailure<R1>) => R2): (result: R1) => ResultFor<R1 | R2, InferSuccess<R1> | InferSuccess<R2>, InferFailure<R2>>;
|
46
|
+
<F extends (a: any) => ResultMaybeAsync<any, any>>(fn: F): <R1 extends ResultMaybeAsync<any, Parameters<F>[0]>>(result: R1) => ResultFor<R1 | ReturnType<F>, InferSuccess<R1> | InferSuccess<F>, InferFailure<F>>;
|
47
|
+
};
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import { isSuccess } from "./is-success.js";
|
2
|
+
import { isPromise } from "../internals/helpers/is-promise.js";
|
3
|
+
const orElse = (fn)=>(result)=>{
|
4
|
+
const apply = (r)=>{
|
5
|
+
if (isSuccess(r)) return r;
|
6
|
+
return fn(r.error);
|
7
|
+
};
|
8
|
+
return isPromise(result) ? result.then(apply) : apply(result);
|
9
|
+
};
|
10
|
+
export { orElse };
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@praha/byethrow",
|
3
|
-
"version": "0.0
|
3
|
+
"version": "0.2.0",
|
4
4
|
"description": "A lightweight, tree-shakable Result type package with a simple, consistent API designed",
|
5
5
|
"keywords": [
|
6
6
|
"javascript",
|
@@ -41,11 +41,11 @@
|
|
41
41
|
"README.md"
|
42
42
|
],
|
43
43
|
"devDependencies": {
|
44
|
-
"@rslib/core": "0.10.
|
44
|
+
"@rslib/core": "0.10.1",
|
45
45
|
"eslint": "9.29.0",
|
46
46
|
"typedoc": "0.28.5",
|
47
47
|
"typescript": "5.8.3",
|
48
|
-
"vitest": "3.2.
|
48
|
+
"vitest": "3.2.4"
|
49
49
|
},
|
50
50
|
"publishConfig": {
|
51
51
|
"provenance": true
|