iter-fest 0.2.2-main.fdb3230 → 0.3.1-main.202512220058.031427d

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 (43) hide show
  1. package/README.md +47 -32
  2. package/dist/chunk-6ZEIOTH6.mjs +9 -0
  3. package/dist/chunk-6ZEIOTH6.mjs.map +1 -0
  4. package/dist/{chunk-2DE3J4J7.mjs → chunk-AMBNMMKA.mjs} +2 -1
  5. package/dist/chunk-AMBNMMKA.mjs.map +1 -0
  6. package/dist/{chunk-ANRVAYLW.mjs → chunk-P6MH6RRG.mjs} +2 -1
  7. package/dist/chunk-P6MH6RRG.mjs.map +1 -0
  8. package/dist/chunk-VF6V265K.mjs +190 -0
  9. package/dist/chunk-VF6V265K.mjs.map +1 -0
  10. package/dist/chunk-YGRCFTJT.mjs +13 -0
  11. package/dist/chunk-YGRCFTJT.mjs.map +1 -0
  12. package/dist/iter-fest.asyncGeneratorWithLastValue.js +1 -0
  13. package/dist/iter-fest.asyncGeneratorWithLastValue.js.map +1 -1
  14. package/dist/iter-fest.asyncGeneratorWithLastValue.mjs +1 -1
  15. package/dist/iter-fest.d.mts +1 -0
  16. package/dist/iter-fest.d.ts +1 -0
  17. package/dist/iter-fest.generatorWithLastValue.js +1 -0
  18. package/dist/iter-fest.generatorWithLastValue.js.map +1 -1
  19. package/dist/iter-fest.generatorWithLastValue.mjs +1 -1
  20. package/dist/iter-fest.js +198 -47
  21. package/dist/iter-fest.js.map +1 -1
  22. package/dist/iter-fest.mjs +11 -7
  23. package/dist/iter-fest.observableValues.js +1 -45
  24. package/dist/iter-fest.observableValues.js.map +1 -1
  25. package/dist/iter-fest.observableValues.mjs +1 -2
  26. package/dist/iter-fest.readableStreamValues.d.mts +6 -1
  27. package/dist/iter-fest.readableStreamValues.d.ts +6 -1
  28. package/dist/iter-fest.readableStreamValues.js +2 -19
  29. package/dist/iter-fest.readableStreamValues.js.map +1 -1
  30. package/dist/iter-fest.readableStreamValues.mjs +1 -1
  31. package/dist/iter-fest.readableStreamValuesWithSignal.d.mts +15 -0
  32. package/dist/iter-fest.readableStreamValuesWithSignal.d.ts +15 -0
  33. package/dist/iter-fest.readableStreamValuesWithSignal.js +216 -0
  34. package/dist/iter-fest.readableStreamValuesWithSignal.js.map +1 -0
  35. package/dist/iter-fest.readableStreamValuesWithSignal.mjs +7 -0
  36. package/dist/iter-fest.readableStreamValuesWithSignal.mjs.map +1 -0
  37. package/package.json +26 -14
  38. package/dist/chunk-2DE3J4J7.mjs.map +0 -1
  39. package/dist/chunk-ANRVAYLW.mjs.map +0 -1
  40. package/dist/chunk-RVIERPEV.mjs +0 -26
  41. package/dist/chunk-RVIERPEV.mjs.map +0 -1
  42. package/dist/chunk-WMTE2GGJ.mjs +0 -38
  43. package/dist/chunk-WMTE2GGJ.mjs.map +0 -1
