semantic-typescript 0.2.5 → 0.2.7

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.cn.md CHANGED
@@ -1,10 +1,10 @@
1
- # Semantic-TypeScript 流处理库
1
+ # Semantic-TypeScript 流式处理库
2
2
 
3
3
  ## 简介
4
4
 
5
- Semantic-TypeScript 是一个受到 JavaScript GeneratorFunction、Java Stream 和 MySQL Index 启发而设计的现代化流处理库。该库的核心设计理念是基于数据索引构建高效的数据处理管道,为前端开发提供类型安全、函数式风格的流式操作体验。
5
+ Semantic-TypeScript 是一个受 JavaScript GeneratorFunction、Java Stream 和 MySQL 索引启发的现代流式处理库。其核心理念是基于数据索引构建高效的数据处理管道,为前端开发提供类型安全、函数式风格的流式操作体验。
6
6
 
7
- 与传统的同步处理不同,Semantic 采用异步处理模式。在创建数据流时,终端接收数据的时间完全取决于上游何时调用 `accept` `interrupt` 回调函数,这种设计使得库能够优雅地处理实时数据流、大型数据集和异步数据源。
7
+ 与传统同步处理不同,Semantic 采用异步处理模型。在创建数据流时,终端接收到数据的时间完全取决于上游何时调用 `accept` `interrupt` 回调函数。这种设计使该库能够优雅地处理实时数据流、大数据集以及异步数据源。
8
8
 
9
9
  ## 安装
10
10
 
@@ -16,28 +16,28 @@ npm install semantic-typescript
16
16
 
17
17
  | 类型 | 描述 |
18
18
  |------|------|
19
- | `Invalid<T>` | 扩展 null 或 undefined 的类型 |
20
- | `Valid<T>` | 排除 null 和 undefined 的类型 |
21
- | `MaybeInvalid<T>` | 可能为 null 或 undefined 的类型 |
22
- | `Primitive` | 原始类型集合 |
23
- | `MaybePrimitive<T>` | 可能为原始类型的类型 |
24
- | `OptionalSymbol` | Optional 类的符号标识 |
25
- | `SemanticSymbol` | Semantic 类的符号标识 |
26
- | `CollectorsSymbol` | Collector 类的符号标识 |
27
- | `CollectableSymbol` | Collectable 类的符号标识 |
28
- | `OrderedCollectableSymbol` | OrderedCollectable 类的符号标识 |
29
- | `WindowCollectableSymbol` | WindowCollectable 类的符号标识 |
30
- | `StatisticsSymbol` | Statistics 类的符号标识 |
31
- | `NumericStatisticsSymbol` | NumericStatistics 类的符号标识 |
32
- | `BigIntStatisticsSymbol` | BigIntStatistics 类的符号标识 |
33
- | `UnorderedCollectableSymbol` | UnorderedCollectable 类的符号标识 |
19
+ | `Invalid<T>` | 扩展自 `null``undefined` 的类型 |
20
+ | `Valid<T>` | 排除 `null``undefined` 的类型 |
21
+ | `MaybeInvalid<T>` | 可能为 `null``undefined` 的类型 |
22
+ | `Primitive` | 原始类型的集合 |
23
+ | `MaybePrimitive<T>` | 可能是原始类型的类型 |
24
+ | `OptionalSymbol` | `Optional` 类的 Symbol 标识符 |
25
+ | `SemanticSymbol` | `Semantic` 类的 Symbol 标识符 |
26
+ | `CollectorsSymbol` | `Collector` 类的 Symbol 标识符 |
27
+ | `CollectableSymbol` | `Collectable` 类的 Symbol 标识符 |
28
+ | `OrderedCollectableSymbol` | `OrderedCollectable` 类的 Symbol 标识符 |
29
+ | `WindowCollectableSymbol` | `WindowCollectable` 类的 Symbol 标识符 |
30
+ | `StatisticsSymbol` | `Statistics` 类的 Symbol 标识符 |
31
+ | `NumericStatisticsSymbol` | `NumericStatistics` 类的 Symbol 标识符 |
32
+ | `BigIntStatisticsSymbol` | `BigIntStatistics` 类的 Symbol 标识符 |
33
+ | `UnorderedCollectableSymbol` | `UnorderedCollectable` 类的 Symbol 标识符 |
34
34
 
35
35
  ## 函数式接口
36
36
 
37
37
  | 接口 | 描述 |
38
38
  |------|------|
