iter-fest 0.1.1-main.c619924 → 0.1.1-main.cd25da6

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 +97 -9
  2. package/dist/chunk-EIIP7YWB.mjs +27 -0
  3. package/dist/chunk-EIIP7YWB.mjs.map +1 -0
  4. package/dist/chunk-EUVK4YM7.mjs +25 -0
  5. package/dist/chunk-EUVK4YM7.mjs.map +1 -0
  6. package/dist/chunk-MOBXUTO5.mjs +22 -0
  7. package/dist/chunk-MOBXUTO5.mjs.map +1 -0
  8. package/dist/chunk-O5SQJUKB.mjs +37 -0
  9. package/dist/chunk-O5SQJUKB.mjs.map +1 -0
  10. package/dist/iter-fest.d.mts +4 -1
  11. package/dist/iter-fest.d.ts +4 -1
  12. package/dist/iter-fest.iterableGetReadable.d.mts +3 -0
  13. package/dist/iter-fest.iterableGetReadable.d.ts +3 -0
  14. package/dist/iter-fest.iterableGetReadable.js +46 -0
  15. package/dist/iter-fest.iterableGetReadable.js.map +1 -0
  16. package/dist/iter-fest.iterableGetReadable.mjs +7 -0
  17. package/dist/iter-fest.js +89 -48
  18. package/dist/iter-fest.js.map +1 -1
  19. package/dist/iter-fest.mjs +21 -9
  20. package/dist/{iter-fest.observableValues.d.mts → iter-fest.observableSubscribeAsReadable.d.mts} +2 -2
  21. package/dist/{iter-fest.observableValues.d.ts → iter-fest.observableSubscribeAsReadable.d.ts} +2 -2
  22. package/dist/iter-fest.observableSubscribeAsReadable.js +51 -0
  23. package/dist/iter-fest.observableSubscribeAsReadable.js.map +1 -0
  24. package/dist/iter-fest.observableSubscribeAsReadable.mjs +7 -0
  25. package/dist/iter-fest.observableSubscribeAsReadable.mjs.map +1 -0
  26. package/dist/iter-fest.pushAsyncIterableIterator.d.mts +9 -0
  27. package/dist/iter-fest.pushAsyncIterableIterator.d.ts +9 -0
  28. package/dist/{iter-fest.observableValues.js → iter-fest.pushAsyncIterableIterator.js} +31 -58
  29. package/dist/iter-fest.pushAsyncIterableIterator.js.map +1 -0
  30. package/dist/iter-fest.pushAsyncIterableIterator.mjs +7 -0
  31. package/dist/iter-fest.pushAsyncIterableIterator.mjs.map +1 -0
  32. package/dist/iter-fest.readerValues.d.mts +3 -0
  33. package/dist/iter-fest.readerValues.d.ts +3 -0
  34. package/dist/iter-fest.readerValues.js +49 -0
  35. package/dist/iter-fest.readerValues.js.map +1 -0
  36. package/dist/iter-fest.readerValues.mjs +7 -0
  37. package/dist/iter-fest.readerValues.mjs.map +1 -0
  38. package/package.json +37 -7
  39. package/dist/chunk-QDUX45ZP.mjs +0 -64
  40. package/dist/chunk-QDUX45ZP.mjs.map +0 -1
  41. package/dist/iter-fest.observableValues.js.map +0 -1
  42. package/dist/iter-fest.observableValues.mjs +0 -7
  43. /package/dist/{iter-fest.observableValues.mjs.map → iter-fest.iterableGetReadable.mjs.map} +0 -0
package/README.md CHANGED
@@ -33,9 +33,21 @@ console.log(iterableSome(iterable, value => value % 2)); // Prints "true".
33
33
 
