asygen 0.0.13 → 0.1.0
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 +21 -0
- package/build/combine.cjs +34 -0
- package/build/combine.cjs.map +1 -0
- package/build/combine.d.ts +5 -0
- package/build/combine.js +26 -0
- package/build/combine.js.map +1 -0
- package/build/deferredPoll.cjs +34 -0
- package/build/deferredPoll.cjs.map +1 -0
- package/build/deferredPoll.d.ts +6 -0
- package/build/deferredPoll.js +26 -0
- package/build/deferredPoll.js.map +1 -0
- package/build/generatorify.cjs +8 -23
- package/build/generatorify.cjs.map +1 -1
- package/build/generatorify.d.ts +2 -2
- package/build/generatorify.js +8 -23
- package/build/generatorify.js.map +1 -1
- package/build/index.cjs +2 -0
- package/build/index.cjs.map +1 -1
- package/build/index.d.ts +2 -0
- package/build/index.js +2 -0
- package/build/index.js.map +1 -1
- package/package.json +13 -8
- package/src/combine.ts +21 -0
- package/src/deferredPoll.ts +25 -0
- package/src/generatorify.ts +8 -18
- package/src/index.ts +2 -0
package/README.md
CHANGED
|
@@ -44,6 +44,27 @@ for await (const data of generatorify(task)) {
|
|
|
44
44
|
}
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
+
#### Combine generators
|
|
48
|
+
```typescript
|
|
49
|
+
import { combine } from 'asygen';
|
|
50
|
+
|
|
51
|
+
const sleep = (timeout: number) => new Promise(resolve => setTimeout(resolve, timeout));
|
|
52
|
+
|
|
53
|
+
async function* generate(timeout: number, count: number) {
|
|
54
|
+
for (let index = 0; index < count; index++) {
|
|
55
|
+
yield index;
|
|
56
|
+
await sleep(timeout);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
for await (const data of combine(generate(100, 5), generate(500, 2))) {
|
|
61
|
+
// handle data
|
|
62
|
+
}
|
|
63
|
+
// First: 0 1 2 3 4 -
|
|
64
|
+
// Second: 0 . . . . 1
|
|
65
|
+
// Combined: 0 0 1 2 3 4 1
|
|
66
|
+
```
|
|
67
|
+
|
|
47
68
|
## License
|
|
48
69
|
|
|
49
70
|
License [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "combine", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: ()=>combine
|
|
8
|
+
});
|
|
9
|
+
const _deferredPollCjs = require("./deferredPoll.cjs");
|
|
10
|
+
const combine = (...iterables)=>{
|
|
11
|
+
const poll = (0, _deferredPollCjs.createPoll)();
|
|
12
|
+
Promise.all(iterables.map(async (iterable)=>{
|
|
13
|
+
for await (const value of iterable){
|
|
14
|
+
await poll.push({
|
|
15
|
+
value,
|
|
16
|
+
done: false
|
|
17
|
+
}).promise;
|
|
18
|
+
}
|
|
19
|
+
})).then(async ()=>poll.done({
|
|
20
|
+
value: null,
|
|
21
|
+
done: true
|
|
22
|
+
}));
|
|
23
|
+
return {
|
|
24
|
+
[Symbol.asyncIterator] () {
|
|
25
|
+
return {
|
|
26
|
+
next () {
|
|
27
|
+
return poll.pull().promise;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=combine.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/combine.ts"],"sourcesContent":["import { createPoll } from './deferredPoll';\n\nexport const combine = <T, R = unknown>(...iterables: AsyncIterable<T>[]) => {\n const poll = createPoll<IteratorResult<T, R>>();\n\n Promise.all(iterables.map(async (iterable) => {\n for await (const value of iterable) {\n await poll.push({ value, done: false }).promise;\n }\n })).then(async () => poll.done({ value: null, done: true }));\n\n return {\n [Symbol.asyncIterator]() {\n return {\n next() {\n return poll.pull().promise;\n },\n };\n }\n };\n};\n"],"names":["combine","iterables","poll","createPoll","Promise","all","map","iterable","value","push","done","promise","then","Symbol","asyncIterator","next","pull"],"mappings":";;;;+BAEaA;;aAAAA;;iCAFc;AAEpB,MAAMA,UAAU,CAAiB,GAAGC,YAAkC;IAC3E,MAAMC,OAAOC,IAAAA,2BAAU;IAEvBC,QAAQC,GAAG,CAACJ,UAAUK,GAAG,CAAC,OAAOC,WAAa;QAC5C,WAAW,MAAMC,SAASD,SAAU;YAClC,MAAML,KAAKO,IAAI,CAAC;gBAAED;gBAAOE,MAAM,KAAK;YAAC,GAAGC,OAAO;QACjD;IACF,IAAIC,IAAI,CAAC,UAAYV,KAAKQ,IAAI,CAAC;YAAEF,OAAO,IAAI;YAAEE,MAAM,IAAI;QAAC;IAEzD,OAAO;QACL,CAACG,OAAOC,aAAa,CAAC,IAAG;YACvB,OAAO;gBACLC,QAAO;oBACL,OAAOb,KAAKc,IAAI,GAAGL,OAAO;gBAC5B;YACF;QACF;IACF;AACF"}
|
package/build/combine.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { createPoll } from "./deferredPoll.js";
|
|
2
|
+
export const combine = (...iterables)=>{
|
|
3
|
+
const poll = createPoll();
|
|
4
|
+
Promise.all(iterables.map(async (iterable)=>{
|
|
5
|
+
for await (const value of iterable){
|
|
6
|
+
await poll.push({
|
|
7
|
+
value,
|
|
8
|
+
done: false
|
|
9
|
+
}).promise;
|
|
10
|
+
}
|
|
11
|
+
})).then(async ()=>poll.done({
|
|
12
|
+
value: null,
|
|
13
|
+
done: true
|
|
14
|
+
}));
|
|
15
|
+
return {
|
|
16
|
+
[Symbol.asyncIterator] () {
|
|
17
|
+
return {
|
|
18
|
+
next () {
|
|
19
|
+
return poll.pull().promise;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=combine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/combine.ts"],"sourcesContent":["import { createPoll } from './deferredPoll';\n\nexport const combine = <T, R = unknown>(...iterables: AsyncIterable<T>[]) => {\n const poll = createPoll<IteratorResult<T, R>>();\n\n Promise.all(iterables.map(async (iterable) => {\n for await (const value of iterable) {\n await poll.push({ value, done: false }).promise;\n }\n })).then(async () => poll.done({ value: null, done: true }));\n\n return {\n [Symbol.asyncIterator]() {\n return {\n next() {\n return poll.pull().promise;\n },\n };\n }\n };\n};\n"],"names":["createPoll","combine","iterables","poll","Promise","all","map","iterable","value","push","done","promise","then","Symbol","asyncIterator","next","pull"],"mappings":"AAAA,SAASA,UAAU,QAAQ,oBAAiB;AAE5C,OAAO,MAAMC,UAAU,CAAiB,GAAGC,YAAkC;IAC3E,MAAMC,OAAOH;IAEbI,QAAQC,GAAG,CAACH,UAAUI,GAAG,CAAC,OAAOC,WAAa;QAC5C,WAAW,MAAMC,SAASD,SAAU;YAClC,MAAMJ,KAAKM,IAAI,CAAC;gBAAED;gBAAOE,MAAM,KAAK;YAAC,GAAGC,OAAO;QACjD;IACF,IAAIC,IAAI,CAAC,UAAYT,KAAKO,IAAI,CAAC;YAAEF,OAAO,IAAI;YAAEE,MAAM,IAAI;QAAC;IAEzD,OAAO;QACL,CAACG,OAAOC,aAAa,CAAC,IAAG;YACvB,OAAO;gBACLC,QAAO;oBACL,OAAOZ,KAAKa,IAAI,GAAGL,OAAO;gBAC5B;YACF;QACF;IACF;AACF,EAAE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "createPoll", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: ()=>createPoll
|
|
8
|
+
});
|
|
9
|
+
const _deferCjs = require("./defer.cjs");
|
|
10
|
+
const createPoll = ()=>{
|
|
11
|
+
const dPoll = [
|
|
12
|
+
(0, _deferCjs.defer)()
|
|
13
|
+
];
|
|
14
|
+
return {
|
|
15
|
+
push (value) {
|
|
16
|
+
const next = (0, _deferCjs.defer)();
|
|
17
|
+
const prev = dPoll.push(next) - 2;
|
|
18
|
+
const prevDeferred = dPoll[prev];
|
|
19
|
+
prevDeferred.resolve(value);
|
|
20
|
+
return prevDeferred;
|
|
21
|
+
},
|
|
22
|
+
pull () {
|
|
23
|
+
const current = dPoll[0];
|
|
24
|
+
current.promise.then(()=>dPoll.shift());
|
|
25
|
+
return current;
|
|
26
|
+
},
|
|
27
|
+
done (value) {
|
|
28
|
+
dPoll[dPoll.length - 1].resolve(value);
|
|
29
|
+
return Promise.all(dPoll.map((d)=>d.promise));
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=deferredPoll.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/deferredPoll.ts"],"sourcesContent":["import { defer, Deferred } from './defer';\n\nexport const createPoll = <T>() => {\n const dPoll: Deferred<T>[] = [defer<T>()];\n\n return {\n push(value: T) {\n const next = defer<T>();\n const prev = dPoll.push(next) - 2;\n const prevDeferred = dPoll[prev] as Deferred<T>;\n prevDeferred.resolve(value);\n\n return prevDeferred;\n },\n pull() {\n const current = dPoll[0];\n current.promise.then(() => dPoll.shift());\n return current;\n },\n done(value: T) {\n dPoll[dPoll.length - 1].resolve(value);\n return Promise.all(dPoll.map(d => d.promise));\n }\n };\n}\n"],"names":["createPoll","dPoll","defer","push","value","next","prev","prevDeferred","resolve","pull","current","promise","then","shift","done","length","Promise","all","map","d"],"mappings":";;;;+BAEaA;;aAAAA;;0BAFmB;AAEzB,MAAMA,aAAa,IAAS;IACjC,MAAMC,QAAuB;QAACC,IAAAA,eAAK;KAAM;IAEzC,OAAO;QACLC,MAAKC,KAAQ,EAAE;YACb,MAAMC,OAAOH,IAAAA,eAAK;YAClB,MAAMI,OAAOL,MAAME,IAAI,CAACE,QAAQ;YAChC,MAAME,eAAeN,KAAK,CAACK,KAAK;YAChCC,aAAaC,OAAO,CAACJ;YAErB,OAAOG;QACT;QACAE,QAAO;YACL,MAAMC,UAAUT,KAAK,CAAC,EAAE;YACxBS,QAAQC,OAAO,CAACC,IAAI,CAAC,IAAMX,MAAMY,KAAK;YACtC,OAAOH;QACT;QACAI,MAAKV,KAAQ,EAAE;YACbH,KAAK,CAACA,MAAMc,MAAM,GAAG,EAAE,CAACP,OAAO,CAACJ;YAChC,OAAOY,QAAQC,GAAG,CAAChB,MAAMiB,GAAG,CAACC,CAAAA,IAAKA,EAAER,OAAO;QAC7C;IACF;AACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { defer } from "./defer.js";
|
|
2
|
+
export const createPoll = ()=>{
|
|
3
|
+
const dPoll = [
|
|
4
|
+
defer()
|
|
5
|
+
];
|
|
6
|
+
return {
|
|
7
|
+
push (value) {
|
|
8
|
+
const next = defer();
|
|
9
|
+
const prev = dPoll.push(next) - 2;
|
|
10
|
+
const prevDeferred = dPoll[prev];
|
|
11
|
+
prevDeferred.resolve(value);
|
|
12
|
+
return prevDeferred;
|
|
13
|
+
},
|
|
14
|
+
pull () {
|
|
15
|
+
const current = dPoll[0];
|
|
16
|
+
current.promise.then(()=>dPoll.shift());
|
|
17
|
+
return current;
|
|
18
|
+
},
|
|
19
|
+
done (value) {
|
|
20
|
+
dPoll[dPoll.length - 1].resolve(value);
|
|
21
|
+
return Promise.all(dPoll.map((d)=>d.promise));
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=deferredPoll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/deferredPoll.ts"],"sourcesContent":["import { defer, Deferred } from './defer';\n\nexport const createPoll = <T>() => {\n const dPoll: Deferred<T>[] = [defer<T>()];\n\n return {\n push(value: T) {\n const next = defer<T>();\n const prev = dPoll.push(next) - 2;\n const prevDeferred = dPoll[prev] as Deferred<T>;\n prevDeferred.resolve(value);\n\n return prevDeferred;\n },\n pull() {\n const current = dPoll[0];\n current.promise.then(() => dPoll.shift());\n return current;\n },\n done(value: T) {\n dPoll[dPoll.length - 1].resolve(value);\n return Promise.all(dPoll.map(d => d.promise));\n }\n };\n}\n"],"names":["defer","createPoll","dPoll","push","value","next","prev","prevDeferred","resolve","pull","current","promise","then","shift","done","length","Promise","all","map","d"],"mappings":"AAAA,SAASA,KAAK,QAAkB,aAAU;AAE1C,OAAO,MAAMC,aAAa,IAAS;IACjC,MAAMC,QAAuB;QAACF;KAAW;IAEzC,OAAO;QACLG,MAAKC,KAAQ,EAAE;YACb,MAAMC,OAAOL;YACb,MAAMM,OAAOJ,MAAMC,IAAI,CAACE,QAAQ;YAChC,MAAME,eAAeL,KAAK,CAACI,KAAK;YAChCC,aAAaC,OAAO,CAACJ;YAErB,OAAOG;QACT;QACAE,QAAO;YACL,MAAMC,UAAUR,KAAK,CAAC,EAAE;YACxBQ,QAAQC,OAAO,CAACC,IAAI,CAAC,IAAMV,MAAMW,KAAK;YACtC,OAAOH;QACT;QACAI,MAAKV,KAAQ,EAAE;YACbF,KAAK,CAACA,MAAMa,MAAM,GAAG,EAAE,CAACP,OAAO,CAACJ;YAChC,OAAOY,QAAQC,GAAG,CAACf,MAAMgB,GAAG,CAACC,CAAAA,IAAKA,EAAER,OAAO;QAC7C;IACF;AACF,EAAC"}
|
package/build/generatorify.cjs
CHANGED
|
@@ -6,38 +6,23 @@ Object.defineProperty(exports, "generatorify", {
|
|
|
6
6
|
enumerable: true,
|
|
7
7
|
get: ()=>generatorify
|
|
8
8
|
});
|
|
9
|
-
const
|
|
9
|
+
const _deferredPollCjs = require("./deferredPoll.cjs");
|
|
10
10
|
const generatorify = (task)=>{
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
Promise.resolve(task((value)=>{
|
|
15
|
-
const next = (0, _deferCjs.defer)();
|
|
16
|
-
const prev = dPoll.push(next) - 2;
|
|
17
|
-
const prevDeferred = dPoll[prev];
|
|
18
|
-
prevDeferred.resolve({
|
|
11
|
+
const poll = (0, _deferredPollCjs.createPoll)();
|
|
12
|
+
Promise.resolve(task(async (value)=>{
|
|
13
|
+
await poll.push({
|
|
19
14
|
value,
|
|
20
15
|
done: false
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
})).then(async (value)=>{
|
|
24
|
-
dPoll[dPoll.length - 1].resolve({
|
|
16
|
+
}).promise;
|
|
17
|
+
})).then(async (value)=>poll.done({
|
|
25
18
|
value,
|
|
26
19
|
done: true
|
|
27
|
-
});
|
|
28
|
-
await Promise.all(dPoll.map((d)=>d.promise));
|
|
29
|
-
return {
|
|
30
|
-
value,
|
|
31
|
-
done: true
|
|
32
|
-
};
|
|
33
|
-
});
|
|
20
|
+
}));
|
|
34
21
|
return {
|
|
35
22
|
[Symbol.asyncIterator] () {
|
|
36
23
|
return {
|
|
37
24
|
next () {
|
|
38
|
-
|
|
39
|
-
current.promise.then(()=>dPoll.shift());
|
|
40
|
-
return current.promise;
|
|
25
|
+
return poll.pull().promise;
|
|
41
26
|
}
|
|
42
27
|
};
|
|
43
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generatorify.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../src/generatorify.ts"],"sourcesContent":["import { createPoll } from './deferredPoll';\n\nexport interface TaskCallback<T> {\n (value: T): Promise<void>;\n}\n\nexport interface Task<T, R = unknown> {\n (callback: TaskCallback<T>): R;\n}\n\nexport const generatorify = <T, R>(task: Task<T, R>): AsyncIterable<T> => {\n const poll = createPoll<IteratorResult<T, R>>();\n\n Promise.resolve(task(async value => {\n await poll.push({ value, done: false }).promise;\n })).then(async (value) => poll.done({ value, done: true }));\n\n return {\n [Symbol.asyncIterator]() {\n return {\n next() {\n return poll.pull().promise;\n },\n };\n }\n };\n}\n"],"names":["generatorify","task","poll","createPoll","Promise","resolve","value","push","done","promise","then","Symbol","asyncIterator","next","pull"],"mappings":";;;;+BAUaA;;aAAAA;;iCAVc;AAUpB,MAAMA,eAAe,CAAOC,OAAuC;IACxE,MAAMC,OAAOC,IAAAA,2BAAU;IAEvBC,QAAQC,OAAO,CAACJ,KAAK,OAAMK,QAAS;QAClC,MAAMJ,KAAKK,IAAI,CAAC;YAAED;YAAOE,MAAM,KAAK;QAAC,GAAGC,OAAO;IACjD,IAAIC,IAAI,CAAC,OAAOJ,QAAUJ,KAAKM,IAAI,CAAC;YAAEF;YAAOE,MAAM,IAAI;QAAC;IAExD,OAAO;QACL,CAACG,OAAOC,aAAa,CAAC,IAAG;YACvB,OAAO;gBACLC,QAAO;oBACL,OAAOX,KAAKY,IAAI,GAAGL,OAAO;gBAC5B;YACF;QACF;IACF;AACF"}
|
package/build/generatorify.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export interface TaskCallback<T> {
|
|
2
|
-
(value: T): Promise<
|
|
2
|
+
(value: T): Promise<void>;
|
|
3
3
|
}
|
|
4
4
|
export interface Task<T, R = unknown> {
|
|
5
5
|
(callback: TaskCallback<T>): R;
|
|
6
6
|
}
|
|
7
|
-
export declare const generatorify: <T, R
|
|
7
|
+
export declare const generatorify: <T, R>(task: Task<T, R>) => AsyncIterable<T>;
|
package/build/generatorify.js
CHANGED
|
@@ -1,35 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createPoll } from "./deferredPoll.js";
|
|
2
2
|
export const generatorify = (task)=>{
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
Promise.resolve(task((value)=>{
|
|
7
|
-
const next = defer();
|
|
8
|
-
const prev = dPoll.push(next) - 2;
|
|
9
|
-
const prevDeferred = dPoll[prev];
|
|
10
|
-
prevDeferred.resolve({
|
|
3
|
+
const poll = createPoll();
|
|
4
|
+
Promise.resolve(task(async (value)=>{
|
|
5
|
+
await poll.push({
|
|
11
6
|
value,
|
|
12
7
|
done: false
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
})).then(async (value)=>{
|
|
16
|
-
dPoll[dPoll.length - 1].resolve({
|
|
8
|
+
}).promise;
|
|
9
|
+
})).then(async (value)=>poll.done({
|
|
17
10
|
value,
|
|
18
11
|
done: true
|
|
19
|
-
});
|
|
20
|
-
await Promise.all(dPoll.map((d)=>d.promise));
|
|
21
|
-
return {
|
|
22
|
-
value,
|
|
23
|
-
done: true
|
|
24
|
-
};
|
|
25
|
-
});
|
|
12
|
+
}));
|
|
26
13
|
return {
|
|
27
14
|
[Symbol.asyncIterator] () {
|
|
28
15
|
return {
|
|
29
16
|
next () {
|
|
30
|
-
|
|
31
|
-
current.promise.then(()=>dPoll.shift());
|
|
32
|
-
return current.promise;
|
|
17
|
+
return poll.pull().promise;
|
|
33
18
|
}
|
|
34
19
|
};
|
|
35
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generatorify.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../src/generatorify.ts"],"sourcesContent":["import { createPoll } from './deferredPoll';\n\nexport interface TaskCallback<T> {\n (value: T): Promise<void>;\n}\n\nexport interface Task<T, R = unknown> {\n (callback: TaskCallback<T>): R;\n}\n\nexport const generatorify = <T, R>(task: Task<T, R>): AsyncIterable<T> => {\n const poll = createPoll<IteratorResult<T, R>>();\n\n Promise.resolve(task(async value => {\n await poll.push({ value, done: false }).promise;\n })).then(async (value) => poll.done({ value, done: true }));\n\n return {\n [Symbol.asyncIterator]() {\n return {\n next() {\n return poll.pull().promise;\n },\n };\n }\n };\n}\n"],"names":["createPoll","generatorify","task","poll","Promise","resolve","value","push","done","promise","then","Symbol","asyncIterator","next","pull"],"mappings":"AAAA,SAASA,UAAU,QAAQ,oBAAiB;AAU5C,OAAO,MAAMC,eAAe,CAAOC,OAAuC;IACxE,MAAMC,OAAOH;IAEbI,QAAQC,OAAO,CAACH,KAAK,OAAMI,QAAS;QAClC,MAAMH,KAAKI,IAAI,CAAC;YAAED;YAAOE,MAAM,KAAK;QAAC,GAAGC,OAAO;IACjD,IAAIC,IAAI,CAAC,OAAOJ,QAAUH,KAAKK,IAAI,CAAC;YAAEF;YAAOE,MAAM,IAAI;QAAC;IAExD,OAAO;QACL,CAACG,OAAOC,aAAa,CAAC,IAAG;YACvB,OAAO;gBACLC,QAAO;oBACL,OAAOV,KAAKW,IAAI,GAAGL,OAAO;gBAC5B;YACF;QACF;IACF;AACF,EAAC"}
|
package/build/index.cjs
CHANGED
|
@@ -4,6 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
});
|
|
5
5
|
_exportStar(require("./defer.cjs"), exports);
|
|
6
6
|
_exportStar(require("./generatorify.cjs"), exports);
|
|
7
|
+
_exportStar(require("./deferredPoll.cjs"), exports);
|
|
8
|
+
_exportStar(require("./combine.cjs"), exports);
|
|
7
9
|
function _exportStar(from, to) {
|
|
8
10
|
Object.keys(from).forEach(function(k) {
|
|
9
11
|
if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) Object.defineProperty(to, k, {
|
package/build/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './defer';\nexport * from './generatorify';\n"],"names":[],"mappings":";;;;oBAAc;oBACA"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './defer';\nexport * from './generatorify';\nexport * from './deferredPoll';\nexport * from './combine';\n"],"names":[],"mappings":";;;;oBAAc;oBACA;oBACA;oBACA"}
|
package/build/index.d.ts
CHANGED
package/build/index.js
CHANGED
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './defer';\nexport * from './generatorify';\n"],"names":[],"mappings":"AAAA,cAAc,aAAU;AACxB,cAAc,oBAAiB"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './defer';\nexport * from './generatorify';\nexport * from './deferredPoll';\nexport * from './combine';\n"],"names":[],"mappings":"AAAA,cAAc,aAAU;AACxB,cAAc,oBAAiB;AAC/B,cAAc,oBAAiB;AAC/B,cAAc,eAAY"}
|
package/package.json
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "asygen",
|
|
3
3
|
"description": "0-Deps, simple and fast async generator library for browser and NodeJS",
|
|
4
|
-
"version": "0.0
|
|
4
|
+
"version": "0.1.0",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"types": "build/index.d.ts",
|
|
6
7
|
"main": "build/index.cjs",
|
|
7
8
|
"module": "build/index.js",
|
|
8
|
-
"
|
|
9
|
+
"exports": {
|
|
10
|
+
"require": "./build/index.cjs",
|
|
11
|
+
"import": "./build/index.js"
|
|
12
|
+
},
|
|
9
13
|
"files": [
|
|
10
14
|
"build",
|
|
11
|
-
"src/
|
|
15
|
+
"src/combine.ts",
|
|
12
16
|
"src/defer.ts",
|
|
13
|
-
"src/
|
|
17
|
+
"src/deferredPoll.ts",
|
|
18
|
+
"src/generatorify.ts",
|
|
19
|
+
"src/index.ts"
|
|
14
20
|
],
|
|
15
|
-
"sideEffects": false,
|
|
16
21
|
"scripts": {
|
|
17
22
|
"build": "rm -rf build && inop src build -p -i __tests__ && tsc --declaration --emitDeclarationOnly",
|
|
18
23
|
"test": "jest",
|
|
@@ -50,13 +55,13 @@
|
|
|
50
55
|
},
|
|
51
56
|
"homepage": "https://github.com/3axap4eHko/asygen#readme",
|
|
52
57
|
"devDependencies": {
|
|
53
|
-
"@swc/core": "^1.3.
|
|
58
|
+
"@swc/core": "^1.3.50",
|
|
54
59
|
"@swc/jest": "^0.2.24",
|
|
55
60
|
"@types/jest": "^29.5.0",
|
|
56
61
|
"@types/node": "^18.15.11",
|
|
57
62
|
"fast-glob": "^3.2.12",
|
|
58
|
-
"inop": "^0.
|
|
63
|
+
"inop": "^0.2.2",
|
|
59
64
|
"jest": "^29.5.0",
|
|
60
65
|
"typescript": "^5.0.4"
|
|
61
66
|
}
|
|
62
|
-
}
|
|
67
|
+
}
|
package/src/combine.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createPoll } from './deferredPoll';
|
|
2
|
+
|
|
3
|
+
export const combine = <T, R = unknown>(...iterables: AsyncIterable<T>[]) => {
|
|
4
|
+
const poll = createPoll<IteratorResult<T, R>>();
|
|
5
|
+
|
|
6
|
+
Promise.all(iterables.map(async (iterable) => {
|
|
7
|
+
for await (const value of iterable) {
|
|
8
|
+
await poll.push({ value, done: false }).promise;
|
|
9
|
+
}
|
|
10
|
+
})).then(async () => poll.done({ value: null, done: true }));
|
|
11
|
+
|
|
12
|
+
return {
|
|
13
|
+
[Symbol.asyncIterator]() {
|
|
14
|
+
return {
|
|
15
|
+
next() {
|
|
16
|
+
return poll.pull().promise;
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { defer, Deferred } from './defer';
|
|
2
|
+
|
|
3
|
+
export const createPoll = <T>() => {
|
|
4
|
+
const dPoll: Deferred<T>[] = [defer<T>()];
|
|
5
|
+
|
|
6
|
+
return {
|
|
7
|
+
push(value: T) {
|
|
8
|
+
const next = defer<T>();
|
|
9
|
+
const prev = dPoll.push(next) - 2;
|
|
10
|
+
const prevDeferred = dPoll[prev] as Deferred<T>;
|
|
11
|
+
prevDeferred.resolve(value);
|
|
12
|
+
|
|
13
|
+
return prevDeferred;
|
|
14
|
+
},
|
|
15
|
+
pull() {
|
|
16
|
+
const current = dPoll[0];
|
|
17
|
+
current.promise.then(() => dPoll.shift());
|
|
18
|
+
return current;
|
|
19
|
+
},
|
|
20
|
+
done(value: T) {
|
|
21
|
+
dPoll[dPoll.length - 1].resolve(value);
|
|
22
|
+
return Promise.all(dPoll.map(d => d.promise));
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
package/src/generatorify.ts
CHANGED
|
@@ -1,35 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createPoll } from './deferredPoll';
|
|
2
2
|
|
|
3
3
|
export interface TaskCallback<T> {
|
|
4
|
-
(value: T): Promise<
|
|
4
|
+
(value: T): Promise<void>;
|
|
5
5
|
}
|
|
6
6
|
|
|
7
7
|
export interface Task<T, R = unknown> {
|
|
8
8
|
(callback: TaskCallback<T>): R;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
export const generatorify = <T, R
|
|
12
|
-
const
|
|
11
|
+
export const generatorify = <T, R>(task: Task<T, R>): AsyncIterable<T> => {
|
|
12
|
+
const poll = createPoll<IteratorResult<T, R>>();
|
|
13
13
|
|
|
14
|
-
Promise.resolve(task(value => {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const prevDeferred = dPoll[prev] as Deferred<IteratorYieldResult<T>>;
|
|
18
|
-
prevDeferred.resolve({ value, done: false });
|
|
19
|
-
return prevDeferred.promise.then(v => v.value);
|
|
20
|
-
})).then(async (value) => {
|
|
21
|
-
dPoll[dPoll.length - 1].resolve({ value, done: true });
|
|
22
|
-
await Promise.all(dPoll.map(d => d.promise));
|
|
23
|
-
return { value, done: true };
|
|
24
|
-
});
|
|
14
|
+
Promise.resolve(task(async value => {
|
|
15
|
+
await poll.push({ value, done: false }).promise;
|
|
16
|
+
})).then(async (value) => poll.done({ value, done: true }));
|
|
25
17
|
|
|
26
18
|
return {
|
|
27
19
|
[Symbol.asyncIterator]() {
|
|
28
20
|
return {
|
|
29
21
|
next() {
|
|
30
|
-
|
|
31
|
-
current.promise.then(() => dPoll.shift());
|
|
32
|
-
return current.promise;
|
|
22
|
+
return poll.pull().promise;
|
|
33
23
|
},
|
|
34
24
|
};
|
|
35
25
|
}
|
package/src/index.ts
CHANGED