semantic-typescript 0.6.0 → 0.7.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/dist/asynchronous/collector.d.ts +62 -58
- package/dist/asynchronous/collector.js +16 -5
- package/dist/asynchronous/semantic.d.ts +2 -2
- package/dist/asynchronous/semantic.js +16 -6
- package/dist/factory.d.ts +8 -0
- package/dist/factory.js +112 -36
- package/dist/hook.d.ts +6 -1
- package/dist/hook.js +20 -3
- package/dist/main.d.ts +1 -0
- package/dist/main.js +6 -0
- package/dist/synchronous/collector.d.ts +8 -4
- package/dist/synchronous/collector.js +74 -59
- package/dist/synchronous/semantic.d.ts +27 -23
- package/dist/synchronous/semantic.js +215 -286
- package/package.json +3 -2
- package/readme.cn.md +213 -214
- package/readme.de.md +172 -173
- package/readme.es.md +177 -172
- package/readme.fr.md +181 -172
- package/readme.jp.md +187 -169
- package/readme.kr.md +182 -169
- package/readme.md +213 -214
- package/readme.ru.md +188 -169
- package/readme.tw.md +178 -169
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"url": "https://github.com/eloyhere"
|
|
7
7
|
},
|
|
8
8
|
"description": "A modern type-safe stream processing library inspired by JavaScript Generator, Java Stream, and MySQL Index. Supports lazy evaluation, async streams, statistics, and IO-like operations.",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.7.0",
|
|
10
10
|
"type": "module",
|
|
11
11
|
"readme": "readme.md",
|
|
12
12
|
"main": "dist/index.js",
|
|
@@ -36,7 +36,8 @@
|
|
|
36
36
|
"blob-stream",
|
|
37
37
|
"websocket-stream",
|
|
38
38
|
"frontend",
|
|
39
|
-
"bigInt"
|
|
39
|
+
"bigInt",
|
|
40
|
+
"semantic"
|
|
40
41
|
],
|
|
41
42
|
"repository": {
|
|
42
43
|
"type": "git",
|
package/readme.cn.md
CHANGED
|
@@ -1,214 +1,213 @@
|
|
|
1
|
-
# Semantic-TypeScript
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
###
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
//
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
//
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
);
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
//
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
[](https://github.com/eloyhere/semantic-typescript) [](https://www.npmjs.com/package/semantic-typescript)
|
|
1
|
+
# **Semantic-TypeScript**
|
|
2
|
+
**流,索引化。** 您的数据,尽在掌控。
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
### 概述
|
|
7
|
+
|
|
8
|
+
Semantic-TypeScript 是流处理技术的一次重大飞跃,它**集大成**了 JavaScript `GeneratorFunction`、Java Streams 和 MySQL 式索引中最有效的概念。其核心理念既简单又强大:通过智能索引而非暴力迭代,来构建高效的数据处理管道。
|
|
9
|
+
|
|
10
|
+
当传统库强制使用同步循环或笨拙的 Promise 链时,Semantic-TypeScript 提供了一种**完全异步**、函数式纯粹且类型安全的体验,专为现代前端开发的需求而设计。
|
|
11
|
+
|
|
12
|
+
在其优雅的模型中,数据仅在上游管道显式调用 `accept`(以及可选的 `interrupt`)回调时才会抵达消费者。您完全掌控时机——就在您需要的时候。
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
### 开发者为何青睐它
|
|
17
|
+
|
|
18
|
+
- **零样板索引** — 每个元素都携带其自然或自定义索引。
|
|
19
|
+
- **函数式纯粹风格** — 具备完整的 TypeScript 类型推断。
|
|
20
|
+
- **防泄漏事件流** — `useWindow`、`useDocument`、`useHTMLElement` 和 `useWebSocket` 在设计时就考虑了安全性。您通过 `limit(n)`、`sub(start, end)` 或 `takeWhile(predicate)` 定义边界,库则负责清理。没有残留的监听器,没有内存泄漏。
|
|
21
|
+
- **开箱即用的统计** — 全面的数值和 bigint 分析,包括平均值、中位数、众数、方差、偏度和峰度。
|
|
22
|
+
- **可预测的性能** — 根据需求在有序和无序收集器之间选择。
|
|
23
|
+
- **内存高效** — 流采用惰性求值,无需担心内存问题。
|
|
24
|
+
- **无未定义行为** — TypeScript 保证类型安全和可空性。除非在回调函数中显式修改,否则输入数据保持不变。
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
### 安装
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npm install semantic-typescript
|
|
32
|
+
```
|
|
33
|
+
或
|
|
34
|
+
```bash
|
|
35
|
+
yarn add semantic-typescript
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
### 快速开始
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
import { useOf, useFrom, useRange, useWindow, useHTMLElement, useWebSocket, useText, useStringify } from "semantic-typescript";
|
|
44
|
+
|
|
45
|
+
// 数值统计
|
|
46
|
+
let summate: number = useOf(10, 20, 30, 40)
|
|
47
|
+
.map((n: number): number => n * 2)
|
|
48
|
+
.toNumericStatistics() // 终结操作前必需
|
|
49
|
+
.summate(); // 200
|
|
50
|
+
|
|
51
|
+
// Bigint 统计
|
|
52
|
+
let summate: bigint = useOf(10n, 20n, 30n, 40n)
|
|
53
|
+
.map((n: bigint): bigint => n * 2)
|
|
54
|
+
.toBigIntStatistics() // 终结操作前必需
|
|
55
|
+
.summate(); // 200n
|
|
56
|
+
|
|
57
|
+
// 通过索引反转流
|
|
58
|
+
useFrom([1, 2, 3, 4, 5])
|
|
59
|
+
.redirect((element: E, index: bigint): bigint => -index) // 负索引以实现反转
|
|
60
|
+
.toOrdered() // 调用 toOrdered() 以保持索引顺序
|
|
61
|
+
.toArray(); // [5, 4, 3, 2, 1]
|
|
62
|
+
|
|
63
|
+
// 打乱流
|
|
64
|
+
useFrom([1, 2, 3, 4, 5])
|
|
65
|
+
.shuffle()
|
|
66
|
+
.toOrdered()
|
|
67
|
+
.toArray(); // 例如:[2, 5, 1, 4, 3]
|
|
68
|
+
|
|
69
|
+
// 在流内平移元素
|
|
70
|
+
useFrom([1, 2, 3, 4, 5])
|
|
71
|
+
.translate(2) // 将元素向右移动 2 位
|
|
72
|
+
.toOrdered()
|
|
73
|
+
.toArray(); // [4, 5, 1, 2, 3]
|
|
74
|
+
|
|
75
|
+
useFrom([1, 2, 3, 4, 5])
|
|
76
|
+
.translate(-2) // 将元素向左移动 2 位
|
|
77
|
+
.toOrdered()
|
|
78
|
+
.toArray(); // [3, 4, 5, 1, 2]
|
|
79
|
+
|
|
80
|
+
// 无限范围与提前终止
|
|
81
|
+
useRange(0n, 1_000_000n)
|
|
82
|
+
.filter(n => n % 17n === 0n)
|
|
83
|
+
.limit(10n) // 在 10 个元素后停止
|
|
84
|
+
.toUnordered()
|
|
85
|
+
.toArray();
|
|
86
|
+
|
|
87
|
+
// 实时窗口大小调整(5 次事件后自动停止)
|
|
88
|
+
useWindow("resize")
|
|
89
|
+
.limit(5n) // 对事件流至关重要
|
|
90
|
+
.toUnordered()
|
|
91
|
+
.forEach((ev, idx) => console.log(`调整大小 #${idx}`));
|
|
92
|
+
|
|
93
|
+
// 监听 HTML 元素
|
|
94
|
+
// <input id="input" type="text"/>
|
|
95
|
+
useHTMLElement("#input", "change")
|
|
96
|
+
.limit(1)
|
|
97
|
+
.toUnordered()
|
|
98
|
+
.forEach((event: Event) => submit(event));
|
|
99
|
+
|
|
100
|
+
// 监听多个元素和事件
|
|
101
|
+
useHTMLElement("input", ["change", "keyup"])
|
|
102
|
+
.takeWhile((event: Event): boolean => validate(event))
|
|
103
|
+
.toUnordered()
|
|
104
|
+
.forEach((event: Event) => submit(event));
|
|
105
|
+
|
|
106
|
+
// 监听 WebSocket
|
|
107
|
+
let webSocket = new WebSocket("ws://localhost:8080");
|
|
108
|
+
webSocket.addEventListener("close", (): void => {
|
|
109
|
+
webSocket.close(); // 需手动管理 WebSocket 生命周期
|
|
110
|
+
});
|
|
111
|
+
useWebSocket(webSocket, "message")
|
|
112
|
+
.limit(1)
|
|
113
|
+
.toUnordered()
|
|
114
|
+
.forEach((message: MessageEvent) => console.log(message.data));
|
|
115
|
+
|
|
116
|
+
// 按码点迭代字符串
|
|
117
|
+
useText("My emotion now is: 😊, and semantic is 👍")
|
|
118
|
+
.toUnordered()
|
|
119
|
+
.log(); // 输出字符串
|
|
120
|
+
|
|
121
|
+
// 安全地字符串化包含循环引用的对象
|
|
122
|
+
let o = {
|
|
123
|
+
a: 1,
|
|
124
|
+
b: "text",
|
|
125
|
+
c: [o.a, o.b, o.c] // 循环引用
|
|
126
|
+
};
|
|
127
|
+
// let text: string = JSON.stringify(o); // 抛出错误
|
|
128
|
+
let text: string = useStringify(o); // 安全地生成 `{a: 1, b: "text", c: []}`
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
### 核心概念
|
|
134
|
+
|
|
135
|
+
| 概念 | 目的 | 何时使用 |
|
|
136
|
+
| :--- | :--- | :--- |
|
|
137
|
+
| `AsynchronousSemantic` | 用于异步流、事件和惰性管道的核心构建器。 | 实时事件、WebSocket、DOM 监听器、长时间运行或无限流。 |
|
|
138
|
+
| `SynchronousSemantic` | 用于同步、内存中或基于循环的流的构建器。 | 静态数据、范围、立即迭代。 |
|
|
139
|
+
| `toUnordered()` | 最快的终结收集器(基于 Map 的索引)。 | 性能关键路径(O(n) 时间与空间,无排序)。 |
|
|
140
|
+
| `toOrdered()` | 有序的、索引稳定的收集器。 | 当需要稳定排序或索引访问时。 |
|
|
141
|
+
| `toNumericStatistics()` | 丰富的数值统计分析(均值、中位数、方差、偏度、峰度等)。 | 数据分析和统计计算。 |
|
|
142
|
+
| `toBigIntStatistics()` | 丰富的 bigint 统计分析。 | 针对大整数的数据分析和统计计算。 |
|
|
143
|
+
| `toWindow()` | 滑动和滚动窗口支持。 | 时间序列处理、批处理和窗口化操作。 |
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
**重要使用规则**
|
|
148
|
+
|
|
149
|
+
1. **事件流**(`useWindow`、`useDocument`、`useHTMLElement`、`useWebSocket`……)返回一个 `AsynchronousSemantic`。
|
|
150
|
+
→ 您**必须**调用 `.limit(n)`、`.sub(start, end)` 或 `.takeWhile()` 来停止监听。否则,监听器将保持活动状态。
|
|
151
|
+
|
|
152
|
+
2. **终结操作**(`.toArray()`、`.count()`、`.average()`、`.reduce()`、`.findFirst()` 等)**仅在**转换为收集器**之后**可用:
|
|
153
|
+
```typescript
|
|
154
|
+
.toUnordered() // O(n) 时间与空间,无排序
|
|
155
|
+
// 或
|
|
156
|
+
.toOrdered() // 已排序,保持顺序
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
### 性能特征
|
|
162
|
+
|
|
163
|
+
| 收集器 | 时间复杂度 | 空间复杂度 | 是否排序? | 最佳适用场景 |
|
|
164
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
165
|
+
| `toUnordered()` | O(n) | O(n) | 否 | 追求原始速度,顺序不重要时。 |
|
|
166
|
+
| `toOrdered()` | O(2n) | O(n) | 是 | 需要稳定排序、索引访问或分析时。 |
|
|
167
|
+
| `toNumericStatistics()` | O(2n) | O(n) | 是 | 需要排序数据的统计操作。 |
|
|
168
|
+
| `toBigIntStatistics()` | O(2n) | O(n) | 是 | 针对 bigint 的统计操作。 |
|
|
169
|
+
| `toWindow()` | O(2n) | O(n) | 是 | 基于时间的窗口化操作。 |
|
|
170
|
+
|
|
171
|
+
当速度至上时,选择 `toUnordered()`。仅当您需要稳定排序或依赖于排序数据的统计方法时,才使用 `toOrdered()`。
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
**与其他前端流处理器的对比**
|
|
176
|
+
|
|
177
|
+
| 特性 | Semantic-TypeScript | RxJS | 原生 Async Iterators / Generators | Most.js |
|
|
178
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
179
|
+
| **TypeScript 集成** | 一流的深度类型支持,具备原生索引感知。 | 优秀,但涉及复杂的泛型。 | 良好,需要手动类型标注。 | 强大,函数式优先风格。 |
|
|
180
|
+
| **内置统计分析** | 对 `number` 和 `bigint` 的全面原生支持。 | 非原生支持(需要自定义操作符)。 | 无。 | 无。 |
|
|
181
|
+
| **索引与位置感知** | 原生、强大的每个元素 bigint 索引。 | 需要自定义操作符(`scan`、`withLatestFrom`)。 | 需要手动计数器。 | 基础,无内置索引。 |
|
|
182
|
+
| **事件流管理** | 专用的、类型安全的工厂函数,具备显式的提前停止控制。 | 强大但需要手动管理订阅。 | 手动事件监听器 + 取消。 | 良好的 `fromEvent`,轻量。 |
|
|
183
|
+
| **性能与内存效率** | 卓越——优化的 `toUnordered()` 和 `toOrdered()` 收集器。 | 非常好,但操作符链会带来开销。 | 优秀(零开销)。 | 优秀。 |
|
|
184
|
+
| **包体积** | 非常轻量。 | 较大(即使进行 Tree Shaking)。 | 零(原生)。 | 小。 |
|
|
185
|
+
| **API 设计理念** | 函数式收集器模式,具有显式索引。 | 响应式 Observable 模式。 | 迭代器 / 生成器模式。 | 函数式,无点风格。 |
|
|
186
|
+
| **提前终止与控制** | 显式(`interrupt`、`.limit()`、`.takeWhile()`、`.sub()`)。 | 良好(`take`、`takeUntil`、`first`)。 | 手动(在 `for await…of` 中使用 `break`)。 | 良好(`take`、`until`)。 |
|
|
187
|
+
| **同步与异步支持** | 统一的 API——对两者都提供一流支持。 | 主要是异步。 | 两者都支持,但需手动处理。 | 主要是异步。 |
|
|
188
|
+
| **学习曲线** | 对于熟悉函数式和索引管道的开发者来说很平缓。 | 较陡峭(众多操作符、热/冷 Observable)。 | 低。 | 中等。 |
|
|
189
|
+
|
|
190
|
+
**Semantic-TypeScript 的主要优势**
|
|
191
|
+
|
|
192
|
+
* 独特的内置统计和索引功能,无需手动 `reduce` 或外部库。
|
|
193
|
+
* 对事件流的显式控制,防止了 RxJS 中常见的内存泄漏。
|
|
194
|
+
* 统一的同步/异步设计,为多样化的用例提供了单一、一致的 API。
|
|
195
|
+
|
|
196
|
+
此对比说明了为何 Semantic-TypeScript 特别适合那些需要高性能、类型安全和丰富分析功能,而又不希望陷入传统响应式库繁琐仪式感的现代 TypeScript 前端应用。
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
### 准备探索?
|
|
201
|
+
|
|
202
|
+
Semantic-TypeScript 将复杂的数据流转化为可读、可组合且高性能的管道。无论您是处理实时 UI 事件、处理大型数据集还是构建分析仪表板,它都能提供数据库级索引的强大功能与函数式编程的优雅。
|
|
203
|
+
|
|
204
|
+
**下一步:**
|
|
205
|
+
|
|
206
|
+
* 在您的 IDE 中浏览完整的类型化 API(所有导出均来自主包)。
|
|
207
|
+
* 加入不断壮大的开发者社区,他们已用清晰的 Semantic 管道取代了复杂的异步迭代器。
|
|
208
|
+
|
|
209
|
+
**Semantic-TypeScript** — 流与结构的交汇点。
|
|
210
|
+
|
|
211
|
+
立即开始构建,体验精心设计的索引所带来的不同。
|
|
212
|
+
|
|
213
|
+
**构建清晰,运行自信,让数据流转尽在掌控。**
|