iter-fest 0.1.1-main.1b2076b → 0.1.1-main.4decbaa

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 (65) hide show
  1. package/README.md +94 -0
  2. package/dist/chunk-2HLJODU3.mjs +21 -0
  3. package/dist/chunk-2HLJODU3.mjs.map +1 -0
  4. package/dist/chunk-4LRYDU2Y.mjs +62 -0
  5. package/dist/chunk-4LRYDU2Y.mjs.map +1 -0
  6. package/dist/chunk-EIIP7YWB.mjs +27 -0
  7. package/dist/chunk-EIIP7YWB.mjs.map +1 -0
  8. package/dist/chunk-FEOLYD5R.mjs +31 -0
  9. package/dist/chunk-FEOLYD5R.mjs.map +1 -0
  10. package/dist/chunk-K5XV4W7G.mjs +35 -0
  11. package/dist/chunk-K5XV4W7G.mjs.map +1 -0
  12. package/dist/chunk-OJMT4K3R.mjs +8 -0
  13. package/dist/chunk-OJMT4K3R.mjs.map +1 -0
  14. package/dist/chunk-U6G4RNZ2.mjs +10 -0
  15. package/dist/chunk-U6G4RNZ2.mjs.map +1 -0
  16. package/dist/chunk-VLF6DI2U.mjs +30 -0
  17. package/dist/chunk-VLF6DI2U.mjs.map +1 -0
  18. package/dist/iter-fest.d.mts +8 -0
  19. package/dist/iter-fest.d.ts +8 -0
  20. package/dist/iter-fest.js +204 -2
  21. package/dist/iter-fest.js.map +1 -1
  22. package/dist/iter-fest.mjs +30 -1
  23. package/dist/iter-fest.observable.d.mts +51 -0
  24. package/dist/iter-fest.observable.d.ts +51 -0
  25. package/dist/iter-fest.observable.js +66 -0
  26. package/dist/iter-fest.observable.js.map +1 -0
  27. package/dist/iter-fest.observable.mjs +8 -0
  28. package/dist/iter-fest.observable.mjs.map +1 -0
  29. package/dist/iter-fest.observableFromAsync.d.mts +7 -0
  30. package/dist/iter-fest.observableFromAsync.d.ts +7 -0
  31. package/dist/iter-fest.observableFromAsync.js +91 -0
  32. package/dist/iter-fest.observableFromAsync.js.map +1 -0
  33. package/dist/iter-fest.observableFromAsync.mjs +9 -0
  34. package/dist/iter-fest.observableFromAsync.mjs.map +1 -0
  35. package/dist/iter-fest.observableSubscribeAsReadable.d.mts +7 -0
  36. package/dist/iter-fest.observableSubscribeAsReadable.d.ts +7 -0
  37. package/dist/iter-fest.observableSubscribeAsReadable.js +51 -0
  38. package/dist/iter-fest.observableSubscribeAsReadable.js.map +1 -0
  39. package/dist/iter-fest.observableSubscribeAsReadable.mjs +7 -0
  40. package/dist/iter-fest.observableSubscribeAsReadable.mjs.map +1 -0
  41. package/dist/iter-fest.observableValues.d.mts +7 -0
  42. package/dist/iter-fest.observableValues.d.ts +7 -0
  43. package/dist/iter-fest.observableValues.js +100 -0
  44. package/dist/iter-fest.observableValues.js.map +1 -0
  45. package/dist/iter-fest.observableValues.mjs +8 -0
  46. package/dist/iter-fest.observableValues.mjs.map +1 -0
  47. package/dist/iter-fest.pushAsyncIterableIterator.d.mts +9 -0
  48. package/dist/iter-fest.pushAsyncIterableIterator.d.ts +9 -0
  49. package/dist/iter-fest.pushAsyncIterableIterator.js +73 -0
  50. package/dist/iter-fest.pushAsyncIterableIterator.js.map +1 -0
  51. package/dist/iter-fest.pushAsyncIterableIterator.mjs +8 -0
  52. package/dist/iter-fest.pushAsyncIterableIterator.mjs.map +1 -0
  53. package/dist/iter-fest.readerToAsyncIterableIterator.d.mts +3 -0
  54. package/dist/iter-fest.readerToAsyncIterableIterator.d.ts +3 -0
  55. package/dist/iter-fest.readerToAsyncIterableIterator.js +45 -0
  56. package/dist/iter-fest.readerToAsyncIterableIterator.js.map +1 -0
  57. package/dist/iter-fest.readerToAsyncIterableIterator.mjs +7 -0
  58. package/dist/iter-fest.readerToAsyncIterableIterator.mjs.map +1 -0
  59. package/dist/iter-fest.symbolObservable.d.mts +3 -0
  60. package/dist/iter-fest.symbolObservable.d.ts +3 -0
  61. package/dist/iter-fest.symbolObservable.js +42 -0
  62. package/dist/iter-fest.symbolObservable.js.map +1 -0
  63. package/dist/iter-fest.symbolObservable.mjs +7 -0
  64. package/dist/iter-fest.symbolObservable.mjs.map +1 -0
  65. package/package.json +76 -2
