Skip to content

Commit 39a29ce

Browse files
committed
🔀 Merge branch 'devel' into release
- 📦 Badge section is deleted - 📦 Email address is corrected - ⬆️ Packages for development are updated - `@types/chai` is upgraded from 4.2.21 to 4.2.22 - `@types/node` is upgraded from 16.7.8 to 16.11.6 - `@typescript-eslint/eslint-plugin` is upgraded from 4.30.0 to 5.3.0 - `@typescript-eslint/eslint-parser` is upgraded from 4.30.0 to 5.3.0 - `eslint` is upgraded from 7.32.0 to 8.2.0 - `mocha` is upgraded from 9.1.1 to 9.1.3 - `terser` is upgraded from 5.7.2 to 5.9.0 - `ts-node` is upgraded from 10.2.1 to 10.4.0 - `typescript` is upgraded from 4.4.2 to 4.4.4 - 🎨 Some indents are fixed Signed-off-by: kei-g <km.8k6ce+github@gmail.com>
2 parents 352f6e7 + 5de5697 commit 39a29ce

File tree

3 files changed

+157
-102
lines changed

3 files changed

+157
-102
lines changed

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,21 @@
11
# ChangeLogs
22

3+
## Version 1.0.8
4+
5+
- :package: Badge section is deleted
6+
- :package: Email address is corrected
7+
- :arrow_up: Packages for development are updated
8+
- `@types/chai` is upgraded from 4.2.21 to 4.2.22
9+
- `@types/node` is upgraded from 16.7.8 to 16.11.6
10+
- `@typescript-eslint/eslint-plugin` is upgraded from 4.30.0 to 5.3.0
11+
- `@typescript-eslint/eslint-parser` is upgraded from 4.30.0 to 5.3.0
12+
- `eslint` is upgraded from 7.32.0 to 8.2.0
13+
- `mocha` is upgraded from 9.1.1 to 9.1.3
14+
- `terser` is upgraded from 5.7.2 to 5.9.0
15+
- `ts-node` is upgraded from 10.2.1 to 10.4.0
16+
- `typescript` is upgraded from 4.4.2 to 4.4.4
17+
- :art: Some indents are fixed
18+
319
## Version 1.0.7
420

521
- :heavy_minus_sign: `uuid` is removed from development packages

package.json

