happy-rusty 1.4.0 → 1.5.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.cn.md +9 -28
- package/README.md +9 -28
- package/dist/main.cjs +54 -0
- package/dist/main.cjs.map +1 -1
- package/dist/main.mjs +54 -0
- package/dist/main.mjs.map +1 -1
- package/dist/types.d.ts +71 -17
- package/docs/functions/Err.md +1 -1
- package/docs/functions/Ok.md +2 -2
- package/docs/functions/Some.md +1 -1
- package/docs/functions/isOption.md +1 -1
- package/docs/functions/isResult.md +1 -1
- package/docs/functions/promiseToAsyncResult.md +1 -1
- package/docs/interfaces/None.md +175 -46
- package/docs/interfaces/Option.md +128 -32
- package/docs/interfaces/Result.md +160 -34
- package/docs/type-aliases/AsyncIOResult.md +1 -1
- package/docs/type-aliases/AsyncOption.md +1 -1
- package/docs/type-aliases/AsyncResult.md +1 -1
- package/docs/type-aliases/AsyncVoidIOResult.md +1 -1
- package/docs/type-aliases/AsyncVoidResult.md +1 -1
- package/docs/type-aliases/IOResult.md +1 -1
- package/docs/type-aliases/VoidIOResult.md +1 -1
- package/docs/type-aliases/VoidResult.md +1 -1
- package/docs/variables/None.md +1 -1
- package/docs/variables/RESULT_FALSE.md +1 -1
- package/docs/variables/RESULT_TRUE.md +1 -1
- package/docs/variables/RESULT_VOID.md +1 -1
- package/docs/variables/RESULT_ZERO.md +1 -1
- package/package.json +5 -5
- package/src/enum/core.ts +69 -3
- package/src/enum/defines.ts +1 -18
- package/src/enum/prelude.ts +71 -1
package/src/enum/defines.ts
CHANGED
|
@@ -2,24 +2,7 @@
|
|
|
2
2
|
* Exports some commonly used types.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import type {
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Represents an asynchronous operation that yields an `Option<T>`.
|
|
9
|
-
* This is a promise that resolves to either `Some(T)` if the value is present, or `None` if the value is absent.
|
|
10
|
-
*
|
|
11
|
-
* @typeParam T - The type of the value that may be contained within the `Option`.
|
|
12
|
-
*/
|
|
13
|
-
export type AsyncOption<T> = Promise<Option<T>>;
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Represents an asynchronous operation that yields a `Result<T, E>`.
|
|
17
|
-
* This is a promise that resolves to `Ok(T)` if the operation was successful, or `Err(E)` if there was an error.
|
|
18
|
-
*
|
|
19
|
-
* @typeParam T - The type of the value that is produced by a successful operation.
|
|
20
|
-
* @typeParam E - The type of the error that may be produced by a failed operation.
|
|
21
|
-
*/
|
|
22
|
-
export type AsyncResult<T, E> = Promise<Result<T, E>>;
|
|
5
|
+
import type { AsyncResult, Result } from './core.ts';
|
|
23
6
|
|
|
24
7
|
/**
|
|
25
8
|
* Similar to Rust's `Result<(), E>`.
|
package/src/enum/prelude.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
-
import type { Option, Result } from './core.ts';
|
|
2
|
+
import type { AsyncOption, AsyncResult, Option, Result } from './core.ts';
|
|
3
3
|
import { OptionKindSymbol, ResultKindSymbol } from './symbols.ts';
|
|
4
4
|
import { isOption, isResult } from './utils.ts';
|
|
5
5
|
|
|
@@ -14,14 +14,26 @@ export interface None extends Option<never> {
|
|
|
14
14
|
|
|
15
15
|
readonly [OptionKindSymbol]: 'None';
|
|
16
16
|
|
|
17
|
+
isSome(): false;
|
|
18
|
+
isNone(): true;
|
|
19
|
+
isSomeAnd(predicate: (value: never) => boolean): false;
|
|
20
|
+
isSomeAndAsync(predicate: (value: never) => Promise<boolean>): Promise<false>;
|
|
21
|
+
|
|
22
|
+
expect(msg: string): never;
|
|
23
|
+
unwrap(): never;
|
|
17
24
|
unwrapOr<T>(defaultValue: T): T;
|
|
18
25
|
unwrapOrElse<T>(fn: () => T): T;
|
|
26
|
+
unwrapOrElseAsync<T>(fn: () => Promise<T>): Promise<T>;
|
|
19
27
|
|
|
28
|
+
okOr<E>(error: E): Result<never, E>;
|
|
29
|
+
okOrElse<E>(err: () => E): Result<never, E>;
|
|
20
30
|
transpose(): Result<None, never>;
|
|
21
31
|
|
|
22
32
|
filter(predicate: (value: never) => boolean): None;
|
|
23
33
|
flatten(): None;
|
|
24
34
|
map<U>(fn: (value: never) => U): None;
|
|
35
|
+
mapOr<U>(defaultValue: U, fn: (value: never) => U): U;
|
|
36
|
+
mapOrElse<U>(defaultFn: () => U, fn: (value: never) => U): U;
|
|
25
37
|
|
|
26
38
|
zip<U>(other: Option<U>): None;
|
|
27
39
|
zipWith<U, R>(other: Option<U>, fn: (value: never, otherValue: U) => R): None;
|
|
@@ -29,10 +41,14 @@ export interface None extends Option<never> {
|
|
|
29
41
|
|
|
30
42
|
and<U>(other: Option<U>): None;
|
|
31
43
|
andThen<U>(fn: (value: never) => Option<U>): None;
|
|
44
|
+
andThenAsync<U>(fn: (value: never) => AsyncOption<U>): Promise<None>;
|
|
32
45
|
or<T>(other: Option<T>): Option<T>;
|
|
33
46
|
orElse<T>(fn: () => Option<T>): Option<T>;
|
|
47
|
+
orElseAsync<T>(fn: () => AsyncOption<T>): AsyncOption<T>;
|
|
34
48
|
xor<T>(other: Option<T>): Option<T>;
|
|
35
49
|
|
|
50
|
+
inspect(fn: (value: never) => void): this;
|
|
51
|
+
|
|
36
52
|
eq<T>(other: Option<T>): boolean;
|
|
37
53
|
}
|
|
38
54
|
|
|
@@ -66,6 +82,9 @@ export function Some<T>(value: T): Option<T> {
|
|
|
66
82
|
isSomeAnd(predicate: (value: T) => boolean): boolean {
|
|
67
83
|
return predicate(value);
|
|
68
84
|
},
|
|
85
|
+
isSomeAndAsync(predicate: (value: T) => Promise<boolean>): Promise<boolean> {
|
|
86
|
+
return predicate(value);
|
|
87
|
+
},
|
|
69
88
|
|
|
70
89
|
expect(_msg: string): T {
|
|
71
90
|
return value;
|
|
@@ -79,6 +98,9 @@ export function Some<T>(value: T): Option<T> {
|
|
|
79
98
|
unwrapOrElse(_fn: () => T): T {
|
|
80
99
|
return value;
|
|
81
100
|
},
|
|
101
|
+
unwrapOrElseAsync(_fn: () => Promise<T>): Promise<T> {
|
|
102
|
+
return Promise.resolve(value);
|
|
103
|
+
},
|
|
82
104
|
|
|
83
105
|
okOr<E>(_error: E): Result<T, E> {
|
|
84
106
|
return Ok(value);
|
|
@@ -137,12 +159,18 @@ export function Some<T>(value: T): Option<T> {
|
|
|
137
159
|
andThen<U>(fn: (value: T) => Option<U>): Option<U> {
|
|
138
160
|
return fn(value);
|
|
139
161
|
},
|
|
162
|
+
andThenAsync<U>(fn: (value: T) => AsyncOption<U>): AsyncOption<U> {
|
|
163
|
+
return fn(value);
|
|
164
|
+
},
|
|
140
165
|
or(_other: Option<T>): Option<T> {
|
|
141
166
|
return some;
|
|
142
167
|
},
|
|
143
168
|
orElse(_fn: () => Option<T>): Option<T> {
|
|
144
169
|
return some;
|
|
145
170
|
},
|
|
171
|
+
orElseAsync(_fn: () => AsyncOption<T>): AsyncOption<T> {
|
|
172
|
+
return Promise.resolve(some);
|
|
173
|
+
},
|
|
146
174
|
xor(other: Option<T>): Option<T> {
|
|
147
175
|
assertOption(other);
|
|
148
176
|
return other.isSome() ? None : some;
|
|
@@ -183,6 +211,9 @@ export const None = Object.freeze<None>({
|
|
|
183
211
|
isSomeAnd(_predicate: (value: never) => boolean): false {
|
|
184
212
|
return false;
|
|
185
213
|
},
|
|
214
|
+
isSomeAndAsync(_predicate: (value: never) => Promise<boolean>): Promise<false> {
|
|
215
|
+
return Promise.resolve(false);
|
|
216
|
+
},
|
|
186
217
|
|
|
187
218
|
expect(msg: string): never {
|
|
188
219
|
throw new TypeError(msg);
|
|
@@ -196,6 +227,9 @@ export const None = Object.freeze<None>({
|
|
|
196
227
|
unwrapOrElse<T>(fn: () => T): T {
|
|
197
228
|
return fn();
|
|
198
229
|
},
|
|
230
|
+
unwrapOrElseAsync<T>(fn: () => Promise<T>): Promise<T> {
|
|
231
|
+
return fn();
|
|
232
|
+
},
|
|
199
233
|
|
|
200
234
|
okOr<E>(error: E): Result<never, E> {
|
|
201
235
|
return Err(error);
|
|
@@ -240,6 +274,9 @@ export const None = Object.freeze<None>({
|
|
|
240
274
|
andThen<U>(_fn: (value: never) => Option<U>): None {
|
|
241
275
|
return None;
|
|
242
276
|
},
|
|
277
|
+
andThenAsync<U>(_fn: (value: never) => AsyncOption<U>): Promise<None> {
|
|
278
|
+
return Promise.resolve(None);
|
|
279
|
+
},
|
|
243
280
|
or<T>(other: Option<T>): Option<T> {
|
|
244
281
|
assertOption(other);
|
|
245
282
|
return other;
|
|
@@ -247,6 +284,9 @@ export const None = Object.freeze<None>({
|
|
|
247
284
|
orElse<T>(fn: () => Option<T>): Option<T> {
|
|
248
285
|
return fn();
|
|
249
286
|
},
|
|
287
|
+
orElseAsync<T>(fn: () => AsyncOption<T>): AsyncOption<T> {
|
|
288
|
+
return fn();
|
|
289
|
+
},
|
|
250
290
|
xor<T>(other: Option<T>): Option<T> {
|
|
251
291
|
assertOption(other);
|
|
252
292
|
return other.isSome() ? other : None;
|
|
@@ -302,9 +342,15 @@ export function Ok<T, E>(value?: T): Result<T, E> {
|
|
|
302
342
|
isOkAnd(predicate: (value: T) => boolean): boolean {
|
|
303
343
|
return predicate(value as T);
|
|
304
344
|
},
|
|
345
|
+
isOkAndAsync(predicate: (value: T) => Promise<boolean>): Promise<boolean> {
|
|
346
|
+
return predicate(value as T);
|
|
347
|
+
},
|
|
305
348
|
isErrAnd(_predicate: (error: E) => boolean): false {
|
|
306
349
|
return false;
|
|
307
350
|
},
|
|
351
|
+
isErrAndAsync(_predicate: (error: E) => Promise<boolean>): Promise<false> {
|
|
352
|
+
return Promise.resolve(false);
|
|
353
|
+
},
|
|
308
354
|
|
|
309
355
|
expect(_msg: string): T {
|
|
310
356
|
return value as T;
|
|
@@ -318,6 +364,9 @@ export function Ok<T, E>(value?: T): Result<T, E> {
|
|
|
318
364
|
unwrapOrElse(_fn: (error: E) => T): T {
|
|
319
365
|
return value as T;
|
|
320
366
|
},
|
|
367
|
+
unwrapOrElseAsync(_fn: (error: E) => Promise<T>): Promise<T> {
|
|
368
|
+
return Promise.resolve(value as T);
|
|
369
|
+
},
|
|
321
370
|
|
|
322
371
|
expectErr(msg: string): E {
|
|
323
372
|
throw new TypeError(`${ msg }: ${ value }`);
|
|
@@ -366,9 +415,15 @@ export function Ok<T, E>(value?: T): Result<T, E> {
|
|
|
366
415
|
andThen<U>(fn: (value: T) => Result<U, E>): Result<U, E> {
|
|
367
416
|
return fn(value as T);
|
|
368
417
|
},
|
|
418
|
+
andThenAsync<U>(fn: (value: T) => AsyncResult<U, E>): AsyncResult<U, E> {
|
|
419
|
+
return fn(value as T);
|
|
420
|
+
},
|
|
369
421
|
orElse<F>(_fn: (error: E) => Result<T, F>): Result<T, F> {
|
|
370
422
|
return ok as unknown as Result<T, F>;
|
|
371
423
|
},
|
|
424
|
+
orElseAsync<F>(_fn: (error: E) => AsyncResult<T, F>): AsyncResult<T, F> {
|
|
425
|
+
return Promise.resolve(ok as unknown as Result<T, F>);
|
|
426
|
+
},
|
|
372
427
|
|
|
373
428
|
inspect(fn: (value: T) => void): Result<T, E> {
|
|
374
429
|
fn(value as T);
|
|
@@ -429,9 +484,15 @@ export function Err<T, E>(error: E): Result<T, E> {
|
|
|
429
484
|
isOkAnd(_predicate: (value: T) => boolean): false {
|
|
430
485
|
return false;
|
|
431
486
|
},
|
|
487
|
+
isOkAndAsync(_predicate: (value: T) => Promise<boolean>): Promise<boolean> {
|
|
488
|
+
return Promise.resolve(false);
|
|
489
|
+
},
|
|
432
490
|
isErrAnd(predicate: (error: E) => boolean): boolean {
|
|
433
491
|
return predicate(error);
|
|
434
492
|
},
|
|
493
|
+
isErrAndAsync(predicate: (error: E) => Promise<boolean>): Promise<boolean> {
|
|
494
|
+
return predicate(error);
|
|
495
|
+
},
|
|
435
496
|
|
|
436
497
|
expect(msg: string): T {
|
|
437
498
|
throw new TypeError(`${ msg }: ${ error }`);
|
|
@@ -445,6 +506,9 @@ export function Err<T, E>(error: E): Result<T, E> {
|
|
|
445
506
|
unwrapOrElse(fn: (error: E) => T): T {
|
|
446
507
|
return fn(error);
|
|
447
508
|
},
|
|
509
|
+
unwrapOrElseAsync(fn: (error: E) => Promise<T>): Promise<T> {
|
|
510
|
+
return fn(error);
|
|
511
|
+
},
|
|
448
512
|
|
|
449
513
|
expectErr(_msg: string): E {
|
|
450
514
|
return error;
|
|
@@ -489,9 +553,15 @@ export function Err<T, E>(error: E): Result<T, E> {
|
|
|
489
553
|
andThen<U>(_fn: (value: T) => Result<U, E>): Result<U, E> {
|
|
490
554
|
return err as unknown as Result<U, E>;
|
|
491
555
|
},
|
|
556
|
+
andThenAsync<U>(_fn: (value: T) => AsyncResult<U, E>): AsyncResult<U, E> {
|
|
557
|
+
return Promise.resolve(err as unknown as Result<U, E>);
|
|
558
|
+
},
|
|
492
559
|
orElse<F>(fn: (error: E) => Result<T, F>): Result<T, F> {
|
|
493
560
|
return fn(error);
|
|
494
561
|
},
|
|
562
|
+
orElseAsync<F>(fn: (error: E) => AsyncResult<T, F>): AsyncResult<T, F> {
|
|
563
|
+
return fn(error);
|
|
564
|
+
},
|
|
495
565
|
|
|
496
566
|
inspect(_fn: (value: T) => void): Result<T, E> {
|
|
497
567
|
return err;
|