39
- | `Runnable` | 无参数无返回值的函数 |
40
- | `Supplier<R>` | 无参数返回 R 的函数 |
39
+ | `Runnable` | 无参数且无返回值的函数 |
40
+ | `Supplier<R>` | 无参数并返回 `R` 的函数 |
41
41
  | `Functional<T, R>` | 单参数转换函数 |
42
42
  | `BiFunctional<T, U, R>` | 双参数转换函数 |
43
43
  | `TriFunctional<T, U, V, R>` | 三参数转换函数 |
@@ -48,21 +48,21 @@ npm install semantic-typescript
48
48
  | `BiConsumer<T, U>` | 双参数消费函数 |
49
49
  | `TriConsumer<T, U, V>` | 三参数消费函数 |
50
50
  | `Comparator<T>` | 双参数比较函数 |
51
- | `Generator<T>` | 生成器函数(核心与基础) |
51
+ | `Generator<T>` | 生成器函数(核心与基础) |
52
52
 
53
53
  ```typescript
54
54
  // 类型使用示例
55
- const predicate: Predicate<number> = (n) => n > 0;
56
- const mapper: Functional<string, number> = (str) => str.length;
57
- const comparator: Comparator<number> = (a, b) => a - b;
55
+ let predicate: Predicate<number> = (n: number): boolean => n > 0;
56
+ let mapper: Functional<string, number> = (text: string): number => text.length;
57
+ let comparator: Comparator<number> = (a: number, b: number): number => a - b;
58
58
  ```
59
59
 
60
60
  ## 类型守卫
61
61
 
62
62
  | 函数 | 描述 | 时间复杂度 | 空间复杂度 |
63
63
  |------|------|------------|------------|
64
- | `validate<T>(t: MaybeInvalid<T>): t is T` | 验证值不为 null 或 undefined | O(1) | O(1) |
65
- | `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | 验证值为 null 或 undefined | O(1) | O(1) |
64
+ | `validate<T>(t: MaybeInvalid<T>): t is T` | 验证值不是 null 或 undefined | O(1) | O(1) |
65
+ | `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | 验证值是 null 或 undefined | O(1) | O(1) |
66
66
  | `isBoolean(t: unknown): t is boolean` | 检查是否为布尔值 | O(1) | O(1) |
67
67
  | `isString(t: unknown): t is string` | 检查是否为字符串 | O(1) | O(1) |
68
68
  | `isNumber(t: unknown): t is number` | 检查是否为数字 | O(1) | O(1) |
@@ -82,17 +82,26 @@ const comparator: Comparator<number> = (a, b) => a - b;
82
82
  | `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | 检查是否为 Statistics 实例 | O(1) | O(1) |
83
83
  | `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | 检查是否为 NumericStatistics 实例 | O(1) | O(1) |
84
84
  | `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | 检查是否为 BigIntStatistics 实例 | O(1) | O(1) |
85
+ | `isPromise(t: unknown): t is Promise<unknown>` | 检查是否为 Promise 对象 | O(1) | O(1) |
86
+ | `isAsync(t: unknown): t is AsyncFunction` | 检查是否为 AsyncFunction | O(1) | O(1) |
85
87
 
86
88
  ```typescript
87
89
  // 类型守卫使用示例
88
- const value: unknown = "hello";
90
+ let value: unknown = "hello";
89
91
 
90
92
  if (isString(value)) {
91
93
  console.log(value.length); // 类型安全,value 被推断为 string
92
94
  }
93
95
 
94
96
  if (isOptional(someValue)) {
95
- someValue.ifPresent(val => console.log(val));
97
+ someValue.ifPresent((value): void => console.log(val));
98
+ }
99
+
100
+ if(isIterable(value)){
101
+ // 类型安全,现在它是可迭代对象
102
+ for(let item of value){
103
+ console.log(item);
104
+ }
96
105
  }
97
106
  ```
98
107
 
@@ -100,16 +109,15 @@ if (isOptional(someValue)) {
100
109
 
101
110
  | 函数 | 描述 | 时间复杂度 | 空间复杂度 |
102
111
  |------|------|------------|------------|
103
- | `useCompare<T>(t1: T, t2: T): number` | 通用比较函数 | O(1) | O(1) |
112
+ | `useCompare<T>(t1: T, t2: T): number` | 泛型比较函数 | O(1) | O(1) |
104
113
  | `useRandom<T = number \| bigint>(index: T): T` | 伪随机数生成器 | O(log n) | O(1) |
105
114
 
106
115
  ```typescript