package/README.md CHANGED
@@ -57,6 +57,100 @@ for (const value of iteratorToIterable(iterate())) {
57
57
  }
58
58
  ```
59
59
 
60
+ ### Typed `Observable`
61
+
62
+ `Observable` and `Symbol.observable` is re-exported from `core-js-pure` with proper type definitions.
63
+
64
+ ### Converting an `Observable` to `AsyncIterableIterator`
65
+
66
+ `observableValues` subscribes to an `Observable` and return as `AsyncIterableIterator`.
67
+
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`.
69
+
70
+ ```ts
71
+ const observable = Observable.from([1, 2, 3]);
72
+
73
+ for await (const value of observableValues(observable)) {
74
+ console.log(value); // Prints "1", "2", "3".
75
+ }
76
+ ```
77
+
78
+ ### Converting an `AsyncIterable` to `Observable`
79
+
80
+ `Observable.from` converts `Iterable` into `Observable`. However, it does not convert `AsyncIterable`.
81
+
82
+ `observableFromAsync` will convert `AsyncIterable` into `Observable`.
83
+
84
+ ```ts
85
+ async function* generate() {
86
+ yield 1;
87
+ yield 2;
88
+ yield 3;
89
+ }
90
+
91
+ const observable = observableFromAsync(generate());
92
+ const next = value => console.log(value);
93
+
94
+ observable.subscribe({ next }); // Prints "1", "2", "3".
95
+ ```
96
+
97
+ ### Producer-consumer queue
98
+
99
+ `PushAsyncIterableIterator` is a simple push-based producer-consumer queue. The producer can push a new job at anytime. The consumer will wait for jobs to be available.
100
+
101
+ A push-based queue is easier to use than a pull-based queue. However, pull-based queue offers better flow control. For a full-featured producer-consumer queue that supports flow control, use `ReadableStream` instead.
102
+
103
+ ```ts
104
+ const iterable = new PushAsyncIterableIterator();
105
+
106
+ (async function consumer() {
107
+ for await (const value of iterable) {
108
+ console.log(value);
109
+ }
110
+
111
+ console.log('Done');
112
+ })();
113
+
114
+ (async function producer() {
115
+ iterable.push(1);
116
+ iterable.push(2);
117
+ iterable.push(3);
118
+ iterable.close();
119
+ })();
120
+
121
+ // Prints "1", "2", "3", "Done".
122
+ ```
123
+
124
+ ### Iterating `ReadableStreamDefaultReader`
125
+
126
+ `readerToAsyncIterableIterator` will convert default reader of `ReadableStream` into an `AsyncIterableIterator` to use in for-loop.
127
+
128
+ ```ts
129
+ const readableStream = new ReadableStream({
130
+ start(controller) {
131
+ controller.enqueue(1);
132
+ controller.enqueue(2);
133
+ controller.close();
134
+ }
135
+ });
136
+
137
+ for await (const value of readerToAsyncIterableIterator(readableStream.getReader())) {
138
+ console.log(value); // Prints "1", "2", "3".
139
+ }
140
+ ```
141
+
142
+ ## Converts `Observable` into `ReadableStream`
143
+
144
+ `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.
145
+
146
+ ```ts
147
+ const observable = Observable.from([1, 2, 3]);
148
+ const readable = observableSubscribeAsReadable(observable);
149
+ const reader = readable.getReader();
150
+
151
+ readable.pipeTo(stream.writable); // Will write 1, 2, 3.
152
+ ```
153
+
60
154
  ## Behaviors
61
155
 
62
156
  ### How this compares to the TC39 proposals?
@@ -0,0 +1,21 @@
1
+ // src/readerToAsyncIterableIterator.ts
2
+ function readerToAsyncIterableIterator(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
+ };
15
+ return iterable;
16
+ }
17
+
18
+ export {
19
+ readerToAsyncIterableIterator
20
+ };
21
+ //# sourceMappingURL=chunk-2HLJODU3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/readerToAsyncIterableIterator.ts"],"sourcesContent":["export function readerToAsyncIterableIterator<T>(reader: ReadableStreamDefaultReader<T>): AsyncIterableIterator<T> {\n const iterable = {\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 };\n\n return iterable;\n}\n"],"mappings":";AAAO,SAAS,8BAAiC,QAAkE;AACjH,QAAM,WAAW;AAAA,IACf,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,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -0,0 +1,62 @@
1
+ import {
2
+ withResolvers
3
+ } from "./chunk-U6G4RNZ2.mjs";
4
+
5
+ // src/observableValues.ts
6
+ var COMPLETE = Symbol("complete");
7
+ var NEXT = Symbol("next");
8
+ var THROW = Symbol("throw");
9
+ function observableValues(observable) {
10
+ const queue = [];
11
+ let deferred = withResolvers();
12
+ const push = (entry) => {
13
+ queue.push(entry);
14
+ deferred.resolve(entry);
15
+ deferred = withResolvers();
16
+ };
17
+ const subscription = observable.subscribe({
18
+ complete() {
19
+ push([COMPLETE]);
20
+ },
21
+ error(err) {
22
+ push([THROW, err]);
23
+ },
24
+ next(value) {
25
+ push([NEXT, value]);
26
+ }
27
+ });
28
+ const asyncIterableIterator = {
29
+ [Symbol.asyncIterator]() {
30
+ return this;
31
+ },
32
+ async next() {
33
+ let entry = queue.shift();
34
+ if (!entry) {
35
+ entry = await deferred.promise;
36
+ queue.shift();
37
+ }
38
+ switch (entry[0]) {
39
+ case COMPLETE:
40
+ return { done: true, value: void 0 };
41
+ case THROW:
42
+ throw entry[1];
43
+ case NEXT:
44
+ return { done: false, value: entry[1] };
45
+ }
46
+ },
47
+ async return() {
48
+ subscription.unsubscribe();
49
+ return { done: true, value: void 0 };
50
+ },
51
+ async throw() {
52
+ subscription.unsubscribe();
53
+ return { done: true, value: void 0 };
54
+ }
55
+ };
56
+ return asyncIterableIterator;
57
+ }
58
+
59
+ export {
60
+ observableValues
61
+ };
62
+ //# sourceMappingURL=chunk-4LRYDU2Y.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/observableValues.ts"],"sourcesContent":["import withResolvers from './private/withResolvers';\n\nimport { Observable } from './Observable';\n\nconst COMPLETE = Symbol('complete');\nconst NEXT = Symbol('next');\nconst THROW = Symbol('throw');\n\ntype Entry<T> = [typeof COMPLETE] | [typeof NEXT, T] | [typeof THROW, unknown];\n\nexport function observableValues<T>(observable: Observable<T>): AsyncIterableIterator<T> {\n const queue: Entry<T>[] = [];\n let deferred = withResolvers<Entry<T>>();\n\n const push = (entry: Entry<T>) => {\n queue.push(entry);\n deferred.resolve(entry);\n deferred = withResolvers();\n };\n\n const subscription = observable.subscribe({\n complete() {\n push([COMPLETE]);\n },\n error(err: unknown) {\n push([THROW, err]);\n },\n next(value: T) {\n push([NEXT, value]);\n }\n });\n\n const asyncIterableIterator: AsyncIterableIterator<T> = {\n [Symbol.asyncIterator]() {\n return this;\n },\n async next(): Promise<IteratorResult<T>> {\n let entry = queue.shift();\n\n if (!entry) {\n entry = await deferred.promise;\n queue.shift();\n }\n\n switch (entry[0]) {\n case COMPLETE:\n return { done: true, value: undefined };\n\n case THROW:\n throw entry[1];\n\n case NEXT:\n return { done: false, value: entry[1] };\n }\n },\n async return() {\n subscription.unsubscribe();\n\n return { done: true, value: undefined };\n },\n async throw() {\n subscription.unsubscribe();\n\n return { done: true, value: undefined };\n }\n };\n\n return asyncIterableIterator;\n}\n"],"mappings":";;;;;AAIA,IAAM,WAAW,OAAO,UAAU;AAClC,IAAM,OAAO,OAAO,MAAM;AAC1B,IAAM,QAAQ,OAAO,OAAO;AAIrB,SAAS,iBAAoB,YAAqD;AACvF,QAAM,QAAoB,CAAC;AAC3B,MAAI,WAAW,cAAwB;AAEvC,QAAM,OAAO,CAAC,UAAoB;AAChC,UAAM,KAAK,KAAK;AAChB,aAAS,QAAQ,KAAK;AACtB,eAAW,cAAc;AAAA,EAC3B;AAEA,QAAM,eAAe,WAAW,UAAU;AAAA,IACxC,WAAW;AACT,WAAK,CAAC,QAAQ,CAAC;AAAA,IACjB;AAAA,IACA,MAAM,KAAc;AAClB,WAAK,CAAC,OAAO,GAAG,CAAC;AAAA,IACnB;AAAA,IACA,KAAK,OAAU;AACb,WAAK,CAAC,MAAM,KAAK,CAAC;AAAA,IACpB;AAAA,EACF,CAAC;AAED,QAAM,wBAAkD;AAAA,IACtD,CAAC,OAAO,aAAa,IAAI;AACvB,aAAO;AAAA,IACT;AAAA,IACA,MAAM,OAAmC;AACvC,UAAI,QAAQ,MAAM,MAAM;AAExB,UAAI,CAAC,OAAO;AACV,gBAAQ,MAAM,SAAS;AACvB,cAAM,MAAM;AAAA,MACd;AAEA,cAAQ,MAAM,CAAC,GAAG;AAAA,QAChB,KAAK;AACH,iBAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,QAExC,KAAK;AACH,gBAAM,MAAM,CAAC;AAAA,QAEf,KAAK;AACH,iBAAO,EAAE,MAAM,OAAO,OAAO,MAAM,CAAC,EAAE;AAAA,MAC1C;AAAA,IACF;AAAA,IACA,MAAM,SAAS;AACb,mBAAa,YAAY;AAEzB,aAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,IACxC;AAAA,IACA,MAAM,QAAQ;AACZ,mBAAa,YAAY;AAEzB,aAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,IACxC;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -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,31 @@
1
+ import {
2
+ Observable
3
+ } from "./chunk-VLF6DI2U.mjs";
4
+
5
+ // src/observableFromAsync.ts
6
+ function observableFromAsync(iterable) {
7
+ return new Observable((subscriber) => {
8
+ let closed = false;
9
+ (async function() {
10
+ try {
11
+ for await (const value of iterable) {
12
+ if (closed) {
13
+ break;
14
+ }
15
+ subscriber.next(value);
16
+ }
17
+ subscriber.complete();
18
+ } catch (error) {
19
+ subscriber.error(error);
20
+ }
21
+ })();
22
+ return () => {
23
+ closed = true;
24
+ };
25
+ });
26
+ }
27
+
28
+ export {
29
+ observableFromAsync
30
+ };
31
+ //# sourceMappingURL=chunk-FEOLYD5R.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/observableFromAsync.ts"],"sourcesContent":["import { Observable } from './Observable';\n\nexport function observableFromAsync<T>(iterable: AsyncIterable<T>): Observable<T> {\n return new Observable(subscriber => {\n let closed = false;\n\n (async function () {\n try {\n for await (const value of iterable) {\n if (closed) {\n break;\n }\n\n subscriber.next(value);\n }\n\n subscriber.complete();\n } catch (error) {\n subscriber.error(error);\n }\n })();\n\n return () => {\n closed = true;\n };\n });\n}\n"],"mappings":";;;;;AAEO,SAAS,oBAAuB,UAA2C;AAChF,SAAO,IAAI,WAAW,gBAAc;AAClC,QAAI,SAAS;AAEb,KAAC,iBAAkB;AACjB,UAAI;AACF,yBAAiB,SAAS,UAAU;AAClC,cAAI,QAAQ;AACV;AAAA,UACF;AAEA,qBAAW,KAAK,KAAK;AAAA,QACvB;AAEA,mBAAW,SAAS;AAAA,MACtB,SAAS,OAAO;AACd,mBAAW,MAAM,KAAK;AAAA,MACxB;AAAA,IACF,GAAG;AAEH,WAAO,MAAM;AACX,eAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,35 @@
1
+ import {
2
+ withResolvers
3
+ } from "./chunk-U6G4RNZ2.mjs";
4
+
5
+ // src/PushAsyncIterableIterator.ts
6
+ var CLOSE = Symbol("close");
7
+ var PushAsyncIterableIterator = class {
8
+ #closed = false;
9
+ #pushResolvers = withResolvers();
10
+ [Symbol.asyncIterator]() {
11
+ return this;
12
+ }
13
+ close() {
14
+ this.#closed = true;
15
+ this.#pushResolvers.resolve(CLOSE);
16
+ }
17
+ async next() {
18
+ const value = await this.#pushResolvers.promise;
19
+ if (value === CLOSE) {
20
+ return { done: true, value: void 0 };
21
+ }
22
+ return { done: false, value };
23
+ }
24
+ push(value) {
25
+ if (!this.#closed) {
26
+ this.#pushResolvers.resolve(value);
27
+ this.#pushResolvers = withResolvers();
28
+ }
29
+ }
30
+ };
31
+
32
+ export {
33
+ PushAsyncIterableIterator
34
+ };
35
+ //# sourceMappingURL=chunk-K5XV4W7G.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/PushAsyncIterableIterator.ts"],"sourcesContent":["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":";;;;;AAEA,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":[]}
@@ -0,0 +1,8 @@
1
+ // src/SymbolObservable.ts
2
+ import CoreJSSymbolObservable from "core-js-pure/features/symbol/observable";
3
+ var SymbolObservable = CoreJSSymbolObservable;
4
+
5
+ export {
6
+ SymbolObservable
7
+ };
8
+ //# sourceMappingURL=chunk-OJMT4K3R.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/SymbolObservable.ts"],"sourcesContent":["// @ts-expect-error core-js is not typed.\nimport CoreJSSymbolObservable from 'core-js-pure/features/symbol/observable';\n\nconst SymbolObservable: unique symbol = CoreJSSymbolObservable;\n\nexport { SymbolObservable };\n"],"mappings":";AACA,OAAO,4BAA4B;AAEnC,IAAM,mBAAkC;","names":[]}
@@ -0,0 +1,10 @@
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
+ export {
8
+ withResolvers
9
+ };
10
+ //# sourceMappingURL=chunk-U6G4RNZ2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/private/withResolvers.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"],"mappings":";AACA,OAAO,gCAAgC;AAExB,SAAR,gBAA6D;AAClE,SAAO,2BAA2B;AACpC;","names":[]}
@@ -0,0 +1,30 @@
1
+ import {
2
+ SymbolObservable
3
+ } from "./chunk-OJMT4K3R.mjs";
4
+
5
+ // src/Observable.ts
6
+ import CoreJSObservable from "core-js-pure/full/observable";
7
+ var Observable = class extends CoreJSObservable {
8
+ constructor(subscriber) {
9
+ super(subscriber);
10
+ }
11
+ subscribe(observerOrOnNext, onError, onComplete) {
12
+ return super.subscribe(observerOrOnNext, onError, onComplete);
13
+ }
14
+ /** Returns itself */
15
+ [SymbolObservable]() {
16
+ return this;
17
+ }
18
+ /** Converts items to an Observable */
19
+ static of(...items) {
20
+ return CoreJSObservable.of(...items);
21
+ }
22
+ static from(iterableOrObservable) {
23
+ return CoreJSObservable.from(iterableOrObservable);
24
+ }
25
+ };
26
+
27
+ export {
28
+ Observable
29
+ };
30
+ //# sourceMappingURL=chunk-VLF6DI2U.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Observable.ts"],"sourcesContent":["// @ts-expect-error core-js is not typed.\nimport CoreJSObservable from 'core-js-pure/full/observable';\n\nimport { SymbolObservable } from './SymbolObservable';\n\nexport interface SubscriptionObserver<T> {\n /** Sends the next value in the sequence */\n next(value: T): void;\n\n /** Sends the sequence error */\n error(errorValue: unknown): void;\n\n /** Sends the completion notification */\n complete(): void;\n\n /** A boolean value indicating whether the subscription is closed */\n get closed(): boolean;\n}\n\nexport interface Subscription {\n /** Cancels the subscription */\n unsubscribe(): void;\n\n /** A boolean value indicating whether the subscription is closed */\n get closed(): boolean;\n}\n\nexport type SubscriberFunction<T> = (observer: SubscriptionObserver<T>) => (() => void) | Subscription | void;\n\nexport type CompleteFunction = () => void;\nexport type ErrorFunction = (errorValue: unknown) => void;\nexport type NextFunction<T> = (value: T) => void;\nexport type StartFunction = (subscription: Subscription) => void;\n\nexport interface Observer<T> {\n /** Receives a completion notification */\n complete?(): void;\n\n /** Receives the sequence error */\n error?(errorValue: unknown): void;\n\n /** Receives the next value in the sequence */\n next?(value: T): void;\n\n /** Receives the subscription object when `subscribe` is called */\n start?(subscription: Subscription): void;\n}\n\nexport class Observable<T> extends CoreJSObservable {\n constructor(subscriber: SubscriberFunction<T>) {\n super(subscriber);\n }\n\n /** Subscribes to the sequence with an observer */\n subscribe(observer: Observer<T>): Subscription;\n\n /** Subscribes to the sequence with callbacks */\n subscribe(\n onNext: NextFunction<T>,\n onError?: ErrorFunction | undefined,\n onComplete?: CompleteFunction | undefined\n ): Subscription;\n\n subscribe(\n observerOrOnNext: Observer<T> | NextFunction<T>,\n onError?: ErrorFunction | undefined,\n onComplete?: CompleteFunction | undefined\n ): Subscription {\n return super.subscribe(observerOrOnNext, onError, onComplete);\n }\n\n /** Returns itself */\n [SymbolObservable](): Observable<T> {\n return this;\n }\n\n /** Converts items to an Observable */\n static of<T>(...items: T[]): Observable<T> {\n return CoreJSObservable.of(...items);\n }\n\n /** Converts an iterable to an Observable */\n static from<T>(iterable: Iterable<T>): Observable<T>;\n\n /** Converts an observable to an Observable */\n static from<T>(observable: Observable<T>): Observable<T>;\n\n static from<T>(iterableOrObservable: Iterable<T> | Observable<T>): Observable<T> {\n return CoreJSObservable.from(iterableOrObservable);\n }\n}\n"],"mappings":";;;;;AACA,OAAO,sBAAsB;AA+CtB,IAAM,aAAN,cAA4B,iBAAiB;AAAA,EAClD,YAAY,YAAmC;AAC7C,UAAM,UAAU;AAAA,EAClB;AAAA,EAYA,UACE,kBACA,SACA,YACc;AACd,WAAO,MAAM,UAAU,kBAAkB,SAAS,UAAU;AAAA,EAC9D;AAAA;AAAA,EAGA,CAAC,gBAAgB,IAAmB;AAClC,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,OAAO,MAAS,OAA2B;AACzC,WAAO,iBAAiB,GAAG,GAAG,KAAK;AAAA,EACrC;AAAA,EAQA,OAAO,KAAQ,sBAAkE;AAC/E,WAAO,iBAAiB,KAAK,oBAAoB;AAAA,EACnD;AACF;","names":[]}
@@ -1,3 +1,6 @@
1
+ export { CompleteFunction, ErrorFunction, NextFunction, Observable, Observer, StartFunction, SubscriberFunction, Subscription, SubscriptionObserver } from './iter-fest.observable.mjs';
2
+ export { PushAsyncIterableIterator } from './iter-fest.pushAsyncIterableIterator.mjs';
3
+ export { SymbolObservable } from './iter-fest.symbolObservable.mjs';
1
4
  export { iterableAt } from './iter-fest.iterableAt.mjs';
2
5
  export { iterableConcat } from './iter-fest.iterableConcat.mjs';
3
6
  export { iterableEntries } from './iter-fest.iterableEntries.mjs';
@@ -19,3 +22,8 @@ export { iterableSome } from './iter-fest.iterableSome.mjs';
19
22
  export { iterableToSpliced } from './iter-fest.iterableToSpliced.mjs';
20
23
  export { iterableToString } from './iter-fest.iterableToString.mjs';
21
24
  export { iteratorToIterable } from './iter-fest.iteratorToIterable.mjs';
25
+ export { observableFromAsync } from './iter-fest.observableFromAsync.mjs';
26
+ export { observableSubscribeAsReadable } from './iter-fest.observableSubscribeAsReadable.mjs';
27
+ export { observableValues } from './iter-fest.observableValues.mjs';
28
+ export { readerToAsyncIterableIterator } from './iter-fest.readerToAsyncIterableIterator.mjs';
29
+ import 'core-js-pure/full/observable';
@@ -1,3 +1,6 @@
1
+ export { CompleteFunction, ErrorFunction, NextFunction, Observable, Observer, StartFunction, SubscriberFunction, Subscription, SubscriptionObserver } from './iter-fest.observable.js';
2
+ export { PushAsyncIterableIterator } from './iter-fest.pushAsyncIterableIterator.js';
3
+ export { SymbolObservable } from './iter-fest.symbolObservable.js';
1
4
  export { iterableAt } from './iter-fest.iterableAt.js';
2
5
  export { iterableConcat } from './iter-fest.iterableConcat.js';
3
6
  export { iterableEntries } from './iter-fest.iterableEntries.js';
@@ -19,3 +22,8 @@ export { iterableSome } from './iter-fest.iterableSome.js';
19
22
  export { iterableToSpliced } from './iter-fest.iterableToSpliced.js';
20
23
  export { iterableToString } from './iter-fest.iterableToString.js';
21
24
  export { iteratorToIterable } from './iter-fest.iteratorToIterable.js';
25
+ export { observableFromAsync } from './iter-fest.observableFromAsync.js';
26
+ export { observableSubscribeAsReadable } from './iter-fest.observableSubscribeAsReadable.js';
27
+ export { observableValues } from './iter-fest.observableValues.js';
28
+ export { readerToAsyncIterableIterator } from './iter-fest.readerToAsyncIterableIterator.js';
29
+ import 'core-js-pure/full/observable';
package/dist/iter-fest.js CHANGED
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,11 +17,22 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
19
  };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
 
20
30
  // src/index.ts
21
31
  var src_exports = {};
22
32
  __export(src_exports, {
33
+ Observable: () => Observable,
34
+ PushAsyncIterableIterator: () => PushAsyncIterableIterator,
35
+ SymbolObservable: () => SymbolObservable,
23
36
  iterableAt: () => iterableAt,
24
37
  iterableConcat: () => iterableConcat,
25
38
  iterableEntries: () => iterableEntries,
@@ -40,10 +53,75 @@ __export(src_exports, {
40
53
  iterableSome: () => iterableSome,
41
54
  iterableToSpliced: () => iterableToSpliced,
42
55
  iterableToString: () => iterableToString,
43
- iteratorToIterable: () => iteratorToIterable
56
+ iteratorToIterable: () => iteratorToIterable,
57
+ observableFromAsync: () => observableFromAsync,
58
+ observableSubscribeAsReadable: () => observableSubscribeAsReadable,
59
+ observableValues: () => observableValues,
60
+ readerToAsyncIterableIterator: () => readerToAsyncIterableIterator
44
61
  });
45
62
  module.exports = __toCommonJS(src_exports);
46
63
 
64
+ // src/Observable.ts
65
+ var import_observable2 = __toESM(require("core-js-pure/full/observable"));
66
+
67
+ // src/SymbolObservable.ts
68
+ var import_observable = __toESM(require("core-js-pure/features/symbol/observable"));
69
+ var SymbolObservable = import_observable.default;
70
+
71
+ // src/Observable.ts
72
+ var Observable = class extends import_observable2.default {
73
+ constructor(subscriber) {
74
+ super(subscriber);
75
+ }
76
+ subscribe(observerOrOnNext, onError, onComplete) {
77
+ return super.subscribe(observerOrOnNext, onError, onComplete);
78
+ }
79
+ /** Returns itself */
80
+ [SymbolObservable]() {
81
+ return this;
82
+ }
83
+ /** Converts items to an Observable */
84
+ static of(...items) {
85
+ return import_observable2.default.of(...items);
86
+ }
87
+ static from(iterableOrObservable) {
88
+ return import_observable2.default.from(iterableOrObservable);
89
+ }
90
+ };
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
+
47
125
  // src/private/toIntegerOrInfinity.ts
48
126
  function toIntegerOrInfinity(value) {
49
127
  if (value === Infinity || value === -Infinity) {
@@ -361,8 +439,128 @@ function iteratorToIterable(iterator) {
361
439
  };
362
440
  return iterableIterator;
363
441
  }
442
+
443
+ // src/observableFromAsync.ts
444
+ function observableFromAsync(iterable) {
445
+ return new Observable((subscriber) => {
446
+ let closed = false;
447
+ (async function() {
448
+ try {
449
+ for await (const value of iterable) {
450
+ if (closed) {
451
+ break;
452
+ }
453
+ subscriber.next(value);
454
+ }
455
+ subscriber.complete();
456
+ } catch (error) {
457
+ subscriber.error(error);
458
+ }
459
+ })();
460
+ return () => {
461
+ closed = true;
462
+ };
463
+ });
464
+ }
465
+
466
+ // src/observableSubscribeAsReadable.ts
467
+ function observableSubscribeAsReadable(observable) {
468
+ let subscription;
469
+ return new ReadableStream({
470
+ cancel() {
471
+ subscription.unsubscribe();
472
+ },
473
+ start(controller) {
474
+ subscription = observable.subscribe({
475
+ complete() {
476
+ controller.close();
477
+ },
478
+ error(err) {
479
+ controller.error(err);
480
+ },
481
+ next(value) {
482
+ controller.enqueue(value);
483
+ }
484
+ });
485
+ }
486
+ });
487
+ }
488
+
489
+ // src/observableValues.ts
490
+ var COMPLETE = Symbol("complete");
491
+ var NEXT = Symbol("next");
492
+ var THROW = Symbol("throw");
493
+ function observableValues(observable) {
494
+ const queue = [];
495
+ let deferred = withResolvers();
496
+ const push = (entry) => {
497
+ queue.push(entry);
498
+ deferred.resolve(entry);
499
+ deferred = withResolvers();
500
+ };
501
+ const subscription = observable.subscribe({
502
+ complete() {
503
+ push([COMPLETE]);
504
+ },
505
+ error(err) {
506
+ push([THROW, err]);
507
+ },
508
+ next(value) {
509
+ push([NEXT, value]);
510
+ }
511
+ });
512
+ const asyncIterableIterator = {
513
+ [Symbol.asyncIterator]() {
514
+ return this;
515
+ },
516
+ async next() {
517
+ let entry = queue.shift();
518
+ if (!entry) {
519
+ entry = await deferred.promise;
520
+ queue.shift();
521
+ }
522
+ switch (entry[0]) {
523
+ case COMPLETE:
524
+ return { done: true, value: void 0 };
525
+ case THROW:
526
+ throw entry[1];
527
+ case NEXT:
528
+ return { done: false, value: entry[1] };
529
+ }
530
+ },
531
+ async return() {
532
+ subscription.unsubscribe();
533
+ return { done: true, value: void 0 };
534
+ },
535
+ async throw() {
536
+ subscription.unsubscribe();
537
+ return { done: true, value: void 0 };
538
+ }
539
+ };
540
+ return asyncIterableIterator;
541
+ }
542
+
543
+ // src/readerToAsyncIterableIterator.ts
544
+ function readerToAsyncIterableIterator(reader) {
545
+ const iterable = {
546
+ [Symbol.asyncIterator]() {
547
+ return iterable;
548
+ },
549
+ async next() {
550
+ const result = await Promise.race([reader.read(), reader.closed]);
551
+ if (!result || result.done) {
552
+ return { done: true, value: void 0 };
553
+ }
554
+ return { value: result.value };
555
+ }
556
+ };
557
+ return iterable;
558
+ }
364
559
  // Annotate the CommonJS export names for ESM import in node:
365
560
  0 && (module.exports = {
561
+ Observable,
562
+ PushAsyncIterableIterator,
563
+ SymbolObservable,
366
564
  iterableAt,
367
565
  iterableConcat,
368
566
  iterableEntries,
@@ -383,6 +581,10 @@ function iteratorToIterable(iterator) {
383
581
  iterableSome,
384
582
  iterableToSpliced,
385
583
  iterableToString,
386
- iteratorToIterable
584
+ iteratorToIterable,
585
+ observableFromAsync,
586
+ observableSubscribeAsReadable,
587
+ observableValues,
588
+ readerToAsyncIterableIterator
387
589
  });
388
590
  //# sourceMappingURL=iter-fest.js.map