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.
- package/README.md +97 -9
- package/dist/chunk-EIIP7YWB.mjs +27 -0
- package/dist/chunk-EIIP7YWB.mjs.map +1 -0
- package/dist/chunk-EUVK4YM7.mjs +25 -0
- package/dist/chunk-EUVK4YM7.mjs.map +1 -0
- package/dist/chunk-MOBXUTO5.mjs +22 -0
- package/dist/chunk-MOBXUTO5.mjs.map +1 -0
- package/dist/chunk-O5SQJUKB.mjs +37 -0
- package/dist/chunk-O5SQJUKB.mjs.map +1 -0
- package/dist/iter-fest.d.mts +4 -1
- package/dist/iter-fest.d.ts +4 -1
- package/dist/iter-fest.iterableGetReadable.d.mts +3 -0
- package/dist/iter-fest.iterableGetReadable.d.ts +3 -0
- package/dist/iter-fest.iterableGetReadable.js +46 -0
- package/dist/iter-fest.iterableGetReadable.js.map +1 -0
- package/dist/iter-fest.iterableGetReadable.mjs +7 -0
- package/dist/iter-fest.js +89 -48
- package/dist/iter-fest.js.map +1 -1
- package/dist/iter-fest.mjs +21 -9
- package/dist/{iter-fest.observableValues.d.mts → iter-fest.observableSubscribeAsReadable.d.mts} +2 -2
- package/dist/{iter-fest.observableValues.d.ts → iter-fest.observableSubscribeAsReadable.d.ts} +2 -2
- package/dist/iter-fest.observableSubscribeAsReadable.js +51 -0
- package/dist/iter-fest.observableSubscribeAsReadable.js.map +1 -0
- package/dist/iter-fest.observableSubscribeAsReadable.mjs +7 -0
- package/dist/iter-fest.observableSubscribeAsReadable.mjs.map +1 -0
- package/dist/iter-fest.pushAsyncIterableIterator.d.mts +9 -0
- package/dist/iter-fest.pushAsyncIterableIterator.d.ts +9 -0
- package/dist/{iter-fest.observableValues.js → iter-fest.pushAsyncIterableIterator.js} +31 -58
- package/dist/iter-fest.pushAsyncIterableIterator.js.map +1 -0
- package/dist/iter-fest.pushAsyncIterableIterator.mjs +7 -0
- package/dist/iter-fest.pushAsyncIterableIterator.mjs.map +1 -0
- package/dist/iter-fest.readerValues.d.mts +3 -0
- package/dist/iter-fest.readerValues.d.ts +3 -0
- package/dist/iter-fest.readerValues.js +49 -0
- package/dist/iter-fest.readerValues.js.map +1 -0
- package/dist/iter-fest.readerValues.mjs +7 -0
- package/dist/iter-fest.readerValues.mjs.map +1 -0
- package/package.json +37 -7
- package/dist/chunk-QDUX45ZP.mjs +0 -64
- package/dist/chunk-QDUX45ZP.mjs.map +0 -1
- package/dist/iter-fest.observableValues.js.map +0 -1
- package/dist/iter-fest.observableValues.mjs +0 -7
- /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`
|
|
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 {
|
|
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
|
-
`
|
|
74
|
+
`ReadableStream` can be used to when converting an `Observable` to `AsyncIterableIterator`.
|
|
67
75
|
|
|
68
|
-
`Observable` is push-based and
|
|
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
|
|
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":[]}
|
package/dist/iter-fest.d.mts
CHANGED
|
@@ -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 {
|
|
27
|
+
export { observableSubscribeAsReadable } from './iter-fest.observableSubscribeAsReadable.mjs';
|
|
28
|
+
export { readerValues } from './iter-fest.readerValues.mjs';
|
|
26
29
|
import 'core-js-pure/full/observable';
|
package/dist/iter-fest.d.ts
CHANGED
|
@@ -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 {
|
|
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,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":[]}
|
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
|
-
|
|
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/
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
return
|
|
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
|
-
|
|
456
|
-
|
|
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
|
-
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// src/readerValues.ts
|
|
508
|
+
function readerValues(reader) {
|
|
509
|
+
const iterable = {
|
|
460
510
|
[Symbol.asyncIterator]() {
|
|
461
|
-
return
|
|
511
|
+
return iterable;
|
|
462
512
|
},
|
|
463
513
|
async next() {
|
|
464
|
-
|
|
465
|
-
if (!
|
|
466
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
555
|
+
observableSubscribeAsReadable,
|
|
556
|
+
readerValues
|
|
516
557
|
});
|
|
517
558
|
//# sourceMappingURL=iter-fest.js.map
|