107
116
  // 工具函数使用示例
108
- const numbers = [3, 1, 4, 1, 5];
117
+ let numbers: Array<number> = [3, 1, 4, 1, 5];
109
118
  numbers.sort(useCompare); // [1, 1, 3, 4, 5]
110
119
 
111
- const randomNum = useRandom(42); // 基于种子的随机数
112
- const randomBigInt = useRandom(1000n); // BigInt 随机数
120
+ let randomNum = useRandom(42); // 基于种子的随机数
113
121
  ```
114
122
 
115
123
  ## 工厂方法
@@ -118,20 +126,20 @@ const randomBigInt = useRandom(1000n); // BigInt 随机数
118
126
 
119
127
  | 方法 | 描述 | 时间复杂度 | 空间复杂度 |
120
128
  |------|------|------------|------------|
121
- | `Optional.empty<T>()` | 创建空的 Optional | O(1) | O(1) |
129
+ | `Optional.empty<T>()` | 创建一个空的 Optional | O(1) | O(1) |
122
130
  | `Optional.of<T>(value)` | 创建包含值的 Optional | O(1) | O(1) |
123
131
  | `Optional.ofNullable<T>(value)` | 创建可能为空的 Optional | O(1) | O(1) |
124
132
  | `Optional.ofNonNull<T>(value)` | 创建非空的 Optional | O(1) | O(1) |
125
133
 
126
134
  ```typescript
127
135
  // Optional 使用示例
128
- const emptyOpt = Optional.empty<number>();
129
- const presentOpt = Optional.of(42);
130
- const nullableOpt = Optional.ofNullable<string>(null);
131
- const nonNullOpt = Optional.ofNonNull("hello");
136
+ let empty: Optional<number> = Optional.empty();
137
+ let present: Optional<number> = Optional.of(42);
138
+ let nullable: Optional<string> = Optional.ofNullable<string>(null);
139
+ let nonNull: Optional<string> = Optional.ofNonNull("hello");
132
140
 
133
- presentOpt.ifPresent(val => console.log(val)); // 输出 42
134
- console.log(emptyOpt.orElse(100)); // 输出 100
141
+ present.ifPresent((value: number): void => console.log(value)); // 输出 42
142
+ console.log(empty.get(100)); // 输出 100
135
143
  ```
136
144
 
137
145
  ### Collector 工厂方法
@@ -142,31 +150,32 @@ console.log(emptyOpt.orElse(100)); // 输出 100
142
150
  | `Collector.shortable(identity, interruptor, accumulator, finisher)` | 创建可中断收集器 | O(1) | O(1) |
143
151
 
144
152
  ```typescript
145
- // 收集器转换示例
146
- const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
153
+ // Collector 转换示例
154
+ let numbers: Semantic<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
147
155
 
148
- // 优先考虑性能:使用无序收集器
149
- const unordered = numbers
150
- .filter(n => n > 3)
156
+ // 优先性能:使用无序收集器
157
+ let unordered: UnorderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
158
+ .filter((n: number): boolean => n > 3)
151
159
  .toUnoredered();
152
160
 
153
161
  // 需要排序:使用有序收集器
