iter-fest 0.1.0 → 0.1.1-main.0a3d131
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 +64 -0
- package/dist/chunk-4LRYDU2Y.mjs +62 -0
- package/dist/chunk-4LRYDU2Y.mjs.map +1 -0
- package/dist/chunk-FEOLYD5R.mjs +31 -0
- package/dist/chunk-FEOLYD5R.mjs.map +1 -0
- package/dist/chunk-K5XV4W7G.mjs +35 -0
- package/dist/chunk-K5XV4W7G.mjs.map +1 -0
- package/dist/chunk-OJMT4K3R.mjs +8 -0
- package/dist/chunk-OJMT4K3R.mjs.map +1 -0
- package/dist/chunk-U6G4RNZ2.mjs +10 -0
- package/dist/chunk-U6G4RNZ2.mjs.map +1 -0
- package/dist/chunk-VLF6DI2U.mjs +30 -0
- package/dist/chunk-VLF6DI2U.mjs.map +1 -0
- package/dist/iter-fest.d.mts +6 -0
- package/dist/iter-fest.d.ts +6 -0
- package/dist/iter-fest.js +160 -2
- package/dist/iter-fest.js.map +1 -1
- package/dist/iter-fest.mjs +22 -1
- package/dist/iter-fest.observable.d.mts +51 -0
- package/dist/iter-fest.observable.d.ts +51 -0
- package/dist/iter-fest.observable.js +66 -0
- package/dist/iter-fest.observable.js.map +1 -0
- package/dist/iter-fest.observable.mjs +8 -0
- package/dist/iter-fest.observable.mjs.map +1 -0
- package/dist/iter-fest.observableFromAsync.d.mts +7 -0
- package/dist/iter-fest.observableFromAsync.d.ts +7 -0
- package/dist/iter-fest.observableFromAsync.js +91 -0
- package/dist/iter-fest.observableFromAsync.js.map +1 -0
- package/dist/iter-fest.observableFromAsync.mjs +9 -0
- package/dist/iter-fest.observableFromAsync.mjs.map +1 -0
- package/dist/iter-fest.observableValues.d.mts +7 -0
- package/dist/iter-fest.observableValues.d.ts +7 -0
- package/dist/iter-fest.observableValues.js +100 -0
- package/dist/iter-fest.observableValues.js.map +1 -0
- package/dist/iter-fest.observableValues.mjs +8 -0
- package/dist/iter-fest.observableValues.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.pushAsyncIterableIterator.js +73 -0
- package/dist/iter-fest.pushAsyncIterableIterator.js.map +1 -0
- package/dist/iter-fest.pushAsyncIterableIterator.mjs +8 -0
- package/dist/iter-fest.pushAsyncIterableIterator.mjs.map +1 -0
- package/dist/iter-fest.symbolObservable.d.mts +3 -0
- package/dist/iter-fest.symbolObservable.d.ts +3 -0
- package/dist/iter-fest.symbolObservable.js +42 -0
- package/dist/iter-fest.symbolObservable.js.map +1 -0
- package/dist/iter-fest.symbolObservable.mjs +7 -0
- package/dist/iter-fest.symbolObservable.mjs.map +1 -0
- package/package.json +66 -12
package/README.md
CHANGED
|
@@ -57,6 +57,70 @@ 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
|
+
|
|
60
124
|
## Behaviors
|
|
61
125
|
|
|
62
126
|
### How this compares to the TC39 proposals?
|
|
@@ -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,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 @@
|
|
|
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":[]}
|
package/dist/iter-fest.d.mts
CHANGED
|
@@ -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,6 @@ 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 { observableValues } from './iter-fest.observableValues.mjs';
|
|
27
|
+
import 'core-js-pure/full/observable';
|
package/dist/iter-fest.d.ts
CHANGED
|
@@ -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,6 @@ 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 { observableValues } from './iter-fest.observableValues.js';
|
|
27
|
+
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,73 @@ __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
|
+
observableValues: () => observableValues
|
|
44
59
|
});
|
|
45
60
|
module.exports = __toCommonJS(src_exports);
|
|
46
61
|
|
|
62
|
+
// src/Observable.ts
|
|
63
|
+
var import_observable2 = __toESM(require("core-js-pure/full/observable"));
|
|
64
|
+
|
|
65
|
+
// src/SymbolObservable.ts
|
|
66
|
+
var import_observable = __toESM(require("core-js-pure/features/symbol/observable"));
|
|
67
|
+
var SymbolObservable = import_observable.default;
|
|
68
|
+
|
|
69
|
+
// src/Observable.ts
|
|
70
|
+
var Observable = class extends import_observable2.default {
|
|
71
|
+
constructor(subscriber) {
|
|
72
|
+
super(subscriber);
|
|
73
|
+
}
|
|
74
|
+
subscribe(observerOrOnNext, onError, onComplete) {
|
|
75
|
+
return super.subscribe(observerOrOnNext, onError, onComplete);
|
|
76
|
+
}
|
|
77
|
+
/** Returns itself */
|
|
78
|
+
[SymbolObservable]() {
|
|
79
|
+
return this;
|
|
80
|
+
}
|
|
81
|
+
/** Converts items to an Observable */
|
|
82
|
+
static of(...items) {
|
|
83
|
+
return import_observable2.default.of(...items);
|
|
84
|
+
}
|
|
85
|
+
static from(iterableOrObservable) {
|
|
86
|
+
return import_observable2.default.from(iterableOrObservable);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
// src/private/withResolvers.ts
|
|
91
|
+
var import_with_resolvers = __toESM(require("core-js-pure/full/promise/with-resolvers"));
|
|
92
|
+
function withResolvers() {
|
|
93
|
+
return (0, import_with_resolvers.default)();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// src/PushAsyncIterableIterator.ts
|
|
97
|
+
var CLOSE = Symbol("close");
|
|
98
|
+
var PushAsyncIterableIterator = class {
|
|
99
|
+
#closed = false;
|
|
100
|
+
#pushResolvers = withResolvers();
|
|
101
|
+
[Symbol.asyncIterator]() {
|
|
102
|
+
return this;
|
|
103
|
+
}
|
|
104
|
+
close() {
|
|
105
|
+
this.#closed = true;
|
|
106
|
+
this.#pushResolvers.resolve(CLOSE);
|
|
107
|
+
}
|
|
108
|
+
async next() {
|
|
109
|
+
const value = await this.#pushResolvers.promise;
|
|
110
|
+
if (value === CLOSE) {
|
|
111
|
+
return { done: true, value: void 0 };
|
|
112
|
+
}
|
|
113
|
+
return { done: false, value };
|
|
114
|
+
}
|
|
115
|
+
push(value) {
|
|
116
|
+
if (!this.#closed) {
|
|
117
|
+
this.#pushResolvers.resolve(value);
|
|
118
|
+
this.#pushResolvers = withResolvers();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
|
|
47
123
|
// src/private/toIntegerOrInfinity.ts
|
|
48
124
|
function toIntegerOrInfinity(value) {
|
|
49
125
|
if (value === Infinity || value === -Infinity) {
|
|
@@ -361,8 +437,88 @@ function iteratorToIterable(iterator) {
|
|
|
361
437
|
};
|
|
362
438
|
return iterableIterator;
|
|
363
439
|
}
|
|
440
|
+
|
|
441
|
+
// src/observableFromAsync.ts
|
|
442
|
+
function observableFromAsync(iterable) {
|
|
443
|
+
return new Observable((subscriber) => {
|
|
444
|
+
let closed = false;
|
|
445
|
+
(async function() {
|
|
446
|
+
try {
|
|
447
|
+
for await (const value of iterable) {
|
|
448
|
+
if (closed) {
|
|
449
|
+
break;
|
|
450
|
+
}
|
|
451
|
+
subscriber.next(value);
|
|
452
|
+
}
|
|
453
|
+
subscriber.complete();
|
|
454
|
+
} catch (error) {
|
|
455
|
+
subscriber.error(error);
|
|
456
|
+
}
|
|
457
|
+
})();
|
|
458
|
+
return () => {
|
|
459
|
+
closed = true;
|
|
460
|
+
};
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
// src/observableValues.ts
|
|
465
|
+
var COMPLETE = Symbol("complete");
|
|
466
|
+
var NEXT = Symbol("next");
|
|
467
|
+
var THROW = Symbol("throw");
|
|
468
|
+
function observableValues(observable) {
|
|
469
|
+
const queue = [];
|
|
470
|
+
let deferred = withResolvers();
|
|
471
|
+
const push = (entry) => {
|
|
472
|
+
queue.push(entry);
|
|
473
|
+
deferred.resolve(entry);
|
|
474
|
+
deferred = withResolvers();
|
|
475
|
+
};
|
|
476
|
+
const subscription = observable.subscribe({
|
|
477
|
+
complete() {
|
|
478
|
+
push([COMPLETE]);
|
|
479
|
+
},
|
|
480
|
+
error(err) {
|
|
481
|
+
push([THROW, err]);
|
|
482
|
+
},
|
|
483
|
+
next(value) {
|
|
484
|
+
push([NEXT, value]);
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
const asyncIterableIterator = {
|
|
488
|
+
[Symbol.asyncIterator]() {
|
|
489
|
+
return this;
|
|
490
|
+
},
|
|
491
|
+
async next() {
|
|
492
|
+
let entry = queue.shift();
|
|
493
|
+
if (!entry) {
|
|
494
|
+
entry = await deferred.promise;
|
|
495
|
+
queue.shift();
|
|
496
|
+
}
|
|
497
|
+
switch (entry[0]) {
|
|
498
|
+
case COMPLETE:
|
|
499
|
+
return { done: true, value: void 0 };
|
|
500
|
+
case THROW:
|
|
501
|
+
throw entry[1];
|
|
502
|
+
case NEXT:
|
|
503
|
+
return { done: false, value: entry[1] };
|
|
504
|
+
}
|
|
505
|
+
},
|
|
506
|
+
async return() {
|
|
507
|
+
subscription.unsubscribe();
|
|
508
|
+
return { done: true, value: void 0 };
|
|
509
|
+
},
|
|
510
|
+
async throw() {
|
|
511
|
+
subscription.unsubscribe();
|
|
512
|
+
return { done: true, value: void 0 };
|
|
513
|
+
}
|
|
514
|
+
};
|
|
515
|
+
return asyncIterableIterator;
|
|
516
|
+
}
|
|
364
517
|
// Annotate the CommonJS export names for ESM import in node:
|
|
365
518
|
0 && (module.exports = {
|
|
519
|
+
Observable,
|
|
520
|
+
PushAsyncIterableIterator,
|
|
521
|
+
SymbolObservable,
|
|
366
522
|
iterableAt,
|
|
367
523
|
iterableConcat,
|
|
368
524
|
iterableEntries,
|
|
@@ -383,6 +539,8 @@ function iteratorToIterable(iterator) {
|
|
|
383
539
|
iterableSome,
|
|
384
540
|
iterableToSpliced,
|
|
385
541
|
iterableToString,
|
|
386
|
-
iteratorToIterable
|
|
542
|
+
iteratorToIterable,
|
|
543
|
+
observableFromAsync,
|
|
544
|
+
observableValues
|
|
387
545
|
});
|
|
388
546
|
//# sourceMappingURL=iter-fest.js.map
|