effect 2.4.16 → 2.4.18

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.
Files changed (76) hide show
  1. package/Iterable/package.json +6 -0
  2. package/dist/cjs/Effect.js +11 -4
  3. package/dist/cjs/Effect.js.map +1 -1
  4. package/dist/cjs/Inspectable.js +23 -1
  5. package/dist/cjs/Inspectable.js.map +1 -1
  6. package/dist/cjs/Iterable.js +938 -0
  7. package/dist/cjs/Iterable.js.map +1 -0
  8. package/dist/cjs/Logger.js +11 -1
  9. package/dist/cjs/Logger.js.map +1 -1
  10. package/dist/cjs/ReadonlyArray.js +2 -17
  11. package/dist/cjs/ReadonlyArray.js.map +1 -1
  12. package/dist/cjs/index.js +4 -2
  13. package/dist/cjs/index.js.map +1 -1
  14. package/dist/cjs/internal/core-effect.js.map +1 -1
  15. package/dist/cjs/internal/effect/circular.js.map +1 -1
  16. package/dist/cjs/internal/fiberRuntime.js +19 -25
  17. package/dist/cjs/internal/fiberRuntime.js.map +1 -1
  18. package/dist/cjs/internal/logger.js +8 -22
  19. package/dist/cjs/internal/logger.js.map +1 -1
  20. package/dist/cjs/internal/runtime.js +42 -50
  21. package/dist/cjs/internal/runtime.js.map +1 -1
  22. package/dist/cjs/internal/schedule.js.map +1 -1
  23. package/dist/cjs/internal/version.js +1 -1
  24. package/dist/dts/Config.d.ts +2 -2
  25. package/dist/dts/Config.d.ts.map +1 -1
  26. package/dist/dts/Effect.d.ts +30 -20
  27. package/dist/dts/Effect.d.ts.map +1 -1
  28. package/dist/dts/Inspectable.d.ts +8 -0
  29. package/dist/dts/Inspectable.d.ts.map +1 -1
  30. package/dist/dts/Iterable.d.ts +495 -0
  31. package/dist/dts/Iterable.d.ts.map +1 -0
  32. package/dist/dts/Logger.d.ts +10 -0
  33. package/dist/dts/Logger.d.ts.map +1 -1
  34. package/dist/dts/ReadonlyArray.d.ts.map +1 -1
  35. package/dist/dts/index.d.ts +6 -0
  36. package/dist/dts/index.d.ts.map +1 -1
  37. package/dist/dts/internal/logger.d.ts +0 -1
  38. package/dist/dts/internal/logger.d.ts.map +1 -1
  39. package/dist/esm/Effect.js +7 -0
  40. package/dist/esm/Effect.js.map +1 -1
  41. package/dist/esm/Inspectable.js +20 -0
  42. package/dist/esm/Inspectable.js.map +1 -1
  43. package/dist/esm/Iterable.js +893 -0
  44. package/dist/esm/Iterable.js.map +1 -0
  45. package/dist/esm/Logger.js +10 -0
  46. package/dist/esm/Logger.js.map +1 -1
  47. package/dist/esm/ReadonlyArray.js +2 -17
  48. package/dist/esm/ReadonlyArray.js.map +1 -1
  49. package/dist/esm/index.js +6 -0
  50. package/dist/esm/index.js.map +1 -1
  51. package/dist/esm/internal/core-effect.js.map +1 -1
  52. package/dist/esm/internal/effect/circular.js.map +1 -1
  53. package/dist/esm/internal/fiberRuntime.js +16 -23
  54. package/dist/esm/internal/fiberRuntime.js.map +1 -1
  55. package/dist/esm/internal/logger.js +6 -19
  56. package/dist/esm/internal/logger.js.map +1 -1
  57. package/dist/esm/internal/runtime.js +42 -50
  58. package/dist/esm/internal/runtime.js.map +1 -1
  59. package/dist/esm/internal/schedule.js.map +1 -1
  60. package/dist/esm/internal/version.js +1 -1
  61. package/package.json +9 -1
  62. package/src/Config.ts +2 -2
  63. package/src/Effect.ts +64 -47
  64. package/src/Inspectable.ts +30 -0
  65. package/src/Iterable.ts +1009 -0
  66. package/src/Logger.ts +12 -0
  67. package/src/ReadonlyArray.ts +2 -20
  68. package/src/index.ts +7 -0
  69. package/src/internal/config.ts +2 -2
  70. package/src/internal/core-effect.ts +11 -9
  71. package/src/internal/effect/circular.ts +19 -7
  72. package/src/internal/fiberRuntime.ts +63 -54
  73. package/src/internal/logger.ts +6 -28
  74. package/src/internal/runtime.ts +45 -52
  75. package/src/internal/schedule.ts +3 -3
  76. package/src/internal/version.ts +1 -1
