@dangayle/rustlike 0.1.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.
@@ -0,0 +1,1009 @@
1
+ //#region src/core.ts
2
+ const PANIC_STRING_MAX_LENGTH = 200;
3
+ function toPanicString(value) {
4
+ let str;
5
+ if (value instanceof Error) str = value.message;
6
+ else try {
7
+ str = JSON.stringify(value);
8
+ } catch {
9
+ str = String(value);
10
+ }
11
+ if (str.length > PANIC_STRING_MAX_LENGTH) return str.slice(0, PANIC_STRING_MAX_LENGTH) + "...";
12
+ return str;
13
+ }
14
+ var SomeImpl = class SomeImpl {
15
+ constructor(value) {
16
+ this.value = value;
17
+ this.some = true;
18
+ }
19
+ map(fn) {
20
+ return new SomeImpl(fn(this.value));
21
+ }
22
+ mapOr(_defaultValue, fn) {
23
+ return fn(this.value);
24
+ }
25
+ mapOrElse(_defaultFn, fn) {
26
+ return fn(this.value);
27
+ }
28
+ andThen(fn) {
29
+ return fn(this.value);
30
+ }
31
+ and(other) {
32
+ return other;
33
+ }
34
+ or(_other) {
35
+ return this;
36
+ }
37
+ orElse(_fn) {
38
+ return this;
39
+ }
40
+ xor(other) {
41
+ return other.isSome() ? NoneValue : this;
42
+ }
43
+ filter(predicate) {
44
+ return predicate(this.value) ? this : NoneValue;
45
+ }
46
+ contains(value) {
47
+ return this.value === value;
48
+ }
49
+ unwrap() {
50
+ return this.value;
51
+ }
52
+ unwrapOr(_defaultValue) {
53
+ return this.value;
54
+ }
55
+ unwrapOrElse(_fn) {
56
+ return this.value;
57
+ }
58
+ expect(_message) {
59
+ return this.value;
60
+ }
61
+ match(handlers) {
62
+ return handlers.some(this.value);
63
+ }
64
+ okOr(_error) {
65
+ return new OkImpl(this.value);
66
+ }
67
+ zip(other) {
68
+ return other.isSome() ? new SomeImpl([this.value, other.value]) : NoneValue;
69
+ }
70
+ flatten() {
71
+ return this.unwrap();
72
+ }
73
+ inspect(fn) {
74
+ fn(this.value);
75
+ return this;
76
+ }
77
+ isSome() {
78
+ return true;
79
+ }
80
+ isNone() {
81
+ return false;
82
+ }
83
+ };
84
+ var NoneImpl = class {
85
+ constructor() {
86
+ this.some = false;
87
+ }
88
+ map(_fn) {
89
+ return this;
90
+ }
91
+ mapOr(defaultValue, _fn) {
92
+ return defaultValue;
93
+ }
94
+ mapOrElse(defaultFn, _fn) {
95
+ return defaultFn();
96
+ }
97
+ andThen(_fn) {
98
+ return this;
99
+ }
100
+ and(_other) {
101
+ return this;
102
+ }
103
+ or(other) {
104
+ return other;
105
+ }
106
+ orElse(fn) {
107
+ return fn();
108
+ }
109
+ xor(other) {
110
+ return other;
111
+ }
112
+ filter(_predicate) {
113
+ return this;
114
+ }
115
+ contains(_value) {
116
+ return false;
117
+ }
118
+ unwrap() {
119
+ throw new Error("Called unwrap on None");
120
+ }
121
+ unwrapOr(defaultValue) {
122
+ return defaultValue;
123
+ }
124
+ unwrapOrElse(fn) {
125
+ return fn();
126
+ }
127
+ expect(message) {
128
+ throw new Error(message);
129
+ }
130
+ match(handlers) {
131
+ return handlers.none();
132
+ }
133
+ okOr(error) {
134
+ return new ErrImpl(error);
135
+ }
136
+ zip(_other) {
137
+ return this;
138
+ }
139
+ flatten() {
140
+ return this;
141
+ }
142
+ inspect(_fn) {
143
+ return this;
144
+ }
145
+ isSome() {
146
+ return false;
147
+ }
148
+ isNone() {
149
+ return true;
150
+ }
151
+ };
152
+ const NoneValue = Object.freeze(new NoneImpl());
153
+ var OkImpl = class OkImpl {
154
+ constructor(value) {
155
+ this.value = value;
156
+ this.ok = true;
157
+ }
158
+ map(fn) {
159
+ return new OkImpl(fn(this.value));
160
+ }
161
+ mapOr(_defaultValue, fn) {
162
+ return fn(this.value);
163
+ }
164
+ mapOrElse(_defaultFn, fn) {
165
+ return fn(this.value);
166
+ }
167
+ mapErr(_fn) {
168
+ return this;
169
+ }
170
+ andThen(fn) {
171
+ return fn(this.value);
172
+ }
173
+ and(other) {
174
+ return other;
175
+ }
176
+ or(_other) {
177
+ return this;
178
+ }
179
+ orElse(_fn) {
180
+ return this;
181
+ }
182
+ contains(value) {
183
+ return this.value === value;
184
+ }
185
+ containsErr(_error) {
186
+ return false;
187
+ }
188
+ unwrap() {
189
+ return this.value;
190
+ }
191
+ unwrapOr(_defaultValue) {
192
+ return this.value;
193
+ }
194
+ unwrapOrElse(_fn) {
195
+ return this.value;
196
+ }
197
+ expect(_message) {
198
+ return this.value;
199
+ }
200
+ unwrapErr() {
201
+ throw new Error(`Called unwrapErr on Ok: ${toPanicString(this.value)}`);
202
+ }
203
+ expectErr(message) {
204
+ throw new Error(`${message}: ${toPanicString(this.value)}`);
205
+ }
206
+ match(handlers) {
207
+ return handlers.ok(this.value);
208
+ }
209
+ toOption() {
210
+ return new SomeImpl(this.value);
211
+ }
212
+ err() {
213
+ return NoneValue;
214
+ }
215
+ flatten() {
216
+ return this.unwrap();
217
+ }
218
+ inspect(fn) {
219
+ fn(this.value);
220
+ return this;
221
+ }
222
+ inspectErr(_fn) {
223
+ return this;
224
+ }
225
+ isOk() {
226
+ return true;
227
+ }
228
+ isErr() {
229
+ return false;
230
+ }
231
+ };
232
+ var ErrImpl = class ErrImpl {
233
+ constructor(error) {
234
+ this.error = error;
235
+ this.ok = false;
236
+ }
237
+ map(_fn) {
238
+ return this;
239
+ }
240
+ mapOr(defaultValue, _fn) {
241
+ return defaultValue;
242
+ }
243
+ mapOrElse(defaultFn, _fn) {
244
+ return defaultFn(this.error);
245
+ }
246
+ mapErr(fn) {
247
+ return new ErrImpl(fn(this.error));
248
+ }
249
+ andThen(_fn) {
250
+ return this;
251
+ }
252
+ and(_other) {
253
+ return this;
254
+ }
255
+ or(other) {
256
+ return other;
257
+ }
258
+ orElse(fn) {
259
+ return fn(this.error);
260
+ }
261
+ contains(_value) {
262
+ return false;
263
+ }
264
+ containsErr(error) {
265
+ return this.error === error;
266
+ }
267
+ unwrap() {
268
+ throw new Error(`Called unwrap on Err: ${toPanicString(this.error)}`);
269
+ }
270
+ unwrapOr(defaultValue) {
271
+ return defaultValue;
272
+ }
273
+ unwrapOrElse(fn) {
274
+ return fn(this.error);
275
+ }
276
+ expect(message) {
277
+ throw new Error(`${message}: ${toPanicString(this.error)}`);
278
+ }
279
+ unwrapErr() {
280
+ return this.error;
281
+ }
282
+ expectErr(_message) {
283
+ return this.error;
284
+ }
285
+ match(handlers) {
286
+ return handlers.err(this.error);
287
+ }
288
+ toOption() {
289
+ return NoneValue;
290
+ }
291
+ err() {
292
+ return new SomeImpl(this.error);
293
+ }
294
+ flatten() {
295
+ return this;
296
+ }
297
+ inspect(_fn) {
298
+ return this;
299
+ }
300
+ inspectErr(fn) {
301
+ fn(this.error);
302
+ return this;
303
+ }
304
+ isOk() {
305
+ return false;
306
+ }
307
+ isErr() {
308
+ return true;
309
+ }
310
+ };
311
+ const Some = (value) => new SomeImpl(value);
312
+ const None = NoneValue;
313
+ const Ok = (value) => new OkImpl(value);
314
+ const Err = (error) => new ErrImpl(error);
315
+ const isSome = (option) => option.some;
316
+ const isNone = (option) => !option.some;
317
+ const isOk = (result) => result.ok;
318
+ const isErr = (result) => !result.ok;
319
+ const Option = {
320
+ some: Some,
321
+ none: None,
322
+ isSome,
323
+ isNone,
324
+ from: (value) => value != null ? Some(value) : None,
325
+ map: (option, fn) => option.map(fn),
326
+ andThen: (option, fn) => option.andThen(fn),
327
+ or: (option, other) => option.or(other),
328
+ orElse: (option, fn) => option.orElse(fn),
329
+ filter: (option, predicate) => option.some ? option.filter(predicate) : None,
330
+ unwrap: (option) => option.unwrap(),
331
+ unwrapOr: (option, defaultValue) => option.unwrapOr(defaultValue),
332
+ unwrapOrElse: (option, fn) => option.unwrapOrElse(fn),
333
+ match: (option, handlers) => option.match(handlers),
334
+ zip: (a, b) => a.zip(b),
335
+ okOr: (option, error) => option.some ? Ok(option.value) : Err(error),
336
+ flatten: (option) => option.flatten(),
337
+ transpose: (option) => {
338
+ if (option.isSome()) {
339
+ const val = option.unwrap();
340
+ if (val.isOk()) return Ok(Some(val.unwrap()));
341
+ else return Err(val.unwrapErr());
342
+ }
343
+ return Ok(None);
344
+ },
345
+ all: (options) => {
346
+ const values = [];
347
+ for (const option of options) {
348
+ if (option.isNone()) return None;
349
+ values.push(option.value);
350
+ }
351
+ return Some(values);
352
+ },
353
+ collect: (options) => Option.all(options)
354
+ };
355
+ const Result = {
356
+ ok: Ok,
357
+ err: Err,
358
+ isOk,
359
+ isErr,
360
+ map: (result, fn) => result.map(fn),
361
+ mapErr: (result, fn) => result.mapErr(fn),
362
+ andThen: (result, fn) => result.andThen(fn),
363
+ orElse: (result, fn) => result.orElse(fn),
364
+ unwrap: (result) => result.unwrap(),
365
+ unwrapOr: (result, defaultValue) => result.unwrapOr(defaultValue),
366
+ unwrapOrElse: (result, fn) => result.unwrapOrElse(fn),
367
+ unwrapErr: (result) => result.unwrapErr(),
368
+ expectErr: (result, message) => result.expectErr(message),
369
+ match: (result, handlers) => result.match(handlers),
370
+ toOption: (result) => result.toOption(),
371
+ fromThrowable: (fn) => {
372
+ try {
373
+ return Ok(fn());
374
+ } catch (e) {
375
+ return Err(e);
376
+ }
377
+ },
378
+ fromPromise: async (promise) => {
379
+ try {
380
+ return Ok(await promise);
381
+ } catch (e) {
382
+ return Err(e);
383
+ }
384
+ },
385
+ flatten: (result) => result.flatten(),
386
+ transpose: (result) => {
387
+ if (result.isOk()) {
388
+ const val = result.unwrap();
389
+ if (val.isSome()) return Some(Ok(val.unwrap()));
390
+ else return None;
391
+ }
392
+ return Some(Err(result.unwrapErr()));
393
+ },
394
+ all: (results) => {
395
+ const values = [];
396
+ for (const result of results) {
397
+ if (result.isErr()) return result;
398
+ values.push(result.value);
399
+ }
400
+ return Ok(values);
401
+ },
402
+ collect: (results) => Result.all(results)
403
+ };
404
+
405
+ //#endregion
406
+ //#region src/iter.ts
407
+ /**
408
+ * Lazy Iterator: Iter<T>
409
+ *
410
+ * Rust-like lazy iterator wrappers around JavaScript's native Iterator protocol.
411
+ * Enables composable, memory-efficient data processing pipelines.
412
+ */
413
+ const EMPTY_PEEK = Object.freeze({
414
+ has: false,
415
+ value: void 0
416
+ });
417
+ /**
418
+ * Core iterator implementation using idiomatic TypeScript.
419
+ * Uses generator functions internally for lazy evaluation.
420
+ */
421
+ var IterImpl = class IterImpl {
422
+ constructor(source) {
423
+ this.peeked = EMPTY_PEEK;
424
+ this.source = source;
425
+ }
426
+ map(fn) {
427
+ const source = this;
428
+ return new IterImpl((function* () {
429
+ for (const value of source) yield fn(value);
430
+ })());
431
+ }
432
+ filter(pred) {
433
+ const source = this;
434
+ return new IterImpl((function* () {
435
+ for (const value of source) if (pred(value)) yield value;
436
+ })());
437
+ }
438
+ flatMap(fn) {
439
+ const source = this;
440
+ return new IterImpl((function* () {
441
+ for (const value of source) for (const inner of fn(value)) yield inner;
442
+ })());
443
+ }
444
+ inspect(fn) {
445
+ const source = this;
446
+ return new IterImpl((function* () {
447
+ for (const value of source) {
448
+ fn(value);
449
+ yield value;
450
+ }
451
+ })());
452
+ }
453
+ peekable() {
454
+ return this;
455
+ }
456
+ find(pred) {
457
+ for (const value of this) if (pred(value)) return Some(value);
458
+ return None;
459
+ }
460
+ findMap(fn) {
461
+ for (const value of this) {
462
+ const result = fn(value);
463
+ if (result.isSome()) return result;
464
+ }
465
+ return None;
466
+ }
467
+ any(pred) {
468
+ for (const value of this) if (pred(value)) return true;
469
+ return false;
470
+ }
471
+ all(pred) {
472
+ for (const value of this) if (!pred(value)) return false;
473
+ return true;
474
+ }
475
+ position(pred) {
476
+ let index = 0;
477
+ for (const value of this) {
478
+ if (pred(value)) return Some(index);
479
+ index++;
480
+ }
481
+ return None;
482
+ }
483
+ fold(init, fn) {
484
+ let acc = init;
485
+ for (const value of this) acc = fn(acc, value);
486
+ return acc;
487
+ }
488
+ reduce(fn) {
489
+ const first = this.next();
490
+ if (first.done) return None;
491
+ let acc = first.value;
492
+ for (const value of this) acc = fn(acc, value);
493
+ return Some(acc);
494
+ }
495
+ tryFold(init, fn) {
496
+ let acc = init;
497
+ for (const value of this) {
498
+ const result = fn(acc, value);
499
+ if (result.isErr()) return result;
500
+ acc = result.value;
501
+ }
502
+ return Ok(acc);
503
+ }
504
+ count() {
505
+ let n = 0;
506
+ for (const _value of this) n++;
507
+ return n;
508
+ }
509
+ last() {
510
+ let last = None;
511
+ for (const value of this) last = Some(value);
512
+ return last;
513
+ }
514
+ nth(n) {
515
+ if (n < 0) return None;
516
+ let index = 0;
517
+ for (const value of this) {
518
+ if (index === n) return Some(value);
519
+ index++;
520
+ }
521
+ return None;
522
+ }
523
+ partition(pred) {
524
+ const matching = [];
525
+ const rest = [];
526
+ for (const value of this) if (pred(value)) matching.push(value);
527
+ else rest.push(value);
528
+ return [matching, rest];
529
+ }
530
+ tryMap(fn) {
531
+ return this.map(fn);
532
+ }
533
+ take(n) {
534
+ const source = this;
535
+ return new IterImpl((function* () {
536
+ let count = 0;
537
+ const iterator = source[Symbol.iterator]();
538
+ while (count < n) {
539
+ const result = iterator.next();
540
+ if (result.done) break;
541
+ yield result.value;
542
+ count++;
543
+ }
544
+ })());
545
+ }
546
+ skip(n) {
547
+ const source = this;
548
+ return new IterImpl((function* () {
549
+ let count = 0;
550
+ for (const value of source) {
551
+ if (count < n) {
552
+ count++;
553
+ continue;
554
+ }
555
+ yield value;
556
+ }
557
+ })());
558
+ }
559
+ stepBy(step) {
560
+ if (step <= 0) throw new Error("Iter.stepBy: step must be positive");
561
+ const source = this;
562
+ return new IterImpl((function* () {
563
+ let index = 0;
564
+ for (const value of source) {
565
+ if (index % step === 0) yield value;
566
+ index++;
567
+ }
568
+ })());
569
+ }
570
+ enumerate() {
571
+ const source = this;
572
+ return new IterImpl((function* () {
573
+ let index = 0;
574
+ for (const value of source) {
575
+ yield [index, value];
576
+ index++;
577
+ }
578
+ })());
579
+ }
580
+ zip(other) {
581
+ const source = this;
582
+ return new IterImpl((function* () {
583
+ const otherIter = other[Symbol.iterator]();
584
+ for (const value of source) {
585
+ const otherResult = otherIter.next();
586
+ if (otherResult.done) break;
587
+ yield [value, otherResult.value];
588
+ }
589
+ })());
590
+ }
591
+ chain(other) {
592
+ const source = this;
593
+ return new IterImpl((function* () {
594
+ for (const value of source) yield value;
595
+ for (const value of other) yield value;
596
+ })());
597
+ }
598
+ flatten() {
599
+ const source = this;
600
+ return new IterImpl((function* () {
601
+ for (const inner of source) for (const value of inner) yield value;
602
+ })());
603
+ }
604
+ peek() {
605
+ if (this.peeked.has) return Some(this.peeked.value);
606
+ const result = this.source.next();
607
+ if (result.done) return None;
608
+ this.peeked = {
609
+ has: true,
610
+ value: result.value
611
+ };
612
+ return Some(result.value);
613
+ }
614
+ collectResult() {
615
+ const out = [];
616
+ for (const item of this) {
617
+ if (item.isErr()) return Err(item.error);
618
+ out.push(item.value);
619
+ }
620
+ return Ok(out);
621
+ }
622
+ forEach(fn) {
623
+ for (const value of this) fn(value);
624
+ }
625
+ collect() {
626
+ const result = [];
627
+ for (const value of this) result.push(value);
628
+ return result;
629
+ }
630
+ [Symbol.iterator]() {
631
+ return this;
632
+ }
633
+ next() {
634
+ if (this.peeked.has) {
635
+ const value = this.peeked.value;
636
+ this.peeked = EMPTY_PEEK;
637
+ return {
638
+ done: false,
639
+ value
640
+ };
641
+ }
642
+ return this.source.next();
643
+ }
644
+ };
645
+ /**
646
+ * Create an Iter from an iterator or iterable source.
647
+ *
648
+ * @example
649
+ * const numbers = iter([1, 2, 3, 4, 5]);
650
+ * const doubled = numbers.map(x => x * 2).collect();
651
+ */
652
+ function iter(source) {
653
+ if (Symbol.iterator in source) return new IterImpl(source[Symbol.iterator]());
654
+ return new IterImpl(source);
655
+ }
656
+ /**
657
+ * Create an Iter from an array.
658
+ * Convenience function for the common case of iterating over arrays.
659
+ *
660
+ * @example
661
+ * const items = iterFromArray(['a', 'b', 'c']);
662
+ */
663
+ function iterFromArray(arr) {
664
+ return new IterImpl(arr[Symbol.iterator]());
665
+ }
666
+ /**
667
+ * Create an Iter from a generator function.
668
+ * Useful for creating custom lazy sequences.
669
+ *
670
+ * @example
671
+ * const naturals = iterFromGenerator(function* () {
672
+ * let n = 0;
673
+ * while (true) yield n++;
674
+ * });
675
+ * const firstTen = naturals.take(10).collect();
676
+ */
677
+ function iterFromGenerator(gen) {
678
+ return new IterImpl(gen());
679
+ }
680
+ const Iter = {
681
+ from: iter,
682
+ fromArray: iterFromArray,
683
+ fromGenerator: iterFromGenerator,
684
+ empty: () => new IterImpl((function* () {})()),
685
+ once: (value) => new IterImpl((function* () {
686
+ yield value;
687
+ })()),
688
+ repeat: (value, n) => new IterImpl((function* () {
689
+ for (let i = 0; i < n; i++) yield value;
690
+ })()),
691
+ range: (start, end, step = 1) => new IterImpl((function* () {
692
+ if (step === 0) throw new Error("Iter.range: step must be non-zero");
693
+ for (let i = start; step > 0 ? i < end : i > end; i += step) yield i;
694
+ })()),
695
+ sum: (iterator) => iterator.fold(0, (acc, x) => acc + x),
696
+ product: (iterator) => iterator.fold(1, (acc, x) => acc * x),
697
+ min: (iterator) => iterator.reduce((a, b) => a <= b ? a : b),
698
+ max: (iterator) => iterator.reduce((a, b) => a >= b ? a : b)
699
+ };
700
+
701
+ //#endregion
702
+ //#region src/async-iter.ts
703
+ /**
704
+ * Async Lazy Iterator: AsyncIter<T>
705
+ *
706
+ * Rust-like async lazy iterator wrapper around JavaScript's native AsyncIterator protocol.
707
+ * Enables composable, memory-efficient async data processing pipelines.
708
+ */
709
+ /**
710
+ * Core async iterator implementation using idiomatic TypeScript.
711
+ * Uses async generator functions internally for lazy evaluation.
712
+ */
713
+ var AsyncIterImpl = class AsyncIterImpl {
714
+ constructor(source) {
715
+ this.peeked = null;
716
+ this.source = source;
717
+ }
718
+ map(fn) {
719
+ const source = this;
720
+ return new AsyncIterImpl((async function* () {
721
+ for await (const value of source) yield await fn(value);
722
+ })());
723
+ }
724
+ filter(pred) {
725
+ const source = this;
726
+ return new AsyncIterImpl((async function* () {
727
+ for await (const value of source) if (await pred(value)) yield value;
728
+ })());
729
+ }
730
+ flatMap(fn) {
731
+ const source = this;
732
+ return new AsyncIterImpl((async function* () {
733
+ for await (const value of source) {
734
+ const inner = fn(value);
735
+ if (Symbol.asyncIterator in inner) for await (const item of inner) yield item;
736
+ else for (const item of inner) yield item;
737
+ }
738
+ })());
739
+ }
740
+ inspect(fn) {
741
+ const source = this;
742
+ return new AsyncIterImpl((async function* () {
743
+ for await (const value of source) {
744
+ await fn(value);
745
+ yield value;
746
+ }
747
+ })());
748
+ }
749
+ peekable() {
750
+ return this;
751
+ }
752
+ async find(pred) {
753
+ for await (const value of this) if (await pred(value)) return Some(value);
754
+ return None;
755
+ }
756
+ async findMap(fn) {
757
+ for await (const value of this) {
758
+ const result = await fn(value);
759
+ if (result.isSome()) return result;
760
+ }
761
+ return None;
762
+ }
763
+ async any(pred) {
764
+ for await (const value of this) if (await pred(value)) return true;
765
+ return false;
766
+ }
767
+ async all(pred) {
768
+ for await (const value of this) if (!await pred(value)) return false;
769
+ return true;
770
+ }
771
+ async position(pred) {
772
+ let index = 0;
773
+ for await (const value of this) {
774
+ if (await pred(value)) return Some(index);
775
+ index++;
776
+ }
777
+ return None;
778
+ }
779
+ async fold(init, fn) {
780
+ let acc = init;
781
+ for await (const value of this) acc = await fn(acc, value);
782
+ return acc;
783
+ }
784
+ async reduce(fn) {
785
+ const first = await this.next();
786
+ if (first.done) return None;
787
+ let acc = first.value;
788
+ for await (const value of this) acc = await fn(acc, value);
789
+ return Some(acc);
790
+ }
791
+ async tryFold(init, fn) {
792
+ let acc = init;
793
+ for await (const value of this) {
794
+ const result = await fn(acc, value);
795
+ if (result.isErr()) return result;
796
+ acc = result.value;
797
+ }
798
+ return Ok(acc);
799
+ }
800
+ async count() {
801
+ let n = 0;
802
+ for await (const _value of this) n++;
803
+ return n;
804
+ }
805
+ async last() {
806
+ let last = None;
807
+ for await (const value of this) last = Some(value);
808
+ return last;
809
+ }
810
+ async nth(n) {
811
+ if (n < 0) return None;
812
+ let index = 0;
813
+ for await (const value of this) {
814
+ if (index === n) return Some(value);
815
+ index++;
816
+ }
817
+ return None;
818
+ }
819
+ async partition(pred) {
820
+ const matching = [];
821
+ const rest = [];
822
+ for await (const value of this) if (await pred(value)) matching.push(value);
823
+ else rest.push(value);
824
+ return [matching, rest];
825
+ }
826
+ tryMap(fn) {
827
+ return this.map(fn);
828
+ }
829
+ take(n) {
830
+ const source = this;
831
+ return new AsyncIterImpl((async function* () {
832
+ let count = 0;
833
+ const iterator = source[Symbol.asyncIterator]();
834
+ while (count < n) {
835
+ const result = await iterator.next();
836
+ if (result.done) break;
837
+ yield result.value;
838
+ count++;
839
+ }
840
+ })());
841
+ }
842
+ skip(n) {
843
+ const source = this;
844
+ return new AsyncIterImpl((async function* () {
845
+ let count = 0;
846
+ for await (const value of source) {
847
+ if (count < n) {
848
+ count++;
849
+ continue;
850
+ }
851
+ yield value;
852
+ }
853
+ })());
854
+ }
855
+ stepBy(step) {
856
+ if (step <= 0) throw new Error("AsyncIter.stepBy: step must be positive");
857
+ const source = this;
858
+ return new AsyncIterImpl((async function* () {
859
+ let index = 0;
860
+ for await (const value of source) {
861
+ if (index % step === 0) yield value;
862
+ index++;
863
+ }
864
+ })());
865
+ }
866
+ enumerate() {
867
+ const source = this;
868
+ return new AsyncIterImpl((async function* () {
869
+ let index = 0;
870
+ for await (const value of source) {
871
+ yield [index, value];
872
+ index++;
873
+ }
874
+ })());
875
+ }
876
+ zip(other) {
877
+ const source = this;
878
+ return new AsyncIterImpl((async function* () {
879
+ const otherIter = other[Symbol.asyncIterator]();
880
+ for await (const value of source) {
881
+ const otherResult = await otherIter.next();
882
+ if (otherResult.done) break;
883
+ yield [value, otherResult.value];
884
+ }
885
+ })());
886
+ }
887
+ chain(other) {
888
+ const source = this;
889
+ return new AsyncIterImpl((async function* () {
890
+ for await (const value of source) yield value;
891
+ for await (const value of other) yield value;
892
+ })());
893
+ }
894
+ flatten() {
895
+ const source = this;
896
+ return new AsyncIterImpl((async function* () {
897
+ for await (const inner of source) if (Symbol.asyncIterator in inner) for await (const value of inner) yield value;
898
+ else for (const value of inner) yield value;
899
+ })());
900
+ }
901
+ async peek() {
902
+ this.peeked ??= this.source.next();
903
+ const result = await this.peeked;
904
+ if (result.done) return None;
905
+ return Some(result.value);
906
+ }
907
+ async collectResult() {
908
+ const out = [];
909
+ for await (const item of this) {
910
+ if (item.isErr()) return Err(item.error);
911
+ out.push(item.value);
912
+ }
913
+ return Ok(out);
914
+ }
915
+ async forEach(fn) {
916
+ for await (const value of this) await fn(value);
917
+ }
918
+ async collect() {
919
+ const result = [];
920
+ for await (const value of this) result.push(value);
921
+ return result;
922
+ }
923
+ [Symbol.asyncIterator]() {
924
+ return this;
925
+ }
926
+ next() {
927
+ if (this.peeked) {
928
+ const promise = this.peeked;
929
+ this.peeked = null;
930
+ return promise;
931
+ }
932
+ return this.source.next();
933
+ }
934
+ };
935
+ /**
936
+ * Create an AsyncIter from an async iterator or async iterable source.
937
+ *
938
+ * @example
939
+ * const items = asyncIter(fetchPages());
940
+ * const processed = await items.map(processPage).collect();
941
+ */
942
+ function asyncIter(source) {
943
+ if (Symbol.asyncIterator in source) return new AsyncIterImpl(source[Symbol.asyncIterator]());
944
+ return new AsyncIterImpl(source);
945
+ }
946
+ /**
947
+ * Create an AsyncIter from a sync iterable.
948
+ * Useful for lifting sync data into async pipelines.
949
+ *
950
+ * @example
951
+ * const items = asyncIterFromIterable([1, 2, 3]);
952
+ */
953
+ function asyncIterFromIterable(source) {
954
+ return new AsyncIterImpl((async function* () {
955
+ for (const value of source) yield value;
956
+ })());
957
+ }
958
+ /**
959
+ * Create an AsyncIter from an array.
960
+ * Convenience function for the common case.
961
+ *
962
+ * @example
963
+ * const items = asyncIterFromArray(['a', 'b', 'c']);
964
+ */
965
+ function asyncIterFromArray(arr) {
966
+ return asyncIterFromIterable(arr);
967
+ }
968
+ /**
969
+ * Create an AsyncIter from an async generator function.
970
+ * Useful for creating custom lazy async sequences.
971
+ *
972
+ * @example
973
+ * const pages = asyncIterFromGenerator(async function* () {
974
+ * let page = 1;
975
+ * while (true) {
976
+ * const data = await fetchPage(page++);
977
+ * if (data.length === 0) break;
978
+ * yield data;
979
+ * }
980
+ * });
981
+ */
982
+ function asyncIterFromGenerator(gen) {
983
+ return new AsyncIterImpl(gen());
984
+ }
985
+ const AsyncIter = {
986
+ from: asyncIter,
987
+ fromIterable: asyncIterFromIterable,
988
+ fromArray: asyncIterFromArray,
989
+ fromGenerator: asyncIterFromGenerator,
990
+ empty: () => new AsyncIterImpl((async function* () {})()),
991
+ once: (value) => new AsyncIterImpl((async function* () {
992
+ yield value;
993
+ })()),
994
+ repeat: (value, n) => new AsyncIterImpl((async function* () {
995
+ for (let i = 0; i < n; i++) yield value;
996
+ })()),
997
+ range: (start, end, step = 1) => new AsyncIterImpl((async function* () {
998
+ if (step === 0) throw new Error("AsyncIter.range: step must be non-zero");
999
+ for (let i = start; step > 0 ? i < end : i > end; i += step) yield i;
1000
+ })()),
1001
+ sum: (iterator) => iterator.fold(0, (acc, x) => acc + x),
1002
+ product: (iterator) => iterator.fold(1, (acc, x) => acc * x),
1003
+ min: (iterator) => iterator.reduce((a, b) => a <= b ? a : b),
1004
+ max: (iterator) => iterator.reduce((a, b) => a >= b ? a : b)
1005
+ };
1006
+
1007
+ //#endregion
1008
+ export { isNone as _, asyncIterFromIterable as a, toPanicString as b, iterFromArray as c, None as d, Ok as f, isErr as g, Some as h, asyncIterFromGenerator as i, iterFromGenerator as l, Result as m, asyncIter as n, Iter as o, Option as p, asyncIterFromArray as r, iter as s, AsyncIter as t, Err as u, isOk as v, isSome as y };
1009
+ //# sourceMappingURL=async-iter-aLdg-qp2.mjs.map