asygen 0.2.30 → 0.3.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 +119 -3
- package/build/combine.cjs +5 -5
- package/build/combine.cjs.map +1 -1
- package/build/combine.js +5 -5
- package/build/combine.js.map +1 -1
- package/build/defer.cjs +12 -8
- package/build/defer.cjs.map +1 -1
- package/build/defer.d.ts +5 -3
- package/build/defer.js +12 -8
- package/build/defer.js.map +1 -1
- package/build/generatorify.cjs +5 -5
- package/build/generatorify.cjs.map +1 -1
- package/build/generatorify.js +5 -5
- package/build/generatorify.js.map +1 -1
- package/build/index.cjs +1 -1
- package/build/index.cjs.map +1 -1
- package/build/index.d.ts +1 -1
- package/build/index.js +1 -1
- package/build/index.js.map +1 -1
- package/build/queue.cjs +55 -0
- package/build/queue.cjs.map +1 -0
- package/build/queue.d.ts +7 -0
- package/build/queue.js +45 -0
- package/build/queue.js.map +1 -0
- package/package.json +6 -3
- package/src/combine.ts +5 -5
- package/src/defer.ts +21 -12
- package/src/generatorify.ts +5 -5
- package/src/index.ts +1 -1
- package/src/queue.ts +53 -0
- package/build/deferredPoll.cjs +0 -36
- package/build/deferredPoll.cjs.map +0 -1
- package/build/deferredPoll.d.ts +0 -6
- package/build/deferredPoll.js +0 -26
- package/build/deferredPoll.js.map +0 -1
- package/src/deferredPoll.ts +0 -25
package/README.md
CHANGED
|
@@ -10,9 +10,61 @@ Supports ESM and CommonJS modules.
|
|
|
10
10
|
[![Coverage Status][codecov-image]][codecov-url]
|
|
11
11
|
[![Maintainability][codeclimate-image]][codeclimate-url]
|
|
12
12
|
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
Npm installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install asygen
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Yarn installation
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
yarn add asygen
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Utilities
|
|
28
|
+
|
|
29
|
+
#### Deferred
|
|
30
|
+
|
|
31
|
+
- Represents a deferred operation.
|
|
32
|
+
- Provides methods resolve and reject to control the wrapped promise.
|
|
33
|
+
- Exposes properties promise and status to get the underlying promise and its current status.
|
|
34
|
+
|
|
35
|
+
#### Queue
|
|
36
|
+
|
|
37
|
+
- A queue system for handling asynchronous tasks.
|
|
38
|
+
- Offers methods `push`, `pull`, and `done` to manage tasks.
|
|
39
|
+
|
|
40
|
+
#### Generatorify
|
|
41
|
+
|
|
42
|
+
- Convert a task into an asynchronous iterable.
|
|
43
|
+
- The iterable can be used in `for await...of` loops to process values as they're produced.
|
|
44
|
+
|
|
45
|
+
#### Combine
|
|
46
|
+
|
|
47
|
+
- Combine multiple asynchronous iterables into a single iterable.
|
|
48
|
+
- The resulting iterable will yield values from all input iterables and complete when all of them are done.
|
|
49
|
+
|
|
13
50
|
## Usage
|
|
14
51
|
|
|
15
|
-
#### Create deferred
|
|
52
|
+
#### Create deferred operation
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
import { defer, Status } from 'asygen';
|
|
56
|
+
|
|
57
|
+
const deferred = defer<number>();
|
|
58
|
+
console.log(deferred.status); // Status.PENDING
|
|
59
|
+
|
|
60
|
+
deferred.resolve(42);
|
|
61
|
+
deferred.promise.then((value) => {
|
|
62
|
+
console.log(value); // 42
|
|
63
|
+
console.log(deferred.status); // Status.RESOLVED
|
|
64
|
+
});
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
#### Create a deferred operation from events
|
|
16
68
|
|
|
17
69
|
```typescript
|
|
18
70
|
import { defer } from 'asygen';
|
|
@@ -28,7 +80,43 @@ await result.promise;
|
|
|
28
80
|
console.log(result.status); // resolved or rejected
|
|
29
81
|
```
|
|
30
82
|
|
|
83
|
+
#### Task queue
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
import { createQueue } from 'asygen';
|
|
87
|
+
|
|
88
|
+
const queue = createQueue<number>();
|
|
89
|
+
|
|
90
|
+
queue.push(1);
|
|
91
|
+
queue.push(2);
|
|
92
|
+
queue.push(3);
|
|
93
|
+
|
|
94
|
+
queue.pull().promise.then((value) => console.log(value)); // 1
|
|
95
|
+
queue.pull().promise.then((value) => console.log(value)); // 2
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
#### Generatorify
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
import { generatorify } from 'asygen';
|
|
102
|
+
|
|
103
|
+
const task = async (callback) => {
|
|
104
|
+
await callback('Hello');
|
|
105
|
+
await callback('World');
|
|
106
|
+
return 'Done!';
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const iterable = generatorify(task);
|
|
110
|
+
|
|
111
|
+
(async () => {
|
|
112
|
+
for await (const value of iterable) {
|
|
113
|
+
console.log(value); // "Hello", then "World"
|
|
114
|
+
}
|
|
115
|
+
})();
|
|
116
|
+
```
|
|
117
|
+
|
|
31
118
|
#### Convert events to asyncGenerator
|
|
119
|
+
|
|
32
120
|
```typescript
|
|
33
121
|
import { once } from 'node:events';
|
|
34
122
|
import { generatorify, Task } from 'asygen';
|
|
@@ -44,11 +132,40 @@ for await (const data of generatorify(task)) {
|
|
|
44
132
|
}
|
|
45
133
|
```
|
|
46
134
|
|
|
135
|
+
#### Combine tasks
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
import { generatorify, combine } from 'asygen';
|
|
139
|
+
|
|
140
|
+
const task1 = async (callback) => {
|
|
141
|
+
await callback('Task1 - Hello');
|
|
142
|
+
await callback('Task1 - World');
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
const task2 = async (callback) => {
|
|
146
|
+
await callback('Task2 - Foo');
|
|
147
|
+
await callback('Task2 - Bar');
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
const iterable1 = generatorify(task1);
|
|
151
|
+
const iterable2 = generatorify(task2);
|
|
152
|
+
|
|
153
|
+
const combined = combine(iterable1, iterable2);
|
|
154
|
+
|
|
155
|
+
(async () => {
|
|
156
|
+
for await (const value of combined) {
|
|
157
|
+
console.log(value); // Logs values from both task1 and task2
|
|
158
|
+
}
|
|
159
|
+
})();
|
|
160
|
+
```
|
|
161
|
+
|
|
47
162
|
#### Combine generators
|
|
163
|
+
|
|
48
164
|
```typescript
|
|
49
165
|
import { combine } from 'asygen';
|
|
50
166
|
|
|
51
|
-
const sleep = (timeout: number) =>
|
|
167
|
+
const sleep = (timeout: number) =>
|
|
168
|
+
new Promise((resolve) => setTimeout(resolve, timeout));
|
|
52
169
|
|
|
53
170
|
async function* generate(timeout: number, count: number) {
|
|
54
171
|
for (let index = 0; index < count; index++) {
|
|
@@ -70,7 +187,6 @@ for await (const data of combine(generate(100, 5), generate(500, 2))) {
|
|
|
70
187
|
License [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
|
71
188
|
Copyright (c) 2023-present Ivan Zakharchanka
|
|
72
189
|
|
|
73
|
-
|
|
74
190
|
[npm-url]: https://www.npmjs.com/package/asygen
|
|
75
191
|
[downloads-image]: https://img.shields.io/npm/dw/asygen.svg?maxAge=43200
|
|
76
192
|
[npm-image]: https://img.shields.io/npm/v/asygen.svg?maxAge=43200
|
package/build/combine.cjs
CHANGED
|
@@ -8,17 +8,17 @@ Object.defineProperty(exports, "combine", {
|
|
|
8
8
|
return combine;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
-
const
|
|
11
|
+
const _queuecjs = require("./queue.cjs");
|
|
12
12
|
const combine = (...iterables)=>{
|
|
13
|
-
const
|
|
13
|
+
const queue = (0, _queuecjs.createQueue)();
|
|
14
14
|
Promise.all(iterables.map(async (iterable)=>{
|
|
15
15
|
for await (const value of iterable){
|
|
16
|
-
await
|
|
16
|
+
await queue.push({
|
|
17
17
|
value,
|
|
18
18
|
done: false
|
|
19
19
|
}).promise;
|
|
20
20
|
}
|
|
21
|
-
})).then(async ()=>
|
|
21
|
+
})).then(async ()=>queue.done({
|
|
22
22
|
value: null,
|
|
23
23
|
done: true
|
|
24
24
|
}));
|
|
@@ -26,7 +26,7 @@ const combine = (...iterables)=>{
|
|
|
26
26
|
[Symbol.asyncIterator] () {
|
|
27
27
|
return {
|
|
28
28
|
next () {
|
|
29
|
-
return
|
|
29
|
+
return queue.pull().promise;
|
|
30
30
|
}
|
|
31
31
|
};
|
|
32
32
|
}
|
package/build/combine.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/combine.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../src/combine.ts"],"sourcesContent":["import { createQueue } from './queue.js';\n\nexport const combine = <T, R = unknown>(...iterables: AsyncIterable<T>[]) => {\n const queue = createQueue<IteratorResult<T, R>>();\n\n Promise.all(\n iterables.map(async (iterable) => {\n for await (const value of iterable) {\n await queue.push({ value, done: false }).promise;\n }\n })\n ).then(async () => queue.done({ value: null, done: true }));\n\n return {\n [Symbol.asyncIterator]() {\n return {\n next() {\n return queue.pull().promise;\n },\n };\n },\n };\n};\n"],"names":["combine","iterables","queue","createQueue","Promise","all","map","iterable","value","push","done","promise","then","Symbol","asyncIterator","next","pull"],"mappings":";;;;+BAEaA;;;eAAAA;;;0BAFe;AAErB,MAAMA,UAAU,CAAiB,GAAGC;IACzC,MAAMC,QAAQC,IAAAA,qBAAW;IAEzBC,QAAQC,GAAG,CACTJ,UAAUK,GAAG,CAAC,OAAOC;QACnB,WAAW,MAAMC,SAASD,SAAU;YAClC,MAAML,MAAMO,IAAI,CAAC;gBAAED;gBAAOE,MAAM;YAAM,GAAGC,OAAO;QAClD;IACF,IACAC,IAAI,CAAC,UAAYV,MAAMQ,IAAI,CAAC;YAAEF,OAAO;YAAME,MAAM;QAAK;IAExD,OAAO;QACL,CAACG,OAAOC,aAAa,CAAC;YACpB,OAAO;gBACLC;oBACE,OAAOb,MAAMc,IAAI,GAAGL,OAAO;gBAC7B;YACF;QACF;IACF;AACF"}
|
package/build/combine.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createQueue } from "./queue.js";
|
|
2
2
|
export const combine = (...iterables)=>{
|
|
3
|
-
const
|
|
3
|
+
const queue = createQueue();
|
|
4
4
|
Promise.all(iterables.map(async (iterable)=>{
|
|
5
5
|
for await (const value of iterable){
|
|
6
|
-
await
|
|
6
|
+
await queue.push({
|
|
7
7
|
value,
|
|
8
8
|
done: false
|
|
9
9
|
}).promise;
|
|
10
10
|
}
|
|
11
|
-
})).then(async ()=>
|
|
11
|
+
})).then(async ()=>queue.done({
|
|
12
12
|
value: null,
|
|
13
13
|
done: true
|
|
14
14
|
}));
|
|
@@ -16,7 +16,7 @@ export const combine = (...iterables)=>{
|
|
|
16
16
|
[Symbol.asyncIterator] () {
|
|
17
17
|
return {
|
|
18
18
|
next () {
|
|
19
|
-
return
|
|
19
|
+
return queue.pull().promise;
|
|
20
20
|
}
|
|
21
21
|
};
|
|
22
22
|
}
|
package/build/combine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/combine.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../src/combine.ts"],"sourcesContent":["import { createQueue } from './queue.js';\n\nexport const combine = <T, R = unknown>(...iterables: AsyncIterable<T>[]) => {\n const queue = createQueue<IteratorResult<T, R>>();\n\n Promise.all(\n iterables.map(async (iterable) => {\n for await (const value of iterable) {\n await queue.push({ value, done: false }).promise;\n }\n })\n ).then(async () => queue.done({ value: null, done: true }));\n\n return {\n [Symbol.asyncIterator]() {\n return {\n next() {\n return queue.pull().promise;\n },\n };\n },\n };\n};\n"],"names":["createQueue","combine","iterables","queue","Promise","all","map","iterable","value","push","done","promise","then","Symbol","asyncIterator","next","pull"],"mappings":"AAAA,SAASA,WAAW,QAAQ,aAAa;AAEzC,OAAO,MAAMC,UAAU,CAAiB,GAAGC;IACzC,MAAMC,QAAQH;IAEdI,QAAQC,GAAG,CACTH,UAAUI,GAAG,CAAC,OAAOC;QACnB,WAAW,MAAMC,SAASD,SAAU;YAClC,MAAMJ,MAAMM,IAAI,CAAC;gBAAED;gBAAOE,MAAM;YAAM,GAAGC,OAAO;QAClD;IACF,IACAC,IAAI,CAAC,UAAYT,MAAMO,IAAI,CAAC;YAAEF,OAAO;YAAME,MAAM;QAAK;IAExD,OAAO;QACL,CAACG,OAAOC,aAAa,CAAC;YACpB,OAAO;gBACLC;oBACE,OAAOZ,MAAMa,IAAI,GAAGL,OAAO;gBAC7B;YACF;QACF;IACF;AACF,EAAE"}
|
package/build/defer.cjs
CHANGED
|
@@ -46,14 +46,24 @@ class Deferred {
|
|
|
46
46
|
_resolve;
|
|
47
47
|
_reject;
|
|
48
48
|
_status = Status.PENDING;
|
|
49
|
+
state;
|
|
49
50
|
constructor(){
|
|
50
51
|
this._promise = new Promise((resolve, reject)=>{
|
|
51
52
|
this._resolve = resolve;
|
|
52
53
|
this._reject = reject;
|
|
54
|
+
}).catch((error)=>{
|
|
55
|
+
this._status = Status.REJECTED;
|
|
56
|
+
throw error;
|
|
57
|
+
}).then((value)=>{
|
|
58
|
+
this._status = Status.RESOLVED;
|
|
59
|
+
return value;
|
|
53
60
|
});
|
|
54
61
|
this.resolve = this.resolve.bind(this);
|
|
55
62
|
this.reject = this.reject.bind(this);
|
|
56
63
|
}
|
|
64
|
+
get id() {
|
|
65
|
+
return this.txts;
|
|
66
|
+
}
|
|
57
67
|
get [Symbol.toStringTag]() {
|
|
58
68
|
return `Deferred ${this.txts} ${this._status}`;
|
|
59
69
|
}
|
|
@@ -64,17 +74,11 @@ class Deferred {
|
|
|
64
74
|
return this._status;
|
|
65
75
|
}
|
|
66
76
|
resolve(value) {
|
|
67
|
-
|
|
68
|
-
this._status = Status.RESOLVED;
|
|
69
|
-
this._resolve(value);
|
|
70
|
-
}
|
|
77
|
+
this._resolve(value);
|
|
71
78
|
return this;
|
|
72
79
|
}
|
|
73
80
|
reject(error) {
|
|
74
|
-
|
|
75
|
-
this._status = Status.REJECTED;
|
|
76
|
-
this._reject(error);
|
|
77
|
-
}
|
|
81
|
+
this._reject(error);
|
|
78
82
|
return this;
|
|
79
83
|
}
|
|
80
84
|
}
|
package/build/defer.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/defer.ts"],"sourcesContent":["export enum Status {\n PENDING = 'pending',\n RESOLVED = 'resolved',\n REJECTED = 'rejected',\n}\n\nconst counter: [number, number] = [0, 0];\nexport const getId = () => {\n const result = Date.now() * 100;\n if (counter[0] !== result) {\n counter[0] = result;\n counter[1] = 0;\n }\n return (counter[0] + counter[1]++).toString(16);\n};\n\nexport class Deferred<T = void, E = unknown> {\n private txts = getId();\n private _promise: Promise<T>;\n private _resolve?: (value: T) => void;\n private _reject?: (error: E) => void;\n private _status: Status = Status.PENDING;\n\n constructor() {\n this._promise = new Promise<T>((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n this.resolve = this.resolve.bind(this);\n this.reject = this.reject.bind(this);\n }\n\n get [Symbol.toStringTag]() {\n return `Deferred ${this.txts} ${this._status}`;\n }\n\n get promise() {\n return this._promise;\n }\n\n get status() {\n return this._status;\n }\n\n resolve(value: T
|
|
1
|
+
{"version":3,"sources":["../src/defer.ts"],"sourcesContent":["export enum Status {\n PENDING = 'pending',\n RESOLVED = 'resolved',\n REJECTED = 'rejected',\n}\n\nconst counter: [number, number] = [0, 0];\nexport const getId = () => {\n const result = Date.now() * 100;\n if (counter[0] !== result) {\n counter[0] = result;\n counter[1] = 0;\n }\n return (counter[0] + counter[1]++).toString(16);\n};\n\nexport class Deferred<T = void, S = unknown, E = unknown> {\n private txts = getId();\n private _promise: Promise<T>;\n private _resolve?: (value: T | PromiseLike<T>) => void;\n private _reject?: (error: E) => void;\n private _status: Status = Status.PENDING;\n\n public state: S;\n\n constructor() {\n this._promise = new Promise<T>((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n })\n .catch((error) => {\n this._status = Status.REJECTED;\n throw error;\n })\n .then((value) => {\n this._status = Status.RESOLVED;\n return value;\n });\n this.resolve = this.resolve.bind(this);\n this.reject = this.reject.bind(this);\n }\n\n get id() {\n return this.txts;\n }\n\n get [Symbol.toStringTag]() {\n return `Deferred ${this.txts} ${this._status}`;\n }\n\n get promise() {\n return this._promise;\n }\n\n get status() {\n return this._status;\n }\n\n resolve(value: T | PromiseLike<T>) {\n this._resolve(value);\n\n return this;\n }\n\n reject(error: E) {\n this._reject(error);\n\n return this;\n }\n}\n\nexport const defer = <T = void, E = unknown>() => {\n return new Deferred<T, E>();\n};\n"],"names":["getId","Deferred","defer","Status","PENDING","RESOLVED","REJECTED","counter","result","Date","now","toString","txts","_promise","_resolve","_reject","_status","state","constructor","Promise","resolve","reject","catch","error","then","value","bind","id","Symbol","toStringTag","promise","status"],"mappings":";;;;;;;;;;;;;;IAOaA,KAAK;eAALA;;IASAC,QAAQ;eAARA;;IAuDAC,KAAK;eAALA;;;IAvEN;UAAKC,MAAM;IAANA,OACVC,aAAU;IADAD,OAEVE,cAAW;IAFDF,OAGVG,cAAW;GAHDH,WAAAA;AAMZ,MAAMI,UAA4B;IAAC;IAAG;CAAE;AACjC,MAAMP,QAAQ;IACnB,MAAMQ,SAASC,KAAKC,GAAG,KAAK;IAC5B,IAAIH,OAAO,CAAC,EAAE,KAAKC,QAAQ;QACzBD,OAAO,CAAC,EAAE,GAAGC;QACbD,OAAO,CAAC,EAAE,GAAG;IACf;IACA,OAAO,AAACA,CAAAA,OAAO,CAAC,EAAE,GAAGA,OAAO,CAAC,EAAE,EAAC,EAAGI,QAAQ,CAAC;AAC9C;AAEO,MAAMV;IACHW,OAAOZ,QAAQ;IACfa,SAAqB;IACrBC,SAA+C;IAC/CC,QAA6B;IAC7BC,UAAkBb,OAAOC,OAAO,CAAC;IAElCa,MAAS;IAEhBC,aAAc;QACZ,IAAI,CAACL,QAAQ,GAAG,IAAIM,QAAW,CAACC,SAASC;YACvC,IAAI,CAACP,QAAQ,GAAGM;YAChB,IAAI,CAACL,OAAO,GAAGM;QACjB,GACGC,KAAK,CAAC,CAACC;YACN,IAAI,CAACP,OAAO,GAAGb,OAAOG,QAAQ;YAC9B,MAAMiB;QACR,GACCC,IAAI,CAAC,CAACC;YACL,IAAI,CAACT,OAAO,GAAGb,OAAOE,QAAQ;YAC9B,OAAOoB;QACT;QACF,IAAI,CAACL,OAAO,GAAG,IAAI,CAACA,OAAO,CAACM,IAAI,CAAC,IAAI;QACrC,IAAI,CAACL,MAAM,GAAG,IAAI,CAACA,MAAM,CAACK,IAAI,CAAC,IAAI;IACrC;IAEA,IAAIC,KAAK;QACP,OAAO,IAAI,CAACf,IAAI;IAClB;IAEA,IAAI,CAACgB,OAAOC,WAAW,CAAC,GAAG;QACzB,OAAO,CAAC,SAAS,EAAE,IAAI,CAACjB,IAAI,CAAC,CAAC,EAAE,IAAI,CAACI,OAAO,CAAC,CAAC;IAChD;IAEA,IAAIc,UAAU;QACZ,OAAO,IAAI,CAACjB,QAAQ;IACtB;IAEA,IAAIkB,SAAS;QACX,OAAO,IAAI,CAACf,OAAO;IACrB;IAEAI,QAAQK,KAAyB,EAAE;QACjC,IAAI,CAACX,QAAQ,CAACW;QAEd,OAAO,IAAI;IACb;IAEAJ,OAAOE,KAAQ,EAAE;QACf,IAAI,CAACR,OAAO,CAACQ;QAEb,OAAO,IAAI;IACb;AACF;AAEO,MAAMrB,QAAQ;IACnB,OAAO,IAAID;AACb"}
|
package/build/defer.d.ts
CHANGED
|
@@ -4,17 +4,19 @@ export declare enum Status {
|
|
|
4
4
|
REJECTED = "rejected"
|
|
5
5
|
}
|
|
6
6
|
export declare const getId: () => string;
|
|
7
|
-
export declare class Deferred<T = void, E = unknown> {
|
|
7
|
+
export declare class Deferred<T = void, S = unknown, E = unknown> {
|
|
8
8
|
private txts;
|
|
9
9
|
private _promise;
|
|
10
10
|
private _resolve?;
|
|
11
11
|
private _reject?;
|
|
12
12
|
private _status;
|
|
13
|
+
state: S;
|
|
13
14
|
constructor();
|
|
15
|
+
get id(): string;
|
|
14
16
|
get [Symbol.toStringTag](): string;
|
|
15
17
|
get promise(): Promise<T>;
|
|
16
18
|
get status(): Status;
|
|
17
|
-
resolve(value: T): this;
|
|
19
|
+
resolve(value: T | PromiseLike<T>): this;
|
|
18
20
|
reject(error: E): this;
|
|
19
21
|
}
|
|
20
|
-
export declare const defer: <T = void, E = unknown>() => Deferred<T, E>;
|
|
22
|
+
export declare const defer: <T = void, E = unknown>() => Deferred<T, E, unknown>;
|
package/build/defer.js
CHANGED
|
@@ -22,14 +22,24 @@ export class Deferred {
|
|
|
22
22
|
_resolve;
|
|
23
23
|
_reject;
|
|
24
24
|
_status = Status.PENDING;
|
|
25
|
+
state;
|
|
25
26
|
constructor(){
|
|
26
27
|
this._promise = new Promise((resolve, reject)=>{
|
|
27
28
|
this._resolve = resolve;
|
|
28
29
|
this._reject = reject;
|
|
30
|
+
}).catch((error)=>{
|
|
31
|
+
this._status = Status.REJECTED;
|
|
32
|
+
throw error;
|
|
33
|
+
}).then((value)=>{
|
|
34
|
+
this._status = Status.RESOLVED;
|
|
35
|
+
return value;
|
|
29
36
|
});
|
|
30
37
|
this.resolve = this.resolve.bind(this);
|
|
31
38
|
this.reject = this.reject.bind(this);
|
|
32
39
|
}
|
|
40
|
+
get id() {
|
|
41
|
+
return this.txts;
|
|
42
|
+
}
|
|
33
43
|
get [Symbol.toStringTag]() {
|
|
34
44
|
return `Deferred ${this.txts} ${this._status}`;
|
|
35
45
|
}
|
|
@@ -40,17 +50,11 @@ export class Deferred {
|
|
|
40
50
|
return this._status;
|
|
41
51
|
}
|
|
42
52
|
resolve(value) {
|
|
43
|
-
|
|
44
|
-
this._status = Status.RESOLVED;
|
|
45
|
-
this._resolve(value);
|
|
46
|
-
}
|
|
53
|
+
this._resolve(value);
|
|
47
54
|
return this;
|
|
48
55
|
}
|
|
49
56
|
reject(error) {
|
|
50
|
-
|
|
51
|
-
this._status = Status.REJECTED;
|
|
52
|
-
this._reject(error);
|
|
53
|
-
}
|
|
57
|
+
this._reject(error);
|
|
54
58
|
return this;
|
|
55
59
|
}
|
|
56
60
|
}
|
package/build/defer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/defer.ts"],"sourcesContent":["export enum Status {\n PENDING = 'pending',\n RESOLVED = 'resolved',\n REJECTED = 'rejected',\n}\n\nconst counter: [number, number] = [0, 0];\nexport const getId = () => {\n const result = Date.now() * 100;\n if (counter[0] !== result) {\n counter[0] = result;\n counter[1] = 0;\n }\n return (counter[0] + counter[1]++).toString(16);\n};\n\nexport class Deferred<T = void, E = unknown> {\n private txts = getId();\n private _promise: Promise<T>;\n private _resolve?: (value: T) => void;\n private _reject?: (error: E) => void;\n private _status: Status = Status.PENDING;\n\n constructor() {\n this._promise = new Promise<T>((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n this.resolve = this.resolve.bind(this);\n this.reject = this.reject.bind(this);\n }\n\n get [Symbol.toStringTag]() {\n return `Deferred ${this.txts} ${this._status}`;\n }\n\n get promise() {\n return this._promise;\n }\n\n get status() {\n return this._status;\n }\n\n resolve(value: T
|
|
1
|
+
{"version":3,"sources":["../src/defer.ts"],"sourcesContent":["export enum Status {\n PENDING = 'pending',\n RESOLVED = 'resolved',\n REJECTED = 'rejected',\n}\n\nconst counter: [number, number] = [0, 0];\nexport const getId = () => {\n const result = Date.now() * 100;\n if (counter[0] !== result) {\n counter[0] = result;\n counter[1] = 0;\n }\n return (counter[0] + counter[1]++).toString(16);\n};\n\nexport class Deferred<T = void, S = unknown, E = unknown> {\n private txts = getId();\n private _promise: Promise<T>;\n private _resolve?: (value: T | PromiseLike<T>) => void;\n private _reject?: (error: E) => void;\n private _status: Status = Status.PENDING;\n\n public state: S;\n\n constructor() {\n this._promise = new Promise<T>((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n })\n .catch((error) => {\n this._status = Status.REJECTED;\n throw error;\n })\n .then((value) => {\n this._status = Status.RESOLVED;\n return value;\n });\n this.resolve = this.resolve.bind(this);\n this.reject = this.reject.bind(this);\n }\n\n get id() {\n return this.txts;\n }\n\n get [Symbol.toStringTag]() {\n return `Deferred ${this.txts} ${this._status}`;\n }\n\n get promise() {\n return this._promise;\n }\n\n get status() {\n return this._status;\n }\n\n resolve(value: T | PromiseLike<T>) {\n this._resolve(value);\n\n return this;\n }\n\n reject(error: E) {\n this._reject(error);\n\n return this;\n }\n}\n\nexport const defer = <T = void, E = unknown>() => {\n return new Deferred<T, E>();\n};\n"],"names":["Status","PENDING","RESOLVED","REJECTED","counter","getId","result","Date","now","toString","Deferred","txts","_promise","_resolve","_reject","_status","state","constructor","Promise","resolve","reject","catch","error","then","value","bind","id","Symbol","toStringTag","promise","status","defer"],"mappings":"WAAO;UAAKA,MAAM;IAANA,OACVC,aAAU;IADAD,OAEVE,cAAW;IAFDF,OAGVG,cAAW;GAHDH,WAAAA;AAMZ,MAAMI,UAA4B;IAAC;IAAG;CAAE;AACxC,OAAO,MAAMC,QAAQ;IACnB,MAAMC,SAASC,KAAKC,GAAG,KAAK;IAC5B,IAAIJ,OAAO,CAAC,EAAE,KAAKE,QAAQ;QACzBF,OAAO,CAAC,EAAE,GAAGE;QACbF,OAAO,CAAC,EAAE,GAAG;IACf;IACA,OAAO,AAACA,CAAAA,OAAO,CAAC,EAAE,GAAGA,OAAO,CAAC,EAAE,EAAC,EAAGK,QAAQ,CAAC;AAC9C,EAAE;AAEF,OAAO,MAAMC;IACHC,OAAON,QAAQ;IACfO,SAAqB;IACrBC,SAA+C;IAC/CC,QAA6B;IAC7BC,UAAkBf,OAAOC,OAAO,CAAC;IAElCe,MAAS;IAEhBC,aAAc;QACZ,IAAI,CAACL,QAAQ,GAAG,IAAIM,QAAW,CAACC,SAASC;YACvC,IAAI,CAACP,QAAQ,GAAGM;YAChB,IAAI,CAACL,OAAO,GAAGM;QACjB,GACGC,KAAK,CAAC,CAACC;YACN,IAAI,CAACP,OAAO,GAAGf,OAAOG,QAAQ;YAC9B,MAAMmB;QACR,GACCC,IAAI,CAAC,CAACC;YACL,IAAI,CAACT,OAAO,GAAGf,OAAOE,QAAQ;YAC9B,OAAOsB;QACT;QACF,IAAI,CAACL,OAAO,GAAG,IAAI,CAACA,OAAO,CAACM,IAAI,CAAC,IAAI;QACrC,IAAI,CAACL,MAAM,GAAG,IAAI,CAACA,MAAM,CAACK,IAAI,CAAC,IAAI;IACrC;IAEA,IAAIC,KAAK;QACP,OAAO,IAAI,CAACf,IAAI;IAClB;IAEA,IAAI,CAACgB,OAAOC,WAAW,CAAC,GAAG;QACzB,OAAO,CAAC,SAAS,EAAE,IAAI,CAACjB,IAAI,CAAC,CAAC,EAAE,IAAI,CAACI,OAAO,CAAC,CAAC;IAChD;IAEA,IAAIc,UAAU;QACZ,OAAO,IAAI,CAACjB,QAAQ;IACtB;IAEA,IAAIkB,SAAS;QACX,OAAO,IAAI,CAACf,OAAO;IACrB;IAEAI,QAAQK,KAAyB,EAAE;QACjC,IAAI,CAACX,QAAQ,CAACW;QAEd,OAAO,IAAI;IACb;IAEAJ,OAAOE,KAAQ,EAAE;QACf,IAAI,CAACR,OAAO,CAACQ;QAEb,OAAO,IAAI;IACb;AACF;AAEA,OAAO,MAAMS,QAAQ;IACnB,OAAO,IAAIrB;AACb,EAAE"}
|
package/build/generatorify.cjs
CHANGED
|
@@ -8,15 +8,15 @@ Object.defineProperty(exports, "generatorify", {
|
|
|
8
8
|
return generatorify;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
-
const
|
|
11
|
+
const _queuecjs = require("./queue.cjs");
|
|
12
12
|
const generatorify = (task)=>{
|
|
13
|
-
const
|
|
13
|
+
const queue = (0, _queuecjs.createQueue)();
|
|
14
14
|
Promise.resolve(task(async (value)=>{
|
|
15
|
-
await
|
|
15
|
+
await queue.push({
|
|
16
16
|
value,
|
|
17
17
|
done: false
|
|
18
18
|
}).promise;
|
|
19
|
-
})).then(async (value)=>
|
|
19
|
+
})).then(async (value)=>queue.done({
|
|
20
20
|
value,
|
|
21
21
|
done: true
|
|
22
22
|
}));
|
|
@@ -24,7 +24,7 @@ const generatorify = (task)=>{
|
|
|
24
24
|
[Symbol.asyncIterator] () {
|
|
25
25
|
return {
|
|
26
26
|
next () {
|
|
27
|
-
return
|
|
27
|
+
return queue.pull().promise;
|
|
28
28
|
}
|
|
29
29
|
};
|
|
30
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generatorify.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../src/generatorify.ts"],"sourcesContent":["import { createQueue } from './queue.js';\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 queue = createQueue<IteratorResult<T, R>>();\n\n Promise.resolve(\n task(async (value) => {\n await queue.push({ value, done: false }).promise;\n })\n ).then(async (value) => queue.done({ value, done: true }));\n\n return {\n [Symbol.asyncIterator]() {\n return {\n next() {\n return queue.pull().promise;\n },\n };\n },\n };\n};\n"],"names":["generatorify","task","queue","createQueue","Promise","resolve","value","push","done","promise","then","Symbol","asyncIterator","next","pull"],"mappings":";;;;+BAUaA;;;eAAAA;;;0BAVe;AAUrB,MAAMA,eAAe,CAAOC;IACjC,MAAMC,QAAQC,IAAAA,qBAAW;IAEzBC,QAAQC,OAAO,CACbJ,KAAK,OAAOK;QACV,MAAMJ,MAAMK,IAAI,CAAC;YAAED;YAAOE,MAAM;QAAM,GAAGC,OAAO;IAClD,IACAC,IAAI,CAAC,OAAOJ,QAAUJ,MAAMM,IAAI,CAAC;YAAEF;YAAOE,MAAM;QAAK;IAEvD,OAAO;QACL,CAACG,OAAOC,aAAa,CAAC;YACpB,OAAO;gBACLC;oBACE,OAAOX,MAAMY,IAAI,GAAGL,OAAO;gBAC7B;YACF;QACF;IACF;AACF"}
|
package/build/generatorify.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createQueue } from "./queue.js";
|
|
2
2
|
export const generatorify = (task)=>{
|
|
3
|
-
const
|
|
3
|
+
const queue = createQueue();
|
|
4
4
|
Promise.resolve(task(async (value)=>{
|
|
5
|
-
await
|
|
5
|
+
await queue.push({
|
|
6
6
|
value,
|
|
7
7
|
done: false
|
|
8
8
|
}).promise;
|
|
9
|
-
})).then(async (value)=>
|
|
9
|
+
})).then(async (value)=>queue.done({
|
|
10
10
|
value,
|
|
11
11
|
done: true
|
|
12
12
|
}));
|
|
@@ -14,7 +14,7 @@ export const generatorify = (task)=>{
|
|
|
14
14
|
[Symbol.asyncIterator] () {
|
|
15
15
|
return {
|
|
16
16
|
next () {
|
|
17
|
-
return
|
|
17
|
+
return queue.pull().promise;
|
|
18
18
|
}
|
|
19
19
|
};
|
|
20
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generatorify.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../src/generatorify.ts"],"sourcesContent":["import { createQueue } from './queue.js';\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 queue = createQueue<IteratorResult<T, R>>();\n\n Promise.resolve(\n task(async (value) => {\n await queue.push({ value, done: false }).promise;\n })\n ).then(async (value) => queue.done({ value, done: true }));\n\n return {\n [Symbol.asyncIterator]() {\n return {\n next() {\n return queue.pull().promise;\n },\n };\n },\n };\n};\n"],"names":["createQueue","generatorify","task","queue","Promise","resolve","value","push","done","promise","then","Symbol","asyncIterator","next","pull"],"mappings":"AAAA,SAASA,WAAW,QAAQ,aAAa;AAUzC,OAAO,MAAMC,eAAe,CAAOC;IACjC,MAAMC,QAAQH;IAEdI,QAAQC,OAAO,CACbH,KAAK,OAAOI;QACV,MAAMH,MAAMI,IAAI,CAAC;YAAED;YAAOE,MAAM;QAAM,GAAGC,OAAO;IAClD,IACAC,IAAI,CAAC,OAAOJ,QAAUH,MAAMK,IAAI,CAAC;YAAEF;YAAOE,MAAM;QAAK;IAEvD,OAAO;QACL,CAACG,OAAOC,aAAa,CAAC;YACpB,OAAO;gBACLC;oBACE,OAAOV,MAAMW,IAAI,GAAGL,OAAO;gBAC7B;YACF;QACF;IACF;AACF,EAAE"}
|
package/build/index.cjs
CHANGED
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
});
|
|
5
5
|
_export_star(require("./defer.cjs"), exports);
|
|
6
6
|
_export_star(require("./generatorify.cjs"), exports);
|
|
7
|
-
_export_star(require("./
|
|
7
|
+
_export_star(require("./queue.cjs"), exports);
|
|
8
8
|
_export_star(require("./combine.cjs"), exports);
|
|
9
9
|
function _export_star(from, to) {
|
|
10
10
|
Object.keys(from).forEach(function(k) {
|
package/build/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './defer.js';\nexport * from './generatorify.js';\nexport * from './
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './defer.js';\nexport * from './generatorify.js';\nexport * from './queue.js';\nexport * from './combine.js';\n"],"names":[],"mappings":";;;;qBAAc;qBACA;qBACA;qBACA"}
|
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.js';\nexport * from './generatorify.js';\nexport * from './
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './defer.js';\nexport * from './generatorify.js';\nexport * from './queue.js';\nexport * from './combine.js';\n"],"names":[],"mappings":"AAAA,cAAc,aAAa;AAC3B,cAAc,oBAAoB;AAClC,cAAc,aAAa;AAC3B,cAAc,eAAe"}
|
package/build/queue.cjs
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "createQueue", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return createQueue;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _defercjs = require("./defer.cjs");
|
|
12
|
+
const createQueue = ()=>{
|
|
13
|
+
const pendingQueue = [];
|
|
14
|
+
const resolvedQueue = [];
|
|
15
|
+
const requestQueue = [];
|
|
16
|
+
const push = (value)=>{
|
|
17
|
+
const task = (0, _defercjs.defer)();
|
|
18
|
+
pendingQueue.push(task);
|
|
19
|
+
Promise.resolve(value).then(task.resolve).catch(task.reject).finally(()=>{
|
|
20
|
+
pendingQueue.splice(pendingQueue.indexOf(task), 1);
|
|
21
|
+
if (requestQueue.length > 0) {
|
|
22
|
+
const request = requestQueue.shift();
|
|
23
|
+
request.resolve(task.promise);
|
|
24
|
+
} else {
|
|
25
|
+
resolvedQueue.push(task);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return task;
|
|
29
|
+
};
|
|
30
|
+
const pull = ()=>{
|
|
31
|
+
if (resolvedQueue.length > 0) {
|
|
32
|
+
return resolvedQueue.shift();
|
|
33
|
+
}
|
|
34
|
+
const task = (0, _defercjs.defer)();
|
|
35
|
+
requestQueue.push(task);
|
|
36
|
+
return task;
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
push,
|
|
40
|
+
pull,
|
|
41
|
+
done (value) {
|
|
42
|
+
push(value);
|
|
43
|
+
return Promise.all([
|
|
44
|
+
...pendingQueue,
|
|
45
|
+
...resolvedQueue,
|
|
46
|
+
...requestQueue
|
|
47
|
+
].map((d)=>d.promise));
|
|
48
|
+
},
|
|
49
|
+
get size () {
|
|
50
|
+
return pendingQueue.length + resolvedQueue.length + requestQueue.length;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=queue.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/queue.ts"],"sourcesContent":["import { defer, Deferred, Status } from './defer.js';\n\nexport const createQueue = <T, E = Error>() => {\n const pendingQueue: Deferred<T, E>[] = [];\n const resolvedQueue: Deferred<T, E>[] = [];\n const requestQueue: Deferred<T, E>[] = [];\n\n const push = (value: T): Deferred<T, E> => {\n const task = defer<T, E>();\n pendingQueue.push(task);\n\n Promise.resolve(value)\n .then(task.resolve)\n .catch(task.reject)\n .finally(() => {\n pendingQueue.splice(pendingQueue.indexOf(task), 1);\n if (requestQueue.length > 0) {\n const request = requestQueue.shift();\n request.resolve(task.promise);\n } else {\n resolvedQueue.push(task);\n }\n });\n\n return task;\n };\n\n const pull = (): Deferred<T, E> => {\n if (resolvedQueue.length > 0) {\n return resolvedQueue.shift();\n }\n const task = defer<T, E>();\n requestQueue.push(task);\n\n return task;\n };\n\n return {\n push,\n pull,\n done(value: T) {\n push(value);\n return Promise.all(\n [...pendingQueue, ...resolvedQueue, ...requestQueue].map(\n (d) => d.promise\n )\n );\n },\n get size() {\n return pendingQueue.length + resolvedQueue.length + requestQueue.length;\n },\n };\n};\n"],"names":["createQueue","pendingQueue","resolvedQueue","requestQueue","push","value","task","defer","Promise","resolve","then","catch","reject","finally","splice","indexOf","length","request","shift","promise","pull","done","all","map","d","size"],"mappings":";;;;+BAEaA;;;eAAAA;;;0BAF2B;AAEjC,MAAMA,cAAc;IACzB,MAAMC,eAAiC,EAAE;IACzC,MAAMC,gBAAkC,EAAE;IAC1C,MAAMC,eAAiC,EAAE;IAEzC,MAAMC,OAAO,CAACC;QACZ,MAAMC,OAAOC,IAAAA,eAAK;QAClBN,aAAaG,IAAI,CAACE;QAElBE,QAAQC,OAAO,CAACJ,OACbK,IAAI,CAACJ,KAAKG,OAAO,EACjBE,KAAK,CAACL,KAAKM,MAAM,EACjBC,OAAO,CAAC;YACPZ,aAAaa,MAAM,CAACb,aAAac,OAAO,CAACT,OAAO;YAChD,IAAIH,aAAaa,MAAM,GAAG,GAAG;gBAC3B,MAAMC,UAAUd,aAAae,KAAK;gBAClCD,QAAQR,OAAO,CAACH,KAAKa,OAAO;YAC9B,OAAO;gBACLjB,cAAcE,IAAI,CAACE;YACrB;QACF;QAEF,OAAOA;IACT;IAEA,MAAMc,OAAO;QACX,IAAIlB,cAAcc,MAAM,GAAG,GAAG;YAC5B,OAAOd,cAAcgB,KAAK;QAC5B;QACA,MAAMZ,OAAOC,IAAAA,eAAK;QAClBJ,aAAaC,IAAI,CAACE;QAElB,OAAOA;IACT;IAEA,OAAO;QACLF;QACAgB;QACAC,MAAKhB,KAAQ;YACXD,KAAKC;YACL,OAAOG,QAAQc,GAAG,CAChB;mBAAIrB;mBAAiBC;mBAAkBC;aAAa,CAACoB,GAAG,CACtD,CAACC,IAAMA,EAAEL,OAAO;QAGtB;QACA,IAAIM,QAAO;YACT,OAAOxB,aAAae,MAAM,GAAGd,cAAcc,MAAM,GAAGb,aAAaa,MAAM;QACzE;IACF;AACF"}
|
package/build/queue.d.ts
ADDED
package/build/queue.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { defer } from "./defer.js";
|
|
2
|
+
export const createQueue = ()=>{
|
|
3
|
+
const pendingQueue = [];
|
|
4
|
+
const resolvedQueue = [];
|
|
5
|
+
const requestQueue = [];
|
|
6
|
+
const push = (value)=>{
|
|
7
|
+
const task = defer();
|
|
8
|
+
pendingQueue.push(task);
|
|
9
|
+
Promise.resolve(value).then(task.resolve).catch(task.reject).finally(()=>{
|
|
10
|
+
pendingQueue.splice(pendingQueue.indexOf(task), 1);
|
|
11
|
+
if (requestQueue.length > 0) {
|
|
12
|
+
const request = requestQueue.shift();
|
|
13
|
+
request.resolve(task.promise);
|
|
14
|
+
} else {
|
|
15
|
+
resolvedQueue.push(task);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
return task;
|
|
19
|
+
};
|
|
20
|
+
const pull = ()=>{
|
|
21
|
+
if (resolvedQueue.length > 0) {
|
|
22
|
+
return resolvedQueue.shift();
|
|
23
|
+
}
|
|
24
|
+
const task = defer();
|
|
25
|
+
requestQueue.push(task);
|
|
26
|
+
return task;
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
push,
|
|
30
|
+
pull,
|
|
31
|
+
done (value) {
|
|
32
|
+
push(value);
|
|
33
|
+
return Promise.all([
|
|
34
|
+
...pendingQueue,
|
|
35
|
+
...resolvedQueue,
|
|
36
|
+
...requestQueue
|
|
37
|
+
].map((d)=>d.promise));
|
|
38
|
+
},
|
|
39
|
+
get size () {
|
|
40
|
+
return pendingQueue.length + resolvedQueue.length + requestQueue.length;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/queue.ts"],"sourcesContent":["import { defer, Deferred, Status } from './defer.js';\n\nexport const createQueue = <T, E = Error>() => {\n const pendingQueue: Deferred<T, E>[] = [];\n const resolvedQueue: Deferred<T, E>[] = [];\n const requestQueue: Deferred<T, E>[] = [];\n\n const push = (value: T): Deferred<T, E> => {\n const task = defer<T, E>();\n pendingQueue.push(task);\n\n Promise.resolve(value)\n .then(task.resolve)\n .catch(task.reject)\n .finally(() => {\n pendingQueue.splice(pendingQueue.indexOf(task), 1);\n if (requestQueue.length > 0) {\n const request = requestQueue.shift();\n request.resolve(task.promise);\n } else {\n resolvedQueue.push(task);\n }\n });\n\n return task;\n };\n\n const pull = (): Deferred<T, E> => {\n if (resolvedQueue.length > 0) {\n return resolvedQueue.shift();\n }\n const task = defer<T, E>();\n requestQueue.push(task);\n\n return task;\n };\n\n return {\n push,\n pull,\n done(value: T) {\n push(value);\n return Promise.all(\n [...pendingQueue, ...resolvedQueue, ...requestQueue].map(\n (d) => d.promise\n )\n );\n },\n get size() {\n return pendingQueue.length + resolvedQueue.length + requestQueue.length;\n },\n };\n};\n"],"names":["defer","createQueue","pendingQueue","resolvedQueue","requestQueue","push","value","task","Promise","resolve","then","catch","reject","finally","splice","indexOf","length","request","shift","promise","pull","done","all","map","d","size"],"mappings":"AAAA,SAASA,KAAK,QAA0B,aAAa;AAErD,OAAO,MAAMC,cAAc;IACzB,MAAMC,eAAiC,EAAE;IACzC,MAAMC,gBAAkC,EAAE;IAC1C,MAAMC,eAAiC,EAAE;IAEzC,MAAMC,OAAO,CAACC;QACZ,MAAMC,OAAOP;QACbE,aAAaG,IAAI,CAACE;QAElBC,QAAQC,OAAO,CAACH,OACbI,IAAI,CAACH,KAAKE,OAAO,EACjBE,KAAK,CAACJ,KAAKK,MAAM,EACjBC,OAAO,CAAC;YACPX,aAAaY,MAAM,CAACZ,aAAaa,OAAO,CAACR,OAAO;YAChD,IAAIH,aAAaY,MAAM,GAAG,GAAG;gBAC3B,MAAMC,UAAUb,aAAac,KAAK;gBAClCD,QAAQR,OAAO,CAACF,KAAKY,OAAO;YAC9B,OAAO;gBACLhB,cAAcE,IAAI,CAACE;YACrB;QACF;QAEF,OAAOA;IACT;IAEA,MAAMa,OAAO;QACX,IAAIjB,cAAca,MAAM,GAAG,GAAG;YAC5B,OAAOb,cAAce,KAAK;QAC5B;QACA,MAAMX,OAAOP;QACbI,aAAaC,IAAI,CAACE;QAElB,OAAOA;IACT;IAEA,OAAO;QACLF;QACAe;QACAC,MAAKf,KAAQ;YACXD,KAAKC;YACL,OAAOE,QAAQc,GAAG,CAChB;mBAAIpB;mBAAiBC;mBAAkBC;aAAa,CAACmB,GAAG,CACtD,CAACC,IAAMA,EAAEL,OAAO;QAGtB;QACA,IAAIM,QAAO;YACT,OAAOvB,aAAac,MAAM,GAAGb,cAAca,MAAM,GAAGZ,aAAaY,MAAM;QACzE;IACF;AACF,EAAE"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "asygen",
|
|
3
3
|
"description": "0-Deps, simple and fast async generator library for browser and NodeJS",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.3.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
7
7
|
"main": "build/index.cjs",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"build",
|
|
15
15
|
"src/combine.ts",
|
|
16
16
|
"src/defer.ts",
|
|
17
|
-
"src/
|
|
17
|
+
"src/queue.ts",
|
|
18
18
|
"src/generatorify.ts",
|
|
19
19
|
"src/index.ts"
|
|
20
20
|
],
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
"defer",
|
|
43
43
|
"deferred",
|
|
44
44
|
"generator",
|
|
45
|
+
"generatorify",
|
|
45
46
|
"asyncgenerator",
|
|
46
47
|
"iterate",
|
|
47
48
|
"promise",
|
|
@@ -49,7 +50,9 @@
|
|
|
49
50
|
"await",
|
|
50
51
|
"yield",
|
|
51
52
|
"flow",
|
|
52
|
-
"control"
|
|
53
|
+
"control",
|
|
54
|
+
"queue",
|
|
55
|
+
"task"
|
|
53
56
|
],
|
|
54
57
|
"license": "Apache-2.0",
|
|
55
58
|
"bugs": {
|
package/src/combine.ts
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createQueue } from './queue.js';
|
|
2
2
|
|
|
3
3
|
export const combine = <T, R = unknown>(...iterables: AsyncIterable<T>[]) => {
|
|
4
|
-
const
|
|
4
|
+
const queue = createQueue<IteratorResult<T, R>>();
|
|
5
5
|
|
|
6
6
|
Promise.all(
|
|
7
7
|
iterables.map(async (iterable) => {
|
|
8
8
|
for await (const value of iterable) {
|
|
9
|
-
await
|
|
9
|
+
await queue.push({ value, done: false }).promise;
|
|
10
10
|
}
|
|
11
11
|
})
|
|
12
|
-
).then(async () =>
|
|
12
|
+
).then(async () => queue.done({ value: null, done: true }));
|
|
13
13
|
|
|
14
14
|
return {
|
|
15
15
|
[Symbol.asyncIterator]() {
|
|
16
16
|
return {
|
|
17
17
|
next() {
|
|
18
|
-
return
|
|
18
|
+
return queue.pull().promise;
|
|
19
19
|
},
|
|
20
20
|
};
|
|
21
21
|
},
|
package/src/defer.ts
CHANGED
|
@@ -14,22 +14,36 @@ export const getId = () => {
|
|
|
14
14
|
return (counter[0] + counter[1]++).toString(16);
|
|
15
15
|
};
|
|
16
16
|
|
|
17
|
-
export class Deferred<T = void, E = unknown> {
|
|
17
|
+
export class Deferred<T = void, S = unknown, E = unknown> {
|
|
18
18
|
private txts = getId();
|
|
19
19
|
private _promise: Promise<T>;
|
|
20
|
-
private _resolve?: (value: T) => void;
|
|
20
|
+
private _resolve?: (value: T | PromiseLike<T>) => void;
|
|
21
21
|
private _reject?: (error: E) => void;
|
|
22
22
|
private _status: Status = Status.PENDING;
|
|
23
23
|
|
|
24
|
+
public state: S;
|
|
25
|
+
|
|
24
26
|
constructor() {
|
|
25
27
|
this._promise = new Promise<T>((resolve, reject) => {
|
|
26
28
|
this._resolve = resolve;
|
|
27
29
|
this._reject = reject;
|
|
28
|
-
})
|
|
30
|
+
})
|
|
31
|
+
.catch((error) => {
|
|
32
|
+
this._status = Status.REJECTED;
|
|
33
|
+
throw error;
|
|
34
|
+
})
|
|
35
|
+
.then((value) => {
|
|
36
|
+
this._status = Status.RESOLVED;
|
|
37
|
+
return value;
|
|
38
|
+
});
|
|
29
39
|
this.resolve = this.resolve.bind(this);
|
|
30
40
|
this.reject = this.reject.bind(this);
|
|
31
41
|
}
|
|
32
42
|
|
|
43
|
+
get id() {
|
|
44
|
+
return this.txts;
|
|
45
|
+
}
|
|
46
|
+
|
|
33
47
|
get [Symbol.toStringTag]() {
|
|
34
48
|
return `Deferred ${this.txts} ${this._status}`;
|
|
35
49
|
}
|
|
@@ -42,20 +56,15 @@ export class Deferred<T = void, E = unknown> {
|
|
|
42
56
|
return this._status;
|
|
43
57
|
}
|
|
44
58
|
|
|
45
|
-
resolve(value: T) {
|
|
46
|
-
|
|
47
|
-
this._status = Status.RESOLVED;
|
|
48
|
-
this._resolve(value);
|
|
49
|
-
}
|
|
59
|
+
resolve(value: T | PromiseLike<T>) {
|
|
60
|
+
this._resolve(value);
|
|
50
61
|
|
|
51
62
|
return this;
|
|
52
63
|
}
|
|
53
64
|
|
|
54
65
|
reject(error: E) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
this._reject(error);
|
|
58
|
-
}
|
|
66
|
+
this._reject(error);
|
|
67
|
+
|
|
59
68
|
return this;
|
|
60
69
|
}
|
|
61
70
|
}
|
package/src/generatorify.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createQueue } from './queue.js';
|
|
2
2
|
|
|
3
3
|
export interface TaskCallback<T> {
|
|
4
4
|
(value: T): Promise<void>;
|
|
@@ -9,19 +9,19 @@ export interface Task<T, R = unknown> {
|
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export const generatorify = <T, R>(task: Task<T, R>): AsyncIterable<T> => {
|
|
12
|
-
const
|
|
12
|
+
const queue = createQueue<IteratorResult<T, R>>();
|
|
13
13
|
|
|
14
14
|
Promise.resolve(
|
|
15
15
|
task(async (value) => {
|
|
16
|
-
await
|
|
16
|
+
await queue.push({ value, done: false }).promise;
|
|
17
17
|
})
|
|
18
|
-
).then(async (value) =>
|
|
18
|
+
).then(async (value) => queue.done({ value, done: true }));
|
|
19
19
|
|
|
20
20
|
return {
|
|
21
21
|
[Symbol.asyncIterator]() {
|
|
22
22
|
return {
|
|
23
23
|
next() {
|
|
24
|
-
return
|
|
24
|
+
return queue.pull().promise;
|
|
25
25
|
},
|
|
26
26
|
};
|
|
27
27
|
},
|
package/src/index.ts
CHANGED
package/src/queue.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { defer, Deferred, Status } from './defer.js';
|
|
2
|
+
|
|
3
|
+
export const createQueue = <T, E = Error>() => {
|
|
4
|
+
const pendingQueue: Deferred<T, E>[] = [];
|
|
5
|
+
const resolvedQueue: Deferred<T, E>[] = [];
|
|
6
|
+
const requestQueue: Deferred<T, E>[] = [];
|
|
7
|
+
|
|
8
|
+
const push = (value: T): Deferred<T, E> => {
|
|
9
|
+
const task = defer<T, E>();
|
|
10
|
+
pendingQueue.push(task);
|
|
11
|
+
|
|
12
|
+
Promise.resolve(value)
|
|
13
|
+
.then(task.resolve)
|
|
14
|
+
.catch(task.reject)
|
|
15
|
+
.finally(() => {
|
|
16
|
+
pendingQueue.splice(pendingQueue.indexOf(task), 1);
|
|
17
|
+
if (requestQueue.length > 0) {
|
|
18
|
+
const request = requestQueue.shift();
|
|
19
|
+
request.resolve(task.promise);
|
|
20
|
+
} else {
|
|
21
|
+
resolvedQueue.push(task);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
return task;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const pull = (): Deferred<T, E> => {
|
|
29
|
+
if (resolvedQueue.length > 0) {
|
|
30
|
+
return resolvedQueue.shift();
|
|
31
|
+
}
|
|
32
|
+
const task = defer<T, E>();
|
|
33
|
+
requestQueue.push(task);
|
|
34
|
+
|
|
35
|
+
return task;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
push,
|
|
40
|
+
pull,
|
|
41
|
+
done(value: T) {
|
|
42
|
+
push(value);
|
|
43
|
+
return Promise.all(
|
|
44
|
+
[...pendingQueue, ...resolvedQueue, ...requestQueue].map(
|
|
45
|
+
(d) => d.promise
|
|
46
|
+
)
|
|
47
|
+
);
|
|
48
|
+
},
|
|
49
|
+
get size() {
|
|
50
|
+
return pendingQueue.length + resolvedQueue.length + requestQueue.length;
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
};
|
package/build/deferredPoll.cjs
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "createPoll", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return createPoll;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _defercjs = require("./defer.cjs");
|
|
12
|
-
const createPoll = ()=>{
|
|
13
|
-
const dPoll = [
|
|
14
|
-
(0, _defercjs.defer)()
|
|
15
|
-
];
|
|
16
|
-
return {
|
|
17
|
-
push (value) {
|
|
18
|
-
const next = (0, _defercjs.defer)();
|
|
19
|
-
const prev = dPoll.push(next) - 2;
|
|
20
|
-
const prevDeferred = dPoll[prev];
|
|
21
|
-
prevDeferred.resolve(value);
|
|
22
|
-
return prevDeferred;
|
|
23
|
-
},
|
|
24
|
-
pull () {
|
|
25
|
-
const current = dPoll[0];
|
|
26
|
-
current.promise.then(()=>dPoll.shift());
|
|
27
|
-
return current;
|
|
28
|
-
},
|
|
29
|
-
done (value) {
|
|
30
|
-
dPoll[dPoll.length - 1].resolve(value);
|
|
31
|
-
return Promise.all(dPoll.map((d)=>d.promise));
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
//# sourceMappingURL=deferredPoll.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/deferredPoll.ts"],"sourcesContent":["import { defer, Deferred } from './defer.js';\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;;;eAAAA;;;0BAFmB;AAEzB,MAAMA,aAAa;IACxB,MAAMC,QAAuB;QAACC,IAAAA,eAAK;KAAM;IAEzC,OAAO;QACLC,MAAKC,KAAQ;YACX,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;YACE,MAAMC,UAAUT,KAAK,CAAC,EAAE;YACxBS,QAAQC,OAAO,CAACC,IAAI,CAAC,IAAMX,MAAMY,KAAK;YACtC,OAAOH;QACT;QACAI,MAAKV,KAAQ;YACXH,KAAK,CAACA,MAAMc,MAAM,GAAG,EAAE,CAACP,OAAO,CAACJ;YAChC,OAAOY,QAAQC,GAAG,CAAChB,MAAMiB,GAAG,CAAC,CAACC,IAAMA,EAAER,OAAO;QAC/C;IACF;AACF"}
|
package/build/deferredPoll.d.ts
DELETED
package/build/deferredPoll.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/deferredPoll.ts"],"sourcesContent":["import { defer, Deferred } from './defer.js';\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,aAAa;AAE7C,OAAO,MAAMC,aAAa;IACxB,MAAMC,QAAuB;QAACF;KAAW;IAEzC,OAAO;QACLG,MAAKC,KAAQ;YACX,MAAMC,OAAOL;YACb,MAAMM,OAAOJ,MAAMC,IAAI,CAACE,QAAQ;YAChC,MAAME,eAAeL,KAAK,CAACI,KAAK;YAChCC,aAAaC,OAAO,CAACJ;YAErB,OAAOG;QACT;QACAE;YACE,MAAMC,UAAUR,KAAK,CAAC,EAAE;YACxBQ,QAAQC,OAAO,CAACC,IAAI,CAAC,IAAMV,MAAMW,KAAK;YACtC,OAAOH;QACT;QACAI,MAAKV,KAAQ;YACXF,KAAK,CAACA,MAAMa,MAAM,GAAG,EAAE,CAACP,OAAO,CAACJ;YAChC,OAAOY,QAAQC,GAAG,CAACf,MAAMgB,GAAG,CAAC,CAACC,IAAMA,EAAER,OAAO;QAC/C;IACF;AACF,EAAE"}
|
package/src/deferredPoll.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { defer, Deferred } from './defer.js';
|
|
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
|
-
};
|