@@ -0,0 +1,893 @@
1
+ /**
2
+ * This module provides utility functions for working with Iterables in TypeScript.
3
+ *
4
+ * @since 2.0.0
5
+ */
6
+ import * as E from "./Either.js";
7
+ import * as Equal from "./Equal.js";
8
+ import { dual, identity } from "./Function.js";
9
+ import * as O from "./Option.js";
10
+ import { isBoolean } from "./Predicate.js";
11
+ import * as Tuple from "./Tuple.js";
12
+ /**
13
+ * Return a `Iterable` with element `i` initialized with `f(i)`.
14
+ *
15
+ * If the `length` is not specified, the `Iterable` will be infinite.
16
+ *
17
+ * **Note**. `length` is normalized to an integer >= 1.
18
+ *
19
+ * @example
20
+ * import { makeBy } from 'effect/Iterable'
21
+ *
22
+ * assert.deepStrictEqual(Array.from(makeBy(n => n * 2, { length: 5 })), [0, 2, 4, 6, 8])
23
+ *
24
+ * @category constructors
25
+ * @since 2.0.0
26
+ */
27
+ export const makeBy = (f, options) => {
28
+ const max = options?.length !== undefined ? Math.max(1, Math.floor(options.length)) : Infinity;
29
+ return {
30
+ [Symbol.iterator]() {
31
+ let i = 0;
32
+ return {
33
+ next() {
34
+ if (i < max) {
35
+ return {
36
+ value: f(i++),
37
+ done: false
38
+ };
39
+ }
40
+ return {
41
+ done: true,
42
+ value: undefined
43
+ };
44
+ }
45
+ };
46
+ }
47
+ };
48
+ };
49
+ /**
50
+ * Return a `Iterable` containing a range of integers, including both endpoints.
51
+ *
52
+ * If `end` is omitted, the range will not have an upper bound.
53
+ *
54
+ * @example
55
+ * import { range } from 'effect/Iterable'
56
+ *
57
+ * assert.deepStrictEqual(Array.from(range(1, 3)), [1, 2, 3])
58
+ *
59
+ * @category constructors
60
+ * @since 2.0.0
61
+ */
62
+ export const range = (start, end) => {
63
+ if (end === undefined) {
64
+ return makeBy(i => start + i);
65
+ }
66
+ return makeBy(i => start + i, {
67
+ length: start <= end ? end - start + 1 : 1
68
+ });
69
+ };
70
+ /**
71
+ * Return a `Iterable` containing a value repeated the specified number of times.
72
+ *
73
+ * **Note**. `n` is normalized to an integer >= 1.
74
+ *
75
+ * @example
76
+ * import { replicate } from 'effect/Iterable'
77
+ *
78
+ * assert.deepStrictEqual(Array.from(replicate("a", 3)), ["a", "a", "a"])
79
+ *
80
+ * @category constructors
81
+ * @since 2.0.0
82
+ */
83
+ export const replicate = /*#__PURE__*/dual(2, (a, n) => makeBy(() => a, {
84
+ length: n
85
+ }));
86
+ /**
87
+ * Takes a record and returns an Iterable of tuples containing its keys and values.
88
+ *
89
+ * @param self - The record to transform.
90
+ *
91
+ * @example
92
+ * import { fromRecord } from "effect/Iterable"
93
+ *
94
+ * const x = { a: 1, b: 2, c: 3 }
95
+ * assert.deepStrictEqual(Array.from(fromRecord(x)), [["a", 1], ["b", 2], ["c", 3]])
96
+ *
97
+ * @category conversions
98
+ * @since 2.0.0
99
+ */
100
+ export const fromRecord = self => ({
101
+ *[Symbol.iterator]() {
102
+ for (const key in self) {
103
+ if (Object.prototype.hasOwnProperty.call(self, key)) {
104
+ yield [key, self[key]];
105
+ }
106
+ }
107
+ }
108
+ });
109
+ /**
110
+ * Prepend an element to the front of an `Iterable`, creating a new `Iterable`.
111
+ *
112
+ * @category concatenating
113
+ * @since 2.0.0
114
+ */
115
+ export const prepend = /*#__PURE__*/dual(2, (self, head) => flatten([[head], self]));
116
+ /**
117
+ * Prepends the specified prefix iterable to the beginning of the specified iterable.
118
+ *
119
+ * @example
120
+ * import * as Iterable from "effect/Iterable"
121
+ *
122
+ * assert.deepStrictEqual(
123
+ * Array.from(Iterable.prependAll([1, 2], ["a", "b"])),
124
+ * ["a", "b", 1, 2]
125
+ * )
126
+ *
127
+ * @category concatenating
128
+ * @since 2.0.0
129
+ */
130
+ export const prependAll = /*#__PURE__*/dual(2, (self, that) => flatten([that, self]));
131
+ /**
132
+ * Append an element to the end of an `Iterable`, creating a new `Iterable`.
133
+ *
134
+ * @category concatenating
135
+ * @since 2.0.0
136
+ */
137
+ export const append = /*#__PURE__*/dual(2, (self, last) => flatten([self, [last]]));
138
+ /**
139
+ * Concatenates two iterables, combining their elements.
140
+ *
141
+ * @category concatenating
142
+ * @since 2.0.0
143
+ */
144
+ export const appendAll = /*#__PURE__*/dual(2, (self, that) => flatten([self, that]));
145
+ /**
146
+ * Reduce an `Iterable` from the left, keeping all intermediate results instead of only the final result.
147
+ *
148
+ * @category folding
149
+ * @since 2.0.0
150
+ */
151
+ export const scan = /*#__PURE__*/dual(3, (self, b, f) => ({
152
+ [Symbol.iterator]() {
153
+ let acc = b;
154
+ let iterator;
155
+ function next() {
156
+ if (iterator === undefined) {
157
+ iterator = self[Symbol.iterator]();
158
+ return {
159
+ done: false,
160
+ value: acc
161
+ };
162
+ }
163
+ const result = iterator.next();
164
+ if (result.done) {
165
+ return result;
166
+ }
167
+ acc = f(acc, result.value);
168
+ return {
169
+ done: false,
170
+ value: acc
171
+ };
172
+ }
173
+ return {
174
+ next
175
+ };
176
+ }
177
+ }));
178
+ /**
179
+ * Determine if an `Iterable` is empty
180
+ *
181
+ * @example
182
+ * import { isEmpty } from "effect/Iterable"
183
+ *
184
+ * assert.deepStrictEqual(isEmpty([]), true);
185
+ * assert.deepStrictEqual(isEmpty([1, 2, 3]), false);
186
+ *
187
+ * @category guards
188
+ * @since 2.0.0
189
+ */
190
+ export const isEmpty = self => {
191
+ const iterator = self[Symbol.iterator]();
192
+ return iterator.next().done === true;
193
+ };
194
+ /**
195
+ * Return the number of elements in a `Iterable`.
196
+ *
197
+ * @category getters
198
+ * @since 2.0.0
199
+ */
200
+ export const size = self => {
201
+ const iterator = self[Symbol.iterator]();
202
+ let count = 0;
203
+ while (!iterator.next().done) {
204
+ count++;
205
+ }
206
+ return count;
207
+ };
208
+ /**
209
+ * Get the first element of a `Iterable`, or `None` if the `Iterable` is empty.
210
+ *
211
+ * @category getters
212
+ * @since 2.0.0
213
+ */
214
+ export const head = self => {
215
+ const iterator = self[Symbol.iterator]();
216
+ const result = iterator.next();
217
+ return result.done ? O.none() : O.some(result.value);
218
+ };
219
+ /**
220
+ * Keep only a max number of elements from the start of an `Iterable`, creating a new `Iterable`.
221
+ *
222
+ * **Note**. `n` is normalized to a non negative integer.
223
+ *
224
+ * @category getters
225
+ * @since 2.0.0
226
+ */
227
+ export const take = /*#__PURE__*/dual(2, (self, n) => ({
228
+ [Symbol.iterator]() {
229
+ let i = 0;
230
+ const iterator = self[Symbol.iterator]();
231
+ return {
232
+ next() {
233
+ if (i < n) {
234
+ i++;
235
+ return iterator.next();
236
+ }
237
+ return {
238
+ done: true,
239
+ value: undefined
240
+ };
241
+ }
242
+ };
243
+ }
244
+ }));
245
+ /**
246
+ * Calculate the longest initial Iterable for which all element satisfy the specified predicate, creating a new `Iterable`.
247
+ *
248
+ * @category getters
249
+ * @since 2.0.0
250
+ */
251
+ export const takeWhile = /*#__PURE__*/dual(2, (self, predicate) => ({
252
+ [Symbol.iterator]() {
253
+ const iterator = self[Symbol.iterator]();
254
+ let i = 0;
255
+ return {
256
+ next() {
257
+ const result = iterator.next();
258
+ if (result.done || !predicate(result.value, i++)) {
259
+ return {
260
+ done: true,
261
+ value: undefined
262
+ };
263
+ }
264
+ return result;
265
+ }
266
+ };
267
+ }
268
+ }));
269
+ /**
270
+ * Drop a max number of elements from the start of an `Iterable`
271
+ *
272
+ * **Note**. `n` is normalized to a non negative integer.
273
+ *
274
+ * @category getters
275
+ * @since 2.0.0
276
+ */
277
+ export const drop = /*#__PURE__*/dual(2, (self, n) => ({
278
+ [Symbol.iterator]() {
279
+ const iterator = self[Symbol.iterator]();
280
+ let i = 0;
281
+ return {
282
+ next() {
283
+ while (i < n) {
284
+ const result = iterator.next();
285
+ if (result.done) {
286
+ return {
287
+ done: true,
288
+ value: undefined
289
+ };
290
+ }
291
+ i++;
292
+ }
293
+ return iterator.next();
294
+ }
295
+ };
296
+ }
297
+ }));
298
+ /**
299
+ * Returns the first element that satisfies the specified
300
+ * predicate, or `None` if no such element exists.
301
+ *
302
+ * @category elements
303
+ * @since 2.0.0
304
+ */
305
+ export const findFirst = /*#__PURE__*/dual(2, (self, f) => {
306
+ let i = 0;
307
+ for (const a of self) {
308
+ const o = f(a, i);
309
+ if (isBoolean(o)) {
310
+ if (o) {
311
+ return O.some(a);
312
+ }
313
+ } else {
314
+ if (O.isSome(o)) {
315
+ return o;
316
+ }
317
+ }
318
+ i++;
319
+ }
320
+ return O.none();
321
+ });
322
+ /**
323
+ * Find the last element for which a predicate holds.
324
+ *
325
+ * @category elements
326
+ * @since 2.0.0
327
+ */
328
+ export const findLast = /*#__PURE__*/dual(2, (self, f) => {
329
+ let i = 0;
330
+ let last = O.none();
331
+ for (const a of self) {
332
+ const o = f(a, i);
333
+ if (isBoolean(o)) {
334
+ if (o) {
335
+ last = O.some(a);
336
+ }
337
+ } else {
338
+ if (O.isSome(o)) {
339
+ last = o;
340
+ }
341
+ }
342
+ i++;
343
+ }
344
+ return last;
345
+ });
346
+ /**
347
+ * Takes two `Iterable`s and returns an `Iterable` of corresponding pairs.
348
+ *
349
+ * @category zipping
350
+ * @since 2.0.0
351
+ */
352
+ export const zip = /*#__PURE__*/dual(2, (self, that) => zipWith(self, that, Tuple.make));
353
+ /**
354
+ * Apply a function to pairs of elements at the same index in two `Iterable`s, collecting the results. If one
355
+ * input `Iterable` is short, excess elements of the longer `Iterable` are discarded.
356
+ *
357
+ * @category zipping
358
+ * @since 2.0.0
359
+ */
360
+ export const zipWith = /*#__PURE__*/dual(3, (self, that, f) => ({
361
+ [Symbol.iterator]() {
362
+ const selfIterator = self[Symbol.iterator]();
363
+ const thatIterator = that[Symbol.iterator]();
364
+ return {
365
+ next() {
366
+ const selfResult = selfIterator.next();
367
+ const thatResult = thatIterator.next();
368
+ if (selfResult.done || thatResult.done) {
369
+ return {
370
+ done: true,
371
+ value: undefined
372
+ };
373
+ }
374
+ return {
375
+ done: false,
376
+ value: f(selfResult.value, thatResult.value)
377
+ };
378
+ }
379
+ };
380
+ }
381
+ }));
382
+ /**
383
+ * Places an element in between members of an `Iterable`.
384
+ * If the input is a non-empty array, the result is also a non-empty array.
385
+ *
386
+ * @since 2.0.0
387
+ */
388
+ export const intersperse = /*#__PURE__*/dual(2, (self, middle) => ({
389
+ [Symbol.iterator]() {
390
+ const iterator = self[Symbol.iterator]();
391
+ let next = iterator.next();
392
+ let emitted = false;
393
+ return {
394
+ next() {
395
+ if (next.done) {
396
+ return next;
397
+ } else if (emitted) {
398
+ emitted = false;
399
+ return {
400
+ done: false,
401
+ value: middle
402
+ };
403
+ }
404
+ emitted = true;
405
+ const result = next;
406
+ next = iterator.next();
407
+ return result;
408
+ }
409
+ };
410
+ }
411
+ }));
412
+ /**
413
+ * Returns a function that checks if an `Iterable` contains a given value using a provided `isEquivalent` function.
414
+ *
415
+ * @category elements
416
+ * @since 2.0.0
417
+ */
418
+ export const containsWith = isEquivalent => dual(2, (self, a) => {
419
+ for (const i of self) {
420
+ if (isEquivalent(a, i)) {
421
+ return true;
422
+ }
423
+ }
424
+ return false;
425
+ });
426
+ const _equivalence = /*#__PURE__*/Equal.equivalence();
427
+ /**
428
+ * Returns a function that checks if a `Iterable` contains a given value using the default `Equivalence`.
429
+ *
430
+ * @category elements
431
+ * @since 2.0.0
432
+ */
433
+ export const contains = /*#__PURE__*/containsWith(_equivalence);
434
+ /**
435
+ * Splits an `Iterable` into length-`n` pieces. The last piece will be shorter if `n` does not evenly divide the length of
436
+ * the `Iterable`.
437
+ *
438
+ * @category splitting
439
+ * @since 2.0.0
440
+ */
441
+ export const chunksOf = /*#__PURE__*/dual(2, (self, n) => {
442
+ const safeN = Math.max(1, Math.floor(n));
443
+ return {
444
+ [Symbol.iterator]() {
445
+ let iterator = self[Symbol.iterator]();
446
+ return {
447
+ next() {
448
+ if (iterator === undefined) {
449
+ return {
450
+ done: true,
451
+ value: undefined
452
+ };
453
+ }
454
+ const chunk = [];
455
+ for (let i = 0; i < safeN; i++) {
456
+ const result = iterator.next();
457
+ if (result.done) {
458
+ iterator = undefined;
459
+ return chunk.length === 0 ? {
460
+ done: true,
461
+ value: undefined
462
+ } : {
463
+ done: false,
464
+ value: chunk
465
+ };
466
+ }
467
+ chunk.push(result.value);
468
+ }
469
+ return {
470
+ done: false,
471
+ value: chunk
472
+ };
473
+ }
474
+ };
475
+ }
476
+ };
477
+ });
478
+ /**
479
+ * Group equal, consecutive elements of an `Iterable` into `NonEmptyArray`s using the provided `isEquivalent` function.
480
+ *
481
+ * @category grouping
482
+ * @since 2.0.0
483
+ */
484
+ export const groupWith = /*#__PURE__*/dual(2, (self, isEquivalent) => ({
485
+ [Symbol.iterator]() {
486
+ const iterator = self[Symbol.iterator]();
487
+ let nextResult;
488
+ return {
489
+ next() {
490
+ let result;
491
+ if (nextResult !== undefined) {
492
+ if (nextResult.done) {
493
+ return {
494
+ done: true,
495
+ value: undefined
496
+ };
497
+ }
498
+ result = nextResult;
499
+ nextResult = undefined;
500
+ } else {
501
+ result = iterator.next();
502
+ if (result.done) {
503
+ return {
504
+ done: true,
505
+ value: undefined
506
+ };
507
+ }
508
+ }
509
+ const chunk = [result.value];
510
+ // eslint-disable-next-line no-constant-condition
511
+ while (true) {
512
+ const next = iterator.next();
513
+ if (next.done || !isEquivalent(result.value, next.value)) {
514
+ nextResult = next;
515
+ return {
516
+ done: false,
517
+ value: chunk
518
+ };
519
+ }
520
+ chunk.push(next.value);
521
+ }
522
+ }
523
+ };
524
+ }
525
+ }));
526
+ /**
527
+ * Group equal, consecutive elements of an `Iterable` into `NonEmptyArray`s.
528
+ *
529
+ * @category grouping
530
+ * @since 2.0.0
531
+ */
532
+ export const group = /*#__PURE__*/groupWith( /*#__PURE__*/Equal.equivalence());
533
+ /**
534
+ * Splits an `Iterable` into sub-non-empty-arrays stored in an object, based on the result of calling a `string`-returning
535
+ * function on each element, and grouping the results according to values returned
536
+ *
537
+ * @category grouping
538
+ * @since 2.0.0
539
+ */
540
+ export const groupBy = /*#__PURE__*/dual(2, (self, f) => {
541
+ const out = {};
542
+ for (const a of self) {
543
+ const k = f(a);
544
+ if (Object.prototype.hasOwnProperty.call(out, k)) {
545
+ out[k].push(a);
546
+ } else {
547
+ out[k] = [a];
548
+ }
549
+ }
550
+ return out;
551
+ });
552
+ const constEmpty = {
553
+ [Symbol.iterator]() {
554
+ return constEmptyIterator;
555
+ }
556
+ };
557
+ const constEmptyIterator = {
558
+ next() {
559
+ return {
560
+ done: true,
561
+ value: undefined
562
+ };
563
+ }
564
+ };
565
+ /**
566
+ * @category constructors
567
+ * @since 2.0.0
568
+ */
569
+ export const empty = () => constEmpty;
570
+ /**
571
+ * Constructs a new `Iterable<A>` from the specified value.
572
+ *
573
+ * @category constructors
574
+ * @since 2.0.0
575
+ */
576
+ export const of = a => [a];
577
+ /**
578
+ * @category mapping
579
+ * @since 2.0.0
580
+ */
581
+ export const map = /*#__PURE__*/dual(2, (self, f) => ({
582
+ [Symbol.iterator]() {
583
+ const iterator = self[Symbol.iterator]();
584
+ let i = 0;
585
+ return {
586
+ next() {
587
+ const result = iterator.next();
588
+ if (result.done) {
589
+ return {
590
+ done: true,
591
+ value: undefined
592
+ };
593
+ }
594
+ return {
595
+ done: false,
596
+ value: f(result.value, i++)
597
+ };
598
+ }
599
+ };
600
+ }
601
+ }));
602
+ /**
603
+ * Applies a function to each element in an Iterable and returns a new Iterable containing the concatenated mapped elements.
604
+ *
605
+ * @category sequencing
606
+ * @since 2.0.0
607
+ */
608
+ export const flatMap = /*#__PURE__*/dual(2, (self, f) => flatten(map(self, f)));
609
+ /**
610
+ * Flattens an Iterable of Iterables into a single Iterable
611
+ *
612
+ * @category sequencing
613
+ * @since 2.0.0
614
+ */
615
+ export const flatten = self => ({
616
+ [Symbol.iterator]() {
617
+ const outerIterator = self[Symbol.iterator]();
618
+ let innerIterator;
619
+ function next() {
620
+ if (innerIterator === undefined) {
621
+ const next = outerIterator.next();
622
+ if (next.done) {
623
+ return next;
624
+ }
625
+ innerIterator = next.value[Symbol.iterator]();
626
+ }
627
+ const result = innerIterator.next();
628
+ if (result.done) {
629
+ innerIterator = undefined;
630
+ return next();
631
+ }
632
+ return result;
633
+ }
634
+ return {
635
+ next
636
+ };
637
+ }
638
+ });
639
+ /**
640
+ * @category filtering
641
+ * @since 2.0.0
642
+ */
643
+ export const filterMap = /*#__PURE__*/dual(2, (self, f) => ({
644
+ [Symbol.iterator]() {
645
+ const iterator = self[Symbol.iterator]();
646
+ let i = 0;
647
+ return {
648
+ next() {
649
+ let result = iterator.next();
650
+ while (!result.done) {
651
+ const b = f(result.value, i++);
652
+ if (O.isSome(b)) {
653
+ return {
654
+ done: false,
655
+ value: b.value
656
+ };
657
+ }
658
+ result = iterator.next();
659
+ }
660
+ return {
661
+ done: true,
662
+ value: undefined
663
+ };
664
+ }
665
+ };
666
+ }
667
+ }));
668
+ /**
669
+ * Transforms all elements of the `Iterable` for as long as the specified function returns some value
670
+ *
671
+ * @category filtering
672
+ * @since 2.0.0
673
+ */
674
+ export const filterMapWhile = /*#__PURE__*/dual(2, (self, f) => ({
675
+ [Symbol.iterator]() {
676
+ const iterator = self[Symbol.iterator]();
677
+ let i = 0;
678
+ return {
679
+ next() {
680
+ const result = iterator.next();
681
+ if (result.done) {
682
+ return {
683
+ done: true,
684
+ value: undefined
685
+ };
686
+ }
687
+ const b = f(result.value, i++);
688
+ if (O.isSome(b)) {
689
+ return {
690
+ done: false,
691
+ value: b.value
692
+ };
693
+ }
694
+ return {
695
+ done: true,
696
+ value: undefined
697
+ };
698
+ }
699
+ };
700
+ }
701
+ }));
702
+ /**
703
+ * Retrieves the `Some` values from an `Iterable` of `Option`s.
704
+ *
705
+ * @example
706
+ * import { getSomes } from "effect/Iterable"
707
+ * import { some, none } from "effect/Option"
708
+ *
709
+ * assert.deepStrictEqual(
710
+ * Array.from(getSomes([some(1), none(), some(2)])),
711
+ * [1, 2]
712
+ * )
713
+ *
714
+ * @category filtering
715
+ * @since 2.0.0
716
+ */
717
+ export const getSomes = /*#__PURE__*/filterMap(identity);
718
+ /**
719
+ * Retrieves the `Left` values from an `Iterable` of `Either`s.
720
+ *
721
+ * @example
722
+ * import { getLefts } from "effect/Iterable"
723
+ * import { right, left } from "effect/Either"
724
+ *
725
+ * assert.deepStrictEqual(
726
+ * Array.from(getLefts([right(1), left("err"), right(2)])),
727
+ * ["err"]
728
+ * )
729
+ *
730
+ * @category filtering
731
+ * @since 2.0.0
732
+ */
733
+ export const getLefts = self => filterMap(self, E.getLeft);
734
+ /**
735
+ * Retrieves the `Right` values from an `Iterable` of `Either`s.
736
+ *
737
+ * @example
738
+ * import { getRights } from "effect/Iterable"
739
+ * import { right, left } from "effect/Either"
740
+ *
741
+ * assert.deepStrictEqual(
742
+ * Array.from(getRights([right(1), left("err"), right(2)])),
743
+ * [1, 2]
744
+ * )
745
+ *
746
+ * @category filtering
747
+ * @since 2.0.0
748
+ */
749
+ export const getRights = self => filterMap(self, E.getRight);
750
+ /**
751
+ * @category filtering
752
+ * @since 2.0.0
753
+ */
754
+ export const filter = /*#__PURE__*/dual(2, (self, predicate) => ({
755
+ [Symbol.iterator]() {
756
+ const iterator = self[Symbol.iterator]();
757
+ let i = 0;
758
+ return {
759
+ next() {
760
+ let result = iterator.next();
761
+ while (!result.done) {
762
+ if (predicate(result.value, i++)) {
763
+ return {
764
+ done: false,
765
+ value: result.value
766
+ };
767
+ }
768
+ result = iterator.next();
769
+ }
770
+ return {
771
+ done: true,
772
+ value: undefined
773
+ };
774
+ }
775
+ };
776
+ }
777
+ }));
778
+ /**
779
+ * @category sequencing
780
+ * @since 2.0.0
781
+ */
782
+ export const flatMapNullable = /*#__PURE__*/dual(2, (self, f) => filterMap(self, a => {
783
+ const b = f(a);
784
+ return b == null ? O.none() : O.some(b);
785
+ }));
786
+ /**
787
+ * Check if a predicate holds true for some `Iterable` element.
788
+ *
789
+ * @category elements
790
+ * @since 2.0.0
791
+ */
792
+ export const some = /*#__PURE__*/dual(2, (self, predicate) => {
793
+ let i = 0;
794
+ for (const a of self) {
795
+ if (predicate(a, i++)) {
796
+ return true;
797
+ }
798
+ }
799
+ return false;
800
+ });
801
+ /**
802
+ * @category constructors
803
+ * @since 2.0.0
804
+ */
805
+ export const unfold = (b, f) => ({
806
+ [Symbol.iterator]() {
807
+ let next = b;
808
+ return {
809
+ next() {
810
+ const o = f(next);
811
+ if (O.isNone(o)) {
812
+ return {
813
+ done: true,
814
+ value: undefined
815
+ };
816
+ }
817
+ const [a, b] = o.value;
818
+ next = b;
819
+ return {
820
+ done: false,
821
+ value: a
822
+ };
823
+ }
824
+ };
825
+ }
826
+ });
827
+ /**
828
+ * Iterate over the `Iterable` applying `f`.
829
+ *
830
+ * @since 2.0.0
831
+ */
832
+ export const forEach = /*#__PURE__*/dual(2, (self, f) => {
833
+ let i = 0;
834
+ for (const a of self) {
835
+ f(a, i++);
836
+ }
837
+ });
838
+ /**
839
+ * Deduplicates adjacent elements that are identical using the provided `isEquivalent` function.
840
+ *
841
+ * @since 2.0.0
842
+ */
843
+ export const dedupeAdjacentWith = /*#__PURE__*/dual(2, (self, isEquivalent) => ({
844
+ [Symbol.iterator]() {
845
+ const iterator = self[Symbol.iterator]();
846
+ let first = true;
847
+ let last;
848
+ function next() {
849
+ const result = iterator.next();
850
+ if (result.done) {
851
+ return {
852
+ done: true,
853
+ value: undefined
854
+ };
855
+ }
856
+ if (first) {
857
+ first = false;
858
+ last = result.value;
859
+ return result;
860
+ }
861
+ const current = result.value;
862
+ if (isEquivalent(last, current)) {
863
+ return next();
864
+ }
865
+ last = current;
866
+ return result;
867
+ }
868
+ return {
869
+ next
870
+ };
871
+ }
872
+ }));
873
+ /**
874
+ * Deduplicates adjacent elements that are identical.
875
+ *
876
+ * @since 2.0.0
877
+ */
878
+ export const dedupeAdjacent = /*#__PURE__*/dedupeAdjacentWith( /*#__PURE__*/Equal.equivalence());
879
+ /**
880
+ * Zips this Iterable crosswise with the specified Iterable using the specified combiner.
881
+ *
882
+ * @since 2.0.0
883
+ * @category elements
884
+ */
885
+ export const cartesianWith = /*#__PURE__*/dual(3, (self, that, f) => flatMap(self, a => map(that, b => f(a, b))));
886
+ /**
887
+ * Zips this Iterable crosswise with the specified Iterable.
888
+ *
889
+ * @since 2.0.0
890
+ * @category elements
891
+ */
892
+ export const cartesian = /*#__PURE__*/dual(2, (self, that) => cartesianWith(self, that, (a, b) => [a, b]));
893
+ //# sourceMappingURL=Iterable.js.map