154
- const ordered = numbers.sorted();
155
-
156
- // 计算元素数量
157
- let count = Collector.full(
158
- () => 0, // 初始值
159
- (accumulator, element) => accumulator + element, // 累加
160
- (accumulator) => accumulator // 完成
162
+ let ordered: OrderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
163
+ .sorted();
164
+
165
+ // 统计元素数量
166
+ let count: Collector<number, number, number> = Collector.full(
167
+ (): number => 0, // 初始值
168
+ (accumulator: number, element: number): number => accumulator + element, // 累加
169
+ (accumulator: number): number => accumulator // 完成
161
170
  );
162
171
  count.collect(from([1,2,3,4,5])); // 从流中计数
163
- count.collect([1,2,3,4,5]); // 从可迭代对象中计数
172
+ count.collect([1,2,3,4,5]); // 从可迭代对象计数
164
173
 
165
- let find = Collector.shortable(
166
- () => Optional.empty(), // 初始值
167
- (element, index, accumulator) => accumulator.isPresent(), // 中断
168
- (accumulator, element, index) => Optional.of(element), // 累加
169
- (accumulator) => accumulator // 完成
174
+ let find: Optional<number> = Collector.shortable(
175
+ (): Optional<number> => Optional.empty(), // 初始值
176
+ (element: number, index: bigint, accumulator: Optional<number>): Optional<number> => accumulator.isPresent(), // 中断
177
+ (accumulator: Optional<number>, element: number, index: bigint): Optional<number> => Optional.of(element), // 累加
178
+ (accumulator: Optional<number>): Optional<number> => accumulator // 完成
170
179
  );
171
180
  find.collect(from([1,2,3,4,5])); // 查找第一个元素
172
181
  find.collect([1,2,3,4,5]); // 查找第一个元素
@@ -176,50 +185,58 @@ find.collect([1,2,3,4,5]); // 查找第一个元素
176
185
 
177
186
  | 方法 | 描述 | 时间复杂度 | 空间复杂度 |
178
187
  |------|------|------------|------------|
188
+ | `animationFrame(period: number, delay: number = 0)` | 创建定时动画帧流 | O(1)* | O(1) |
179
189
  | `blob(blob, chunkSize)` | 从 Blob 创建流 | O(n) | O(chunkSize) |
180
190
  | `empty<E>()` | 创建空流 | O(1) | O(1) |
181
191
  | `fill<E>(element, count)` | 创建填充流 | O(n) | O(1) |
182
192
  | `from<E>(iterable)` | 从可迭代对象创建流 | O(1) | O(1) |
183
- | `generate<E>(element, interrupt)` | 创建生成器流 | O(1) | O(1) |
184
193
  | `interval(period, delay?)` | 创建定时间隔流 | O(1)* | O(1) |
185
194
  | `iterate<E>(generator)` | 从生成器创建流 | O(1) | O(1) |
186
195
  | `range(start, end, step)` | 创建数值范围流 | O(n) | O(1) |
187
196
  | `websocket(websocket)` | 从 WebSocket 创建流 | O(1) | O(1) |
188
197
 
189
198
  ```typescript
190
- // 语义工厂方法使用示例
199
+ // Semantic 工厂方法使用示例
200
+
201
+ // 从定时动画帧创建流
202
+ animationFrame(1000)
203
+ .toUnordered()
204
+ .forEach(frame => console.log(frame));
191
205
 
192
206
  // 从 Blob 创建流(分块读取)
193
207
  blob(someBlob, 1024n)
194
- .toUnordered()
195
- .write(WritableStream)
196
- .then(callback) // 写入流成功
197
- .catch(callback); // 写入流失败
208
+ .toUnordered()
209
+ .write(WritableStream)
210
+ .then(callback) // 写入流成功
211
+ .catch(callback); // 写入流失败
198
212
 
199
- // 创建空流,只有与其他流拼接后才会执行
213
+ // 创建空流,需与其他流连接后才会执行
200
214
  empty<string>()
201
- .toUnordered()
202
- .join(); // []
215
+ .toUnordered()
216
+ .join(); //[]
203
217
 
204
218
  // 创建填充流
205
- const filledStream = fill("hello", 3); // "hello", "hello", "hello"
219
+ let filledStream = fill("hello", 3); // "hello", "hello", "hello"
206
220
 
207
- // 创建定时流,初始延迟 2 秒,执行周期 5 秒,基于定时器机制实现;可能因系统调度精度限制产生时间漂移。
208
- const intervalStream = interval(5000, 2000);
221
+ // 创建初始延迟 2 秒、执行周期 5 秒的定时流,基于定时器机制实现;可能因系统调度精度限制产生时间漂移。
222
+ let intervalStream = interval(5000, 2000);
209
223
 
210
224
  // 从可迭代对象创建流
211
- const numberStream = from([1, 2, 3, 4, 5]);
212
- const stringStream = from(new Set(["Alex", "Bob"]));
225
+ let numberStream = from([1, 2, 3, 4, 5]);
226
+ let stringStream = from(new Set(["Alex", "Bob"]));
227
+
228
+ // 从已解析的 Promise 创建流
229
+ let promisedStream: Semantic<Array<number>> = Promise.resolve([1, 2, 3, 4, 5]);
213
230
 
214
231
  // 创建范围流
215
- const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
232
+ let rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
216
233
 
217
234
  // WebSocket 事件流
218
- const ws = new WebSocket("ws://localhost:8080");
235
+ let ws = new WebSocket("ws://localhost:8080");
219
236
  websocket(ws)
220
- .filter((event)=> event.type === "message"); // 只监听消息事件
237
+ .filter((event): boolean => event.type === "message"); // 仅监听消息事件
221
238
  .toUnordered() // 事件通常无序
222
- .forEach((event)=> receive(event)); // 接收消息
239
+ .forEach((event): void => receive(event)); // 接收消息
223
240
  ```
224
241
 
225
242
  ## Semantic 类方法
@@ -240,36 +257,36 @@ websocket(ws)
240
257
  | `reverse()` | 反转流 | O(n) | O(1) |
241
258
  | `shuffle()` | 随机打乱 | O(n) | O(1) |
242
259
  | `shuffle(mapper)` | 使用映射器打乱 | O(n) | O(1) |
243
- | `skip(n)` | 跳过前n个元素 | O(n) | O(1) |
260
+ | `skip(n)` | 跳过前 n 个元素 | O(n) | O(1) |
244
261
  | `sorted()` | 排序 | O(n log n) | O(n) |
245
262
  | `sorted(comparator)` | 使用比较器排序 | O(n log n) | O(n) |
246
263
  | `sub(start, end)` | 获取子流 | O(n) | O(1) |
247
264
  | `takeWhile(predicate)` | 获取满足条件的元素 | O(n) | O(1) |
248
265
  | `translate(offset)` | 平移索引 | O(n) | O(1) |
249
- | `translate(translator)` | 使用转换器平移索引 | O(n) | O(1) |
266
+ | `translate(translator)` | 使用翻译器平移索引 | O(n) | O(1) |
250
267
 
251
268
  ```typescript
252
269
  // Semantic 操作示例
253
- const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
254
- .filter(n => n % 2 === 0) // 过滤偶数
255
- .map(n => n * 2) // 乘以2
270
+ let result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
271
+ .filter((n: number): boolean => n % 2 === 0) // 过滤偶数
272
+ .map((n: number): number => n * 2) // 乘以 2
256
273
  .skip(1) // 跳过第一个
257
- .limit(3) // 限制3个元素
258
- .toUnOrdered() // 转换为无序收集器
274
+ .limit(3) // 限制为 3 个元素
275
+ .toUnordered() // 转换为无序收集器
259
276
  .toArray(); // 转换为数组
260
277
  // 结果: [8, 12, 20]
261
278
 
262
279
  // 复杂操作示例
263
- const complexResult = range(1, 100, 1)
264
- .flatMap(n => from([n, n * 2])) // 每个元素映射为两个
280
+ let complexResult = range(1, 100, 1)
281
+ .flatMap((n: number): Semantics<number> => from([n, n * 2])) // 每个元素映射为两个
265
282
  .distinct() // 去重
266
283
  .shuffle() // 打乱顺序
267
- .takeWhile(n => n < 50) // 取小于50的元素
284
+ .takeWhile((n: number): boolean => n < 50) // 取小于 50 的元素
268
285
  .toOrdered() // 转换为有序收集器
269
286
  .toArray(); // 转换为数组
270
287
  ```
271
288
 
272
- ## Semantic转换方法
289
+ ## Semantic 转换方法
273
290
 
274
291
  | 方法 | 描述 | 时间复杂度 | 空间复杂度 |
275
292
  |------------|------------|------------|------------|
@@ -277,44 +294,44 @@ const complexResult = range(1, 100, 1)
277
294
  | `toUnordered()` | 转换为无序收集器 | O(1) | O(1) |
278
295
  | `toOrdered()` | 转换为有序收集器 | O(1) | O(1) |
279
296
  | `toNumericStatistics()` | 转换为数值统计 | O(n) | O(1) |
280
- | `toBigintStatistics()` | 转换为 bigint 统计 | O(n) | O(1) |
297
+ | `toBigintStatistics()` | 转换为 BigInt 统计 | O(n) | O(1) |
281
298
  | `toWindow()` | 转换为窗口收集器 | O(1) | O(1) |
282
- | `toCollectable()` | 转换为 `UnorderedCollectable` | O(n) | O(1) |
299
+ | `toCollectable()` | 转换为 `UnorderdCollectable` | O(n) | O(1) |
283
300
  | `toCollectable(mapper)` | 转换为自定义收集器 | O(n) | O(1) |
284
301
 
285
302
  ```typescript
286
303
  // 转换为升序数组
287
304
  from([6,4,3,5,2]) // 创建流
288
- .sorted() // 按升序排序流
305
+ .sorted() // 按升序排序
289
306
  .toArray(); // [2, 3, 4, 5, 6]
290
307
 
291
308
  // 转换为降序数组
292
309
  from([6,4,3,5,2]) // 创建流
293
- .soted((a, b) => b - a) // 按降序排序流
310
+ .soted((a: number, b: number): number => b - a) // 按降序排序
294
311
  .toArray(); // [6, 5, 4, 3, 2]
295
312
 
296
- // 重定向为反转数组
313
+ // 重定向为倒序数组
297
314
  from([6,4,3,5,2])
298
- .redirect((element, index) => -index) // 重定向为反转顺序
299
- .toOrderd() // 保持重定向后的顺序
315
+ .redirect((element, index): bigint => -index) // 重定向为倒序
316
+ .toOrderd() // 保持重定向顺序
300
317
  .toArray(); // [2, 5, 3, 4, 6]
301
318
 
302
- // 忽略反转数组的重定向
319
+ // 忽略重定向以倒序数组
303
320
  from([6,4,3,5,2])
304
- .redirect((element, index) => -index) // 重定向为反转顺序
305
- .toUnorderd() // 丢弃重定向的顺序。此操作会忽略 `redirect`、`reverse`、`shuffle` 和 `translate` 操作
321
+ .redirect((element: number, index: bigint) => -index) // 重定向为倒序
322
+ .toUnorderd() // 丢弃重定向顺序。此操作将忽略 `redirect`、`reverse`、`shuffle` 和 `translate` 操作
306
323
  .toArray(); // [2, 5, 3, 4, 6]
307
324
 
308
- // 将流反转为数组
325
+ // 反转流为数组
309
326
  from([6, 4, 3, 5, 2])
310
327
  .reverse() // 反转流
311
- .toOrdered() // 保证反转后的顺序
328
+ .toOrdered() // 保证反转顺序
312
329
  .toArray(); // [2, 5, 3, 4, 6]
313
330
 
314
- // 覆盖打乱后的流为数组
331
+ // 覆盖打乱的流为数组
315
332
  from([6, 4, 3, 5, 2])
316
333
  .shuffle() // 打乱流
317
- .sorted() // 覆盖打乱的顺序。此操作会覆盖 `redirect`、`reverse`、`shuffle` 和 `translate` 操作
334
+ .sorted() // 覆盖打乱顺序。此操作将覆盖 `redirect`、`reverse`、`shuffle` 和 `translate` 操作
318
335
  .toArray(); // [2, 5, 3, 4, 6]
319
336
 
320
337
  // 转换为窗口收集器
@@ -323,19 +340,19 @@ from([6, 4, 3, 5, 2]).toWindow();
323
340
  // 转换为数值统计
324
341
  from([6, 4, 3, 5, 2]).toNumericStatistics();
325
342
 
326
- // 转换为 bigint 统计
343
+ // 转换为 BigInt 统计
327
344
  from([6n, 4n, 3n, 5n, 2n]).toBigintStatistics();
328
345
 
329
- // 定义一个自定义收集器来收集数据
346
+ // 定义自定义收集器来收集数据
330
347
  let customizedCollector = from([1, 2, 3, 4, 5]).toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
331
348
  ```
332
349
 
333
- ## Collectable 收集方法
350
+ ## Collectable 集合方法
334
351
 
335
352
  | 方法 | 描述 | 时间复杂度 | 空间复杂度 |
336
353
  |------|------|------------|------------|
337
- | `anyMatch(predicate)` | 是否存在匹配元素 | O(n) | O(1) |
338
- | `allMatch(predicate)` | 是否所有元素匹配 | O(n) | O(1) |
354
+ | `anyMatch(predicate)` | 是否有任何元素匹配 | O(n) | O(1) |
355
+ | `allMatch(predicate)` | 是否所有元素都匹配 | O(n) | O(1) |
339
356
  | `count()` | 元素计数 | O(n) | O(1) |
340
357
  | `isEmpty()` | 是否为空 | O(1) | O(1) |
341
358
  | `findAny()` | 查找任意元素 | O(n) | O(1) |
@@ -344,44 +361,41 @@ let customizedCollector = from([1, 2, 3, 4, 5]).toCollectable((generator: Genera
344
361
  | `forEach(action)` | 遍历所有元素 | O(n) | O(1) |
345
362
  | `group(classifier)` | 按分类器分组 | O(n) | O(n) |
346
363
  | `groupBy(keyExtractor, valueExtractor)` | 按键值提取器分组 | O(n) | O(n) |
347
- | `join()` | 连接为字符串 | O(n) | O(n) |
348
- | `join(delimiter)` | 使用分隔符连接 | O(n) | O(n) |
349
- | `nonMatch(predicate)` | 是否没有元素匹配 | O(n) | O(1) |
350
- | `partition(count)` | 按数量分区 | O(n) | O(n) |
364
+ | `join()` | 将元素连接为字符串 | O(n) | O(n) |
365
+ | `join(delimiter)` | 使用分隔符连接元素 | O(n) | O(n) |
366
+ | `nonMatch(predicate)` | 是否没有任何元素匹配 | O(n) | O(1) |
367
+ | `partition(count)` | 按计数分区 | O(n) | O(n) |
351
368
  | `partitionBy(classifier)` | 按分类器分区 | O(n) | O(n) |
352
369
  | `reduce(accumulator)` | 归约操作 | O(n) | O(1) |
353
- | `reduce(identity, accumulator)` | 带初始值的归约 | O(n) | O(1) |
370
+ | `reduce(identity, accumulator)` | 使用初始值的归约操作 | O(n) | O(1) |
354
371
  | `toArray()` | 转换为数组 | O(n) | O(n) |
355
- | `toMap(keyExtractor, valueExtractor)` | 转换为Map | O(n) | O(n) |
356
- | `toSet()` | 转换为Set | O(n) | O(n) |
372
+ | `toMap(keyExtractor, valueExtractor)` | 转换为 Map | O(n) | O(n) |
373
+ | `toSet()` | 转换为 Set | O(n) | O(n) |
357
374
  | `write(stream)` | 写入流 | O(n) | O(1) |
358
375
 
359
376
  ```typescript
360
377
  // Collectable 操作示例
361
378
  const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
362
- .filter(n => n % 2 === 0)
363
- .toOrdered();
364
-
365
- // 匹配检查
366
- console.log(data.anyMatch(n => n > 5)); // true
367
- console.log(data.allMatch(n => n < 20)); // true
379
+ .filter((n: number): boolean => n % 2 === 0)
380
+ .toOrdered(); // 匹配检查
381
+ console.log(data.anyMatch((n: number): boolean => n > 5)); // true
382
+ console.log(data.allMatch((n: number): boolean => n < 20)); // true
368
383
 
369
384
  // 查找操作
370
- data.findFirst().ifPresent(n => console.log(n)); // 2
371
- data.findAny().ifPresent(n => console.log(n)); // 任意元素
385
+ data.findFirst().ifPresent((n: number): void => console.log(n)); // 2
386
+ data.findAny().ifPresent((n: number): void => console.log(n)); // 任意元素
372
387
 
373
388
  // 分组操作
374
389
  const grouped = data.groupBy(
375
- n => n > 5 ? "large" : "small",
376
- n => n * 2
377
- );
378
- // {small: [4, 8], large: [12, 16, 20]}
390
+ (n: number): string => (n > 5 ? "large" : "small"),
391
+ (n: number): number => n * 2
392
+ ); // {small: [4, 8], large: [12, 16, 20]}
379
393
 
380
394
  // 归约操作
381
- const sum = data.reduce(0, (acc, n) => acc + n); // 30
395
+ const sum = data.reduce(0, (accumulator: number, n: number): number => accumulator + n); // 30
382
396
 
383
397
  // 输出操作
384
- data.join(", "); // "2, 4, 6, 8, 10"
398
+ data.join(", "); // "[2, 4, 6, 8, 10]"
385
399
  ```
386
400
 
387
401
  ## 统计分析方法
@@ -390,14 +404,14 @@ data.join(", "); // "2, 4, 6, 8, 10"
390
404
 
391
405
  | 方法 | 描述 | 时间复杂度 | 空间复杂度 |
392
406
  |------|------|------------|------------|
393
- | `range()` | 极差 | O(n) | O(1) |
407
+ | `range()` | 范围 | O(n) | O(1) |
394
408
  | `variance()` | 方差 | O(n) | O(1) |
395
409
  | `standardDeviation()` | 标准差 | O(n) | O(1) |
396
410
  | `mean()` | 平均值 | O(n) | O(1) |
397
411
  | `median()` | 中位数 | O(n log n) | O(n) |
398
412
  | `mode()` | 众数 | O(n) | O(n) |
399
413
  | `frequency()` | 频率分布 | O(n) | O(n) |
400
- | `summate()` | 求和 | O(n) | O(1) |
414
+ | `summate()` | 总和 | O(n) | O(1) |
401
415
  | `quantile(quantile)` | 分位数 | O(n log n) | O(n) |
402
416
  | `interquartileRange()` | 四分位距 | O(n log n) | O(n) |
403
417
  | `skewness()` | 偏度 | O(n) | O(1) |
@@ -407,7 +421,6 @@ data.join(", "); // "2, 4, 6, 8, 10"
407
421
  // 统计分析示例
408
422
  const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
409
423
  .toNumericStatistics();
410
-
411
424
  console.log("平均值:", numbers.mean()); // 5.5
412
425
  console.log("中位数:", numbers.median()); // 5.5
413
426
  console.log("标准差:", numbers.standardDeviation()); // ~2.87
@@ -416,56 +429,58 @@ console.log("总和:", numbers.summate()); // 55
416
429
  // 使用映射器的统计分析
417
430
  const objects = from([
418
431
  { value: 10 },
419
- { value: 20 },
432
+ { value: 20 },
420
433
  { value: 30 }
421
434
  ]).toNumericStatistics();
422
-
423
- console.log("映射平均值:", objects.mean(obj => obj.value)); // 20
435
+ console.log("映射后的平均值:", objects.mean(obj => obj.value)); // 20
424
436
  ```
425
437
 
426
438
  ## 性能选择指南
427
439
 
428
440
  ### 选择无序收集器(性能优先)
441
+
429
442
  ```typescript
430
- // 当不需要顺序保证时,使用无序收集器获得最佳性能
431
- const highPerformance = data
443
+ // 当不需要顺序保证时,使用无序收集器以获得最佳性能
444
+ let highPerformance = data
432
445
  .filter(predicate)
433
446
  .map(mapper)
434
- .toUnoredered(); // 最佳性能
447
+ .toUnordered(); // 最佳性能
435
448
  ```
436
449
 
437
450
  ### 选择有序收集器(需要顺序)
451
+
438
452
  ```typescript
439
453
  // 当需要保持元素顺序时,使用有序收集器
440
- const ordered = data.sorted(comparator);
454
+ let ordered = data.sorted(comparator);
441
455
  ```
442
456
 
443
457
  ### 选择窗口收集器(窗口操作)
444
- ```typescript
445
- // 需要进行窗口操作时
446
- const windowed = data
458
+
459
+ ```typescript
460
+ // 当需要窗口操作时
461
+ let window: WindowCollectable<number> = data
447
462
  .toWindow()
448
463
  .slide(5n, 2n); // 滑动窗口
449
464
  ```
450
465
 
451
466
  ### 选择统计分析(数值计算)
452
- ```typescript
453
- // 需要进行统计分析时
454
- const stats = data
455
- .toNumericStatistics(); // 数值统计
456
467
 
457
- const bigIntStats = data
458
- .toBigintStatistics(); // 大数统计
468
+ ```typescript
469
+ // 当需要统计分析时
470
+ let statistics: NumericStatistics<number> = data
471
+ .toNumericStatistics(); // 数值统计
472
+ let bigIntStatistics: BigintStatistics<bigint> = data
473
+ .toBigintStatistics(); // 大整数统计
459
474
  ```
460
475
 
461
476
  [GitHub](https://github.com/eloyhere/semantic-typescript)
462
477
  [NPMJS](https://www.npmjs.com/package/semantic-typescript)
463
478
 
464
- ## 注意事项
479
+ ## 重要注意事项
465
480
 
466
- 1. **排序操作的影响**:在有序收集器中,`sorted()` 操作会覆盖 `redirect`、`translate`、`shuffle`、`reverse` 的效果
467
- 2. **性能考虑**:如果不需要顺序保证,优先使用 `toUnoredered()` 获得更好性能
468
- 3. **内存使用**:排序操作需要 O(n) 的额外空间
469
- 4. **实时数据**:Semantic 流适合处理实时数据,支持异步数据源
481
+ 1. **排序操作的影响**:在有序收集器中,`sorted()` 操作会覆盖 `redirect`、`translate`、`shuffle`、`reverse` 的效果。
482
+ 2. **性能考虑**:如果不需要顺序保证,优先使用 `toUnordered()` 以获得更好的性能。
483
+ 3. **内存使用**:排序操作需要额外的 O(n) 空间。
484
+ 4. **实时数据处理**:Semantic 流适用于处理实时数据,并支持异步数据源。
470
485
 
471
- 这个库为 TypeScript 开发者提供了强大而灵活的流式处理能力,结合了函数式编程的优点和类型安全的保障。
486
+ 这个库为 TypeScript 开发者提供了强大而灵活的流处理能力,结合了函数式编程的优势和类型安全的保障。