@zwa73/utils 1.0.14 → 1.0.16
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/dist/UtilClass.d.ts +289 -125
- package/dist/UtilClass.js +354 -136
- package/dist/UtilDecorators.d.ts +16 -0
- package/dist/UtilDecorators.js +65 -0
- package/dist/UtilFfmpegTools.d.ts +7 -23
- package/dist/UtilFfmpegTools.js +36 -59
- package/dist/UtilFunctions.d.ts +42 -4
- package/dist/UtilFunctions.js +128 -47
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/package.json +1 -1
- package/src/UtilClass.ts +517 -232
- package/src/UtilDecorators.ts +59 -0
- package/src/UtilFfmpegTools.ts +36 -60
- package/src/UtilFunctions.ts +159 -73
- package/src/UtilInterfaces.ts +0 -2
- package/src/index.ts +2 -1
- package/test.js +10 -1
package/dist/UtilClass.js
CHANGED
|
@@ -1,46 +1,50 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SHashMap = exports.SEntry = exports.SIterator = exports.SList = void 0;
|
|
3
|
+
exports.SHashMap = exports.SEntry = exports.SIterator = exports.SStream = exports.SList = void 0;
|
|
4
4
|
class SList {
|
|
5
5
|
_arr;
|
|
6
6
|
constructor(obj) {
|
|
7
|
-
if (typeof obj ==
|
|
7
|
+
if (typeof obj == "number")
|
|
8
8
|
this._arr = new Array(obj);
|
|
9
9
|
else if (Array.isArray(obj))
|
|
10
10
|
this._arr = obj;
|
|
11
11
|
else
|
|
12
12
|
this._arr = [];
|
|
13
13
|
}
|
|
14
|
-
|
|
14
|
+
/**返回数组长度
|
|
15
|
+
* @returns {number} - 长度
|
|
16
|
+
*/
|
|
15
17
|
size() {
|
|
16
18
|
return this._arr.length;
|
|
17
19
|
}
|
|
18
20
|
/**获取指定下标的元素
|
|
19
|
-
* @param index 下标
|
|
21
|
+
* @param {number} index - 下标
|
|
22
|
+
* @returns {T} - 目标元素
|
|
20
23
|
*/
|
|
21
24
|
get(index) {
|
|
22
25
|
return this._arr[index];
|
|
23
26
|
}
|
|
24
27
|
/**设置指定下标的元素
|
|
25
28
|
* 返回自身 改变自身
|
|
26
|
-
* @param index 下标
|
|
27
|
-
* @param value 值
|
|
28
|
-
* @returns 自身
|
|
29
|
+
* @param {number} index - 下标
|
|
30
|
+
* @param {T} value - 值
|
|
31
|
+
* @returns {SList<T>} - 自身
|
|
29
32
|
*/
|
|
30
33
|
set(index, value) {
|
|
31
34
|
this._arr[index] = value;
|
|
32
35
|
return this;
|
|
33
36
|
}
|
|
34
37
|
/**连接两个数组
|
|
35
|
-
* @param list 目标数组
|
|
36
|
-
* @returns 新数组
|
|
38
|
+
* @param {SList<T>} list - 目标数组
|
|
39
|
+
* @returns {SList<T>} - 新数组
|
|
37
40
|
*/
|
|
38
41
|
concat(list) {
|
|
39
42
|
return new SList(this._arr.concat(list._arr));
|
|
40
43
|
}
|
|
41
44
|
/**在数组末尾添加一个元素
|
|
42
45
|
* 返回自身 改变自身
|
|
43
|
-
* @param value 值
|
|
46
|
+
* @param {T} value - 值
|
|
47
|
+
* @returns {SList<T>} - 自身
|
|
44
48
|
*/
|
|
45
49
|
push(value) {
|
|
46
50
|
this._arr.push(value);
|
|
@@ -48,103 +52,141 @@ class SList {
|
|
|
48
52
|
}
|
|
49
53
|
/**在数组末尾添加一个数组
|
|
50
54
|
* 改变自身
|
|
51
|
-
* @param list 目标数组
|
|
52
|
-
* @returns 自身
|
|
55
|
+
* @param {SList<T>} list - 目标数组
|
|
56
|
+
* @returns {SList<T>} - 自身
|
|
53
57
|
*/
|
|
54
58
|
pushList(list) {
|
|
55
59
|
this._arr = this._arr.concat(list._arr);
|
|
56
60
|
return this;
|
|
57
61
|
}
|
|
58
62
|
/**截取从起始点到结束点之前的一段数组
|
|
59
|
-
* @param strat
|
|
60
|
-
* @param end 结束点
|
|
61
|
-
* @returns 新数组
|
|
63
|
+
* @param {number} strat - 起始点
|
|
64
|
+
* @param {number} end - 结束点
|
|
65
|
+
* @returns {SList<T>} - 新数组
|
|
62
66
|
*/
|
|
63
67
|
slice(strat, end) {
|
|
64
68
|
return new SList(this._arr.slice(strat, end));
|
|
65
69
|
}
|
|
66
70
|
/**翻转数组
|
|
67
71
|
* 改变自身
|
|
68
|
-
* @returns 自身
|
|
72
|
+
* @returns {SList<T>} - 自身
|
|
69
73
|
*/
|
|
70
74
|
reverse() {
|
|
71
75
|
this._arr.reverse();
|
|
72
76
|
return this;
|
|
73
77
|
}
|
|
74
|
-
/**将SList转换为数组
|
|
78
|
+
/**将SList转换为数组
|
|
79
|
+
* @returns {Array<T>} - 数组
|
|
80
|
+
*/
|
|
75
81
|
toArray() {
|
|
76
82
|
return [].concat(this._arr);
|
|
77
83
|
}
|
|
84
|
+
/**将SList转换为SStream
|
|
85
|
+
* @param {number} concurrent - 并发数
|
|
86
|
+
* @returns {SStream<T>} - 流
|
|
87
|
+
*/
|
|
88
|
+
toSStream(concurrent) {
|
|
89
|
+
return new SStream(this._arr, concurrent);
|
|
90
|
+
}
|
|
78
91
|
/**返回指定元素在数组中首次出现的位置
|
|
79
|
-
* @param value 目标元素
|
|
92
|
+
* @param {T} value - 目标元素
|
|
93
|
+
* @returns {number} - 下标
|
|
80
94
|
*/
|
|
81
95
|
indexOf(value) {
|
|
82
96
|
return this._arr.indexOf(value);
|
|
83
97
|
}
|
|
84
98
|
/**返回指定元素在数组中最后一次出现的位置
|
|
85
|
-
* @param value 目标元素
|
|
99
|
+
* @param {T} value - 目标元素
|
|
100
|
+
* @returns {number} - 下标
|
|
86
101
|
*/
|
|
87
102
|
lastIndexOf(value) {
|
|
88
103
|
return this._arr.lastIndexOf(value);
|
|
89
104
|
}
|
|
90
105
|
/**判断数组中是否包含指定元素
|
|
91
|
-
* @param value 目标元素
|
|
106
|
+
* @param {T} value - 目标元素
|
|
107
|
+
* @returns {boolean} - 是否包含
|
|
92
108
|
*/
|
|
93
109
|
contains(value) {
|
|
94
110
|
return this._arr.includes(value);
|
|
95
111
|
}
|
|
96
|
-
/**获取迭代器
|
|
112
|
+
/**获取迭代器
|
|
113
|
+
* @returns {SIterator<T>} - 迭代器
|
|
114
|
+
*/
|
|
97
115
|
iterator() {
|
|
98
116
|
return new SIterator(this);
|
|
99
117
|
}
|
|
100
|
-
/**平分数组
|
|
101
|
-
|
|
118
|
+
/**平分数组
|
|
119
|
+
* @param {number} count - 份数
|
|
120
|
+
* @param {"average" | "chunk"} mode - 模式 average:轮询平均分 chunk:切块均分
|
|
121
|
+
* @returns {SList<SList<T>>} - 新数组
|
|
122
|
+
*/
|
|
123
|
+
divide(count, mode = "average") {
|
|
124
|
+
if (count <= 0)
|
|
125
|
+
return new SList();
|
|
126
|
+
if (count == 1)
|
|
127
|
+
return new SList([this.clone()]);
|
|
102
128
|
let result = new SList();
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
129
|
+
switch (mode) {
|
|
130
|
+
//轮询平均分
|
|
131
|
+
default:
|
|
132
|
+
case "average":
|
|
133
|
+
for (let i = 0; i < count; i++) {
|
|
134
|
+
let clist = new SList();
|
|
135
|
+
let size = this.size();
|
|
136
|
+
for (let j = i; j < size; j += count)
|
|
137
|
+
clist.push(this.get(j));
|
|
138
|
+
result.push(clist);
|
|
139
|
+
}
|
|
140
|
+
break;
|
|
141
|
+
//切块均分
|
|
142
|
+
case "chunk":
|
|
143
|
+
let chunkSize = Math.ceil(this.size() / count);
|
|
144
|
+
for (let i = 0; i < count; i++) {
|
|
145
|
+
let start = i * chunkSize;
|
|
146
|
+
let end = (i + 1) * chunkSize;
|
|
147
|
+
if (end > this.size())
|
|
148
|
+
end = this.size();
|
|
149
|
+
result.push(this.slice(start, end));
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
110
152
|
}
|
|
111
153
|
return result;
|
|
112
154
|
}
|
|
113
|
-
/**从index开始删除count
|
|
155
|
+
/**从index开始删除count个元素,返回删除的元素数组
|
|
114
156
|
* 改变自身
|
|
115
|
-
* @param index 起始点
|
|
116
|
-
* @param count 数量
|
|
117
|
-
* @returns
|
|
157
|
+
* @param {number} index - 起始点
|
|
158
|
+
* @param {number} count - 数量
|
|
159
|
+
* @returns {SList<T>} - 删除的元素数组
|
|
118
160
|
*/
|
|
119
161
|
removeRange(index, count) {
|
|
120
|
-
this._arr.splice(index, count);
|
|
121
|
-
return
|
|
162
|
+
let narr = this._arr.splice(index, count);
|
|
163
|
+
return new SList(narr);
|
|
122
164
|
}
|
|
123
|
-
|
|
165
|
+
/**删除对应下标下的元素,返回删除的元素
|
|
124
166
|
* 改变自身
|
|
125
|
-
* @param i 下标
|
|
126
|
-
* @returns
|
|
167
|
+
* @param {number} i - 下标
|
|
168
|
+
* @returns {T|null} - 删除的元素
|
|
127
169
|
*/
|
|
128
170
|
remove(i) {
|
|
129
171
|
if (i >= 0 && i < this.size())
|
|
130
|
-
this._arr.splice(i, 1);
|
|
131
|
-
return
|
|
172
|
+
return this._arr.splice(i, 1)[0];
|
|
173
|
+
return null;
|
|
132
174
|
}
|
|
133
|
-
|
|
175
|
+
/**删除第一个匹配的项目,返回自身
|
|
134
176
|
* 改变自身
|
|
135
|
-
* @param obj 需删除目标
|
|
136
|
-
* @returns 自身
|
|
177
|
+
* @param {T} obj - 需删除目标
|
|
178
|
+
* @returns {SList<T>} - 自身
|
|
137
179
|
*/
|
|
138
180
|
removeMember(obj) {
|
|
139
181
|
let index = this.indexOf(obj);
|
|
140
182
|
if (index > -1)
|
|
141
|
-
this.
|
|
183
|
+
this.remove(index);
|
|
142
184
|
return this;
|
|
143
185
|
}
|
|
144
186
|
/**删除所有匹配的项目
|
|
145
187
|
* 改变自身
|
|
146
|
-
* @param obj 需删除目标
|
|
147
|
-
* @returns 自身
|
|
188
|
+
* @param {T} obj - 需删除目标
|
|
189
|
+
* @returns {SList<T>} - 自身
|
|
148
190
|
*/
|
|
149
191
|
removeAllMember(obj) {
|
|
150
192
|
while (this.contains(obj))
|
|
@@ -153,9 +195,9 @@ class SList {
|
|
|
153
195
|
}
|
|
154
196
|
/**在这个下标对应的元素前添加一个元素
|
|
155
197
|
* 改变自身
|
|
156
|
-
* @param index 下标
|
|
157
|
-
* @param obj 添加对象
|
|
158
|
-
* @returns 自身
|
|
198
|
+
* @param {number} index - 下标
|
|
199
|
+
* @param {T} obj - 添加对象
|
|
200
|
+
* @returns {SList<T>} - 自身
|
|
159
201
|
*/
|
|
160
202
|
insert(index, obj) {
|
|
161
203
|
this._arr.splice(index, 0, obj);
|
|
@@ -163,46 +205,63 @@ class SList {
|
|
|
163
205
|
}
|
|
164
206
|
/**在这个下标对应的元素前添加一组元素
|
|
165
207
|
* 改变自身
|
|
166
|
-
* @param index 下标
|
|
167
|
-
* @param obj 添加对象
|
|
168
|
-
* @returns 自身
|
|
208
|
+
* @param {number} index - 下标
|
|
209
|
+
* @param {SList<T>} obj - 添加对象
|
|
210
|
+
* @returns {SList<T>} - 自身
|
|
169
211
|
*/
|
|
170
212
|
insertRange(index, obj) {
|
|
171
213
|
this._arr.splice(index, 0, ...obj._arr);
|
|
172
214
|
return this;
|
|
173
215
|
}
|
|
216
|
+
/**删除并返回最后一个元素
|
|
217
|
+
* 改变自身
|
|
218
|
+
* @returns {T | null} - 最后一个元素
|
|
219
|
+
*/
|
|
220
|
+
pop() {
|
|
221
|
+
let val = this._arr.pop();
|
|
222
|
+
return val == undefined ? null : val;
|
|
223
|
+
}
|
|
224
|
+
/**删除并返回第一个元素
|
|
225
|
+
* 改变自身
|
|
226
|
+
* @returns {T | null} - 第一个元素
|
|
227
|
+
*/
|
|
228
|
+
shift() {
|
|
229
|
+
let val = this._arr.shift();
|
|
230
|
+
return val == undefined ? null : val;
|
|
231
|
+
}
|
|
174
232
|
/**克隆数组
|
|
175
|
-
* @returns 新数组
|
|
233
|
+
* @returns {SList<T>} - 新数组
|
|
176
234
|
*/
|
|
177
235
|
clone() {
|
|
178
236
|
return new SList([].concat(this._arr));
|
|
179
237
|
}
|
|
180
238
|
/**判断数组是否为空
|
|
239
|
+
* @returns {boolean} - 是否为空
|
|
181
240
|
*/
|
|
182
241
|
isEmpty() {
|
|
183
242
|
return this.size() == 0;
|
|
184
243
|
}
|
|
185
244
|
/**删除数组中的重复元素
|
|
186
245
|
* 改变自身
|
|
187
|
-
* @returns 自身
|
|
246
|
+
* @returns {SList<T>} - 自身
|
|
188
247
|
*/
|
|
189
248
|
removeDuplicates() {
|
|
190
249
|
this._arr = Array.from(new Set(this._arr));
|
|
191
250
|
return this;
|
|
192
251
|
}
|
|
193
252
|
/**交集
|
|
194
|
-
* @param lists 数组列表
|
|
195
|
-
* @returns 新数组
|
|
253
|
+
* @param {SList<T>[]} lists - 数组列表
|
|
254
|
+
* @returns {SList<T>} - 新数组
|
|
196
255
|
*/
|
|
197
256
|
intersection(...lists) {
|
|
198
257
|
let nlist = this.clone().removeDuplicates();
|
|
199
258
|
for (let list of lists)
|
|
200
|
-
nlist = list.filt(val => nlist.contains(val));
|
|
259
|
+
nlist = list.filt((val) => nlist.contains(val));
|
|
201
260
|
return nlist;
|
|
202
261
|
}
|
|
203
262
|
/**并集
|
|
204
|
-
* @param lists 数组列表
|
|
205
|
-
* @returns 新数组
|
|
263
|
+
* @param {SList<T>[]} lists - 数组列表
|
|
264
|
+
* @returns {SList<T>} - 新数组
|
|
206
265
|
*/
|
|
207
266
|
union(...lists) {
|
|
208
267
|
let nlist = this.clone().removeDuplicates();
|
|
@@ -215,8 +274,8 @@ class SList {
|
|
|
215
274
|
return nlist;
|
|
216
275
|
}
|
|
217
276
|
/**返回符合条件的成员组成的新数组
|
|
218
|
-
* @param func 条件函数
|
|
219
|
-
* @returns 新数组
|
|
277
|
+
* @param {FiltCallback<T>} func - 条件函数
|
|
278
|
+
* @returns {SList<T>} - 新数组
|
|
220
279
|
*/
|
|
221
280
|
filt(func) {
|
|
222
281
|
let nlist = new SList(this.size());
|
|
@@ -224,7 +283,7 @@ class SList {
|
|
|
224
283
|
let it = this.iterator();
|
|
225
284
|
while (it.hasNext()) {
|
|
226
285
|
let tmpObj = it.next();
|
|
227
|
-
if (func(tmpObj)) {
|
|
286
|
+
if (func(tmpObj, it.currIndex(), this)) {
|
|
228
287
|
nlist.set(length, tmpObj);
|
|
229
288
|
length++;
|
|
230
289
|
}
|
|
@@ -232,46 +291,62 @@ class SList {
|
|
|
232
291
|
return nlist.slice(0, length);
|
|
233
292
|
}
|
|
234
293
|
/**遍历数组的每一个元素
|
|
235
|
-
* @param func
|
|
236
|
-
* @returns 自身
|
|
294
|
+
* @param {EachCallback<T>} func - 遍历函数 (value: T, index: number, list: SList<T>): void
|
|
295
|
+
* @returns {SList<T>} - 自身
|
|
237
296
|
*/
|
|
238
297
|
each(func) {
|
|
239
298
|
let it = this.iterator();
|
|
240
299
|
while (it.hasNext())
|
|
241
|
-
func(it.next());
|
|
300
|
+
func(it.next(), it.currIndex(), this);
|
|
242
301
|
return this;
|
|
243
302
|
}
|
|
244
303
|
/**对数组的每一个元素进行加工,返回加工完成的成员组成的新数组
|
|
245
|
-
* @param func 加工函数
|
|
246
|
-
* @returns 新数组
|
|
304
|
+
* @param {MapCallback<T,O>} func - 加工函数 (value: T, index: number, list: SList<T>): O
|
|
305
|
+
* @returns {SList<O>} - 新数组
|
|
247
306
|
*/
|
|
248
307
|
map(func) {
|
|
249
308
|
let nlist = new SList(this.size());
|
|
250
309
|
let it = this.iterator();
|
|
251
310
|
while (it.hasNext())
|
|
252
|
-
nlist.set(it.nextIndex(), func(it.next()));
|
|
311
|
+
nlist.set(it.nextIndex(), func(it.next(), it.currIndex(), this));
|
|
253
312
|
return nlist;
|
|
254
313
|
}
|
|
255
314
|
/**对数组进行排序
|
|
256
315
|
* 如函数返回值大于 0 则将 x 排在 y 后面,小于 0 则将 x 排在 y 前面
|
|
257
316
|
* 改变自身
|
|
258
|
-
* @param func
|
|
259
|
-
* @returns 自身
|
|
317
|
+
* @param {SortCallback<T>} func - 排序函数 (a: T, b: T): number
|
|
318
|
+
* @returns {SList<T>} - 自身
|
|
260
319
|
*/
|
|
261
320
|
sort(func) {
|
|
262
|
-
this._arr.sort(
|
|
321
|
+
this._arr.sort(func);
|
|
263
322
|
return this;
|
|
264
323
|
}
|
|
265
|
-
/**对数组进行统计
|
|
266
|
-
*
|
|
267
|
-
* @param
|
|
268
|
-
* @
|
|
324
|
+
/**对数组进行统计 aggregate
|
|
325
|
+
* 遍历数组,并将每次遍历的结果与下一次遍历的元素一起传入函数,最后返回最后一次遍历的结果
|
|
326
|
+
* @param {O} init - 初始值
|
|
327
|
+
* @param {AggrCallback<T,O>} func - 统计函数 (value: T, accumulator: U, index: number, list: SList<T>): U
|
|
328
|
+
* @returns {O} - 统计结果
|
|
269
329
|
*/
|
|
270
|
-
|
|
330
|
+
aggr(init, func) {
|
|
271
331
|
let it = this.iterator();
|
|
272
332
|
let tmpObj = init;
|
|
273
333
|
while (it.hasNext())
|
|
274
|
-
tmpObj = func(tmpObj, it.next());
|
|
334
|
+
tmpObj = func(tmpObj, it.next(), it.currIndex(), this);
|
|
335
|
+
return tmpObj;
|
|
336
|
+
}
|
|
337
|
+
/**对数组进行缩减
|
|
338
|
+
* 遍历数组,并将每次遍历的结果与下一次遍历的元素一起传入函数,最后返回最后一次遍历的结果
|
|
339
|
+
* @param {ReduceCallback<T>} func - 缩减函数 (previousValue: T, currentValue: T, currentIndex: number, array: SList<T>):T
|
|
340
|
+
* @param {T} init - 初始值
|
|
341
|
+
* @returns {T} - 缩减结果
|
|
342
|
+
*/
|
|
343
|
+
reduce(func, init) {
|
|
344
|
+
if (this.size() === 0)
|
|
345
|
+
return null;
|
|
346
|
+
let it = this.iterator();
|
|
347
|
+
let tmpObj = init === undefined ? it.next() : init;
|
|
348
|
+
while (it.hasNext())
|
|
349
|
+
tmpObj = func(tmpObj, it.next(), it.currIndex(), this);
|
|
275
350
|
return tmpObj;
|
|
276
351
|
}
|
|
277
352
|
//重载TypeScript操作符
|
|
@@ -290,6 +365,101 @@ class SList {
|
|
|
290
365
|
}
|
|
291
366
|
}
|
|
292
367
|
exports.SList = SList;
|
|
368
|
+
class SStream {
|
|
369
|
+
/**并发数*/
|
|
370
|
+
_concurrent;
|
|
371
|
+
/**原始列表*/
|
|
372
|
+
_slist;
|
|
373
|
+
/**加工函数列表*/
|
|
374
|
+
_operation = [];
|
|
375
|
+
constructor(slist, concurrent = 1) {
|
|
376
|
+
if (slist instanceof SList)
|
|
377
|
+
this._slist = slist;
|
|
378
|
+
else if (Array.isArray(slist))
|
|
379
|
+
this._slist = new SList(slist);
|
|
380
|
+
else
|
|
381
|
+
this._slist = new SList();
|
|
382
|
+
this._concurrent = concurrent;
|
|
383
|
+
}
|
|
384
|
+
/**映射加工
|
|
385
|
+
* @param {SStreamOperation<T,U>} operation - 加工函数
|
|
386
|
+
* @returns {SStream<U>} - 新流
|
|
387
|
+
*/
|
|
388
|
+
map(operation) {
|
|
389
|
+
this._operation.push(operation);
|
|
390
|
+
return this;
|
|
391
|
+
}
|
|
392
|
+
/**遍历
|
|
393
|
+
* 返回自身
|
|
394
|
+
* @param {SStreamOperation<T,void>} operation - 遍历函数
|
|
395
|
+
* @returns {SStream<T>} - 自身
|
|
396
|
+
*/
|
|
397
|
+
each(operation) {
|
|
398
|
+
let opera = async (item) => {
|
|
399
|
+
operation(item);
|
|
400
|
+
return item;
|
|
401
|
+
};
|
|
402
|
+
this._operation.push(opera);
|
|
403
|
+
return this;
|
|
404
|
+
}
|
|
405
|
+
//终结操作
|
|
406
|
+
/**应用加工
|
|
407
|
+
* @returns {SStream<T>} - 自身
|
|
408
|
+
*/
|
|
409
|
+
async appendOperations() {
|
|
410
|
+
if (this._operation.length == 0)
|
|
411
|
+
return this;
|
|
412
|
+
let nlist = new SList();
|
|
413
|
+
let promiseList = [];
|
|
414
|
+
//均分处理
|
|
415
|
+
let sliceList = this._slist.divide(this._concurrent);
|
|
416
|
+
for (let i = 0; i < this._concurrent; i++) {
|
|
417
|
+
let subList = sliceList.get(i);
|
|
418
|
+
if (!subList)
|
|
419
|
+
continue;
|
|
420
|
+
promiseList.push(new Promise(async () => {
|
|
421
|
+
let result = new SList();
|
|
422
|
+
for (let item of subList) {
|
|
423
|
+
if (!item)
|
|
424
|
+
continue;
|
|
425
|
+
for (let operation of this._operation)
|
|
426
|
+
item = await operation(item);
|
|
427
|
+
result.push(item);
|
|
428
|
+
}
|
|
429
|
+
nlist.set(i, result);
|
|
430
|
+
}));
|
|
431
|
+
}
|
|
432
|
+
await Promise.all(promiseList);
|
|
433
|
+
//拼接结果 轮询均分
|
|
434
|
+
let result = new SList(this._slist.size());
|
|
435
|
+
for (let i = 0; i < this._concurrent; i++) {
|
|
436
|
+
let subList = nlist.get(i);
|
|
437
|
+
if (!subList)
|
|
438
|
+
continue;
|
|
439
|
+
let subSize = subList.size();
|
|
440
|
+
for (let j = 0; j < subSize; j++)
|
|
441
|
+
result.set(i + j * this._concurrent, subList.get(j));
|
|
442
|
+
}
|
|
443
|
+
this._slist = result;
|
|
444
|
+
this._operation = [];
|
|
445
|
+
return this;
|
|
446
|
+
}
|
|
447
|
+
/**转换为SList
|
|
448
|
+
* @returns {SList<T>} - 数组
|
|
449
|
+
*/
|
|
450
|
+
async toSList() {
|
|
451
|
+
await this.appendOperations();
|
|
452
|
+
return this._slist;
|
|
453
|
+
}
|
|
454
|
+
/**转换为数组
|
|
455
|
+
* @returns {Array<T>} - 数组
|
|
456
|
+
*/
|
|
457
|
+
async toArray() {
|
|
458
|
+
await this.appendOperations();
|
|
459
|
+
return this._slist.toArray();
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
exports.SStream = SStream;
|
|
293
463
|
class SIterator {
|
|
294
464
|
_index = -1;
|
|
295
465
|
_list;
|
|
@@ -297,98 +467,117 @@ class SIterator {
|
|
|
297
467
|
this._list = list;
|
|
298
468
|
}
|
|
299
469
|
/**判断还有没有下一个元素
|
|
470
|
+
* @returns {boolean} - 是否有下一个元素
|
|
300
471
|
*/
|
|
301
472
|
hasNext() {
|
|
302
473
|
return this._index < this.size() - 1 && this._index >= -1;
|
|
303
474
|
}
|
|
304
475
|
/**判断当前下标有无元素
|
|
476
|
+
* @returns {boolean} - 是否有当前元素
|
|
305
477
|
*/
|
|
306
478
|
hasCurr() {
|
|
307
479
|
return this._index < this.size() && this._index >= 0;
|
|
308
480
|
}
|
|
309
481
|
/**判断还有没有上一个元素
|
|
482
|
+
* @returns {boolean} - 是否有上一个元素
|
|
310
483
|
*/
|
|
311
484
|
hasPre() {
|
|
312
485
|
return this._index < this.size() + 1 && this._index >= 1;
|
|
313
486
|
}
|
|
314
487
|
/**返回下一个下标指向的数组内成员,然后下标自加1
|
|
488
|
+
* @returns {T} - 下一个成员
|
|
315
489
|
*/
|
|
316
490
|
next() {
|
|
317
491
|
if (this.hasNext())
|
|
318
492
|
return this._list.get(++this._index);
|
|
319
493
|
else
|
|
320
|
-
throw
|
|
494
|
+
throw "一个 SIterator 迭代器的 next 函数出错,可能是在下标到底时还在尝试迭代";
|
|
321
495
|
}
|
|
322
496
|
/**返回上一个下标指向的数组内成员,然后下标自减1
|
|
497
|
+
* @returns {T} - 上一个成员
|
|
323
498
|
*/
|
|
324
499
|
pre() {
|
|
325
500
|
if (this.hasPre())
|
|
326
501
|
return this._list.get(--this._index);
|
|
327
502
|
else
|
|
328
|
-
throw
|
|
503
|
+
throw "一个 SIterator 迭代器的 pre 函数出错,可能是在下标小于1时还在尝试迭代";
|
|
329
504
|
}
|
|
330
505
|
/**返回当前下标指向的数组内成员
|
|
506
|
+
* @returns {T} - 当前成员
|
|
331
507
|
*/
|
|
332
508
|
curr() {
|
|
333
509
|
if (this.hasCurr())
|
|
334
510
|
return this._list.get(this._index);
|
|
335
511
|
else
|
|
336
|
-
throw
|
|
512
|
+
throw "一个 SIterator 迭代器的 curr 函数出错,可能是当前下标不包含元素/当前下标已越界";
|
|
337
513
|
}
|
|
338
514
|
/**返回遍历长度
|
|
339
|
-
* @returns 遍历长度
|
|
515
|
+
* @returns {number} - 遍历长度
|
|
340
516
|
*/
|
|
341
517
|
size() {
|
|
342
518
|
return this._list.size();
|
|
343
519
|
}
|
|
344
520
|
/**获取下个下标
|
|
345
|
-
* @returns 下个下标
|
|
521
|
+
* @returns {number} - 下个下标
|
|
346
522
|
*/
|
|
347
523
|
nextIndex() {
|
|
348
524
|
return this._index + 1;
|
|
349
525
|
}
|
|
350
526
|
/**获取当前下标
|
|
351
|
-
* @
|
|
527
|
+
* @return {number} - 当前下标
|
|
352
528
|
*/
|
|
353
529
|
currIndex() {
|
|
354
530
|
return this._index;
|
|
355
531
|
}
|
|
356
532
|
/**获取上个下标
|
|
357
|
-
* @returns 上个下标
|
|
533
|
+
* @returns {number} - 上个下标
|
|
358
534
|
*/
|
|
359
535
|
preIndex() {
|
|
360
536
|
return this._index - 1;
|
|
361
537
|
}
|
|
362
538
|
/**判断是否是最后一个
|
|
363
|
-
* @returns 是否是最后一个
|
|
539
|
+
* @returns {boolean} - 是否是最后一个
|
|
364
540
|
*/
|
|
365
541
|
isLast() {
|
|
366
542
|
return this._index >= this._list.size() - 1;
|
|
367
543
|
}
|
|
368
544
|
/**设置数组在迭代器当前下标中的内容
|
|
369
|
-
*
|
|
545
|
+
* 返回自身
|
|
546
|
+
* @param {T} val 要设置的内容
|
|
547
|
+
* @returns {void}
|
|
370
548
|
*/
|
|
371
549
|
set(val) {
|
|
372
550
|
this._list.set(this._index, val);
|
|
551
|
+
return this;
|
|
373
552
|
}
|
|
374
553
|
/**删除数组在当前下标的内容,然后将下标移至上一位,改变数组长度
|
|
554
|
+
* @returns {T} - 被删除的内容
|
|
375
555
|
*/
|
|
376
556
|
remove() {
|
|
557
|
+
let tmp = this._list.get(this._index);
|
|
377
558
|
this._list.remove(this._index);
|
|
559
|
+
this._index--;
|
|
560
|
+
return tmp;
|
|
378
561
|
}
|
|
379
562
|
/**在当前下标前插入元素,然后将下标移至原元素,即下一位,改变数组长度
|
|
380
|
-
*
|
|
563
|
+
* 返回自身
|
|
564
|
+
* @param {T} obj - 要插入的元素
|
|
565
|
+
* @returns {SIterator<T>} - 自身
|
|
381
566
|
*/
|
|
382
567
|
addPre(obj) {
|
|
383
568
|
this._list.insert(this._index, obj);
|
|
384
569
|
this._index++;
|
|
570
|
+
return this;
|
|
385
571
|
}
|
|
386
572
|
/**在当前下标后插入元素,然后将下标移至新元素,即下一位,改变数组长度
|
|
387
|
-
*
|
|
573
|
+
* 返回自身
|
|
574
|
+
* @param {T} obj - 要插入的元素
|
|
575
|
+
* @returns {SIterator<T>} - 自身
|
|
388
576
|
*/
|
|
389
577
|
addNext(obj) {
|
|
390
578
|
this._list.insert(this._index + 1, obj);
|
|
391
579
|
this._index++;
|
|
580
|
+
return this;
|
|
392
581
|
}
|
|
393
582
|
}
|
|
394
583
|
exports.SIterator = SIterator;
|
|
@@ -416,6 +605,9 @@ class SEntry {
|
|
|
416
605
|
exports.SEntry = SEntry;
|
|
417
606
|
class SHashMap {
|
|
418
607
|
_map = new Map();
|
|
608
|
+
/**构造函数
|
|
609
|
+
* @param {Map<K, V>} [map] - 一个键值对集合
|
|
610
|
+
*/
|
|
419
611
|
constructor(map) {
|
|
420
612
|
if (map == null)
|
|
421
613
|
return;
|
|
@@ -427,38 +619,40 @@ class SHashMap {
|
|
|
427
619
|
}
|
|
428
620
|
}
|
|
429
621
|
/**添加一个键值对
|
|
430
|
-
*
|
|
431
|
-
* @
|
|
622
|
+
* 返回自身
|
|
623
|
+
* @param {SEntry<K, V>} entry - 键值对
|
|
624
|
+
* @returns {SHashMap<K, V>} - 自身
|
|
432
625
|
*/
|
|
433
626
|
putEntry(entry) {
|
|
434
627
|
this._map.set(entry.getKey(), entry.getValue());
|
|
435
628
|
return this;
|
|
436
629
|
}
|
|
437
630
|
/**获取指定键的值
|
|
438
|
-
* @param key 键
|
|
439
|
-
* @returns 值
|
|
631
|
+
* @param {K} key - 键
|
|
632
|
+
* @returns {V | undefined} - 值
|
|
440
633
|
*/
|
|
441
634
|
get(key) {
|
|
442
635
|
return this._map.get(key);
|
|
443
636
|
}
|
|
444
637
|
/**添加一个键值对
|
|
445
|
-
*
|
|
446
|
-
* @param
|
|
447
|
-
* @
|
|
638
|
+
* 返回自身
|
|
639
|
+
* @param {K} key - 键
|
|
640
|
+
* @param {V} value - 值
|
|
641
|
+
* @returns {SHashMap<K, V>} - 自身
|
|
448
642
|
*/
|
|
449
643
|
put(key, value) {
|
|
450
644
|
this._map.set(key, value);
|
|
451
645
|
return this;
|
|
452
646
|
}
|
|
453
647
|
/**判断是否存在指定键
|
|
454
|
-
* @param key 键
|
|
455
|
-
* @returns 是否存在
|
|
648
|
+
* @param {K} key - 键
|
|
649
|
+
* @returns {boolean} - 是否存在
|
|
456
650
|
*/
|
|
457
651
|
has(key) {
|
|
458
652
|
return this._map.has(key);
|
|
459
653
|
}
|
|
460
654
|
/**获取所有键值对
|
|
461
|
-
* @returns 键值对列表
|
|
655
|
+
* @returns {SList<SEntry<K, V>>} - 键值对列表
|
|
462
656
|
*/
|
|
463
657
|
entrys() {
|
|
464
658
|
let list = new SList();
|
|
@@ -467,7 +661,7 @@ class SHashMap {
|
|
|
467
661
|
return list;
|
|
468
662
|
}
|
|
469
663
|
/**获取所有键
|
|
470
|
-
* @returns 键列表
|
|
664
|
+
* @returns {SList<K>} - 键列表
|
|
471
665
|
*/
|
|
472
666
|
keys() {
|
|
473
667
|
let list = new SList();
|
|
@@ -477,7 +671,7 @@ class SHashMap {
|
|
|
477
671
|
return list;
|
|
478
672
|
}
|
|
479
673
|
/**获取所有值
|
|
480
|
-
* @returns 值列表
|
|
674
|
+
* @returns {SList<V>} - 值列表
|
|
481
675
|
*/
|
|
482
676
|
values() {
|
|
483
677
|
let list = new SList();
|
|
@@ -486,15 +680,15 @@ class SHashMap {
|
|
|
486
680
|
list.push(val);
|
|
487
681
|
return list;
|
|
488
682
|
}
|
|
489
|
-
|
|
490
|
-
* @returns 迭代器
|
|
683
|
+
/**转换为entry数组,并获取迭代器
|
|
684
|
+
* @returns {SIterator<SEntry<K, V>>} - 迭代器
|
|
491
685
|
*/
|
|
492
686
|
iterator() {
|
|
493
687
|
return this.entrys().iterator();
|
|
494
688
|
}
|
|
495
689
|
/**删除指定键的键值对
|
|
496
|
-
* @param key 键
|
|
497
|
-
* @returns
|
|
690
|
+
* @param {K} key - 键
|
|
691
|
+
* @returns {V | undefined} - 被删除的值
|
|
498
692
|
*/
|
|
499
693
|
remove(key) {
|
|
500
694
|
let out = this._map.get(key);
|
|
@@ -502,36 +696,37 @@ class SHashMap {
|
|
|
502
696
|
return out;
|
|
503
697
|
}
|
|
504
698
|
/**清空哈希表
|
|
505
|
-
* @returns 自身
|
|
699
|
+
* @returns {SHashMap<K, V>} - 自身
|
|
506
700
|
*/
|
|
507
701
|
clear() {
|
|
508
702
|
this._map.clear();
|
|
509
703
|
return this;
|
|
510
704
|
}
|
|
511
705
|
/**判断哈希表是否为空
|
|
512
|
-
* @returns 是否为空
|
|
706
|
+
* @returns {boolean} - 是否为空
|
|
513
707
|
*/
|
|
514
708
|
isEmpty() {
|
|
515
709
|
return this.isEmpty();
|
|
516
710
|
}
|
|
517
711
|
/**判断是否存在指定值
|
|
518
|
-
* @param val 值
|
|
519
|
-
* @returns 是否存在
|
|
712
|
+
* @param {V} val - 值
|
|
713
|
+
* @returns {boolean} - 是否存在
|
|
520
714
|
*/
|
|
521
715
|
containsValue(val) {
|
|
522
716
|
return this.values().contains(val);
|
|
523
717
|
}
|
|
524
718
|
/**判断是否存在指定键
|
|
525
|
-
* @param key 键
|
|
526
|
-
* @returns 是否存在
|
|
719
|
+
* @param {K} key - 键
|
|
720
|
+
* @returns {boolean} - 是否存在
|
|
527
721
|
*/
|
|
528
722
|
containsKey(key) {
|
|
529
723
|
return this._map.has(key);
|
|
530
724
|
}
|
|
531
|
-
|
|
532
|
-
*
|
|
533
|
-
* @param
|
|
534
|
-
* @
|
|
725
|
+
/**加载指定键的值,若不存在则添加默认值
|
|
726
|
+
* 返回键值
|
|
727
|
+
* @param {K} key - 键
|
|
728
|
+
* @param {V} def - 默认值
|
|
729
|
+
* @returns {V} - 值
|
|
535
730
|
*/
|
|
536
731
|
load(key, def) {
|
|
537
732
|
if (this.containsKey(key))
|
|
@@ -540,9 +735,9 @@ class SHashMap {
|
|
|
540
735
|
return def;
|
|
541
736
|
}
|
|
542
737
|
/**合并另一个哈希表,可选择是否覆盖已有键值对
|
|
543
|
-
* @param nmap 另一个哈希表
|
|
544
|
-
* @param isCover 是否覆盖已有键值对,默认为 true
|
|
545
|
-
* @returns 自身
|
|
738
|
+
* @param {SHashMap<K, V>} nmap - 另一个哈希表
|
|
739
|
+
* @param {boolean} [isCover=true] - 是否覆盖已有键值对,默认为 true
|
|
740
|
+
* @returns {SHashMap<K, V>} - 自身
|
|
546
741
|
*/
|
|
547
742
|
merge(nmap, isCover = true) {
|
|
548
743
|
var it = nmap.iterator();
|
|
@@ -558,49 +753,72 @@ class SHashMap {
|
|
|
558
753
|
return this;
|
|
559
754
|
}
|
|
560
755
|
/**获取哈希表大小(键的数量)
|
|
561
|
-
* @returns
|
|
756
|
+
* @returns {number} - 大小
|
|
562
757
|
*/
|
|
563
758
|
size() {
|
|
564
759
|
return this._map.size;
|
|
565
760
|
}
|
|
566
761
|
/**对哈希表的每一个键值对进行加工,返回加工完成的键值对组成的新哈希表
|
|
567
|
-
* @param func 加工函数
|
|
568
|
-
* @returns 新哈希表
|
|
762
|
+
* @param {MapCallback<SEntry<K, V>, SEntry<OK, OV>>} func - 加工函数
|
|
763
|
+
* @returns {SHashMap<OK, OV>} - 新哈希表
|
|
569
764
|
*/
|
|
570
765
|
map(func) {
|
|
571
766
|
let nmap = new SHashMap();
|
|
572
767
|
this.entrys()
|
|
573
|
-
.map(
|
|
574
|
-
.each(val => nmap.putEntry(val));
|
|
768
|
+
.map(func)
|
|
769
|
+
.each((val) => nmap.putEntry(val));
|
|
575
770
|
return nmap;
|
|
576
771
|
}
|
|
577
772
|
/**返回符合条件的键值对组成的新哈希表
|
|
578
|
-
* @param func 条件函数
|
|
579
|
-
* @returns 新哈希表
|
|
773
|
+
* @param {FiltCallback<SEntry<K, V>>): boolean} func - 条件函数
|
|
774
|
+
* @returns {SHashMap<K, V>} - 新哈希表
|
|
580
775
|
*/
|
|
581
776
|
filt(func) {
|
|
582
777
|
let nmap = new SHashMap();
|
|
583
778
|
this.entrys()
|
|
584
|
-
.filt(
|
|
585
|
-
.each(val => nmap.putEntry(val));
|
|
779
|
+
.filt(func)
|
|
780
|
+
.each((val) => nmap.putEntry(val));
|
|
586
781
|
return nmap;
|
|
587
782
|
}
|
|
588
783
|
/**遍历哈希表的每一个键值对
|
|
589
|
-
* @param func
|
|
590
|
-
* @returns 自身
|
|
784
|
+
* @param {EachCallback<SEntry<K, V>>} func - 遍历函数
|
|
785
|
+
* @returns {SHashMap<K, V>} - 自身
|
|
591
786
|
*/
|
|
592
787
|
each(func) {
|
|
593
788
|
this.entrys().each(func);
|
|
594
789
|
return this;
|
|
595
790
|
}
|
|
596
|
-
|
|
597
|
-
*
|
|
598
|
-
* @param
|
|
599
|
-
* @
|
|
600
|
-
* @returns 结果
|
|
791
|
+
/**对哈希表进行统计
|
|
792
|
+
* @param {O} init - 初始值
|
|
793
|
+
* @param {AggrCallback<SEntry<K, V>,O>} func - 统计函数
|
|
794
|
+
* @returns {O} - 统计结果
|
|
601
795
|
*/
|
|
602
|
-
|
|
603
|
-
return this.entrys().
|
|
796
|
+
aggr(init, func) {
|
|
797
|
+
return this.entrys().aggr(init, func);
|
|
798
|
+
}
|
|
799
|
+
/**对哈希表进行缩减
|
|
800
|
+
* @param {AggrCallback<SEntry<K, V>,V>} func - 缩减函数
|
|
801
|
+
* @param {V} init - 初始值
|
|
802
|
+
* @returns {V} - 缩减结果
|
|
803
|
+
*/
|
|
804
|
+
reduce(func, init) {
|
|
805
|
+
if (this.isEmpty()) {
|
|
806
|
+
if (init === undefined)
|
|
807
|
+
return null;
|
|
808
|
+
return init;
|
|
809
|
+
}
|
|
810
|
+
let entries = this.entrys();
|
|
811
|
+
let result;
|
|
812
|
+
if (init === undefined) {
|
|
813
|
+
result = entries.get(0).getValue();
|
|
814
|
+
entries.shift();
|
|
815
|
+
}
|
|
816
|
+
else
|
|
817
|
+
result = init;
|
|
818
|
+
entries.each((val, index, list) => {
|
|
819
|
+
result = func(result, val, index, list);
|
|
820
|
+
});
|
|
821
|
+
return result;
|
|
604
822
|
}
|
|
605
823
|
//重载TypeScript操作符
|
|
606
824
|
[Symbol.iterator]() {
|