retuple 1.0.0-next.1 → 1.0.0-next.3

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/index.d.ts CHANGED
@@ -1,57 +1,103 @@
1
+ export type nonNullable = typeof nonNullable;
2
+ export type truthy = typeof truthy;
3
+ export type safe = typeof safe;
4
+ export type safeAsync = typeof safeAsync;
5
+ export type safePromise = typeof safePromise;
1
6
  export type Ok<T> = OkTuple<T> & Retuple<T, never>;
2
7
  export type Err<E> = ErrTuple<E> & Retuple<never, E>;
3
8
  export type Result<T, E> = (OkTuple<T> | ErrTuple<E>) & Retuple<T, E>;
4
9
  export { type ResultAsync };
5
- export declare class RetupleUnwrapFailed<E = unknown> extends Error {
10
+ /**
11
+ * ## Retuple Unwrap Failed
12
+ *
13
+ * An error which occurs when calling `$unwrap` on `Err`.
14
+ */
15
+ export declare class RetupleUnwrapFailed<const E = unknown> extends Error {
6
16
  value: E;
7
17
  constructor(value: E, msg?: string);
8
18
  }
9
- export declare class RetupleUnwrapErrFailed<T = unknown> extends Error {
19
+ /**
20
+ * ## Retuple Unwrap Err Failed
21
+ *
22
+ * An error which occurs when calling `$unwrapErr` on `Ok`.
23
+ */
24
+ export declare class RetupleUnwrapErrFailed<const T = unknown> extends Error {
10
25
  value: T;
11
26
  constructor(value: T, msg?: string);
12
27
  }
13
- export declare class RetupleExpectFailed<E = unknown> extends Error {
28
+ /**
29
+ * ## Retuple Expect Failed
30
+ *
31
+ * An error which occurs when calling `$expect` on `Err`, and when the value
32
+ * contained in the `Err` is not an instance of `Error`.
33
+ */
34
+ export declare class RetupleExpectFailed<const E = unknown> extends Error {
14
35
  value: E;
15
36
  constructor(value: E);
16
37
  }
38
+ /**
39
+ * ## Retuple Thrown Value Error
40
+ *
41
+ * An error constructed when a safe function call throws or rejects, when the
42
+ * thrown error or rejected value is not an instance of `Error`, and when no
43
+ * map error function is provided.
44
+ */
17
45
  export declare class RetupleThrownValueError extends Error {
18
46
  value: unknown;
19
47
  constructor(value: unknown);
20
48
  }
49
+ /**
50
+ * ## Retuple Invalid Result Error
51
+ *
52
+ * An error constructed when a safe function call throws or rejects, when the
53
+ * thrown error or rejected value is not an instance of `Error`, and when no
54
+ * map error function is provided.
55
+ */
56
+ export declare class RetupleInvalidResultError extends Error {
57
+ value: unknown[];
58
+ constructor(value: unknown[]);
59
+ }
21
60
  /**
22
61
  * ## Result
23
62
  *
24
63
  * @TODO
25
64
  */
26
- export declare const Result: {
27
- Ok: typeof Ok;
28
- Err: typeof Err;
29
- from: typeof from;
30
- safe: typeof safe;
31
- safeAsync: typeof safeAsync;
32
- safePromise: typeof safePromise;
33
- };
34
- export default Result;
65
+ export declare function Result<R extends [err: null | undefined, value: unknown] | [err: unknown, value: null | undefined]>(resultLike: R): (R extends [null | undefined, infer T] ? Ok<T> : R extends [infer E, null | undefined] ? Err<E> : never) extends Ok<infer T> | Err<infer E> ? Result<T, NonNullable<E>> : never;
66
+ export declare namespace Result {
67
+ var Ok: typeof import(".").Ok;
68
+ var Err: typeof import(".").Err;
69
+ var nonNullable: typeof import(".").nonNullable;
70
+ var truthy: typeof import(".").truthy;
71
+ var safe: typeof import(".").safe;
72
+ var safeAsync: typeof import(".").safeAsync;
73
+ var safePromise: typeof import(".").safePromise;
74
+ }
35
75
  /**
36
76
  * ## Ok
37
77
  *
38
78
  * @TODO
39
79
  */
40
80
  export declare function Ok(): Ok<void>;
41
- export declare function Ok<T>(val: T): Ok<T>;
81
+ export declare function Ok<const T>(val: T): Ok<T>;
42
82
  /**
43
83
  * ## Err
44
84
  *
45
85
  * @TODO
46
86
  */
47
87
  export declare function Err(): Err<void>;
48
- export declare function Err<E>(err: E): Err<E>;
88
+ export declare function Err<const E>(err: E): Err<E>;
89
+ /**
90
+ * Construct a {@link Result} from a value. If the value is neither null or
91
+ * undefined, the result is `Ok`.
92
+ */
93
+ export declare function nonNullable<const T>(value: T): Result<NonNullable<T>, true>;
94
+ export declare function nonNullable<const T, const E>(value: T, error: () => E): Result<NonNullable<T>, E>;
49
95
  /**
50
96
  * Construct a {@link Result} from a value. If the value is truthy, the result
51
97
  * is `Ok`.
52
98
  */
53
- export declare function from<T>(value: T): Result<Truthy<T>, true>;
54
- export declare function from<T, E>(value: T, error: () => E): Result<Truthy<T>, E>;
99
+ export declare function truthy<const T>(value: T): Result<Truthy<T>, true>;
100
+ export declare function truthy<const T, const E>(value: T, error: () => E): Result<Truthy<T>, E>;
55
101
  /**
56
102
  * Construct a {@link Result} from a synchronous function call. If the function
57
103
  * returns without throwing, the result is `Ok`.
@@ -78,7 +124,7 @@ export declare function safePromise<T, E>(promise: PromiseLike<T>, mapError: (er
78
124
  declare class ResultAsync<T, E> {
79
125
  #private;
80
126
  constructor(inner: PromiseLike<Result<T, E>>);
81
- then<TResult1 = Result<T, E>, TResult2 = never>(onfulfilled?: ((result: Result<T, E>) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: (reason: any) => TResult2 | PromiseLike<TResult2>): PromiseLike<TResult1 | TResult2>;
127
+ then<U = Result<T, E>, F = never>(onfulfilled?: ((value: Result<T, E>) => U | PromiseLike<U>) | null | undefined, onrejected?: ((reason: any) => F | PromiseLike<F>) | null | undefined): PromiseLike<U | F>;
82
128
  /**
83
129
  * @TODO
84
130
  */
@@ -102,7 +148,7 @@ declare class ResultAsync<T, E> {
102
148
  /**
103
149
  * @TODO
104
150
  */
105
- $unwrapOrElse<U = T>(this: ResultAsync<T, E>, f: () => U): Promise<T | U>;
151
+ $unwrapOrElse<U>(this: ResultAsync<T, E>, f: () => U): Promise<T | U>;
106
152
  /**
107
153
  * @TODO
108
154
  */
@@ -114,39 +160,52 @@ declare class ResultAsync<T, E> {
114
160
  /**
115
161
  * @TODO
116
162
  */
117
- $mapOr<U>(this: ResultAsync<T, E>, def: U, f: (val: T) => U): ResultAsync<U, E>;
163
+ $mapOr<U, V>(this: ResultAsync<T, E>, def: U, f: (val: T) => V): ResultAsync<U | V, E>;
118
164
  /**
119
165
  * @TODO
120
166
  */
121
- $mapOrElse<U>(this: ResultAsync<T, E>, def: (err: E) => U, f: (val: T) => U): ResultAsync<U, E>;
167
+ $mapOrElse<U, V>(this: ResultAsync<T, E>, def: (err: E) => U, f: (val: T) => V): ResultAsync<U | V, E>;
168
+ /**
169
+ * ## $assertOr
170
+ *
171
+ * {@link Retuple.$assertOr|$assertOr}
172
+ */
173
+ $assertOr<U, F>(this: ResultAsync<T, E>, def: Result<U, F> | PromiseLike<Result<U, F>>): ResultAsync<Truthy<T>, E | F>;
174
+ $assertOr<U, F, A extends T>(this: ResultAsync<T, E>, def: Result<U, F> | PromiseLike<Result<U, F>>, predicate: (val: T) => val is A): ResultAsync<U | A, E | F>;
175
+ $assertOr<U, F>(this: ResultAsync<T, E>, def: Result<U, F> | PromiseLike<Result<U, F>>, condition: (val: T) => unknown): ResultAsync<T | U, E | F>;
176
+ $assertOrElse<U, F>(this: ResultAsync<T, E>, def: () => Result<U, F> | PromiseLike<Result<U, F>>): ResultAsync<Truthy<T>, E | F>;
177
+ $assertOrElse<U, F, A extends T>(this: ResultAsync<T, E>, def: () => Result<U, F> | PromiseLike<Result<U, F>>, predicate: (val: T) => val is A): ResultAsync<U | A, E | F>;
178
+ $assertOrElse<U, F>(this: ResultAsync<T, E>, def: () => Result<U, F> | PromiseLike<Result<U, F>>, condition: (val: T) => unknown): ResultAsync<T | U, E | F>;
122
179
  /**
123
180
  * @TODO
124
181
  */
125
- $or<U = T, F = E>(this: ResultAsync<T, E>, or: Result<U, F> | PromiseLike<Result<U, F>>): ResultAsync<T | U, E | F>;
182
+ $or<U, F>(this: ResultAsync<T, E>, or: Result<U, F> | PromiseLike<Result<U, F>>): ResultAsync<T | U, E | F>;
126
183
  /**
127
184
  * @TODO
128
185
  */
129
- $orElse<U = T, F = E>(this: ResultAsync<T, E>, f: (err: E) => Result<U, F> | PromiseLike<Result<U, F>>): ResultAsync<T | U, E | F>;
186
+ $orElse<U, F>(this: ResultAsync<T, E>, f: (err: E) => Result<U, F> | PromiseLike<Result<U, F>>): ResultAsync<T | U, E | F>;
130
187
  /**
131
188
  * @TODO
132
189
  */
133
- $orSafe<U = T, F = Error>(this: ResultAsync<T, E>, f: (err: E) => U | PromiseLike<U>, mapError?: (err: unknown) => F): ResultAsync<T | U, E | F>;
190
+ $orSafe<U>(this: ResultAsync<T, E>, f: (err: E) => U | PromiseLike<U>): ResultAsync<T | U, E | Error>;
191
+ $orSafe<U, F>(this: ResultAsync<T, E>, f: (err: E) => U | PromiseLike<U>, mapError: (err: unknown) => F): ResultAsync<T | U, E | F>;
134
192
  /**
135
193
  * @TODO
136
194
  */
137
- $and<U = T, F = E>(this: ResultAsync<T, E>, and: Result<U, F> | PromiseLike<Result<U, F>>): ResultAsync<U, E | F>;
195
+ $and<U, F>(this: ResultAsync<T, E>, and: Result<U, F> | PromiseLike<Result<U, F>>): ResultAsync<U, E | F>;
138
196
  /**
139
197
  * @TODO
140
198
  */
141
- $andThen<U = T, F = E>(this: ResultAsync<T, E>, f: (val: T) => Result<U, F> | PromiseLike<Result<U, F>>): ResultAsync<U, E | F>;
199
+ $andThen<U, F>(this: ResultAsync<T, E>, f: (val: T) => Result<U, F> | PromiseLike<Result<U, F>>): ResultAsync<U, E | F>;
142
200
  /**
143
201
  * @TODO
144
202
  */
145
- $andThrough<F = E>(this: ResultAsync<T, E>, f: (val: T) => Result<any, F> | PromiseLike<Result<any, F>>): ResultAsync<T, E | F>;
203
+ $andThrough<F>(this: ResultAsync<T, E>, f: (val: T) => Result<any, F> | PromiseLike<Result<any, F>>): ResultAsync<T, E | F>;
146
204
  /**
147
205
  * @TODO
148
206
  */
149
- $andSafe<U = T, F = Error>(this: ResultAsync<T, E>, f: (val: T) => U | PromiseLike<U>, mapError?: (err: unknown) => F): ResultAsync<U, E | F>;
207
+ $andSafe<U>(this: ResultAsync<T, E>, f: (val: T) => U | PromiseLike<U>): ResultAsync<T | U, E | Error>;
208
+ $andSafe<U, F>(this: ResultAsync<T, E>, f: (val: T) => U | PromiseLike<U>, mapError: (err: unknown) => F): ResultAsync<T | U, E | F>;
150
209
  /**
151
210
  * @TODO
152
211
  */
@@ -166,6 +225,7 @@ declare class ResultAsync<T, E> {
166
225
  }
167
226
  type OkTuple<T> = [err: undefined, value: T];
168
227
  type ErrTuple<E> = [err: E, value: undefined];
228
+ type Truthy<T> = Exclude<T, false | null | undefined | 0 | 0n | "">;
169
229
  /**
170
230
  * @TODO - Result.all / Result.any
171
231
  */
@@ -173,23 +233,29 @@ interface Retuple<T, E> {
173
233
  /**
174
234
  * @TODO
175
235
  */
176
- $isOk(this: Result<T, E>): this is Ok<T>;
236
+ $toNativeTuple(this: Result<T, E>): OkTuple<T> | ErrTuple<E>;
177
237
  /**
178
238
  * @TODO
179
239
  */
180
- $isOkAnd<U extends T = T>(this: Result<T, E>, f: ((val: T) => val is U) | ((val: T) => boolean)): this is Ok<U>;
240
+ $value(this: Result<T, E>): T | E;
181
241
  /**
182
242
  * @TODO
183
243
  */
184
- $isErr(this: Result<T, E>): this is Err<E>;
244
+ $isOk(this: Result<T, E>): this is Ok<T>;
185
245
  /**
186
246
  * @TODO
187
247
  */
188
- $isErrAnd<F extends E = E>(this: Result<T, E>, f: ((err: E) => err is F) | ((err: E) => boolean)): this is Err<F>;
248
+ $isOkAnd<U extends T>(this: Result<T, E>, predicate: (val: T) => val is U): this is Ok<U>;
249
+ $isOkAnd(this: Result<T, E>, predicate: (val: T) => unknown): this is Ok<T>;
189
250
  /**
190
251
  * @TODO
191
252
  */
192
- $value(this: Result<T, E>): T | E;
253
+ $isErr(this: Result<T, E>): this is Err<E>;
254
+ /**
255
+ * @TODO
256
+ */
257
+ $isErrAnd<F extends E>(this: Result<T, E>, prediacte: (val: E) => val is F): this is Err<F>;
258
+ $isErrAnd(this: Result<T, E>, predicate: (val: E) => unknown): this is Err<E>;
193
259
  /**
194
260
  * @TODO
195
261
  */
@@ -205,11 +271,11 @@ interface Retuple<T, E> {
205
271
  /**
206
272
  * @TODO
207
273
  */
208
- $unwrapOr<U = T>(this: Result<T, E>, def: U): T | U;
274
+ $unwrapOr<const U>(this: Result<T, E>, def: U): T | U;
209
275
  /**
210
276
  * @TODO
211
277
  */
212
- $unwrapOrElse<U = T>(this: Result<T, E>, f: () => U): T | U;
278
+ $unwrapOrElse<U>(this: Result<T, E>, f: () => U): T | U;
213
279
  /**
214
280
  * @TODO
215
281
  */
@@ -221,43 +287,53 @@ interface Retuple<T, E> {
221
287
  /**
222
288
  * @TODO
223
289
  */
224
- $mapOr<U>(this: Result<T, E>, def: U, f: (val: T) => U): Result<U, E>;
290
+ $mapOr<U, V = U>(this: Result<T, E>, def: U, f: (val: T) => V): Result<U | V, E>;
225
291
  /**
226
292
  * @TODO
227
293
  */
228
- $mapOrElse<U>(this: Result<T, E>, def: (err: E) => U, f: (val: T) => U): Result<U, E>;
294
+ $mapOrElse<U, V = U>(this: Result<T, E>, def: (err: E) => U, f: (val: T) => V): Result<U | V, E>;
229
295
  /**
230
296
  * @TODO
231
297
  */
232
- $or<U = T, F = E>(this: Result<T, E>, or: Result<U, F>): Result<T | U, E | F>;
298
+ $or<U, F>(this: Result<T, E>, or: Result<U, F>): Result<T | U, E | F>;
233
299
  /**
234
300
  * @TODO
235
301
  */
236
- $orElse<U = never, F = never>(this: Result<T, E>, f: (err: E) => Result<U, F>): Result<T | U, E | F>;
302
+ $orElse<U, F>(this: Result<T, E>, f: (err: E) => Result<U, F>): Result<T | U, E | F>;
237
303
  /**
238
304
  * @TODO
239
305
  */
240
- $orSafe<U = T>(this: Result<T, E>, f: (err: E) => U): Result<T | U, E | Error>;
241
- $orSafe<U = T, F = E>(this: Result<T, E>, f: (err: E) => U, mapError: (err: unknown) => F): Result<T | U, E | F>;
242
- $orSafe<U = T, F = Error>(this: Result<T, E>, f: (err: E) => U, mapError: (err: unknown) => F): Result<T | U, E | F>;
306
+ $orSafe<U>(this: Result<T, E>, f: (err: E) => U): Result<T | U, E | Error>;
307
+ $orSafe<U, F>(this: Result<T, E>, f: (err: E) => U, mapError: (err: unknown) => F): Result<T | U, E | F>;
243
308
  /**
244
309
  * @TODO
245
310
  */
246
- $and<U = T, F = E>(this: Result<T, E>, and: Result<U, F>): Result<U, E | F>;
311
+ $and<U, F>(this: Result<T, E>, and: Result<U, F>): Result<U, E | F>;
247
312
  /**
248
313
  * @TODO
249
314
  */
250
- $andThen<U = never, F = never>(this: Result<T, E>, f: (val: T) => Result<U, F>): Result<U, E | F>;
315
+ $andThen<U, F>(this: Result<T, E>, f: (val: T) => Result<U, F>): Result<U, E | F>;
251
316
  /**
252
317
  * @TODO
253
318
  */
254
- $andThrough<F = never>(this: Result<T, E>, f: (val: T) => Result<any, F>): Result<T, E | F>;
319
+ $andThrough<F>(this: Result<T, E>, f: (val: T) => Result<any, F>): Result<T, E | F>;
255
320
  /**
256
321
  * @TODO
257
322
  */
258
- $andSafe<U = T>(this: Result<T, E>, f: (val: T) => U): Result<T | U, E | Error>;
259
- $andSafe<U = T, F = E>(this: Result<T, E>, f: (val: T) => U, mapError: (err: unknown) => F): Result<T | U, E | F>;
260
- $andSafe<U, F = Error>(this: Result<T, E>, f: (val: T) => U, mapError: (err: unknown) => F): Result<T | U, E | F>;
323
+ $andSafe<U>(this: Result<T, E>, f: (val: T) => U): Result<T | U, E | Error>;
324
+ $andSafe<U, F>(this: Result<T, E>, f: (val: T) => U, mapError: (err: unknown) => F): Result<T | U, E | F>;
325
+ /**
326
+ * @TODO
327
+ */
328
+ $assertOr<U, F>(this: Result<T, E>, def: Result<U, F>): Result<Truthy<T>, E | F>;
329
+ $assertOr<U, F, A extends T>(this: Result<T, E>, def: Result<U, F>, predicate: (val: T) => val is A): Result<U | A, E | F>;
330
+ $assertOr<U, F>(this: Result<T, E>, def: Result<U, F>, condition: (val: T) => unknown): Result<T | U, E | F>;
331
+ /**
332
+ * @TODO
333
+ */
334
+ $assertOrElse<U, F>(this: Result<T, E>, def: () => Result<U, F>): Result<Truthy<T>, E | F>;
335
+ $assertOrElse<U, F, A extends T>(this: Result<T, E>, def: () => Result<U, F>, predicate: (val: T) => val is A): Result<U | A, E | F>;
336
+ $assertOrElse<U, F>(this: Result<T, E>, def: () => Result<U, F>, condition: (val: T) => unknown): Result<T | U, E | F>;
261
337
  /**
262
338
  * @TODO
263
339
  */
@@ -282,5 +358,135 @@ interface Retuple<T, E> {
282
358
  * @TODO
283
359
  */
284
360
  $promise(this: Result<T, E>): Promise<Result<T, E>>;
361
+ /**
362
+ * Mark standard array methods as deprecated, to assist with type hinting.
363
+ */
364
+ /**
365
+ * @deprecated
366
+ */
367
+ at(...args: unknown[]): unknown;
368
+ /**
369
+ * @deprecated
370
+ */
371
+ concat(...args: unknown[]): unknown;
372
+ /**
373
+ * @deprecated
374
+ */
375
+ copyWithin(...args: unknown[]): unknown;
376
+ /**
377
+ * @deprecated
378
+ */
379
+ entries(...args: unknown[]): unknown;
380
+ /**
381
+ * @deprecated
382
+ */
383
+ every(...args: unknown[]): unknown;
384
+ /**
385
+ * @deprecated
386
+ */
387
+ fill(...args: unknown[]): unknown;
388
+ /**
389
+ * @deprecated
390
+ */
391
+ filter(...args: unknown[]): unknown;
392
+ /**
393
+ * @deprecated
394
+ */
395
+ find(...args: unknown[]): unknown;
396
+ /**
397
+ * @deprecated
398
+ */
399
+ findIndex(...args: unknown[]): unknown;
400
+ /**
401
+ * @deprecated
402
+ */
403
+ flat(...args: unknown[]): unknown;
404
+ /**
405
+ * @deprecated
406
+ */
407
+ flatMap(...args: unknown[]): unknown;
408
+ /**
409
+ * @deprecated
410
+ */
411
+ forEach(...args: unknown[]): unknown;
412
+ /**
413
+ * @deprecated
414
+ */
415
+ includes(...args: unknown[]): unknown;
416
+ /**
417
+ * @deprecated
418
+ */
419
+ indexOf(...args: unknown[]): unknown;
420
+ /**
421
+ * @deprecated
422
+ */
423
+ join(...args: unknown[]): unknown;
424
+ /**
425
+ * @deprecated
426
+ */
427
+ keys(...args: unknown[]): unknown;
428
+ /**
429
+ * @deprecated
430
+ */
431
+ lastIndexOf(...args: unknown[]): unknown;
432
+ /**
433
+ * @deprecated
434
+ */
435
+ map(...args: unknown[]): unknown;
436
+ /**
437
+ * @deprecated
438
+ */
439
+ pop(...args: unknown[]): any;
440
+ /**
441
+ * @deprecated
442
+ */
443
+ push(...args: unknown[]): unknown;
444
+ /**
445
+ * @deprecated
446
+ */
447
+ reduce(...args: unknown[]): unknown;
448
+ /**
449
+ * @deprecated
450
+ */
451
+ reduceRight(...args: unknown[]): unknown;
452
+ /**
453
+ * @deprecated
454
+ */
455
+ reverse(...args: unknown[]): unknown;
456
+ /**
457
+ * @deprecated
458
+ */
459
+ shift(...args: unknown[]): unknown;
460
+ /**
461
+ * @deprecated
462
+ */
463
+ slice(...args: unknown[]): unknown;
464
+ /**
465
+ * @deprecated
466
+ */
467
+ some(...args: unknown[]): unknown;
468
+ /**
469
+ * @deprecated
470
+ */
471
+ sort(...args: unknown[]): unknown;
472
+ /**
473
+ * @deprecated
474
+ */
475
+ splice(...args: unknown[]): unknown;
476
+ /**
477
+ * @deprecated
478
+ */
479
+ toString(...args: unknown[]): unknown;
480
+ /**
481
+ * @deprecated
482
+ */
483
+ toLocaleString(...args: unknown[]): unknown;
484
+ /**
485
+ * @deprecated
486
+ */
487
+ unshift(...args: unknown[]): unknown;
488
+ /**
489
+ * @deprecated
490
+ */
491
+ values(...args: unknown[]): unknown;
285
492
  }
286
- type Truthy<T> = Exclude<T, false | null | undefined | 0 | 0n | "">;