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.
@@ -2,24 +2,7 @@
2
2
  * Exports some commonly used types.
3
3
  */
4
4
 
5
- import type { Option, Result } from './core.ts';
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>`.
@@ -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;