happy-rusty 1.4.0 → 1.6.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/CHANGELOG.md +206 -0
- package/README.cn.md +253 -26
- package/README.md +249 -28
- package/dist/main.cjs +436 -32
- package/dist/main.cjs.map +1 -1
- package/dist/main.mjs +428 -33
- package/dist/main.mjs.map +1 -1
- package/dist/types.d.ts +2070 -66
- package/package.json +37 -24
- package/dist/types.d.ts.map +0 -1
- package/docs/README.md +0 -47
- package/docs/functions/Err.md +0 -46
- package/docs/functions/Ok.md +0 -70
- package/docs/functions/Some.md +0 -45
- package/docs/functions/isOption.md +0 -35
- package/docs/functions/isResult.md +0 -36
- package/docs/functions/promiseToAsyncResult.md +0 -50
- package/docs/interfaces/None.md +0 -850
- package/docs/interfaces/Option.md +0 -761
- package/docs/interfaces/Result.md +0 -777
- package/docs/type-aliases/AsyncIOResult.md +0 -24
- package/docs/type-aliases/AsyncOption.md +0 -24
- package/docs/type-aliases/AsyncResult.md +0 -25
- package/docs/type-aliases/AsyncVoidIOResult.md +0 -17
- package/docs/type-aliases/AsyncVoidResult.md +0 -23
- package/docs/type-aliases/IOResult.md +0 -24
- package/docs/type-aliases/VoidIOResult.md +0 -17
- package/docs/type-aliases/VoidResult.md +0 -23
- package/docs/variables/None.md +0 -18
- package/docs/variables/RESULT_FALSE.md +0 -18
- package/docs/variables/RESULT_TRUE.md +0 -18
- package/docs/variables/RESULT_VOID.md +0 -17
- package/docs/variables/RESULT_ZERO.md +0 -18
- package/src/enum/constants.ts +0 -30
- package/src/enum/core.ts +0 -569
- package/src/enum/defines.ts +0 -62
- package/src/enum/extensions.ts +0 -31
- package/src/enum/mod.ts +0 -6
- package/src/enum/prelude.ts +0 -549
- package/src/enum/symbols.ts +0 -9
- package/src/enum/utils.ts +0 -27
- package/src/mod.ts +0 -1
package/dist/main.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const OptionKindSymbol = Symbol("Option kind");
|
|
2
|
-
const ResultKindSymbol = Symbol("Result kind");
|
|
1
|
+
const OptionKindSymbol = /* @__PURE__ */ Symbol("Option kind");
|
|
2
|
+
const ResultKindSymbol = /* @__PURE__ */ Symbol("Result kind");
|
|
3
3
|
|
|
4
4
|
function isOption(o) {
|
|
5
5
|
return o != null && typeof o === "object" && OptionKindSymbol in o;
|
|
@@ -9,7 +9,7 @@ function isResult(r) {
|
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
function Some(value) {
|
|
12
|
-
const some = {
|
|
12
|
+
const some = Object.freeze({
|
|
13
13
|
[Symbol.toStringTag]: "Option",
|
|
14
14
|
[OptionKindSymbol]: "Some",
|
|
15
15
|
isSome() {
|
|
@@ -21,6 +21,15 @@ function Some(value) {
|
|
|
21
21
|
isSomeAnd(predicate) {
|
|
22
22
|
return predicate(value);
|
|
23
23
|
},
|
|
24
|
+
isSomeAndAsync(predicate) {
|
|
25
|
+
return predicate(value);
|
|
26
|
+
},
|
|
27
|
+
isNoneOr(predicate) {
|
|
28
|
+
return predicate(value);
|
|
29
|
+
},
|
|
30
|
+
isNoneOrAsync(predicate) {
|
|
31
|
+
return predicate(value);
|
|
32
|
+
},
|
|
24
33
|
expect(_msg) {
|
|
25
34
|
return value;
|
|
26
35
|
},
|
|
@@ -33,6 +42,9 @@ function Some(value) {
|
|
|
33
42
|
unwrapOrElse(_fn) {
|
|
34
43
|
return value;
|
|
35
44
|
},
|
|
45
|
+
unwrapOrElseAsync(_fn) {
|
|
46
|
+
return Promise.resolve(value);
|
|
47
|
+
},
|
|
36
48
|
okOr(_error) {
|
|
37
49
|
return Ok(value);
|
|
38
50
|
},
|
|
@@ -40,17 +52,15 @@ function Some(value) {
|
|
|
40
52
|
return Ok(value);
|
|
41
53
|
},
|
|
42
54
|
transpose() {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
return r.isOk() ? Ok(Some(r.unwrap())) : Err(r.unwrapErr());
|
|
55
|
+
assertResult(value);
|
|
56
|
+
return value.isOk() ? Ok(Some(value.unwrap())) : Err(value.unwrapErr());
|
|
46
57
|
},
|
|
47
58
|
filter(predicate) {
|
|
48
59
|
return predicate(value) ? some : None;
|
|
49
60
|
},
|
|
50
61
|
flatten() {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return o;
|
|
62
|
+
assertOption(value);
|
|
63
|
+
return value;
|
|
54
64
|
},
|
|
55
65
|
map(fn) {
|
|
56
66
|
return Some(fn(value));
|
|
@@ -72,7 +82,7 @@ function Some(value) {
|
|
|
72
82
|
unzip() {
|
|
73
83
|
const tuple = value;
|
|
74
84
|
if (!Array.isArray(tuple) || tuple.length !== 2) {
|
|
75
|
-
throw new TypeError(
|
|
85
|
+
throw new TypeError(`Option::unzip() requires a 2-element tuple, received ${Array.isArray(tuple) ? `array with ${tuple.length} elements` : typeof tuple}.`);
|
|
76
86
|
}
|
|
77
87
|
const [a, b] = tuple;
|
|
78
88
|
return [Some(a), Some(b)];
|
|
@@ -84,12 +94,18 @@ function Some(value) {
|
|
|
84
94
|
andThen(fn) {
|
|
85
95
|
return fn(value);
|
|
86
96
|
},
|
|
97
|
+
andThenAsync(fn) {
|
|
98
|
+
return fn(value);
|
|
99
|
+
},
|
|
87
100
|
or(_other) {
|
|
88
101
|
return some;
|
|
89
102
|
},
|
|
90
103
|
orElse(_fn) {
|
|
91
104
|
return some;
|
|
92
105
|
},
|
|
106
|
+
orElseAsync(_fn) {
|
|
107
|
+
return Promise.resolve(some);
|
|
108
|
+
},
|
|
93
109
|
xor(other) {
|
|
94
110
|
assertOption(other);
|
|
95
111
|
return other.isSome() ? None : some;
|
|
@@ -105,7 +121,7 @@ function Some(value) {
|
|
|
105
121
|
toString() {
|
|
106
122
|
return `Some(${value})`;
|
|
107
123
|
}
|
|
108
|
-
};
|
|
124
|
+
});
|
|
109
125
|
return some;
|
|
110
126
|
}
|
|
111
127
|
const None = Object.freeze({
|
|
@@ -120,11 +136,20 @@ const None = Object.freeze({
|
|
|
120
136
|
isSomeAnd(_predicate) {
|
|
121
137
|
return false;
|
|
122
138
|
},
|
|
139
|
+
isSomeAndAsync(_predicate) {
|
|
140
|
+
return Promise.resolve(false);
|
|
141
|
+
},
|
|
142
|
+
isNoneOr(_predicate) {
|
|
143
|
+
return true;
|
|
144
|
+
},
|
|
145
|
+
isNoneOrAsync(_predicate) {
|
|
146
|
+
return Promise.resolve(true);
|
|
147
|
+
},
|
|
123
148
|
expect(msg) {
|
|
124
149
|
throw new TypeError(msg);
|
|
125
150
|
},
|
|
126
151
|
unwrap() {
|
|
127
|
-
throw new TypeError("
|
|
152
|
+
throw new TypeError("Option::unwrap() called on a `None` value.");
|
|
128
153
|
},
|
|
129
154
|
unwrapOr(defaultValue) {
|
|
130
155
|
return defaultValue;
|
|
@@ -132,6 +157,9 @@ const None = Object.freeze({
|
|
|
132
157
|
unwrapOrElse(fn) {
|
|
133
158
|
return fn();
|
|
134
159
|
},
|
|
160
|
+
unwrapOrElseAsync(fn) {
|
|
161
|
+
return fn();
|
|
162
|
+
},
|
|
135
163
|
okOr(error) {
|
|
136
164
|
return Err(error);
|
|
137
165
|
},
|
|
@@ -171,6 +199,9 @@ const None = Object.freeze({
|
|
|
171
199
|
andThen(_fn) {
|
|
172
200
|
return None;
|
|
173
201
|
},
|
|
202
|
+
andThenAsync(_fn) {
|
|
203
|
+
return Promise.resolve(None);
|
|
204
|
+
},
|
|
174
205
|
or(other) {
|
|
175
206
|
assertOption(other);
|
|
176
207
|
return other;
|
|
@@ -178,6 +209,9 @@ const None = Object.freeze({
|
|
|
178
209
|
orElse(fn) {
|
|
179
210
|
return fn();
|
|
180
211
|
},
|
|
212
|
+
orElseAsync(fn) {
|
|
213
|
+
return fn();
|
|
214
|
+
},
|
|
181
215
|
xor(other) {
|
|
182
216
|
assertOption(other);
|
|
183
217
|
return other.isSome() ? other : None;
|
|
@@ -194,7 +228,7 @@ const None = Object.freeze({
|
|
|
194
228
|
}
|
|
195
229
|
});
|
|
196
230
|
function Ok(value) {
|
|
197
|
-
const ok = {
|
|
231
|
+
const ok = Object.freeze({
|
|
198
232
|
[Symbol.toStringTag]: "Result",
|
|
199
233
|
[ResultKindSymbol]: "Ok",
|
|
200
234
|
isOk() {
|
|
@@ -206,9 +240,15 @@ function Ok(value) {
|
|
|
206
240
|
isOkAnd(predicate) {
|
|
207
241
|
return predicate(value);
|
|
208
242
|
},
|
|
243
|
+
isOkAndAsync(predicate) {
|
|
244
|
+
return predicate(value);
|
|
245
|
+
},
|
|
209
246
|
isErrAnd(_predicate) {
|
|
210
247
|
return false;
|
|
211
248
|
},
|
|
249
|
+
isErrAndAsync(_predicate) {
|
|
250
|
+
return Promise.resolve(false);
|
|
251
|
+
},
|
|
212
252
|
expect(_msg) {
|
|
213
253
|
return value;
|
|
214
254
|
},
|
|
@@ -221,11 +261,14 @@ function Ok(value) {
|
|
|
221
261
|
unwrapOrElse(_fn) {
|
|
222
262
|
return value;
|
|
223
263
|
},
|
|
264
|
+
unwrapOrElseAsync(_fn) {
|
|
265
|
+
return Promise.resolve(value);
|
|
266
|
+
},
|
|
224
267
|
expectErr(msg) {
|
|
225
268
|
throw new TypeError(`${msg}: ${value}`);
|
|
226
269
|
},
|
|
227
270
|
unwrapErr() {
|
|
228
|
-
throw new TypeError("
|
|
271
|
+
throw new TypeError("Result::unwrapErr() called on an `Ok` value.");
|
|
229
272
|
},
|
|
230
273
|
ok() {
|
|
231
274
|
return Some(value);
|
|
@@ -234,9 +277,8 @@ function Ok(value) {
|
|
|
234
277
|
return None;
|
|
235
278
|
},
|
|
236
279
|
transpose() {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
return o.isSome() ? Some(Ok(o.unwrap())) : None;
|
|
280
|
+
assertOption(value);
|
|
281
|
+
return value.isSome() ? Some(Ok(value.unwrap())) : None;
|
|
240
282
|
},
|
|
241
283
|
map(fn) {
|
|
242
284
|
return Ok(fn(value));
|
|
@@ -251,9 +293,8 @@ function Ok(value) {
|
|
|
251
293
|
return fn(value);
|
|
252
294
|
},
|
|
253
295
|
flatten() {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
return r;
|
|
296
|
+
assertResult(value);
|
|
297
|
+
return value;
|
|
257
298
|
},
|
|
258
299
|
and(other) {
|
|
259
300
|
assertResult(other);
|
|
@@ -265,9 +306,15 @@ function Ok(value) {
|
|
|
265
306
|
andThen(fn) {
|
|
266
307
|
return fn(value);
|
|
267
308
|
},
|
|
309
|
+
andThenAsync(fn) {
|
|
310
|
+
return fn(value);
|
|
311
|
+
},
|
|
268
312
|
orElse(_fn) {
|
|
269
313
|
return ok;
|
|
270
314
|
},
|
|
315
|
+
orElseAsync(_fn) {
|
|
316
|
+
return Promise.resolve(ok);
|
|
317
|
+
},
|
|
271
318
|
inspect(fn) {
|
|
272
319
|
fn(value);
|
|
273
320
|
return ok;
|
|
@@ -283,16 +330,16 @@ function Ok(value) {
|
|
|
283
330
|
return ok;
|
|
284
331
|
},
|
|
285
332
|
asErr() {
|
|
286
|
-
throw new TypeError("
|
|
333
|
+
throw new TypeError("Result::asErr() called on an `Ok` value.");
|
|
287
334
|
},
|
|
288
335
|
toString() {
|
|
289
336
|
return `Ok(${value})`;
|
|
290
337
|
}
|
|
291
|
-
};
|
|
338
|
+
});
|
|
292
339
|
return ok;
|
|
293
340
|
}
|
|
294
341
|
function Err(error) {
|
|
295
|
-
const err = {
|
|
342
|
+
const err = Object.freeze({
|
|
296
343
|
[Symbol.toStringTag]: "Result",
|
|
297
344
|
[ResultKindSymbol]: "Err",
|
|
298
345
|
isOk() {
|
|
@@ -304,14 +351,20 @@ function Err(error) {
|
|
|
304
351
|
isOkAnd(_predicate) {
|
|
305
352
|
return false;
|
|
306
353
|
},
|
|
354
|
+
isOkAndAsync(_predicate) {
|
|
355
|
+
return Promise.resolve(false);
|
|
356
|
+
},
|
|
307
357
|
isErrAnd(predicate) {
|
|
308
358
|
return predicate(error);
|
|
309
359
|
},
|
|
360
|
+
isErrAndAsync(predicate) {
|
|
361
|
+
return predicate(error);
|
|
362
|
+
},
|
|
310
363
|
expect(msg) {
|
|
311
364
|
throw new TypeError(`${msg}: ${error}`);
|
|
312
365
|
},
|
|
313
366
|
unwrap() {
|
|
314
|
-
throw new TypeError("
|
|
367
|
+
throw new TypeError("Result::unwrap() called on an `Err` value.");
|
|
315
368
|
},
|
|
316
369
|
unwrapOr(defaultValue) {
|
|
317
370
|
return defaultValue;
|
|
@@ -319,6 +372,9 @@ function Err(error) {
|
|
|
319
372
|
unwrapOrElse(fn) {
|
|
320
373
|
return fn(error);
|
|
321
374
|
},
|
|
375
|
+
unwrapOrElseAsync(fn) {
|
|
376
|
+
return fn(error);
|
|
377
|
+
},
|
|
322
378
|
expectErr(_msg) {
|
|
323
379
|
return error;
|
|
324
380
|
},
|
|
@@ -359,9 +415,15 @@ function Err(error) {
|
|
|
359
415
|
andThen(_fn) {
|
|
360
416
|
return err;
|
|
361
417
|
},
|
|
418
|
+
andThenAsync(_fn) {
|
|
419
|
+
return Promise.resolve(err);
|
|
420
|
+
},
|
|
362
421
|
orElse(fn) {
|
|
363
422
|
return fn(error);
|
|
364
423
|
},
|
|
424
|
+
orElseAsync(fn) {
|
|
425
|
+
return fn(error);
|
|
426
|
+
},
|
|
365
427
|
inspect(_fn) {
|
|
366
428
|
return err;
|
|
367
429
|
},
|
|
@@ -374,7 +436,7 @@ function Err(error) {
|
|
|
374
436
|
return other.isErr() && other.unwrapErr() === error;
|
|
375
437
|
},
|
|
376
438
|
asOk() {
|
|
377
|
-
throw new TypeError("
|
|
439
|
+
throw new TypeError("Result::asOk() called on an `Err` value.");
|
|
378
440
|
},
|
|
379
441
|
asErr() {
|
|
380
442
|
return err;
|
|
@@ -382,17 +444,33 @@ function Err(error) {
|
|
|
382
444
|
toString() {
|
|
383
445
|
return `Err(${error})`;
|
|
384
446
|
}
|
|
385
|
-
};
|
|
447
|
+
});
|
|
386
448
|
return err;
|
|
387
449
|
}
|
|
450
|
+
function safeStringify(value) {
|
|
451
|
+
try {
|
|
452
|
+
if (value === null) {
|
|
453
|
+
return "null";
|
|
454
|
+
}
|
|
455
|
+
if (value === void 0) {
|
|
456
|
+
return "undefined";
|
|
457
|
+
}
|
|
458
|
+
if (typeof value === "object") {
|
|
459
|
+
return Object.prototype.toString.call(value);
|
|
460
|
+
}
|
|
461
|
+
return String(value);
|
|
462
|
+
} catch {
|
|
463
|
+
return "[unable to stringify]";
|
|
464
|
+
}
|
|
465
|
+
}
|
|
388
466
|
function assertOption(o) {
|
|
389
467
|
if (!isOption(o)) {
|
|
390
|
-
throw new TypeError(`
|
|
468
|
+
throw new TypeError(`Expected an Option, but received: ${safeStringify(o)}.`);
|
|
391
469
|
}
|
|
392
470
|
}
|
|
393
471
|
function assertResult(r) {
|
|
394
472
|
if (!isResult(r)) {
|
|
395
|
-
throw new TypeError(`
|
|
473
|
+
throw new TypeError(`Expected a Result, but received: ${safeStringify(r)}.`);
|
|
396
474
|
}
|
|
397
475
|
}
|
|
398
476
|
|
|
@@ -401,13 +479,330 @@ const RESULT_FALSE = Ok(false);
|
|
|
401
479
|
const RESULT_ZERO = Ok(0);
|
|
402
480
|
const RESULT_VOID = Ok();
|
|
403
481
|
|
|
404
|
-
function promiseToAsyncResult(p) {
|
|
405
|
-
|
|
406
|
-
return Ok(
|
|
407
|
-
}
|
|
482
|
+
async function promiseToAsyncResult(p) {
|
|
483
|
+
try {
|
|
484
|
+
return Ok(await p);
|
|
485
|
+
} catch (err) {
|
|
408
486
|
return Err(err);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
const ControlFlowKindSymbol = /* @__PURE__ */ Symbol("ControlFlow kind");
|
|
491
|
+
|
|
492
|
+
function Break(value) {
|
|
493
|
+
const brk = Object.freeze({
|
|
494
|
+
[Symbol.toStringTag]: "ControlFlow",
|
|
495
|
+
[ControlFlowKindSymbol]: "Break",
|
|
496
|
+
isBreak() {
|
|
497
|
+
return true;
|
|
498
|
+
},
|
|
499
|
+
isContinue() {
|
|
500
|
+
return false;
|
|
501
|
+
},
|
|
502
|
+
breakValue() {
|
|
503
|
+
return Some(value);
|
|
504
|
+
},
|
|
505
|
+
continueValue() {
|
|
506
|
+
return None;
|
|
507
|
+
},
|
|
508
|
+
mapBreak(fn) {
|
|
509
|
+
return Break(fn(value));
|
|
510
|
+
},
|
|
511
|
+
mapContinue(_fn) {
|
|
512
|
+
return brk;
|
|
513
|
+
},
|
|
514
|
+
breakOk() {
|
|
515
|
+
return Ok(value);
|
|
516
|
+
},
|
|
517
|
+
continueOk() {
|
|
518
|
+
return Err(value);
|
|
519
|
+
},
|
|
520
|
+
toString() {
|
|
521
|
+
return `Break(${value})`;
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
return brk;
|
|
525
|
+
}
|
|
526
|
+
function Continue(value) {
|
|
527
|
+
const cont = Object.freeze({
|
|
528
|
+
[Symbol.toStringTag]: "ControlFlow",
|
|
529
|
+
[ControlFlowKindSymbol]: "Continue",
|
|
530
|
+
isBreak() {
|
|
531
|
+
return false;
|
|
532
|
+
},
|
|
533
|
+
isContinue() {
|
|
534
|
+
return true;
|
|
535
|
+
},
|
|
536
|
+
breakValue() {
|
|
537
|
+
return None;
|
|
538
|
+
},
|
|
539
|
+
continueValue() {
|
|
540
|
+
return Some(value);
|
|
541
|
+
},
|
|
542
|
+
mapBreak(_fn) {
|
|
543
|
+
return cont;
|
|
544
|
+
},
|
|
545
|
+
mapContinue(fn) {
|
|
546
|
+
return Continue(fn(value));
|
|
547
|
+
},
|
|
548
|
+
breakOk() {
|
|
549
|
+
return Err(value);
|
|
550
|
+
},
|
|
551
|
+
continueOk() {
|
|
552
|
+
return Ok(value);
|
|
553
|
+
},
|
|
554
|
+
toString() {
|
|
555
|
+
return `Continue(${value})`;
|
|
556
|
+
}
|
|
557
|
+
});
|
|
558
|
+
return cont;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
function isControlFlow(cf) {
|
|
562
|
+
return cf != null && typeof cf === "object" && ControlFlowKindSymbol in cf;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
function Lazy(fn) {
|
|
566
|
+
let value;
|
|
567
|
+
let initialized = false;
|
|
568
|
+
return Object.freeze({
|
|
569
|
+
[Symbol.toStringTag]: "Lazy",
|
|
570
|
+
force() {
|
|
571
|
+
if (!initialized) {
|
|
572
|
+
value = fn();
|
|
573
|
+
initialized = true;
|
|
574
|
+
}
|
|
575
|
+
return value;
|
|
576
|
+
},
|
|
577
|
+
get() {
|
|
578
|
+
return initialized ? Some(value) : None;
|
|
579
|
+
},
|
|
580
|
+
isInitialized() {
|
|
581
|
+
return initialized;
|
|
582
|
+
},
|
|
583
|
+
toString() {
|
|
584
|
+
return initialized ? `Lazy(${value})` : "Lazy(<uninitialized>)";
|
|
585
|
+
}
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
function LazyAsync(fn) {
|
|
589
|
+
let value;
|
|
590
|
+
let initialized = false;
|
|
591
|
+
let pendingPromise;
|
|
592
|
+
return Object.freeze({
|
|
593
|
+
[Symbol.toStringTag]: "LazyAsync",
|
|
594
|
+
async force() {
|
|
595
|
+
if (initialized) {
|
|
596
|
+
return value;
|
|
597
|
+
}
|
|
598
|
+
if (pendingPromise) {
|
|
599
|
+
return pendingPromise;
|
|
600
|
+
}
|
|
601
|
+
pendingPromise = (async () => {
|
|
602
|
+
try {
|
|
603
|
+
const result = await fn();
|
|
604
|
+
value = result;
|
|
605
|
+
initialized = true;
|
|
606
|
+
return result;
|
|
607
|
+
} finally {
|
|
608
|
+
pendingPromise = void 0;
|
|
609
|
+
}
|
|
610
|
+
})();
|
|
611
|
+
return pendingPromise;
|
|
612
|
+
},
|
|
613
|
+
get() {
|
|
614
|
+
return initialized ? Some(value) : None;
|
|
615
|
+
},
|
|
616
|
+
isInitialized() {
|
|
617
|
+
return initialized;
|
|
618
|
+
},
|
|
619
|
+
toString() {
|
|
620
|
+
return initialized ? `LazyAsync(${value})` : "LazyAsync(<uninitialized>)";
|
|
621
|
+
}
|
|
622
|
+
});
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
function Mutex(value) {
|
|
626
|
+
let currentValue = value;
|
|
627
|
+
let locked = false;
|
|
628
|
+
const waitQueue = [];
|
|
629
|
+
function unlock() {
|
|
630
|
+
if (waitQueue.length > 0) {
|
|
631
|
+
const next = waitQueue.shift();
|
|
632
|
+
next();
|
|
633
|
+
} else {
|
|
634
|
+
locked = false;
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
function createGuard() {
|
|
638
|
+
let released = false;
|
|
639
|
+
return Object.freeze({
|
|
640
|
+
[Symbol.toStringTag]: "MutexGuard",
|
|
641
|
+
get value() {
|
|
642
|
+
if (released) {
|
|
643
|
+
throw new Error("MutexGuard has been released.");
|
|
644
|
+
}
|
|
645
|
+
return currentValue;
|
|
646
|
+
},
|
|
647
|
+
set value(newValue) {
|
|
648
|
+
if (released) {
|
|
649
|
+
throw new Error("MutexGuard has been released.");
|
|
650
|
+
}
|
|
651
|
+
currentValue = newValue;
|
|
652
|
+
},
|
|
653
|
+
unlock() {
|
|
654
|
+
if (released) {
|
|
655
|
+
return;
|
|
656
|
+
}
|
|
657
|
+
released = true;
|
|
658
|
+
unlock();
|
|
659
|
+
},
|
|
660
|
+
toString() {
|
|
661
|
+
if (released) {
|
|
662
|
+
return "MutexGuard(<released>)";
|
|
663
|
+
}
|
|
664
|
+
return `MutexGuard(${currentValue})`;
|
|
665
|
+
}
|
|
666
|
+
});
|
|
667
|
+
}
|
|
668
|
+
function lock() {
|
|
669
|
+
if (!locked) {
|
|
670
|
+
locked = true;
|
|
671
|
+
return Promise.resolve(createGuard());
|
|
672
|
+
}
|
|
673
|
+
return new Promise((resolve) => {
|
|
674
|
+
waitQueue.push(() => {
|
|
675
|
+
resolve(createGuard());
|
|
676
|
+
});
|
|
677
|
+
});
|
|
678
|
+
}
|
|
679
|
+
return Object.freeze({
|
|
680
|
+
[Symbol.toStringTag]: "Mutex",
|
|
681
|
+
async withLock(fn) {
|
|
682
|
+
const guard = await lock();
|
|
683
|
+
try {
|
|
684
|
+
return await fn(guard.value);
|
|
685
|
+
} finally {
|
|
686
|
+
guard.unlock();
|
|
687
|
+
}
|
|
688
|
+
},
|
|
689
|
+
lock,
|
|
690
|
+
tryLock() {
|
|
691
|
+
if (locked) {
|
|
692
|
+
return None;
|
|
693
|
+
}
|
|
694
|
+
locked = true;
|
|
695
|
+
return Some(createGuard());
|
|
696
|
+
},
|
|
697
|
+
isLocked() {
|
|
698
|
+
return locked;
|
|
699
|
+
},
|
|
700
|
+
toString() {
|
|
701
|
+
return locked ? "Mutex(<locked>)" : "Mutex(<unlocked>)";
|
|
702
|
+
}
|
|
703
|
+
});
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
function Once() {
|
|
707
|
+
let value;
|
|
708
|
+
let initialized = false;
|
|
709
|
+
let pendingPromise;
|
|
710
|
+
return Object.freeze({
|
|
711
|
+
[Symbol.toStringTag]: "Once",
|
|
712
|
+
get() {
|
|
713
|
+
return initialized ? Some(value) : None;
|
|
714
|
+
},
|
|
715
|
+
set(newValue) {
|
|
716
|
+
if (initialized) {
|
|
717
|
+
return Err(newValue);
|
|
718
|
+
}
|
|
719
|
+
value = newValue;
|
|
720
|
+
initialized = true;
|
|
721
|
+
return Ok(void 0);
|
|
722
|
+
},
|
|
723
|
+
getOrInit(fn) {
|
|
724
|
+
if (!initialized) {
|
|
725
|
+
value = fn();
|
|
726
|
+
initialized = true;
|
|
727
|
+
}
|
|
728
|
+
return value;
|
|
729
|
+
},
|
|
730
|
+
async getOrInitAsync(fn) {
|
|
731
|
+
if (initialized) {
|
|
732
|
+
return value;
|
|
733
|
+
}
|
|
734
|
+
if (pendingPromise) {
|
|
735
|
+
return pendingPromise;
|
|
736
|
+
}
|
|
737
|
+
pendingPromise = (async () => {
|
|
738
|
+
try {
|
|
739
|
+
const result = await fn();
|
|
740
|
+
value = result;
|
|
741
|
+
initialized = true;
|
|
742
|
+
return result;
|
|
743
|
+
} finally {
|
|
744
|
+
pendingPromise = void 0;
|
|
745
|
+
}
|
|
746
|
+
})();
|
|
747
|
+
return pendingPromise;
|
|
748
|
+
},
|
|
749
|
+
getOrTryInit(fn) {
|
|
750
|
+
if (initialized) {
|
|
751
|
+
return Ok(value);
|
|
752
|
+
}
|
|
753
|
+
const result = fn();
|
|
754
|
+
if (result.isOk()) {
|
|
755
|
+
value = result.unwrap();
|
|
756
|
+
initialized = true;
|
|
757
|
+
}
|
|
758
|
+
return result;
|
|
759
|
+
},
|
|
760
|
+
async getOrTryInitAsync(fn) {
|
|
761
|
+
if (initialized) {
|
|
762
|
+
return Ok(value);
|
|
763
|
+
}
|
|
764
|
+
if (pendingPromise) {
|
|
765
|
+
try {
|
|
766
|
+
await pendingPromise;
|
|
767
|
+
return Ok(value);
|
|
768
|
+
} catch {
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
pendingPromise = (async () => {
|
|
772
|
+
const result = await fn();
|
|
773
|
+
if (result.isOk()) {
|
|
774
|
+
value = result.unwrap();
|
|
775
|
+
initialized = true;
|
|
776
|
+
return value;
|
|
777
|
+
}
|
|
778
|
+
throw result;
|
|
779
|
+
})();
|
|
780
|
+
try {
|
|
781
|
+
const resultValue = await pendingPromise;
|
|
782
|
+
return Ok(resultValue);
|
|
783
|
+
} catch (errResult) {
|
|
784
|
+
return errResult;
|
|
785
|
+
} finally {
|
|
786
|
+
pendingPromise = void 0;
|
|
787
|
+
}
|
|
788
|
+
},
|
|
789
|
+
take() {
|
|
790
|
+
if (!initialized) {
|
|
791
|
+
return None;
|
|
792
|
+
}
|
|
793
|
+
const taken = value;
|
|
794
|
+
value = void 0;
|
|
795
|
+
initialized = false;
|
|
796
|
+
return Some(taken);
|
|
797
|
+
},
|
|
798
|
+
isInitialized() {
|
|
799
|
+
return initialized;
|
|
800
|
+
},
|
|
801
|
+
toString() {
|
|
802
|
+
return initialized ? `Once(${value})` : "Once(<uninitialized>)";
|
|
803
|
+
}
|
|
409
804
|
});
|
|
410
805
|
}
|
|
411
806
|
|
|
412
|
-
export { Err, None, Ok, RESULT_FALSE, RESULT_TRUE, RESULT_VOID, RESULT_ZERO, Some, isOption, isResult, promiseToAsyncResult };
|
|
807
|
+
export { Break, Continue, Err, Lazy, LazyAsync, Mutex, None, Ok, Once, RESULT_FALSE, RESULT_TRUE, RESULT_VOID, RESULT_ZERO, Some, isControlFlow, isOption, isResult, promiseToAsyncResult };
|
|
413
808
|
//# sourceMappingURL=main.mjs.map
|