package/README.md CHANGED
@@ -23,7 +23,6 @@ npm install iter-fest
23
23
  | `Iterator` | `IterableIterator` | [`iteratorToIterable`](#converting-an-iterator-to-iterable) |
24
24
  | `AsyncIterator` | `AsyncIterableIterator` | [`asyncIteratorToAsyncIterable`](#converting-an-iterator-to-iterable) |
25
25
  | `Observable` | `ReadableStream` | [`observableSubscribeAsReadable`](#converting-an-observable-to-readablestream) |
26
- | `ReadableStream` | `AsyncIterableIterator` | [`readableStreamValues`](#converting-a-readablestream-to-asynciterableiterator) |
27
26
  | `AsyncIterable` | `Observable` | [`observableFromAsync`](#converting-an-asynciterable-to-observable) |
28
27
  | `AsyncIterable`/`Iterable` | `ReadableStream` | [`readableStreamFrom`](#converting-an-asynciterableiterable-to-readablestream) |
29
28
  | `Observable` | `AsyncIterableIterator` | [`observableValues`](#converting-an-observable-to-asynciterableiterator) |
@@ -31,9 +30,9 @@ npm install iter-fest
31
30
  ### Converting an iterator to iterable
32
31
 
33
32
  ```ts
34
- function iteratorToIterable<T>(iterator: Iterator<T>): IterableIterator<T>
33
+ function iteratorToIterable<T>(iterator: Iterator<T>): IterableIterator<T>;
35
34
 
36
- function asyncIteratorToAsyncIterable<T>(asyncIterator: AsyncIterator<T>): AsyncIterableIterator<T>
35
+ function asyncIteratorToAsyncIterable<T>(asyncIterator: AsyncIterator<T>): AsyncIterableIterator<T>;
37
36
  ```
38
37
 
39
38
  `iteratorToIterable` and `asyncIteratorToAsyncIterable` enable a [pure iterator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Iterator) to be iterable using a for-loop statement.
@@ -63,7 +62,7 @@ Note: calling `[Symbol.iterator]()` or `[Symbol.asyncIterator]()` will not resta
63
62
  ### Converting an `AsyncIterable` to `Observable`
64
63
 
65
64
  ```ts
66
- function observableFromAsync<T>(iterable: AsyncIterable<T>): Observable<T>
65
+ function observableFromAsync<T>(iterable: AsyncIterable<T>): Observable<T>;
67
66
  ```
68
67
 
69
68
  `Observable.from` converts `Iterable` into `Observable`. However, it does not convert `AsyncIterable`.
@@ -90,7 +89,7 @@ Note: It is not recommended to convert `AsyncGenerator` to an `Observable`. `Asy
90
89
  ### Converting an `Observable` to `ReadableStream`
91
90
 
92
91
  ```ts
93
- function observableSubscribeAsReadable<T>(observable: Observable<T>): ReadableStream<T>
92
+ function observableSubscribeAsReadable<T>(observable: Observable<T>): ReadableStream<T>;
94
93
  ```
95
94
 
96
95
  `ReadableStream` is powerful for transforming and piping stream of data. It can be formed using data from both push-based and pull-based source with backpressuree.
@@ -106,39 +105,18 @@ readable.pipeTo(stream.writable); // Will write 1, 2, 3.
106
105
 
107
106
  ### Converting a `ReadableStream` to `AsyncIterableIterator`
108
107
 
109
- ```ts
110
- function readableStreamValues`<T>(readable: ReadableStream<T>): AsyncIterableIterator<T>
111
- ```
112
-
113
- `readableStreamValues` allow iteration of `ReadableStream` as an `AsyncIterableIterator`.
108
+ > This is deprecated and removed in favor of [native `ReadableStream.values()`](https://streams.spec.whatwg.org/#rs-asynciterator).
114
109
 
115
110
  ```ts
116
- const readable = new ReadableStream({
117
- start(controller) {
118
- controller.enqueue(1);
119
- controller.enqueue(2);
120
- },
121
- pull(controller) {
122
- controller.enqueue(3);
123
- controller.close();
124
- }
125
- });
126
-
127
- const iterable = readableStreamValues(readable);
128
-
129
- for await (const value of iterable) {
130
- console.log(value); // Prints "1", "2", "3".
131
- }
111
+ function readableStreamValues`<T>(
112
+ readable: ReadableStream<T>
113
+ ): AsyncIterableIterator<T>
132
114
  ```
133
115
 
134
- Note: The stream will be locked as soon as the iterable is created. When using iterating outside of for-loop, make sure to call `AsyncIterator.return` when the iteration is done to release the lock on the stream.
135
-
136
- Note: `[Symbol.asyncIterator]()` will not restart the stream.
137
-
138
116
  ### Converting an `AsyncIterable`/`Iterable` to `ReadableStream`
139
117
 
140
118
  ```ts
141
- function readableStreamFrom<T>(anyIterable: AsyncIterable<T> | Iterable<T>): ReadableStream<T>
119
+ function readableStreamFrom<T>(anyIterable: AsyncIterable<T> | Iterable<T>): ReadableStream<T>;
142
120
  ```
143
121
 
144
122
  > Notes: this feature is part of [Streams Standard](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/from_static).
@@ -155,7 +133,7 @@ Note: `readableStreamFrom()` will call `[Symbol.iterator]()` initially to restar
155
133
  ### Converting an `Observable` to `AsyncIterableIterator`
156
134
 
157
135
  ```ts
158
- function observableValues<T>(observable: Observable<T>): AsyncIterableIterator<T>
136
+ function observableValues<T>(observable: Observable<T>): AsyncIterableIterator<T>;
159
137
  ```
160
138
 
161
139
  `Observable` can be converted to `AsyncIterableIterator` for easier consumption.
@@ -250,6 +228,43 @@ const generator = generatorWithLastValue(
250
228
  );
251
229
  ```
252
230
 
231
+ ### Iterating `ReadableStream` with `AbortSignal`
232
+
233
+ > This is an unofficial extension to the [native `ReadableStream.values()`](https://streams.spec.whatwg.org/#rs-asynciterator).
234
+
235
+ ```ts
236
+ function readableStreamValuesWithSignal`<T>(
237
+ readable: ReadableStream<T>,
238
+ options?: {
239
+ preventCancel?: boolean | undefined;
240
+ signal?: AbortSignal | undefined;
241
+ } | undefined
242
+ ): AsyncIterableIterator<T>
243
+ ```
244
+
245
+ To break early without awaiting for the next value, pass an `AbortSignal` to `options.signal`. When the signal is aborted, all pending and future calls to `next()` and `return()` will reject with `DOMException` with name of `AbortError`.
246
+
247
+ > Notes: native `ReadableStreamAsyncIterator` does not support `throw()`.
248
+
249
+ ```ts
250
+ const abortController = new AbortController();
251
+ const iterable = readableStreamValues(readable, { signal: abortController.signal });
252
+
253
+ setTimeout(() => {
254
+ abortController.abort();
255
+ }, 100);
256
+
257
+ try {
258
+ for await (const value of iterable) {
259
+ console.log(value);
260
+ }
261
+ } catch (error) {
262
+ // On abort, will throw DOMException with name of "AbortError"
263
+ }
264
+ ```
265
+
266
+ If `preventCancel` is `true`, the `ReadableStream` can be reopened and read by another reader.
267
+
253
268
  ## Adding types to `core-js-pure`
254
269
 
255
270
  We added types to [Iterator Helpers](https://github.com/tc39/proposal-iterator-helpers) and [Async Iterator Helpers](https://github.com/tc39/proposal-async-iterator-helpers) implementation from `core-js-pure`:
@@ -0,0 +1,9 @@
1
+ // src/readableStreamValues.ts
2
+ function readableStreamValues(readable, options) {
3
+ return readable.values(options);
4
+ }
5
+
6
+ export {
7
+ readableStreamValues
8
+ };
9
+ //# sourceMappingURL=chunk-6ZEIOTH6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/readableStreamValues.ts"],"sourcesContent":["/**\n * This is deprecated. You should use `ReadableStream.values` instead.\n *\n * @deprecated\n */\nexport function readableStreamValues<T>(\n readable: ReadableStream<T>,\n options?: ReadableStreamIteratorOptions | undefined\n): AsyncIterableIterator<T> {\n return readable.values(options);\n}\n"],"mappings":";AAKO,SAAS,qBACd,UACA,SAC0B;AAC1B,SAAO,SAAS,OAAO,OAAO;AAChC;","names":[]}
@@ -3,6 +3,7 @@ var STILL_ITERATING = Symbol();
3
3
  function generatorWithLastValue(generator) {
4
4
  let lastValue = STILL_ITERATING;
5
5
  const generatorWithLastValue2 = {
6
+ ...generator,
6
7
  [Symbol.iterator]() {
7
8
  return generatorWithLastValue2;
8
9
  },
@@ -32,4 +33,4 @@ function generatorWithLastValue(generator) {
32
33
  export {
33
34
  generatorWithLastValue
34
35
  };
35
- //# sourceMappingURL=chunk-2DE3J4J7.mjs.map
36
+ //# sourceMappingURL=chunk-AMBNMMKA.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/generatorWithLastValue.ts"],"sourcesContent":["const STILL_ITERATING = Symbol();\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type GeneratorWithLastValue<T = unknown, TReturn = any, TNext = unknown> = Generator<T, TReturn, TNext> & {\n lastValue(): TReturn;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function generatorWithLastValue<T = unknown, TReturn = any, TNext = unknown>(\n generator: Generator<T, TReturn, TNext>\n): GeneratorWithLastValue<T, TReturn, TNext> {\n let lastValue: typeof STILL_ITERATING | TReturn = STILL_ITERATING;\n\n const generatorWithLastValue = {\n ...generator,\n [Symbol.iterator]() {\n return generatorWithLastValue;\n },\n lastValue(): TReturn {\n if (lastValue === STILL_ITERATING) {\n throw new Error('Iteration has not complete yet, cannot get last value.');\n }\n\n return lastValue;\n },\n next(next: TNext) {\n const result = generator.next(next);\n\n if (result.done) {\n lastValue = result.value;\n }\n\n return result;\n },\n return(value: TReturn) {\n return generator.return(value);\n },\n throw(error: unknown) {\n return generator.throw(error);\n }\n };\n\n return generatorWithLastValue;\n}\n"],"mappings":";AAAA,IAAM,kBAAkB,OAAO;AAQxB,SAAS,uBACd,WAC2C;AAC3C,MAAI,YAA8C;AAElD,QAAMA,0BAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,CAAC,OAAO,QAAQ,IAAI;AAClB,aAAOA;AAAA,IACT;AAAA,IACA,YAAqB;AACnB,UAAI,cAAc,iBAAiB;AACjC,cAAM,IAAI,MAAM,wDAAwD;AAAA,MAC1E;AAEA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,MAAa;AAChB,YAAM,SAAS,UAAU,KAAK,IAAI;AAElC,UAAI,OAAO,MAAM;AACf,oBAAY,OAAO;AAAA,MACrB;AAEA,aAAO;AAAA,IACT;AAAA,IACA,OAAO,OAAgB;AACrB,aAAO,UAAU,OAAO,KAAK;AAAA,IAC/B;AAAA,IACA,MAAM,OAAgB;AACpB,aAAO,UAAU,MAAM,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,SAAOA;AACT;","names":["generatorWithLastValue"]}
@@ -3,6 +3,7 @@ var STILL_ITERATING = Symbol();
3
3
  function asyncGeneratorWithLastValue(generator) {
4
4
  let lastValue = STILL_ITERATING;
5
5
  const asyncGeneratorWithLastValue2 = {
6
+ ...generator,
6
7
  [Symbol.asyncIterator]() {
7
8
  return asyncGeneratorWithLastValue2;
8
9
  },
@@ -32,4 +33,4 @@ function asyncGeneratorWithLastValue(generator) {
32
33
  export {
33
34
  asyncGeneratorWithLastValue
34
35
  };
35
- //# sourceMappingURL=chunk-ANRVAYLW.mjs.map
36
+ //# sourceMappingURL=chunk-P6MH6RRG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/asyncGeneratorWithLastValue.ts"],"sourcesContent":["const STILL_ITERATING = Symbol();\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AsyncGeneratorWithLastValue<T = unknown, TReturn = any, TNext = unknown> = AsyncGenerator<\n T,\n TReturn,\n TNext\n> & {\n lastValue(): TReturn;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function asyncGeneratorWithLastValue<T = unknown, TReturn = any, TNext = unknown>(\n generator: AsyncGenerator<T, TReturn, TNext>\n): AsyncGeneratorWithLastValue<T, TReturn, TNext> {\n let lastValue: typeof STILL_ITERATING | TReturn = STILL_ITERATING;\n\n const asyncGeneratorWithLastValue = {\n ...generator,\n [Symbol.asyncIterator]() {\n return asyncGeneratorWithLastValue;\n },\n lastValue(): TReturn {\n if (lastValue === STILL_ITERATING) {\n throw new Error('Iteration has not complete yet, cannot get last value.');\n }\n\n return lastValue;\n },\n async next(next: TNext) {\n const result = await generator.next(next);\n\n if (result.done) {\n lastValue = result.value;\n }\n\n return result;\n },\n return(value: TReturn) {\n return generator.return(value);\n },\n throw(error: unknown) {\n return generator.throw(error);\n }\n };\n\n return asyncGeneratorWithLastValue;\n}\n"],"mappings":";AAAA,IAAM,kBAAkB,OAAO;AAYxB,SAAS,4BACd,WACgD;AAChD,MAAI,YAA8C;AAElD,QAAMA,+BAA8B;AAAA,IAClC,GAAG;AAAA,IACH,CAAC,OAAO,aAAa,IAAI;AACvB,aAAOA;AAAA,IACT;AAAA,IACA,YAAqB;AACnB,UAAI,cAAc,iBAAiB;AACjC,cAAM,IAAI,MAAM,wDAAwD;AAAA,MAC1E;AAEA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,KAAK,MAAa;AACtB,YAAM,SAAS,MAAM,UAAU,KAAK,IAAI;AAExC,UAAI,OAAO,MAAM;AACf,oBAAY,OAAO;AAAA,MACrB;AAEA,aAAO;AAAA,IACT;AAAA,IACA,OAAO,OAAgB;AACrB,aAAO,UAAU,OAAO,KAAK;AAAA,IAC/B;AAAA,IACA,MAAM,OAAgB;AACpB,aAAO,UAAU,MAAM,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,SAAOA;AACT;","names":["asyncGeneratorWithLastValue"]}
@@ -0,0 +1,190 @@
1
+ // src/private/CriticalSection.ts
2
+ var CriticalSection = class {
3
+ #callbacks = [];
4
+ enter(fn) {
5
+ const fnResolver = Promise.withResolvers();
6
+ const callback = async () => {
7
+ try {
8
+ fnResolver.resolve(await fn());
9
+ } catch (error) {
10
+ fnResolver.reject(error);
11
+ }
12
+ if (this.#callbacks.shift() !== callback) {
13
+ throw new Error("ASSERTION: The first resolver must be self.");
14
+ }
15
+ this.#callbacks[0]?.();
16
+ };
17
+ this.#callbacks.push(callback);
18
+ this.#callbacks[0] === callback && callback();
19
+ return fnResolver.promise;
20
+ }
21
+ };
22
+
23
+ // src/private/AsyncIteratorMachinery.ts
24
+ var AsyncIteratorMachinery = class {
25
+ constructor(iterator) {
26
+ this.#criticalSection = new CriticalSection();
27
+ this.#done = false;
28
+ const enter = this.#criticalSection.enter.bind(this.#criticalSection);
29
+ const return_ = iterator.return && iterator.return.bind(iterator);
30
+ const throw_ = iterator.throw && iterator.throw.bind(iterator);
31
+ this.next = (...[value]) => enter(async () => {
32
+ if (this.#done) {
33
+ return Promise.resolve({ done: true, value: void 0 });
34
+ }
35
+ const result = await iterator.next(...value ? [value] : []);
36
+ if (result.done) {
37
+ this.#done = true;
38
+ }
39
+ return result;
40
+ });
41
+ if (return_) {
42
+ this.return = (value) => enter(async () => {
43
+ if (this.#done) {
44
+ return {
45
+ done: true,
46
+ value: typeof value === "undefined" ? value : await value
47
+ };
48
+ }
49
+ this.#done = true;
50
+ return return_(value);
51
+ });
52
+ }
53
+ if (throw_) {
54
+ this.throw = (reason) => enter(() => {
55
+ if (this.#done) {
56
+ return Promise.reject(reason);
57
+ }
58
+ this.#done = true;
59
+ return throw_(reason);
60
+ });
61
+ }
62
+ }
63
+ #criticalSection;
64
+ #done;
65
+ async [Symbol.asyncDispose]() {
66
+ }
67
+ [Symbol.asyncIterator]() {
68
+ return this;
69
+ }
70
+ next;
71
+ return;
72
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
73
+ throw;
74
+ };
75
+
76
+ // src/private/createAbortError.ts
77
+ var ERROR_MESSAGE = "The operation is aborted";
78
+ var ERROR_NAME = "AbortError";
79
+ function createAbortError() {
80
+ if (typeof globalThis.DOMException === "undefined") {
81
+ const error = new Error(ERROR_MESSAGE);
82
+ error.name = ERROR_NAME;
83
+ return error;
84
+ } else {
85
+ return new DOMException(ERROR_MESSAGE, ERROR_NAME);
86
+ }
87
+ }
88
+
89
+ // src/readableStreamValuesWithSignal.ts
90
+ var ReadableStreamIterator = class {
91
+ // The asynchronous iterator initialization steps for a ReadableStream, given stream, iterator, and args, are:
92
+ constructor(stream, args) {
93
+ const reader = stream.getReader();
94
+ this.#reader = reader;
95
+ const preventCancel = !!args[0].preventCancel;
96
+ this.#preventCancel = preventCancel;
97
+ this.#signal = args[0].signal;
98
+ this.#signal?.addEventListener(
99
+ "abort",
100
+ async () => {
101
+ this.#preventCancel || reader.cancel(createAbortError());
102
+ reader.releaseLock();
103
+ },
104
+ { once: true }
105
+ );
106
+ }
107
+ #preventCancel;
108
+ #reader;
109
+ #readRequests = [];
110
+ #signal;
111
+ [Symbol.asyncIterator]() {
112
+ return this;
113
+ }
114
+ async [Symbol.asyncDispose]() {
115
+ }
116
+ // The get the next iteration result steps for a ReadableStream, given stream and iterator, are:
117
+ // next(...[value]: [] | [any]): Promise<IteratorResult<T, any>> {
118
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
119
+ next = () => {
120
+ if (this.#signal?.aborted) {
121
+ return Promise.reject(createAbortError());
122
+ }
123
+ const nextResolvers = Promise.withResolvers();
124
+ const reader = this.#reader;
125
+ const resolvers = Promise.withResolvers();
126
+ const request = {
127
+ // chunk steps, given chunk
128
+ chunk(value) {
129
+ resolvers.resolve({ done: false, value });
130
+ },
131
+ // close steps
132
+ close() {
133
+ reader.releaseLock();
134
+ resolvers.resolve({ done: true, value: void 0 });
135
+ },
136
+ // error steps, given e
137
+ error(reason) {
138
+ reader.releaseLock();
139
+ resolvers.reject(reason);
140
+ }
141
+ };
142
+ this.#readRequests.push(request);
143
+ (async () => {
144
+ try {
145
+ const result = await reader.read();
146
+ if (result.done) {
147
+ if (this.#signal?.aborted) {
148
+ request.error(createAbortError());
149
+ }
150
+ request.close();
151
+ } else {
152
+ request.chunk(result.value);
153
+ }
154
+ } catch (error) {
155
+ if (this.#signal?.aborted) {
156
+ request.error(createAbortError());
157
+ } else {
158
+ request.error(error);
159
+ }
160
+ } finally {
161
+ nextResolvers.resolve();
162
+ }
163
+ })();
164
+ return resolvers.promise;
165
+ };
166
+ // The asynchronous iterator return steps for a ReadableStream, given stream, iterator, and arg, are:
167
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
168
+ async return(value) {
169
+ if (this.#signal?.aborted) {
170
+ return Promise.reject(createAbortError());
171
+ }
172
+ const reader = this.#reader;
173
+ if (!this.#preventCancel) {
174
+ const cancelPromise = reader.cancel(value);
175
+ reader.releaseLock();
176
+ await cancelPromise;
177
+ return { done: true, value };
178
+ }
179
+ reader.releaseLock();
180
+ return { done: true, value };
181
+ }
182
+ };
183
+ function readableStreamValuesWithSignal(stream, options) {
184
+ return new AsyncIteratorMachinery(new ReadableStreamIterator(stream, [options || {}]));
185
+ }
186
+
187
+ export {
188
+ readableStreamValuesWithSignal
189
+ };
190
+ //# sourceMappingURL=chunk-VF6V265K.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/private/CriticalSection.ts","../src/private/AsyncIteratorMachinery.ts","../src/private/createAbortError.ts","../src/readableStreamValuesWithSignal.ts"],"sourcesContent":["export default class CriticalSection {\n #callbacks: (() => void)[] = [];\n\n enter<T>(fn: () => Promise<T>): Promise<T> {\n const fnResolver = Promise.withResolvers<T>();\n\n // const callback = () =>\n // fn()\n // .then(\n // value => fnResolver.resolve(value),\n // reason => fnResolver.reject(reason)\n // )\n // .then(() => {\n // /* istanbul ignore if */\n // if (this.#callbacks.shift() !== callback) {\n // throw new Error('ASSERTION: The first resolver must be self.');\n // }\n\n // this.#callbacks[0]?.();\n // });\n\n const callback = async () => {\n try {\n fnResolver.resolve(await fn());\n } catch (error) {\n fnResolver.reject(error);\n }\n\n /* istanbul ignore if */\n if (this.#callbacks.shift() !== callback) {\n throw new Error('ASSERTION: The first resolver must be self.');\n }\n\n this.#callbacks[0]?.();\n };\n\n this.#callbacks.push(callback);\n\n this.#callbacks[0] === callback && callback();\n\n return fnResolver.promise;\n }\n}\n","import CriticalSection from './CriticalSection.ts';\n\n/**\n * This machinery protect the logic of iterator/generator. It guarantees:\n *\n * - next(), return(), throw() are in the same critical section\n * - They will be processed sequentially\n * - When the iterator is done\n * - next() will always return { done: true, value: undefined }\n * - return(value) will always return { done: true, value }, without calling underlying return()\n * - throw(reason) will always throw reason, without calling underlying throw()\n */\nexport default class AsyncIteratorMachinery<T, TReturn, TNext> implements AsyncIteratorObject<T, TReturn, TNext> {\n constructor(iterator: AsyncIterator<T, TReturn, TNext>) {\n this.#criticalSection = new CriticalSection();\n this.#done = false;\n\n const enter = this.#criticalSection.enter.bind(this.#criticalSection);\n\n const return_ = iterator.return && iterator.return.bind(iterator);\n const throw_ = iterator.throw && iterator.throw.bind(iterator);\n\n this.next = (...[value]) =>\n enter(async () => {\n if (this.#done) {\n // Seems a bug in TypeScript that it doesn't allow undefined as TReturn for AsyncIterator\n return Promise.resolve({ done: true, value: undefined as TReturn });\n }\n\n const result = await iterator.next(...(value ? [value] : []));\n\n if (result.done) {\n this.#done = true;\n }\n\n return result;\n });\n\n if (return_) {\n this.return = value =>\n enter(async () => {\n if (this.#done) {\n return {\n done: true,\n value: typeof value === 'undefined' ? (value as TReturn) : await value\n };\n }\n\n this.#done = true;\n\n return return_(value);\n });\n }\n\n if (throw_) {\n this.throw = reason =>\n enter(() => {\n if (this.#done) {\n return Promise.reject(reason);\n }\n\n this.#done = true;\n\n return throw_(reason);\n });\n }\n }\n\n #criticalSection: CriticalSection;\n #done: boolean;\n\n async [Symbol.asyncDispose]() {}\n\n [Symbol.asyncIterator]() {\n return this;\n }\n\n next: (...[value]: [] | [TNext]) => Promise<IteratorResult<T, TReturn>>;\n return?: (value?: TReturn | PromiseLike<TReturn> | undefined) => Promise<IteratorResult<T, TReturn>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n throw?: (e?: any) => Promise<IteratorResult<T, TReturn>>;\n}\n","const ERROR_MESSAGE = 'The operation is aborted';\nconst ERROR_NAME = 'AbortError';\n\nexport default function createAbortError(): (DOMException & { name: 'AbortError' }) | Error {\n if (typeof globalThis.DOMException === 'undefined') {\n const error = new Error(ERROR_MESSAGE);\n\n error.name = ERROR_NAME;\n\n return error;\n } else {\n return new DOMException(ERROR_MESSAGE, ERROR_NAME);\n }\n}\n","import AsyncIteratorMachinery from './private/AsyncIteratorMachinery.ts';\nimport createAbortError from './private/createAbortError.ts';\n\ntype ReadableStreamIteratorWithSignalOptions = ReadableStreamIteratorOptions & {\n signal?: AbortSignal | undefined;\n};\n\ntype ReadableStreamIteratorReadRequest<T> = {\n chunk(value: T): void;\n close(): void;\n error(error: unknown): void;\n};\n\nclass ReadableStreamIterator<T> implements ReadableStreamAsyncIterator<T> {\n // The asynchronous iterator initialization steps for a ReadableStream, given stream, iterator, and args, are:\n constructor(\n stream: ReadableStream<T>,\n args: [{ preventCancel?: boolean | undefined; signal?: AbortSignal | undefined }]\n ) {\n // 1. Let reader be ? AcquireReadableStreamDefaultReader(stream).\n const reader = stream.getReader();\n\n // 2. Set iterator’s reader to reader.\n this.#reader = reader;\n\n // 3. Let preventCancel be args[0][\"preventCancel\"].\n const preventCancel = !!args[0].preventCancel;\n\n // 4. Set iterator’s prevent cancel to preventCancel.\n this.#preventCancel = preventCancel;\n\n this.#signal = args[0].signal;\n\n this.#signal?.addEventListener(\n 'abort',\n async () => {\n // Ignore cancel() rejections.\n this.#preventCancel || reader.cancel(createAbortError());\n\n reader.releaseLock();\n },\n { once: true }\n );\n }\n\n #preventCancel: boolean;\n #reader: ReadableStreamDefaultReader<T>;\n #readRequests: ReadableStreamIteratorReadRequest<T>[] = [];\n #signal: AbortSignal | undefined;\n\n [Symbol.asyncIterator]() {\n return this;\n }\n\n async [Symbol.asyncDispose]() {}\n\n // The get the next iteration result steps for a ReadableStream, given stream and iterator, are:\n // next(...[value]: [] | [any]): Promise<IteratorResult<T, any>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n next: () => Promise<IteratorResult<T, any>> = () => {\n if (this.#signal?.aborted) {\n return Promise.reject(createAbortError());\n }\n\n // Iterator machinery: iterator is busy, don't start return().\n const nextResolvers = Promise.withResolvers<void>();\n\n // 1. Let reader be iterator’s reader.\n const reader = this.#reader;\n\n // 2. Assert: reader.[[stream]] is not undefined.\n\n // 3. Let promise be a new promise.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const resolvers = Promise.withResolvers<IteratorResult<T, any>>();\n\n // 4. Let readRequest be a new read request with the following items:\n const request: ReadableStreamIteratorReadRequest<T> = {\n // chunk steps, given chunk\n chunk(value) {\n // Resolve promise with chunk.\n resolvers.resolve({ done: false, value });\n },\n // close steps\n close() {\n // Perform ! ReadableStreamDefaultReaderRelease(reader).\n reader.releaseLock();\n\n // Resolve promise with end of iteration.\n resolvers.resolve({ done: true, value: undefined });\n },\n // error steps, given e\n error(reason) {\n // Perform ! ReadableStreamDefaultReaderRelease(reader).\n reader.releaseLock();\n\n // Reject promise with e.\n resolvers.reject(reason);\n }\n };\n\n this.#readRequests.push(request);\n\n // 5. Perform ! ReadableStreamDefaultReaderRead(this, readRequest).\n (async () => {\n try {\n const result = await reader.read();\n\n if (result.done) {\n if (this.#signal?.aborted) {\n request.error(createAbortError());\n }\n\n request.close();\n } else {\n request.chunk(result.value);\n }\n } catch (error) {\n if (this.#signal?.aborted) {\n request.error(createAbortError());\n } else {\n request.error(error);\n }\n } finally {\n nextResolvers.resolve();\n }\n })();\n\n // 6. Return promise.\n return resolvers.promise;\n };\n\n // The asynchronous iterator return steps for a ReadableStream, given stream, iterator, and arg, are:\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async return(value?: any): Promise<IteratorResult<T, any>> {\n if (this.#signal?.aborted) {\n return Promise.reject(createAbortError());\n }\n\n // 1. Let reader be iterator’s reader.\n const reader = this.#reader;\n // 2. Assert: reader.[[stream]] is not undefined.\n // 3. Assert: reader.[[readRequests]] is empty, as the async iterator machinery guarantees that any previous calls to next() have settled before this is called.\n\n // 4. If iterator’s prevent cancel is false:\n if (!this.#preventCancel) {\n // 1. Let result be ! ReadableStreamReaderGenericCancel(reader, arg).\n const cancelPromise = reader.cancel(value);\n\n // --- Seems WHATWG spec bug: if stream errored, we will fail at cancel() and would never able to call releaseLock(). ---\n // --- Instead, regardless cancel() failed or not, we should release the reader lock. ---\n\n // 2. Perform ! ReadableStreamDefaultReaderRelease(reader).\n reader.releaseLock();\n\n await cancelPromise;\n\n // 3. Return result.\n // --- Seems Node.js 22.14.0 implementation is different from W3C spec, see https://github.com/nodejs/node/issues/57681 ---\n // return { done: true, value: undefined };\n return { done: true, value };\n }\n\n // 5. Perform ! ReadableStreamDefaultReaderRelease(reader).\n reader.releaseLock();\n\n // 6. Return a promise resolved with undefined.\n // --- Seems Node.js 22.14.0 implementation is different from W3C spec, see https://github.com/nodejs/node/issues/57681 ---\n // return { done: true, value: undefined };\n return { done: true, value };\n }\n}\n\n/**\n * This is based on WHATWG Streams Asynchronous Iteration specification.\n *\n * @see https://streams.spec.whatwg.org/#rs-asynciterator\n *\n * @param stream\n * @param options\n * @returns\n */\nexport function readableStreamValuesWithSignal<T>(\n stream: ReadableStream<T>,\n options?: ReadableStreamIteratorWithSignalOptions | undefined\n): ReadableStreamAsyncIterator<T> {\n return new AsyncIteratorMachinery(new ReadableStreamIterator(stream, [options || {}]));\n}\n\nexport { type ReadableStreamIteratorWithSignalOptions };\n"],"mappings":"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","names":[]}
@@ -0,0 +1,13 @@
1
+ import {
2
+ observableSubscribeAsReadable
3
+ } from "./chunk-GOJ2PI5W.mjs";
4
+
5
+ // src/observableValues.ts
6
+ function observableValues(observable) {
7
+ return observableSubscribeAsReadable(observable).values();
8
+ }
9
+
10
+ export {
11
+ observableValues
12
+ };
13
+ //# sourceMappingURL=chunk-YGRCFTJT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/observableValues.ts"],"sourcesContent":["import { type Observable } from './Observable.ts';\nimport { observableSubscribeAsReadable } from './observableSubscribeAsReadable.ts';\n\nexport function observableValues<T>(observable: Observable<T>): AsyncIterableIterator<T> {\n return observableSubscribeAsReadable(observable).values();\n}\n"],"mappings":";;;;;AAGO,SAAS,iBAAoB,YAAqD;AACvF,SAAO,8BAA8B,UAAU,EAAE,OAAO;AAC1D;","names":[]}
@@ -27,6 +27,7 @@ var STILL_ITERATING = Symbol();
27
27
  function asyncGeneratorWithLastValue(generator) {
28
28
  let lastValue = STILL_ITERATING;
29
29
  const asyncGeneratorWithLastValue2 = {
30
+ ...generator,
30
31
  [Symbol.asyncIterator]() {
31
32
  return asyncGeneratorWithLastValue2;
32
33
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/asyncGeneratorWithLastValue.ts"],"sourcesContent":["const STILL_ITERATING = Symbol();\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AsyncGeneratorWithLastValue<T = unknown, TReturn = any, TNext = unknown> = AsyncGenerator<\n T,\n TReturn,\n TNext\n> & {\n lastValue(): TReturn;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function asyncGeneratorWithLastValue<T = unknown, TReturn = any, TNext = unknown>(\n generator: AsyncGenerator<T, TReturn, TNext>\n): AsyncGeneratorWithLastValue<T, TReturn, TNext> {\n let lastValue: typeof STILL_ITERATING | TReturn = STILL_ITERATING;\n\n const asyncGeneratorWithLastValue = {\n [Symbol.asyncIterator]() {\n return asyncGeneratorWithLastValue;\n },\n lastValue(): TReturn {\n if (lastValue === STILL_ITERATING) {\n throw new Error('Iteration has not complete yet, cannot get last value.');\n }\n\n return lastValue;\n },\n async next(next: TNext) {\n const result = await generator.next(next);\n\n if (result.done) {\n lastValue = result.value;\n }\n\n return result;\n },\n return(value: TReturn) {\n return generator.return(value);\n },\n throw(error: unknown) {\n return generator.throw(error);\n }\n };\n\n return asyncGeneratorWithLastValue;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAM,kBAAkB,OAAO;AAYxB,SAAS,4BACd,WACgD;AAChD,MAAI,YAA8C;AAElD,QAAMA,+BAA8B;AAAA,IAClC,CAAC,OAAO,aAAa,IAAI;AACvB,aAAOA;AAAA,IACT;AAAA,IACA,YAAqB;AACnB,UAAI,cAAc,iBAAiB;AACjC,cAAM,IAAI,MAAM,wDAAwD;AAAA,MAC1E;AAEA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,KAAK,MAAa;AACtB,YAAM,SAAS,MAAM,UAAU,KAAK,IAAI;AAExC,UAAI,OAAO,MAAM;AACf,oBAAY,OAAO;AAAA,MACrB;AAEA,aAAO;AAAA,IACT;AAAA,IACA,OAAO,OAAgB;AACrB,aAAO,UAAU,OAAO,KAAK;AAAA,IAC/B;AAAA,IACA,MAAM,OAAgB;AACpB,aAAO,UAAU,MAAM,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,SAAOA;AACT;","names":["asyncGeneratorWithLastValue"]}
1
+ {"version":3,"sources":["../src/asyncGeneratorWithLastValue.ts"],"sourcesContent":["const STILL_ITERATING = Symbol();\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AsyncGeneratorWithLastValue<T = unknown, TReturn = any, TNext = unknown> = AsyncGenerator<\n T,\n TReturn,\n TNext\n> & {\n lastValue(): TReturn;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function asyncGeneratorWithLastValue<T = unknown, TReturn = any, TNext = unknown>(\n generator: AsyncGenerator<T, TReturn, TNext>\n): AsyncGeneratorWithLastValue<T, TReturn, TNext> {\n let lastValue: typeof STILL_ITERATING | TReturn = STILL_ITERATING;\n\n const asyncGeneratorWithLastValue = {\n ...generator,\n [Symbol.asyncIterator]() {\n return asyncGeneratorWithLastValue;\n },\n lastValue(): TReturn {\n if (lastValue === STILL_ITERATING) {\n throw new Error('Iteration has not complete yet, cannot get last value.');\n }\n\n return lastValue;\n },\n async next(next: TNext) {\n const result = await generator.next(next);\n\n if (result.done) {\n lastValue = result.value;\n }\n\n return result;\n },\n return(value: TReturn) {\n return generator.return(value);\n },\n throw(error: unknown) {\n return generator.throw(error);\n }\n };\n\n return asyncGeneratorWithLastValue;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAM,kBAAkB,OAAO;AAYxB,SAAS,4BACd,WACgD;AAChD,MAAI,YAA8C;AAElD,QAAMA,+BAA8B;AAAA,IAClC,GAAG;AAAA,IACH,CAAC,OAAO,aAAa,IAAI;AACvB,aAAOA;AAAA,IACT;AAAA,IACA,YAAqB;AACnB,UAAI,cAAc,iBAAiB;AACjC,cAAM,IAAI,MAAM,wDAAwD;AAAA,MAC1E;AAEA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,KAAK,MAAa;AACtB,YAAM,SAAS,MAAM,UAAU,KAAK,IAAI;AAExC,UAAI,OAAO,MAAM;AACf,oBAAY,OAAO;AAAA,MACrB;AAEA,aAAO;AAAA,IACT;AAAA,IACA,OAAO,OAAgB;AACrB,aAAO,UAAU,OAAO,KAAK;AAAA,IAC/B;AAAA,IACA,MAAM,OAAgB;AACpB,aAAO,UAAU,MAAM,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,SAAOA;AACT;","names":["asyncGeneratorWithLastValue"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  asyncGeneratorWithLastValue
3
- } from "./chunk-ANRVAYLW.mjs";
3
+ } from "./chunk-P6MH6RRG.mjs";
4
4
  export {
5
5
  asyncGeneratorWithLastValue
6
6
  };
@@ -48,4 +48,5 @@ export { observableSubscribeAsReadable } from './iter-fest.observableSubscribeAs
48
48
  export { observableValues } from './iter-fest.observableValues.mjs';
49
49
  export { readableStreamFrom } from './iter-fest.readableStreamFrom.mjs';
50
50
  export { readableStreamValues } from './iter-fest.readableStreamValues.mjs';
51
+ export { ReadableStreamIteratorWithSignalOptions, readableStreamValuesWithSignal } from './iter-fest.readableStreamValuesWithSignal.mjs';
51
52
  import 'core-js-pure/full/observable/index.js';
@@ -48,4 +48,5 @@ export { observableSubscribeAsReadable } from './iter-fest.observableSubscribeAs
48
48
  export { observableValues } from './iter-fest.observableValues.js';
49
49
  export { readableStreamFrom } from './iter-fest.readableStreamFrom.js';
50
50
  export { readableStreamValues } from './iter-fest.readableStreamValues.js';
51
+ export { ReadableStreamIteratorWithSignalOptions, readableStreamValuesWithSignal } from './iter-fest.readableStreamValuesWithSignal.js';
51
52
  import 'core-js-pure/full/observable/index.js';
@@ -27,6 +27,7 @@ var STILL_ITERATING = Symbol();
27
27
  function generatorWithLastValue(generator) {
28
28
  let lastValue = STILL_ITERATING;
29
29
  const generatorWithLastValue2 = {
30
+ ...generator,
30
31
  [Symbol.iterator]() {
31
32
  return generatorWithLastValue2;
32
33
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/generatorWithLastValue.ts"],"sourcesContent":["const STILL_ITERATING = Symbol();\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type GeneratorWithLastValue<T = unknown, TReturn = any, TNext = unknown> = Generator<T, TReturn, TNext> & {\n lastValue(): TReturn;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function generatorWithLastValue<T = unknown, TReturn = any, TNext = unknown>(\n generator: Generator<T, TReturn, TNext>\n): GeneratorWithLastValue<T, TReturn, TNext> {\n let lastValue: typeof STILL_ITERATING | TReturn = STILL_ITERATING;\n\n const generatorWithLastValue = {\n [Symbol.iterator]() {\n return generatorWithLastValue;\n },\n lastValue(): TReturn {\n if (lastValue === STILL_ITERATING) {\n throw new Error('Iteration has not complete yet, cannot get last value.');\n }\n\n return lastValue;\n },\n next(next: TNext) {\n const result = generator.next(next);\n\n if (result.done) {\n lastValue = result.value;\n }\n\n return result;\n },\n return(value: TReturn) {\n return generator.return(value);\n },\n throw(error: unknown) {\n return generator.throw(error);\n }\n };\n\n return generatorWithLastValue;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAM,kBAAkB,OAAO;AAQxB,SAAS,uBACd,WAC2C;AAC3C,MAAI,YAA8C;AAElD,QAAMA,0BAAyB;AAAA,IAC7B,CAAC,OAAO,QAAQ,IAAI;AAClB,aAAOA;AAAA,IACT;AAAA,IACA,YAAqB;AACnB,UAAI,cAAc,iBAAiB;AACjC,cAAM,IAAI,MAAM,wDAAwD;AAAA,MAC1E;AAEA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,MAAa;AAChB,YAAM,SAAS,UAAU,KAAK,IAAI;AAElC,UAAI,OAAO,MAAM;AACf,oBAAY,OAAO;AAAA,MACrB;AAEA,aAAO;AAAA,IACT;AAAA,IACA,OAAO,OAAgB;AACrB,aAAO,UAAU,OAAO,KAAK;AAAA,IAC/B;AAAA,IACA,MAAM,OAAgB;AACpB,aAAO,UAAU,MAAM,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,SAAOA;AACT;","names":["generatorWithLastValue"]}
1
+ {"version":3,"sources":["../src/generatorWithLastValue.ts"],"sourcesContent":["const STILL_ITERATING = Symbol();\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type GeneratorWithLastValue<T = unknown, TReturn = any, TNext = unknown> = Generator<T, TReturn, TNext> & {\n lastValue(): TReturn;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function generatorWithLastValue<T = unknown, TReturn = any, TNext = unknown>(\n generator: Generator<T, TReturn, TNext>\n): GeneratorWithLastValue<T, TReturn, TNext> {\n let lastValue: typeof STILL_ITERATING | TReturn = STILL_ITERATING;\n\n const generatorWithLastValue = {\n ...generator,\n [Symbol.iterator]() {\n return generatorWithLastValue;\n },\n lastValue(): TReturn {\n if (lastValue === STILL_ITERATING) {\n throw new Error('Iteration has not complete yet, cannot get last value.');\n }\n\n return lastValue;\n },\n next(next: TNext) {\n const result = generator.next(next);\n\n if (result.done) {\n lastValue = result.value;\n }\n\n return result;\n },\n return(value: TReturn) {\n return generator.return(value);\n },\n throw(error: unknown) {\n return generator.throw(error);\n }\n };\n\n return generatorWithLastValue;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAM,kBAAkB,OAAO;AAQxB,SAAS,uBACd,WAC2C;AAC3C,MAAI,YAA8C;AAElD,QAAMA,0BAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,CAAC,OAAO,QAAQ,IAAI;AAClB,aAAOA;AAAA,IACT;AAAA,IACA,YAAqB;AACnB,UAAI,cAAc,iBAAiB;AACjC,cAAM,IAAI,MAAM,wDAAwD;AAAA,MAC1E;AAEA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,MAAa;AAChB,YAAM,SAAS,UAAU,KAAK,IAAI;AAElC,UAAI,OAAO,MAAM;AACf,oBAAY,OAAO;AAAA,MACrB;AAEA,aAAO;AAAA,IACT;AAAA,IACA,OAAO,OAAgB;AACrB,aAAO,UAAU,OAAO,KAAK;AAAA,IAC/B;AAAA,IACA,MAAM,OAAgB;AACpB,aAAO,UAAU,MAAM,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,SAAOA;AACT;","names":["generatorWithLastValue"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  generatorWithLastValue
3
- } from "./chunk-2DE3J4J7.mjs";
3
+ } from "./chunk-AMBNMMKA.mjs";
4
4
  export {
5
5
  generatorWithLastValue
6
6
  };