Lines changed: 10 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,8 @@
11
{
22
"author": {
3-
"email": "km.8k6ce+github@gmail.com",
3+
"email": "km.8k6ce+npm@gmail.com",
44
"name": "kei-g"
55
},
6-
"badges": [
7-
{
8-
"description": "license",
9-
"href": "https://opensource.org/licenses/BSD-3-Clause",
10-
"url": "https://img.shields.io/github/license/kei-g/async-iterable-queue"
11-
},
12-
{
13-
"description": "dependency",
14-
"href": "https://npmjs.com/package/async-iterable-queue?activeTab=dependencies",
15-
"url": "https://img.shields.io/librariesio/release/npm/async-iterable-queue?logo=nodedotjs"
16-
},
17-
{
18-
"description": "Travis CI",
19-
"href": "https://www.travis-ci.com/github/kei-g/async-iterable-queue",
20-
"url": "https://img.shields.io/travis/com/kei-g/async-iterable-queue?logo=travis"
21-
},
22-
{
23-
"description": "version",
24-
"href": "https://npmjs.com/package/async-iterable-queue",
25-
"url": "https://img.shields.io/npm/v/async-iterable-queue?logo=npm"
26-
},
27-
{
28-
"description": "maintenance",
29-
"href": "https://npms.io/search?q=async-iterable-queue",
30-
"url": "https://img.shields.io/npms-io/maintenance-score/async-iterable-queue?logo=npm"
31-
},
32-
{
33-
"description": "quality",
34-
"href": "https://npms.io/search?q=async-iterable-queue",
35-
"url": "https://img.shields.io/npms-io/quality-score/async-iterable-queue?logo=npm"
36-
}
37-
],
386
"bugs": {
397
"url": "https://github.com/kei-g/async-iterable-queue/issues"
408
},
@@ -43,20 +11,20 @@
4311
],
4412
"description": "Async Iterable Queue",
4513
"devDependencies": {
46-
"@types/chai": "^4.2.21",
14+
"@types/chai": "^4.2.22",
4715
"@types/mocha": "^9.0.0",
48-
"@types/node": "^16.7.8",
49-
"@typescript-eslint/eslint-plugin": "^4.30.0",
50-
"@typescript-eslint/parser": "^4.30.0",
16+
"@types/node": "^16.11.6",
17+
"@typescript-eslint/eslint-plugin": "^5.3.0",
18+
"@typescript-eslint/parser": "^5.3.0",
5119
"chai": "^4.3.4",
52-
"eslint": "^7.32.0",
53-
"mocha": "^9.1.1",
20+
"eslint": "^8.2.0",
21+
"mocha": "^9.1.3",
5422
"npm-run-all": "^4.1.5",
5523
"nyc": "^15.1.0",
5624
"rimraf": "^3.0.2",
57-
"terser": "^5.7.2",
58-
"ts-node": "^10.2.1",
59-
"typescript": "^4.4.2"
25+
"terser": "^5.9.0",
26+
"ts-node": "^10.4.0",
27+
"typescript": "^4.4.4"
6028
},
6129
"homepage": "https://github.com/kei-g/async-iterable-queue",
6230
"keywords": [

src/lib/async-iterable-queue.ts

Lines changed: 131 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ class AIQAsyncIterator<T> implements AsyncIterator<T> {
2020
* @param emitter 事象発生器への参照
2121
* @param resolvers 反復結果解決関数の配列への参照
2222
*/
23-
constructor(emitter: EventEmitter, resolvers: IteratorResultResolver<T>[]) {
23+
constructor(
24+
emitter: EventEmitter,
25+
resolvers: IteratorResultResolver<T>[],
26+
) {
2427
this.#emitter = emitter
2528
this.#resolvers = resolvers
2629
}
@@ -30,10 +33,14 @@ class AIQAsyncIterator<T> implements AsyncIterator<T> {
3033
* @returns 次の要素
3134
*/
3235
next(): Promise<IteratorResult<T>> {
33-
return new Promise((resolve: IteratorResultResolver<T>) => (
34-
this.#resolvers.push(resolve),
35-
this.#emitter.emit('deq')
36-
))
36+
return new Promise(
37+
(
38+
resolve: IteratorResultResolver<T>,
39+
) => {
40+
this.#resolvers.push(resolve)
41+
this.#emitter.emit('deq')
42+
}
43+
)
3744
}
3845
}
3946

@@ -75,37 +82,62 @@ export class AsyncIterableQueue<T> implements AsyncIterable<T> {
7582
*/
7683
constructor() {
7784
this.#state[0] = AIQState.undefined
78-
const resolveAsync = createAsyncResolver({
79-
finish: () => Atomics.exchange(this.#state, 0, AIQState.finished),
80-
resolvers: this.#resolvers,
81-
})
82-
this.#emitter.on('deq', async () => {
83-
while (this.#queue.length && this.#resolvers.length)
84-
await resolveAsync(this.#queue.shift())
85-
})
86-
this.#emitter.on('enq', async (value: Terminatable<T>) =>
87-
this.#resolvers.length ?
88-
await resolveAsync(value) :
89-
this.#queue.push(value)
85+
const resolveAsync = createAsyncResolver(
86+
{
87+
finish: () =>
88+
Atomics.exchange(
89+
this.#state,
90+
0,
91+
AIQState.finished,
92+
),
93+
resolvers: this.#resolvers,
94+
}
95+
)
96+
this.#emitter.on(
97+
'deq',
98+
async () => {
99+
while (this.#queue.length
100+
&& this.#resolvers.length)
101+
await resolveAsync(
102+
this.#queue.shift()
103+
)
104+
}
105+
)
106+
this.#emitter.on(
107+
'enq',
108+
async (value: Terminatable<T>) =>
109+
this.#resolvers.length
110+
? await resolveAsync(value)
111+
: this.#queue.push(value)
90112
)
91113
}
92114

93115
/**
94116
* この待ち行列への要素の追加を終了する
95117
* @param cb 終端が読み取られた後に呼ばれるコールバック関数
96118
*/
97-
end(cb?: NoParameterCallback): Promise<void> {
119+
end(
120+
cb?: NoParameterCallback,
121+
): Promise<void> {
98122
return new Promise(
99-
(resolve: Resolver<void>, reject: SingleParameterAction<unknown>) => {
123+
(
124+
resolve: Resolver<void>,
125+
reject: SingleParameterAction<unknown>,
126+
) => {
100127
const state = Atomics.compareExchange(
101128
this.#state,
102129
0,
103130
AIQState.undefined,
104131
AIQState.ending,
105132
)
106133
if (state !== AIQState.undefined)
107-
return reject(new Error(AIQState[state]))
108-
this.#emitter.emit('enq', new Terminator(cb))
134+
return reject(
135+
new Error(AIQState[state])
136+
)
137+
this.#emitter.emit(
138+
'enq',
139+
new Terminator(cb),
140+
)
109141
return resolve()
110142
}
111143
)
@@ -117,11 +149,22 @@ export class AsyncIterableQueue<T> implements AsyncIterable<T> {
117149
*/
118150
push(value: T): Promise<void> {
119151
return new Promise(
120-
(resolve: Resolver<void>, reject: SingleParameterAction<unknown>) => {
121-
const state = Atomics.load(this.#state, 0)
152+
(
153+
resolve: Resolver<void>,
154+
reject: SingleParameterAction<unknown>,
155+
) => {
156+
const state = Atomics.load(
157+
this.#state,
158+
0,
159+
)
122160
if (state !== AIQState.undefined)
123-
return reject(new Error(AIQState[state]))
124-
this.#emitter.emit('enq', value)
161+
return reject(
162+
new Error(AIQState[state])
163+
)
164+
this.#emitter.emit(
165+
'enq',
166+
value,
167+
)
125168
return resolve()
126169
}
127170
)
@@ -132,7 +175,10 @@ export class AsyncIterableQueue<T> implements AsyncIterable<T> {
132175
* @returns 非同期反復子
133176
*/
134177
[Symbol.asyncIterator](): AsyncIterator<T> {
135-
return new AIQAsyncIterator(this.#emitter, this.#resolvers)
178+
return new AIQAsyncIterator(
179+
this.#emitter,
180+
this.#resolvers,
181+
)
136182
}
137183
}
138184

@@ -155,22 +201,26 @@ type AsyncResolverCreateParameter<T> = {
155201
/**
156202
* 反復結果解決関数型
157203
*/
158-
type IteratorResultResolver<T> = Resolver<IteratorResult<T>>
204+
type IteratorResultResolver<T> =
205+
Resolver<IteratorResult<T>>
159206

160207
/**
161208
* 引数無しコールバック関数型
162209
*/
163-
type NoParameterCallback = () => PromiseLike<void> | void
210+
type NoParameterCallback =
211+
() => PromiseLike<void> | void
164212

165213
/**
166214
* 解決関数型
167215
*/
168-
type Resolver<T> = SingleParameterAction<T>
216+
type Resolver<T> =
217+
SingleParameterAction<T>
169218

170219
/**
171220
* 引数1個の関数型
172221
*/
173-
type SingleParameterAction<T> = (arg: T) => void
222+
type SingleParameterAction<T> =
223+
(arg: T) => void
174224

175225
/**
176226
* 終端
@@ -180,59 +230,80 @@ class Terminator {
180230
* コンストラクタ
181231
* @param cb コールバック関数
182232
*/
183-
constructor(private readonly cb?: NoParameterCallback) {
233+
constructor(
234+
private readonly cb?: NoParameterCallback,
235+
) {
184236
}
185237

186238
/**
187239
* コールバック関数を呼び出す
188240
*/
189241
call(): Promise<void> {
190-
return new Promise((
191-
resolve: Resolver<void>,
192-
reject: SingleParameterAction<unknown>,
193-
) => {
194-
if (this.cb)
195-
try {
196-
const result = this.cb()
197-
if (result instanceof Promise)
198-
return result.catch(reject).then(resolve)
199-
}
200-
catch (err: unknown) {
201-
return reject(err)
202-
}
203-
return resolve()
204-
})
242+
return new Promise(
243+
(
244+
resolve: Resolver<void>,
245+
reject: SingleParameterAction<unknown>,
246+
) => {
247+
if (this.cb)
248+
try {
249+
const result = this.cb()
250+
if (result instanceof Promise)
251+
return result.catch(reject).then(resolve)
252+
}
253+
catch (err: unknown) {
254+
return reject(err)
255+
}
256+
return resolve()
257+
}
258+
)
205259
}
206260
}
207261

208262
/**
209263
* 終端可能型
210264
*/
211-
type Terminatable<T> = Terminator | T
265+
type Terminatable<T> =
266+
Terminator | T
212267

213268
/**
214269
* 反復結果解決関数を非同期的に処理する関数を作成する
215270
* @param param パラメータ
216271
* @returns 反復結果解決関数を非同期的に処理する関数を返す
217272
*/
218-
const createAsyncResolver = <T>(param: AsyncResolverCreateParameter<T>) => {
219-
const resolveAsync = (result: IteratorResult<T>) =>
220-
new Promise((callback: Resolver<void>) => {
221-
const resolver = param.resolvers.shift()
222-
resolver(result)
223-
callback()
224-
})
225-
return async (value: Terminatable<T>) => {
273+
const createAsyncResolver = <T>(
274+
param: AsyncResolverCreateParameter<T>,
275+
) => {
276+
const resolveAsync = (
277+
result: IteratorResult<T>,
278+
) =>
279+
new Promise(
280+
(
281+
callback: Resolver<void>,
282+
) => {
283+
const resolver = param.resolvers.shift()
284+
resolver(result)
285+
callback()
286+
}
287+
)
288+
return async (
289+
value: Terminatable<T>,
290+
) => {
226291
if (value instanceof Terminator) {
227292
const state = param.finish()
228-
await resolveAsync({ done: true } as IteratorResult<T>)
293+
await resolveAsync(
294+
{
295+
done: true
296+
} as IteratorResult<T>
297+
)
229298
assert(state === AIQState.ending)
230299
await value.call()
231300
}
232301
else
233-
await resolveAsync({
234-
done: false,
235-
value,
236-
})
302+
await resolveAsync(
303+
{
304+
done: false,
305+
value,
306+
}
307+
)
237308
}
238309
}

0 commit comments

Comments
 (0)