34
34
  List of ported functions: [`at`](https://tc39.es/ecma262/#sec-array.prototype.at), [`concat`](https://tc39.es/ecma262/#sec-array.prototype.concat), [`entries`](https://tc39.es/ecma262/#sec-array.prototype.entries), [`every`](https://tc39.es/ecma262/#sec-array.prototype.every), [`filter`](https://tc39.es/ecma262/#sec-array.prototype.filter), [`find`](https://tc39.es/ecma262/#sec-array.prototype.find), [`findIndex`](https://tc39.es/ecma262/#sec-array.prototype.findindex), [`findLast`](https://tc39.es/ecma262/#sec-array.prototype.findlast), [`findLastIndex`](https://tc39.es/ecma262/#sec-array.prototype.findlastindex), [`forEach`](https://tc39.es/ecma262/#sec-array.prototype.foreach), [`includes`](https://tc39.es/ecma262/#sec-array.prototype.includes), [`indexOf`](https://tc39.es/ecma262/#sec-array.prototype.indexof), [`join`](https://tc39.es/ecma262/#sec-array.prototype.join), [`keys`](https://tc39.es/ecma262/#sec-array.prototype.keys), [`map`](https://tc39.es/ecma262/#sec-array.prototype.map), [`reduce`](https://tc39.es/ecma262/#sec-array.prototype.reduce), [`slice`](https://tc39.es/ecma262/#sec-array.prototype.slice), [`some`](https://tc39.es/ecma262/#sec-array.prototype.some), [`toSpliced`](https://tc39.es/ecma262/#sec-array.prototype.tospliced), and [`toString`](https://tc39.es/ecma262/#sec-array.prototype.tostring).
35
35
 
36
+ ## Conversions
37
+
38
+ | From | To | Function signature |
39
+ | ----------------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
40
+ | `Iterator` | `IterableIterator` | [`iteratorToIterable<T>(iterator: Iterator<T>): IterableIterator<T>`](#converting-an-iterator-to-iterable) |
41
+ | `Observable` | `ReadableStream` | [`observableSubscribeAsReadable<T>(observable: Observable<T>): ReadableStream<T>`](#converting-an-observable-to-readablestream) |
42
+ | `ReadableStreamDefaultReader` | `AsyncIterableIterator` | [`readerValues`<T>(reader: ReadableStreamDefaultReader<T>): AsyncIterableIterator<T>`](#iterating-readablestreamdefaultreader) |
43
+ | `AsyncIterable` | `Observable` | [`observableFromAsync<T>(iterable: AsyncIterable<T>): Observable<T>`](#converting-an-asynciterable-to-observable) |
44
+ | `AsyncIterable`/`Iterable` | `ReadableStream` | [`iterableGetReadable<T>(iterable: AsyncIterable<T> \| Iterable<T>): ReadableStream<T>`](#converting-an-asynciterableiterable-to-readablestream) |
45
+
46
+ To convert `Observable` to `AsyncIterableIterator`, [use `ReadableStream` as intermediate format](#converting-an-observable-to-asynciterableiterator).
47
+
36
48
  ### Converting an iterator to iterable
37
49
 
38
- `iteratorToIterable` converts a pure iterator to `IterableIterator` and enable for-loop iteration.
50
+ `iteratorToIterable` 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.
39
51
 
40
52
  ```ts
41
53
  const iterate = (): Iterator<number> => {
@@ -44,7 +56,7 @@ const iterate = (): Iterator<number> => {
44
56
  return {
45
57
  next: () => {
46
58
  if (++value <= 3) {
47
- return { done: false, value };
59
+ return { value };
48
60
  }
49
61
 
50
62
  return { done: true, value: undefined };
@@ -57,20 +69,17 @@ for (const value of iteratorToIterable(iterate())) {
57
69
  }
58
70
  ```
59
71
 
60
- ### Typed `Observable`
61
-
62
- `Observable` and `Symbol.observable` is re-exported from `core-js-pure` with proper type definitions.
63
-
64
72
  ### Converting an `Observable` to `AsyncIterableIterator`
65
73
 
66
- `observableValues` subscribes to an `Observable` and return as `AsyncIterableIterator`.
74
+ `ReadableStream` can be used to when converting an `Observable` to `AsyncIterableIterator`.
67
75
 
68
- `Observable` is push-based and `AsyncIterableIterator` is pull-based. Values from `Observable` may push continuously and will be buffered internally. When for-loop break or complete, the iterator will unsubscribe from the `Observable`.
76
+ Note: `Observable` is push-based and it does not support flow control. When converting to `AsyncIterableIteratorrr`, the internal buffer of `ReadableStream` could build up quickly.
69
77
 
70
78
  ```ts
71
79
  const observable = Observable.from([1, 2, 3]);
80
+ const readable = observableSubscribeAsReadable(observable);
72
81
 
73
- for await (const value of observableValues(observable)) {
82
+ for await (const value of readerValues(readable.getReader())) {
74
83
  console.log(value); // Prints "1", "2", "3".
75
84
  }
76
85
  ```
@@ -94,6 +103,85 @@ const next = value => console.log(value);
94
103
  observable.subscribe({ next }); // Prints "1", "2", "3".
95
104
  ```
96
105
 
106
+ ## Converting an `Observable` to `ReadableStream`
107
+
108
+ `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.
109
+
110
+ Note: `Observable` is push-based and it does not support flow control. When converting to `ReadableStream`, the internal buffer could build up quickly.
111
+
112
+ ```ts
113
+ const observable = Observable.from([1, 2, 3]);
114
+ const readable = observableSubscribeAsReadable(observable);
115
+ const reader = readable.getReader();
116
+
117
+ readable.pipeTo(stream.writable); // Will write 1, 2, 3.
118
+ ```
119
+
120
+ ### Iterating `ReadableStreamDefaultReader`
121
+
122
+ `readerValues` will convert default reader of `ReadableStream` into an `AsyncIterableIterator` to use in for-loop.
123
+
124
+ ```ts
125
+ const readableStream = new ReadableStream({
126
+ start(controller) {
127
+ controller.enqueue(1);
128
+ controller.enqueue(2);
129
+ },
130
+ pull(controller) {
131
+ controller.enqueue(3);
132
+ controller.close();
133
+ }
134
+ });
135
+
136
+ for await (const value of readerValues(readableStream.getReader())) {
137
+ console.log(value); // Prints "1", "2", "3".
138
+ }
139
+ ```
140
+
141
+ ## Converting an `AsyncIterable`/`Iterable` to `ReadableStream`
142
+
143
+ ```ts
144
+ const iterable = [1, 2, 3].values();
145
+ const readable = iterableGetReadable(iterable);
146
+
147
+ readable.pipeTo(stream.writable); // Will write 1, 2, 3.
148
+ ```
149
+
150
+ ## Others
151
+
152
+ ### Typed `Observable`
153
+
154
+ `Observable` and `Symbol.observable` is re-exported from `core-js-pure` with proper type definitions.
155
+
156
+ ### Producer-consumer queue
157
+
158
+ `PushAsyncIterableIterator` is a simple push-based producer-consumer queue and designed to decouple the flow between a producer and consumer. The producer can push a new job at anytime. The consumer can pull a job at its own convenience.
159
+
160
+ Compare to pull-based queue, a push-based queue is easier to use. However, pull-based queue offers better flow control as it will produce a job only if there is a consumer ready to consume.
161
+
162
+ For a full-featured producer-consumer queue that supports flow control, use `ReadableStream` instead.
163
+
164
+ ```ts
165
+ const iterable = new PushAsyncIterableIterator();
166
+
167
+ (async function consumer() {
168
+ for await (const value of iterable) {
169
+ console.log(value);
170
+ }
171
+
172
+ console.log('Done');
173
+ })();
174
+
175
+ (async function producer() {
176
+ iterable.push(1);
177
+ iterable.push(2);
178
+ iterable.push(3);
179
+ iterable.close();
180
+ })();
181
+
182
+ // Prints "1", "2", "3", "Done".
183
+ ```
184
+
97
185
  ## Behaviors
98
186
 
99
187
  ### How this compares to the TC39 proposals?
@@ -0,0 +1,27 @@
1
+ // src/observableSubscribeAsReadable.ts
2
+ function observableSubscribeAsReadable(observable) {
3
+ let subscription;
4
+ return new ReadableStream({
5
+ cancel() {
6
+ subscription.unsubscribe();
7
+ },
8
+ start(controller) {
9
+ subscription = observable.subscribe({
10
+ complete() {
11
+ controller.close();
12
+ },
13
+ error(err) {
14
+ controller.error(err);
15
+ },
16
+ next(value) {
17
+ controller.enqueue(value);
18
+ }
19
+ });
20
+ }
21
+ });
22
+ }
23
+
24
+ export {
25
+ observableSubscribeAsReadable
26
+ };
27
+ //# sourceMappingURL=chunk-EIIP7YWB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/observableSubscribeAsReadable.ts"],"sourcesContent":["import type { Observable, Subscription } from './Observable';\n\nexport function observableSubscribeAsReadable<T>(observable: Observable<T>): ReadableStream<T> {\n let subscription: Subscription;\n\n return new ReadableStream<T>({\n cancel() {\n subscription.unsubscribe();\n },\n start(controller) {\n subscription = observable.subscribe({\n complete() {\n controller.close();\n },\n error(err: unknown) {\n controller.error(err);\n },\n next(value) {\n controller.enqueue(value);\n }\n });\n }\n });\n}\n"],"mappings":";AAEO,SAAS,8BAAiC,YAA8C;AAC7F,MAAI;AAEJ,SAAO,IAAI,eAAkB;AAAA,IAC3B,SAAS;AACP,mBAAa,YAAY;AAAA,IAC3B;AAAA,IACA,MAAM,YAAY;AAChB,qBAAe,WAAW,UAAU;AAAA,QAClC,WAAW;AACT,qBAAW,MAAM;AAAA,QACnB;AAAA,QACA,MAAM,KAAc;AAClB,qBAAW,MAAM,GAAG;AAAA,QACtB;AAAA,QACA,KAAK,OAAO;AACV,qBAAW,QAAQ,KAAK;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,25 @@
1
+ // src/readerValues.ts
2
+ function readerValues(reader) {
3
+ const iterable = {
4
+ [Symbol.asyncIterator]() {
5
+ return iterable;
6
+ },
7
+ async next() {
8
+ const result = await Promise.race([reader.read(), reader.closed]);
9
+ if (!result || result.done) {
10
+ return { done: true, value: void 0 };
11
+ }
12
+ return { value: result.value };
13
+ },
14
+ async return() {
15
+ reader.cancel();
16
+ return { done: true, value: void 0 };
17
+ }
18
+ };
19
+ return iterable;
20
+ }
21
+
22
+ export {
23
+ readerValues
24
+ };
25
+ //# sourceMappingURL=chunk-EUVK4YM7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/readerValues.ts"],"sourcesContent":["export function readerValues<T>(reader: ReadableStreamDefaultReader<T>): AsyncIterableIterator<T> {\n const iterable: AsyncIterableIterator<T> = {\n [Symbol.asyncIterator]() {\n return iterable;\n },\n async next(): Promise<IteratorResult<T>> {\n const result = await Promise.race([reader.read(), reader.closed]);\n\n if (!result || result.done) {\n return { done: true, value: undefined };\n }\n\n return { value: result.value };\n },\n async return() {\n // Throw inside for-loop is return().\n reader.cancel();\n\n return { done: true, value: undefined };\n }\n };\n\n return iterable;\n}\n"],"mappings":";AAAO,SAAS,aAAgB,QAAkE;AAChG,QAAM,WAAqC;AAAA,IACzC,CAAC,OAAO,aAAa,IAAI;AACvB,aAAO;AAAA,IACT;AAAA,IACA,MAAM,OAAmC;AACvC,YAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,OAAO,KAAK,GAAG,OAAO,MAAM,CAAC;AAEhE,UAAI,CAAC,UAAU,OAAO,MAAM;AAC1B,eAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,MACxC;AAEA,aAAO,EAAE,OAAO,OAAO,MAAM;AAAA,IAC/B;AAAA,IACA,MAAM,SAAS;AAEb,aAAO,OAAO;AAEd,aAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,IACxC;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -0,0 +1,22 @@
1
+ // src/iterableGetReadable.ts
2
+ function isIterable(iterable) {
3
+ return !!(iterable && typeof iterable === "object" && Symbol.iterator in iterable);
4
+ }
5
+ function iterableGetReadable(iterable) {
6
+ const iterator = isIterable(iterable) ? iterable[Symbol.iterator]() : iterable[Symbol.asyncIterator]();
7
+ return new ReadableStream({
8
+ async pull(controller) {
9
+ const result = await iterator.next();
10
+ if (result.done) {
11
+ controller.close();
12
+ } else {
13
+ controller.enqueue(result.value);
14
+ }
15
+ }
16
+ });
17
+ }
18
+
19
+ export {
20
+ iterableGetReadable
21
+ };
22
+ //# sourceMappingURL=chunk-MOBXUTO5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/iterableGetReadable.ts"],"sourcesContent":["function isIterable(iterable: unknown): iterable is Iterable<unknown> {\n return !!(iterable && typeof iterable === 'object' && Symbol.iterator in iterable);\n}\n\nexport function iterableGetReadable<T>(iterable: AsyncIterable<T> | Iterable<T>): ReadableStream<T> {\n const iterator = isIterable(iterable) ? iterable[Symbol.iterator]() : iterable[Symbol.asyncIterator]();\n\n return new ReadableStream({\n async pull(controller) {\n const result = await iterator.next();\n\n if (result.done) {\n controller.close();\n } else {\n controller.enqueue(result.value);\n }\n }\n });\n}\n"],"mappings":";AAAA,SAAS,WAAW,UAAkD;AACpE,SAAO,CAAC,EAAE,YAAY,OAAO,aAAa,YAAY,OAAO,YAAY;AAC3E;AAEO,SAAS,oBAAuB,UAA6D;AAClG,QAAM,WAAW,WAAW,QAAQ,IAAI,SAAS,OAAO,QAAQ,EAAE,IAAI,SAAS,OAAO,aAAa,EAAE;AAErG,SAAO,IAAI,eAAe;AAAA,IACxB,MAAM,KAAK,YAAY;AACrB,YAAM,SAAS,MAAM,SAAS,KAAK;AAEnC,UAAI,OAAO,MAAM;AACf,mBAAW,MAAM;AAAA,MACnB,OAAO;AACL,mBAAW,QAAQ,OAAO,KAAK;AAAA,MACjC;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,37 @@
1
+ // src/private/withResolvers.ts
2
+ import coreJSPromiseWithResolvers from "core-js-pure/full/promise/with-resolvers";
3
+ function withResolvers() {
4
+ return coreJSPromiseWithResolvers();
5
+ }
6
+
7
+ // src/PushAsyncIterableIterator.ts
8
+ var CLOSE = Symbol("close");
9
+ var PushAsyncIterableIterator = class {
10
+ #closed = false;
11
+ #pushResolvers = withResolvers();
12
+ [Symbol.asyncIterator]() {
13
+ return this;
14
+ }
15
+ close() {
16
+ this.#closed = true;
17
+ this.#pushResolvers.resolve(CLOSE);
18
+ }
19
+ async next() {
20
+ const value = await this.#pushResolvers.promise;
21
+ if (value === CLOSE) {
22
+ return { done: true, value: void 0 };
23
+ }
24
+ return { done: false, value };
25
+ }
26
+ push(value) {
27
+ if (!this.#closed) {
28
+ this.#pushResolvers.resolve(value);
29
+ this.#pushResolvers = withResolvers();
30
+ }
31
+ }
32
+ };
33
+
34
+ export {
35
+ PushAsyncIterableIterator
36
+ };
37
+ //# sourceMappingURL=chunk-O5SQJUKB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/private/withResolvers.ts","../src/PushAsyncIterableIterator.ts"],"sourcesContent":["// @ts-expect-error \"core-js\" is not typed.\nimport coreJSPromiseWithResolvers from 'core-js-pure/full/promise/with-resolvers';\n\nexport default function withResolvers<T>(): PromiseWithResolvers<T> {\n return coreJSPromiseWithResolvers();\n}\n","import withResolvers from './private/withResolvers';\n\nconst CLOSE = Symbol('close');\n\nexport class PushAsyncIterableIterator<T> implements AsyncIterableIterator<T> {\n #closed: boolean = false;\n #pushResolvers: PromiseWithResolvers<T | typeof CLOSE> = withResolvers();\n\n [Symbol.asyncIterator]() {\n return this;\n }\n\n close() {\n this.#closed = true;\n this.#pushResolvers.resolve(CLOSE);\n }\n\n async next(): Promise<IteratorResult<T>> {\n const value = await this.#pushResolvers.promise;\n\n if (value === CLOSE) {\n return { done: true, value: undefined };\n }\n\n return { done: false, value };\n }\n\n push(value: T) {\n if (!this.#closed) {\n this.#pushResolvers.resolve(value);\n this.#pushResolvers = withResolvers();\n }\n }\n}\n"],"mappings":";AACA,OAAO,gCAAgC;AAExB,SAAR,gBAA6D;AAClE,SAAO,2BAA2B;AACpC;;;ACHA,IAAM,QAAQ,OAAO,OAAO;AAErB,IAAM,4BAAN,MAAuE;AAAA,EAC5E,UAAmB;AAAA,EACnB,iBAAyD,cAAc;AAAA,EAEvE,CAAC,OAAO,aAAa,IAAI;AACvB,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ;AACN,SAAK,UAAU;AACf,SAAK,eAAe,QAAQ,KAAK;AAAA,EACnC;AAAA,EAEA,MAAM,OAAmC;AACvC,UAAM,QAAQ,MAAM,KAAK,eAAe;AAExC,QAAI,UAAU,OAAO;AACnB,aAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,IACxC;AAEA,WAAO,EAAE,MAAM,OAAO,MAAM;AAAA,EAC9B;AAAA,EAEA,KAAK,OAAU;AACb,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,eAAe,QAAQ,KAAK;AACjC,WAAK,iBAAiB,cAAc;AAAA,IACtC;AAAA,EACF;AACF;","names":[]}
@@ -1,4 +1,5 @@
1
1
  export { CompleteFunction, ErrorFunction, NextFunction, Observable, Observer, StartFunction, SubscriberFunction, Subscription, SubscriptionObserver } from './iter-fest.observable.mjs';
2
+ export { PushAsyncIterableIterator } from './iter-fest.pushAsyncIterableIterator.mjs';
2
3
  export { SymbolObservable } from './iter-fest.symbolObservable.mjs';
3
4
  export { iterableAt } from './iter-fest.iterableAt.mjs';
4
5
  export { iterableConcat } from './iter-fest.iterableConcat.mjs';
@@ -10,6 +11,7 @@ export { iterableFindIndex } from './iter-fest.iterableFindIndex.mjs';
10
11
  export { iterableFindLast } from './iter-fest.iterableFindLast.mjs';
11
12
  export { iterableFindLastIndex } from './iter-fest.iterableFindLastIndex.mjs';
12
13
  export { iterableForEach } from './iter-fest.iterableForEach.mjs';
14
+ export { iterableGetReadable } from './iter-fest.iterableGetReadable.mjs';
13
15
  export { iterableIncludes } from './iter-fest.iterableIncludes.mjs';
14
16
  export { iterableIndexOf } from './iter-fest.iterableIndexOf.mjs';
15
17
  export { iterableJoin } from './iter-fest.iterableJoin.mjs';
@@ -22,5 +24,6 @@ export { iterableToSpliced } from './iter-fest.iterableToSpliced.mjs';
22
24
  export { iterableToString } from './iter-fest.iterableToString.mjs';
23
25
  export { iteratorToIterable } from './iter-fest.iteratorToIterable.mjs';
24
26
  export { observableFromAsync } from './iter-fest.observableFromAsync.mjs';
25
- export { observableValues } from './iter-fest.observableValues.mjs';
27
+ export { observableSubscribeAsReadable } from './iter-fest.observableSubscribeAsReadable.mjs';
28
+ export { readerValues } from './iter-fest.readerValues.mjs';
26
29
  import 'core-js-pure/full/observable';
@@ -1,4 +1,5 @@
1
1
  export { CompleteFunction, ErrorFunction, NextFunction, Observable, Observer, StartFunction, SubscriberFunction, Subscription, SubscriptionObserver } from './iter-fest.observable.js';
2
+ export { PushAsyncIterableIterator } from './iter-fest.pushAsyncIterableIterator.js';
2
3
  export { SymbolObservable } from './iter-fest.symbolObservable.js';
3
4
  export { iterableAt } from './iter-fest.iterableAt.js';
4
5
  export { iterableConcat } from './iter-fest.iterableConcat.js';
@@ -10,6 +11,7 @@ export { iterableFindIndex } from './iter-fest.iterableFindIndex.js';
10
11
  export { iterableFindLast } from './iter-fest.iterableFindLast.js';
11
12
  export { iterableFindLastIndex } from './iter-fest.iterableFindLastIndex.js';
12
13
  export { iterableForEach } from './iter-fest.iterableForEach.js';
14
+ export { iterableGetReadable } from './iter-fest.iterableGetReadable.js';
13
15
  export { iterableIncludes } from './iter-fest.iterableIncludes.js';
14
16
  export { iterableIndexOf } from './iter-fest.iterableIndexOf.js';
15
17
  export { iterableJoin } from './iter-fest.iterableJoin.js';
@@ -22,5 +24,6 @@ export { iterableToSpliced } from './iter-fest.iterableToSpliced.js';
22
24
  export { iterableToString } from './iter-fest.iterableToString.js';
23
25
  export { iteratorToIterable } from './iter-fest.iteratorToIterable.js';
24
26
  export { observableFromAsync } from './iter-fest.observableFromAsync.js';
25
- export { observableValues } from './iter-fest.observableValues.js';
27
+ export { observableSubscribeAsReadable } from './iter-fest.observableSubscribeAsReadable.js';
28
+ export { readerValues } from './iter-fest.readerValues.js';
26
29
  import 'core-js-pure/full/observable';
@@ -0,0 +1,3 @@
1
+ declare function iterableGetReadable<T>(iterable: AsyncIterable<T> | Iterable<T>): ReadableStream<T>;
2
+
3
+ export { iterableGetReadable };
@@ -0,0 +1,3 @@
1
+ declare function iterableGetReadable<T>(iterable: AsyncIterable<T> | Iterable<T>): ReadableStream<T>;
2
+
3
+ export { iterableGetReadable };
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/iterableGetReadable.ts
21
+ var iterableGetReadable_exports = {};
22
+ __export(iterableGetReadable_exports, {
23
+ iterableGetReadable: () => iterableGetReadable
24
+ });
25
+ module.exports = __toCommonJS(iterableGetReadable_exports);
26
+ function isIterable(iterable) {
27
+ return !!(iterable && typeof iterable === "object" && Symbol.iterator in iterable);
28
+ }
29
+ function iterableGetReadable(iterable) {
30
+ const iterator = isIterable(iterable) ? iterable[Symbol.iterator]() : iterable[Symbol.asyncIterator]();
31
+ return new ReadableStream({
32
+ async pull(controller) {
33
+ const result = await iterator.next();
34
+ if (result.done) {
35
+ controller.close();
36
+ } else {
37
+ controller.enqueue(result.value);
38
+ }
39
+ }
40
+ });
41
+ }
42
+ // Annotate the CommonJS export names for ESM import in node:
43
+ 0 && (module.exports = {
44
+ iterableGetReadable
45
+ });
46
+ //# sourceMappingURL=iter-fest.iterableGetReadable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/iterableGetReadable.ts"],"sourcesContent":["function isIterable(iterable: unknown): iterable is Iterable<unknown> {\n return !!(iterable && typeof iterable === 'object' && Symbol.iterator in iterable);\n}\n\nexport function iterableGetReadable<T>(iterable: AsyncIterable<T> | Iterable<T>): ReadableStream<T> {\n const iterator = isIterable(iterable) ? iterable[Symbol.iterator]() : iterable[Symbol.asyncIterator]();\n\n return new ReadableStream({\n async pull(controller) {\n const result = await iterator.next();\n\n if (result.done) {\n controller.close();\n } else {\n controller.enqueue(result.value);\n }\n }\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,WAAW,UAAkD;AACpE,SAAO,CAAC,EAAE,YAAY,OAAO,aAAa,YAAY,OAAO,YAAY;AAC3E;AAEO,SAAS,oBAAuB,UAA6D;AAClG,QAAM,WAAW,WAAW,QAAQ,IAAI,SAAS,OAAO,QAAQ,EAAE,IAAI,SAAS,OAAO,aAAa,EAAE;AAErG,SAAO,IAAI,eAAe;AAAA,IACxB,MAAM,KAAK,YAAY;AACrB,YAAM,SAAS,MAAM,SAAS,KAAK;AAEnC,UAAI,OAAO,MAAM;AACf,mBAAW,MAAM;AAAA,MACnB,OAAO;AACL,mBAAW,QAAQ,OAAO,KAAK;AAAA,MACjC;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,7 @@
1
+ import {
2
+ iterableGetReadable
3
+ } from "./chunk-MOBXUTO5.mjs";
4
+ export {
5
+ iterableGetReadable
6
+ };
7
+ //# sourceMappingURL=iter-fest.iterableGetReadable.mjs.map
package/dist/iter-fest.js CHANGED
@@ -31,6 +31,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var src_exports = {};
32
32
  __export(src_exports, {
33
33
  Observable: () => Observable,
34
+ PushAsyncIterableIterator: () => PushAsyncIterableIterator,
34
35
  SymbolObservable: () => SymbolObservable,
35
36
  iterableAt: () => iterableAt,
36
37
  iterableConcat: () => iterableConcat,
@@ -42,6 +43,7 @@ __export(src_exports, {
42
43
  iterableFindLast: () => iterableFindLast,
43
44
  iterableFindLastIndex: () => iterableFindLastIndex,
44
45
  iterableForEach: () => iterableForEach,
46
+ iterableGetReadable: () => iterableGetReadable,
45
47
  iterableIncludes: () => iterableIncludes,
46
48
  iterableIndexOf: () => iterableIndexOf,
47
49
  iterableJoin: () => iterableJoin,
@@ -54,7 +56,8 @@ __export(src_exports, {
54
56
  iterableToString: () => iterableToString,
55
57
  iteratorToIterable: () => iteratorToIterable,
56
58
  observableFromAsync: () => observableFromAsync,
57
- observableValues: () => observableValues
59
+ observableSubscribeAsReadable: () => observableSubscribeAsReadable,
60
+ readerValues: () => readerValues
58
61
  });
59
62
  module.exports = __toCommonJS(src_exports);
60
63
 
@@ -86,6 +89,39 @@ var Observable = class extends import_observable2.default {
86
89
  }
87
90
  };
88
91
 
92
+ // src/private/withResolvers.ts
93
+ var import_with_resolvers = __toESM(require("core-js-pure/full/promise/with-resolvers"));
94
+ function withResolvers() {
95
+ return (0, import_with_resolvers.default)();
96
+ }
97
+
98
+ // src/PushAsyncIterableIterator.ts
99
+ var CLOSE = Symbol("close");
100
+ var PushAsyncIterableIterator = class {
101
+ #closed = false;
102
+ #pushResolvers = withResolvers();
103
+ [Symbol.asyncIterator]() {
104
+ return this;
105
+ }
106
+ close() {
107
+ this.#closed = true;
108
+ this.#pushResolvers.resolve(CLOSE);
109
+ }
110
+ async next() {
111
+ const value = await this.#pushResolvers.promise;
112
+ if (value === CLOSE) {
113
+ return { done: true, value: void 0 };
114
+ }
115
+ return { done: false, value };
116
+ }
117
+ push(value) {
118
+ if (!this.#closed) {
119
+ this.#pushResolvers.resolve(value);
120
+ this.#pushResolvers = withResolvers();
121
+ }
122
+ }
123
+ };
124
+
89
125
  // src/private/toIntegerOrInfinity.ts
90
126
  function toIntegerOrInfinity(value) {
91
127
  if (value === Infinity || value === -Infinity) {
@@ -237,6 +273,24 @@ function iterableForEach(iterable, callbackfn, thisArg) {
237
273
  }
238
274
  }
239
275
 
276
+ // src/iterableGetReadable.ts
277
+ function isIterable(iterable) {
278
+ return !!(iterable && typeof iterable === "object" && Symbol.iterator in iterable);
279
+ }
280
+ function iterableGetReadable(iterable) {
281
+ const iterator = isIterable(iterable) ? iterable[Symbol.iterator]() : iterable[Symbol.asyncIterator]();
282
+ return new ReadableStream({
283
+ async pull(controller) {
284
+ const result = await iterator.next();
285
+ if (result.done) {
286
+ controller.close();
287
+ } else {
288
+ controller.enqueue(result.value);
289
+ }
290
+ }
291
+ });
292
+ }
293
+
240
294
  // src/iterableIncludes.ts
241
295
  function iterableIncludes(iterable, searchElement, fromIndex = 0) {
242
296
  let index = 0;
@@ -427,68 +481,53 @@ function observableFromAsync(iterable) {
427
481
  });
428
482
  }
429
483
 
430
- // src/private/withResolvers.ts
431
- var import_with_resolvers = __toESM(require("core-js-pure/full/promise/with-resolvers"));
432
- function withResolvers() {
433
- return (0, import_with_resolvers.default)();
434
- }
435
-
436
- // src/observableValues.ts
437
- var COMPLETE = Symbol("complete");
438
- var NEXT = Symbol("next");
439
- var THROW = Symbol("throw");
440
- function observableValues(observable) {
441
- const queue = [];
442
- let deferred = withResolvers();
443
- const push = (entry) => {
444
- queue.push(entry);
445
- deferred.resolve(entry);
446
- deferred = withResolvers();
447
- };
448
- const subscription = observable.subscribe({
449
- complete() {
450
- push([COMPLETE]);
451
- },
452
- error(err) {
453
- push([THROW, err]);
484
+ // src/observableSubscribeAsReadable.ts
485
+ function observableSubscribeAsReadable(observable) {
486
+ let subscription;
487
+ return new ReadableStream({
488
+ cancel() {
489
+ subscription.unsubscribe();
454
490
  },
455
- next(value) {
456
- push([NEXT, value]);
491
+ start(controller) {
492
+ subscription = observable.subscribe({
493
+ complete() {
494
+ controller.close();
495
+ },
496
+ error(err) {
497
+ controller.error(err);
498
+ },
499
+ next(value) {
500
+ controller.enqueue(value);
501
+ }
502
+ });
457
503
  }
458
504
  });
459
- const asyncIterableIterator = {
505
+ }
506
+
507
+ // src/readerValues.ts
508
+ function readerValues(reader) {
509
+ const iterable = {
460
510
  [Symbol.asyncIterator]() {
461
- return this;
511
+ return iterable;
462
512
  },
463
513
  async next() {
464
- let entry = queue.shift();
465
- if (!entry) {
466
- entry = await deferred.promise;
467
- queue.shift();
468
- }
469
- switch (entry[0]) {
470
- case COMPLETE:
471
- return { done: true, value: void 0 };
472
- case THROW:
473
- throw entry[1];
474
- case NEXT:
475
- return { done: false, value: entry[1] };
514
+ const result = await Promise.race([reader.read(), reader.closed]);
515
+ if (!result || result.done) {
516
+ return { done: true, value: void 0 };
476
517
  }
518
+ return { value: result.value };
477
519
  },
478
520
  async return() {
479
- subscription.unsubscribe();
480
- return { done: true, value: void 0 };
481
- },
482
- async throw() {
483
- subscription.unsubscribe();
521
+ reader.cancel();
484
522
  return { done: true, value: void 0 };
485
523
  }
486
524
  };
487
- return asyncIterableIterator;
525
+ return iterable;
488
526
  }
489
527
  // Annotate the CommonJS export names for ESM import in node:
490
528
  0 && (module.exports = {
491
529
  Observable,
530
+ PushAsyncIterableIterator,
492
531
  SymbolObservable,
493
532
  iterableAt,
494
533
  iterableConcat,
@@ -500,6 +539,7 @@ function observableValues(observable) {
500
539
  iterableFindLast,
501
540
  iterableFindLastIndex,
502
541
  iterableForEach,
542
+ iterableGetReadable,
503
543
  iterableIncludes,
504
544
  iterableIndexOf,
505
545
  iterableJoin,
@@ -512,6 +552,7 @@ function observableValues(observable) {
512
552
  iterableToString,
513
553
  iteratorToIterable,
514
554
  observableFromAsync,
515
- observableValues
555
+ observableSubscribeAsReadable,
556
+ readerValues
516
557
  });
517
558
  //# sourceMappingURL=iter-fest.js.map