semantic-typescript 0.5.3 → 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/readme.tw.md CHANGED
@@ -1,489 +1,223 @@
1
- # Semantic-TypeScript 流處理庫
1
+ # Semantic-TypeScript
2
+ Flow, Indexed. Ваши данные — под точным контролем.
2
3
 
3
- ## 簡介
4
+ ---
4
5
 
5
- Semantic-TypeScript 是一個現代化的流處理庫,受到 JavaScript GeneratorFunction、Java Stream 和 MySQL Index 的啟發。它的核心設計哲學是基於數據索引來構建高效的數據處理管道,為前端開發提供類型安全、函數式風格的流式操作體驗。
6
+ ### Обзор
6
7
 
7
- 與傳統的同步處理不同,Semantic 使用異步處理模型。在創建數據流時,終端接收數據的時間完全取決於上游何時調用 `accept` `interrupt` 回調函數。這種設計使得庫能夠優雅地處理實時數據流、大數據集和異步數據源。
8
+ Semantic-TypeScript знаменует собой значительный скачок в технологии потоковой обработки данных, синтезируя наиболее эффективные концепции из JavaScript `GeneratorFunction`, Java Streams и MySQL-стиля индексирования. Его основная философия одновременно проста и мощна: создавать исключительно эффективные конвейеры обработки данных с помощью интеллектуального индексирования, а не грубого перебора.
8
9
 
9
- ## 安裝
10
+ В то время как обычные библиотеки навязывают синхронные циклы или громоздкие цепочки промисов, Semantic-TypeScript обеспечивает полностью асинхронный, функционально чистый и строго типобезопасный опыт, созданный для требований современной фронтенд-разработки.
10
11
 
11
- ```bash
12
- npm install semantic-typescript
13
- ```
12
+ В этой элегантной модели данные доходят до потребителя только тогда, когда вышестоящий конвейер явно вызывает колбэки `accept` (и опционально `interrupt`). Вы полностью контролируете время — именно тогда, когда это необходимо.
14
13
 
15
- ## 基本類型
16
-
17
- | 類型 | 描述 |
18
- |------|------|
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
-
35
- ## 函數式接口
36
-
37
- | 介面 | 描述 |
38
- |------|------|
39
- | `Runnable` | 無參數且無返回值的函數 |
40
- | `Supplier<R>` | 無參數並返回 `R` 的函數 |
41
- | `Functional<T, R>` | 單參數轉換函數 |
42
- | `BiFunctional<T, U, R>` | 雙參數轉換函數 |
43
- | `TriFunctional<T, U, V, R>` | 三參數轉換函數 |
44
- | `Predicate<T>` | 單參數斷言函數 |
45
- | `BiPredicate<T, U>` | 雙參數斷言函數 |
46
- | `TriPredicate<T, U, V>` | 三參數斷言函數 |
47
- | `Consumer<T>` | 單參數消費函數 |
48
- | `BiConsumer<T, U>` | 雙參數消費函數 |
49
- | `TriConsumer<T, U, V>` | 三參數消費函數 |
50
- | `Comparator<T>` | 雙參數比較函數 |
51
- | `Generator<T>` | 生成器函數(核心與基礎) |
14
+ ---
52
15
 
53
- ```typescript
54
- // 類型使用範例
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
- ```
16
+ ### Почему разработчики выбирают его
59
17
 
60
- ## 類型守衛
61
-
62
- | 函數 | 描述 | 時間複雜度 | 空間複雜度 |
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) |
66
- | `isBoolean(t: unknown): t is boolean` | 檢查是否為布林值 | O(1) | O(1) |
67
- | `isString(t: unknown): t is string` | 檢查是否為字串 | O(1) | O(1) |
68
- | `isNumber(t: unknown): t is number` | 檢查是否為數字 | O(1) | O(1) |
69
- | `isFunction(t: unknown): t is Function` | 檢查是否為函數 | O(1) | O(1) |
70
- | `isObject(t: unknown): t is object` | 檢查是否為物件 | O(1) | O(1) |
71
- | `isSymbol(t: unknown): t is symbol` | 檢查是否為 Symbol | O(1) | O(1) |
72
- | `isBigint(t: unknown): t is bigint` | 檢查是否為 BigInt | O(1) | O(1) |
73
- | `isPrimitive(t: unknown): t is Primitive` | 檢查是否為原始類型 | O(1) | O(1) |
74
- | `isIterable(t: unknown): t is Iterable<unknown>` | 檢查是否為可迭代物件 | O(1) | O(1) |
75
- | `isOptional(t: unknown): t is Optional<unknown>` | 檢查是否為 Optional 實例 | O(1) | O(1) |
76
- | `isSemantic(t: unknown): t is Semantic<unknown>` | 檢查是否為 Semantic 實例 | O(1) | O(1) |
77
- | `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | 檢查是否為 Collector 實例 | O(1) | O(1) |
78
- | `isCollectable(t: unknown): t is Collectable<unknown>` | 檢查是否為 Collectable 實例 | O(1) | O(1) |
79
- | `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | 檢查是否為 OrderedCollectable 實例 | O(1) | O(1) |
80
- | `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | 檢查是否為 WindowCollectable 實例 | O(1) | O(1) |
81
- | `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | 檢查是否為 UnorderedCollectable 實例 | O(1) | O(1) |
82
- | `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | 檢查是否為 Statistics 實例 | O(1) | O(1) |
83
- | `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | 檢查是否為 NumericStatistics 實例 | O(1) | O(1) |
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) |
18
+ Индексирование без шаблонного кода — каждый элемент несёт свой естественный или специально заданный индекс.
87
19
 
88
- ```typescript
89
- // 類型守衛使用範例
90
- let value: unknown = "hello";
91
-
92
- if (isString(value)) {
93
- console.log(value.length); // 類型安全,value 被推斷為字串
94
- }
95
-
96
- if (isOptional(someValue)) {
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
- }
105
- }
106
- ```
20
+ • Чистый функциональный стиль — с полным выводом типов TypeScript.
107
21
 
108
- ## 工具函數
22
+ Защищённые от утечек потоковые события — `useWindow`, `useDocument`, `useHTMLElement` и `useWebSocket` созданы с учётом безопасности. Вы определяете границу — с помощью `limit(n)`, `sub(start, end)` или `takeWhile(predicate)` — а библиотека управляет очисткой. Никаких зависших слушателей, никаких утечек памяти.
109
23
 
110
- | 函數 | 描述 | 時間複雜度 | 空間複雜度 |
111
- |------|------|------------|------------|
112
- | `useCompare<T>(t1: T, t2: T): number` | 泛型比較函數 | O(1) | O(1) |
113
- | `useRandom<T = number \| bigint>(index: T): T` | 偽隨機數產生器 | O(log n) | O(1) |
24
+ Встроенная статистика всесторонний анализ для чисел (`number`) и больших целых (`bigint`), включая средние значения, медианы, моду, дисперсию, асимметрию и эксцесс.
114
25
 
115
- ```typescript
116
- // 工具函數使用範例
117
- let numbers: Array<number> = [3, 1, 4, 1, 5];
118
- numbers.sort(useCompare); // [1, 1, 3, 4, 5]
26
+ • Предсказуемая производительность — выбирайте между упорядоченными (`ordered`) и неупорядоченными (`unordered`) коллекторами в зависимости от ваших требований.
119
27
 
120
- let randomNum = useRandom(42); // 基於種子的隨機數
121
- ```
28
+ Эффективное использование памяти потоки вычисляются лениво, что снимает проблемы с памятью.
122
29
 
123
- ## 工廠方法
30
+ Никакого неопределённого поведения — TypeScript гарантирует типобезопасность и обработку null/undefined. Входные данные остаются неизменными, если вы явно не изменяете их в своих функциях обратного вызова.
124
31
 
125
- ### Optional 工廠方法
32
+ ---
126
33
 
127
- | 方法 | 描述 | 時間複雜度 | 空間複雜度 |
128
- |------|------|------------|------------|
129
- | `Optional.empty<T>()` | 建立一個空的 Optional | O(1) | O(1) |
130
- | `Optional.of<T>(value)` | 建立一個包含值的 Optional | O(1) | O(1) |
131
- | `Optional.ofNullable<T>(value)` | 建立一個可能為空的 Optional | O(1) | O(1) |
132
- | `Optional.ofNonNull<T>(value)` | 建立一個非空的 Optional | O(1) | O(1) |
34
+ ### Установка
133
35
 
134
- ```typescript
135
- // Optional 使用範例
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");
140
-
141
- presentO.ifPresent((value: number): void => console.log(value)); // 輸出 42
142
- console.log(empty.get(100)); // 輸出 100
36
+ ```bash
37
+ npm install semantic-typescript
38
+ ```
39
+ или
40
+ ```bash
41
+ yarn add semantic-typescript
143
42
  ```
144
43
 
145
- ### Collector 工廠方法
44
+ ---
146
45
 
147
- | 方法 | 描述 | 時間複雜度 | 空間複雜度 |
148
- |------|------|------------|------------|
149
- | `Collector.full(identity, accumulator, finisher)` | 建立一個完整的收集器 | O(1) | O(1) |
150
- | `Collector.shortable(identity, interruptor, accumulator, finisher)` | 建立一個可中斷的收集器 | O(1) | O(1) |
46
+ ### Быстрый старт
151
47
 
152
48
  ```typescript
153
- // Collector 轉換範例
154
- let numbers: Semantic<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
155
-
156
- // 效能優先:使用無序收集器
157
- let unordered: UnorderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
158
- .filter((n: number): boolean => n > 3)
159
- .toUnordered();
160
-
161
- // 需要排序:使用有序收集器
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 // 完成
170
- );
171
- count.collect(from([1,2,3,4,5])); // 從流中統計
172
- count.collect([1,2,3,4,5]); // 從可迭代物件統計
173
-
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 // 完成
179
- );
180
- find.collect(from([1,2,3,4,5])); // 查找第一個元素
181
- find.collect([1,2,3,4,5]); // 查找第一個元素
49
+ import { useOf, useFrom, useRange, useWindow, useHTMLElement, useWebSocket, useText, useStringify } from "semantic-typescript";
50
+
51
+ // Статистика для чисел
52
+ let summate: number = useOf(10, 20, 30, 40)
53
+ .map((n: number): number => n * 2)
54
+ .toNumericStatistics() // Обязательно перед терминальной операцией
55
+ .summate(); // 200
56
+
57
+ // Статистика для больших целых
58
+ let summate: bigint = useOf(10n, 20n, 30n, 40n)
59
+ .map((n: bigint): bigint => n * 2)
60
+ .toBigIntStatistics() // Обязательно перед терминальной операцией
61
+ .summate(); // 200n
62
+
63
+ // Развернуть поток по индексу
64
+ useFrom([1, 2, 3, 4, 5])
65
+ .redirect((element: E, index: bigint): bigint => -index) // Отрицательный индекс для разворота
66
+ .toOrdered() // Вызов toOrdered() для сохранения порядка индексов
67
+ .toArray(); // [5, 4, 3, 2, 1]
68
+
69
+ // Перемешать поток
70
+ useFrom([1, 2, 3, 4, 5])
71
+ .shuffle()
72
+ .toOrdered()
73
+ .toArray(); // например, [2, 5, 1, 4, 3]
74
+
75
+ // Сдвиг элементов в потоке
76
+ useFrom([1, 2, 3, 4, 5])
77
+ .translate(2) // Сдвиг элементов вправо на 2 позиции
78
+ .toOrdered()
79
+ .toArray(); // [4, 5, 1, 2, 3]
80
+
81
+ useFrom([1, 2, 3, 4, 5])
82
+ .translate(-2) // Сдвиг элементов влево на 2 позиции
83
+ .toOrdered()
84
+ .toArray(); // [3, 4, 5, 1, 2]
85
+
86
+ // Бесконечный диапазон с ранним завершением
87
+ useRange(0n, 1_000_000n)
88
+ .filter(n => n % 17n === 0n)
89
+ .limit(10n) // Остановиться после 10 элементов
90
+ .toUnordered()
91
+ .toArray();
92
+
93
+ // События изменения размера окна в реальном времени (автоматически останавливается после 5 событий)
94
+ useWindow("resize")
95
+ .limit(5n) // Критически важно для потоков событий
96
+ .toUnordered()
97
+ .forEach((ev, idx) => console.log(`Изменение размера #${idx}`));
98
+
99
+ // Прослушивание HTML-элемента
100
+ // <input id="input" type="text"/>
101
+ useHTMLElement("#input", "change")
102
+ .limit(1)
103
+ .toUnordered()
104
+ .forEach((event: Event) => submit(event));
105
+
106
+ // Прослушивание нескольких элементов и событий
107
+ useHTMLElement("input", ["change", "keyup"])
108
+ .takeWhile((event: Event): boolean => validate(event))
109
+ .toUnordered()
110
+ .forEach((event: Event) => submit(event));
111
+
112
+ // Прослушивание WebSocket
113
+ let webSocket = new WebSocket("ws://localhost:8080");
114
+ webSocket.addEventListener("close", (): void => {
115
+ webSocket.close(); // Управляйте жизненным циклом WebSocket вручную
116
+ });
117
+ useWebSocket(webSocket, "message")
118
+ .limit(1)
119
+ .toUnordered()
120
+ .forEach((message: MessageEvent) => console.log(message.data));
121
+
122
+ // Итерация по строке по кодовым точкам
123
+ useText("My emotion now is: 😊, and semantic is 👍")
124
+ .toUnordered()
125
+ .log(); // Выводит строку
126
+
127
+ // Безопасная сериализация объекта с циклическими ссылками
128
+ let o = {
129
+ a: 1,
130
+ b: "text",
131
+ c: [o.a, o.b, o.c] // Циклическая ссылка
132
+ };
133
+ // let text: string = JSON.stringify(o); // Выбросит ошибку
134
+ let text: string = useStringify(o); // Безопасно возвращает `{a: 1, b: "text", c: []}`
182
135
  ```
183
136
 
184
- ### Semantic 工廠方法
137
+ ---
185
138
 
186
- | 方法 | 描述 | 時間複雜度 | 空間複雜度 |
187
- |------|------|------------|------------|
188
- | `animationFrame(period: number, delay: number = 0)` | 建立定時動畫幀流 | O(1)* | O(1) |
189
- | `blob(blob, chunkSize)` | 從 Blob 建立流 | O(n) | O(chunkSize) |
190
- | `empty<E>()` | 建立空流 | O(1) | O(1) |
191
- | `fill<E>(element, count)` | 建立填充流 | O(n) | O(1) |
192
- | `from<E>(iterable)` | 從可迭代物件建立流 | O(1) | O(1) |
193
- | `interval(period, delay?)` | 建立定時間隔流 | O(1)* | O(1) |
194
- | `iterate<E>(generator)` | 從生成器建立流 | O(1) | O(1) |
195
- | `range(start, end, step)` | 建立數值範圍流 | O(n) | O(1) |
196
- | `websocket(websocket)` | 從 WebSocket 建立流 | O(1) | O(1) |
139
+ ### Основные концепции
197
140
 
198
- ```typescript
199
- // Semantic 工廠方法使用範例
200
-
201
- // 從定時動畫幀建立流
202
- animationFrame(1000)
203
- .toUnordered()
204
- .forEach(frame => console.log(frame));
205
-
206
- // Blob 建立流(分塊讀取)
207
- blob(someBlob, 1024n)
208
- .toUnordered()
209
- .write(WritableStream)
210
- .then(callback) // 寫入流成功
211
- .catch(callback); // 寫入流失敗
212
-
213
- // 建立空流,需與其他流連接後才會執行
214
- empty<string>()
215
- .toUnordered()
216
- .join(); //[]
217
-
218
- // 建立填充流
219
- let filledStream = fill("hello", 3); // "hello", "hello", "hello"
220
-
221
- // 建立初始延遲 2 秒、執行週期 5 秒的定時流,基於定時器機制實現;可能因系統排程精確度限制產生時間漂移。
222
- let intervalStream = interval(5000, 2000);
223
-
224
- // 從可迭代物件建立流
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]);
230
-
231
- // 建立範圍流
232
- let rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
233
-
234
- // WebSocket 事件流
235
- let ws = new WebSocket("ws://localhost:8080");
236
- websocket(ws)
237
- .filter((event): boolean => event.type === "message"); // 僅監聽訊息事件
238
- .toUnordered() // 事件通常無序
239
- .forEach((event): void => receive(event)); // 接收訊息
240
- ```
141
+ | Концепция | Назначение | Когда использовать |
142
+ | :--- | :--- | :--- |
143
+ | `AsynchronousSemantic` | Основной строитель для асинхронных потоков, событий и ленивых конвейеров. | События в реальном времени, WebSocket, слушатели DOM, долгие или бесконечные потоки. |
144
+ | `SynchronousSemantic` | Строитель для синхронных, хранящихся в памяти или основанных на циклах потоков. | Статические данные, диапазоны, немедленная итерация. |
145
+ | `toUnordered()` | Самый быстрый терминальный коллектор (индексирование на основе Map). | Критичные к производительности сценарии (O(n) время и память, без сортировки). |
146
+ | `toOrdered()` | Упорядоченный, стабильный по индексам коллектор. | Когда требуется стабильный порядок или доступ по индексу. |
147
+ | `toNumericStatistics()` | Богатый числовой статистический анализ (среднее, медиана, дисперсия, асимметрия, эксцесс и т.д.). | Аналитика данных и статистические вычисления. |
148
+ | `toBigIntStatistics()` | Богатый статистический анализ для больших целых (`bigint`). | Аналитика данных и статистические вычисления для больших целых чисел. |
149
+ | `toWindow()` | Поддержка скользящих и фиксированных окон. | Обработка временных рядов, пакетная обработка и оконные операции. |
241
150
 
242
- ## Semantic 類別方法
243
-
244
- | 方法 | 描述 | 時間複雜度 | 空間複雜度 |
245
- |------|------|------------|------------|
246
- | `concat(other)` | 連接兩個流 | O(n) | O(1) |
247
- | `distinct()` | 移除重複項 | O(n) | O(n) |
248
- | `distinct(comparator)` | 使用比較器移除重複項 | O(n²) | O(n) |
249
- | `dropWhile(predicate)` | 丟棄滿足條件的元素 | O(n) | O(1) |
250
- | `filter(predicate)` | 過濾元素 | O(n) | O(1) |
251
- | `flat(mapper)` | 平坦化映射 | O(n × m) | O(1) |
252
- | `flatMap(mapper)` | 平坦化映射到新類型 | O(n × m) | O(1) |
253
- | `limit(n)` | 限制元素數量 | O(n) | O(1) |
254
- | `map(mapper)` | 映射轉換 | O(n) | O(1) |
255
- | `peek(consumer)` | 查看元素 | O(n) | O(1) |
256
- | `redirect(redirector)` | 重定向索引 | O(n) | O(1) |
257
- | `reverse()` | 反轉流 | O(n) | O(1) |
258
- | `shuffle()` | 隨機洗牌 | O(n) | O(1) |
259
- | `shuffle(mapper)` | 使用映射器洗牌 | O(n) | O(1) |
260
- | `skip(n)` | 跳過前 n 個元素 | O(n) | O(1) |
261
- | `sorted()` | 排序 | O(n log n) | O(n) |
262
- | `sorted(comparator)` | 使用比較器排序 | O(n log n) | O(n) |
263
- | `sub(start, end)` | 取得子流 | O(n) | O(1) |
264
- | `takeWhile(predicate)` | 取得滿足條件的元素 | O(n) | O(1) |
265
- | `translate(offset)` | 平移索引 | O(n) | O(1) |
266
- | `translate(translator)` | 使用翻譯器平移索引 | O(n) | O(1) |
151
+ ---
267
152
 
268
- ```typescript
269
- // Semantic 操作範例
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
273
- .skip(1) // 跳過第一個
274
- .limit(3) // 限制為 3 個元素
275
- .toUnordered() // 轉換為無序收集器
276
- .toArray(); // 轉換為陣列
277
- // 結果: [8, 12, 20]
278
-
279
- // 複雜操作範例
280
- let complexResult = range(1, 100, 1)
281
- .flatMap((n: number): Semantics<number> => from([n, n * 2])) // 將每個元素映射為兩個
282
- .distinct() // 移除重複項
283
- .shuffle() // 隨機洗牌
284
- .takeWhile((n: number): boolean => n < 50) // 取小於 50 的元素
285
- .toOrdered() // 轉換為有序收集器
286
- .toArray(); // 轉換為陣列
287
- ```
153
+ Важные правила использования
288
154
 
289
- ## Semantic 轉換方法
155
+ 1. Потоки событий (`useWindow`, `useDocument`, `useHTMLElement`, `useWebSocket`, …) возвращают `AsynchronousSemantic`.
156
+ → Вы **должны** вызвать `.limit(n)`, `.sub(start, end)` или `.takeWhile()`, чтобы прекратить прослушивание. Иначе слушатель останется активным.
290
157
 
291
- | 方法 | 描述 | 時間複雜度 | 空間複雜度 |
292
- |------------|------------|------------|------------|
293
- | `sorted()` | 轉換為有序收集器 | O(n log n) | O(n) |
294
- | `toUnordered()` | 轉換為無序收集器 | O(1) | O(1) |
295
- | `toOrdered()` | 轉換為有序收集器 | O(1) | O(1) |
296
- | `toNumericStatistics()` | 轉換為數值統計 | O(n) | O(1) |
297
- | `toBigintStatistics()` | 轉換為 BigInt 統計 | O(n) | O(1) |
298
- | `toWindow()` | 轉換為視窗收集器 | O(1) | O(1) |
299
- | `toCollectable()` | 轉換為 `UnorderdCollectable` | O(n) | O(1) |
300
- | `toCollectable(mapper)` | 轉換為自訂收集器 | O(n) | O(1) |
158
+ 2. Терминальные операции (`.toArray()`, `.count()`, `.average()`, `.reduce()`, `.findFirst()` и т.д.) доступны только после преобразования в коллектор:
159
+ ```typescript
160
+ .toUnordered() // O(n) время и память, без сортировки
161
+ // или
162
+ .toOrdered() // Отсортировано, сохраняет порядок
163
+ ```
301
164
 
302
- ```typescript
303
- // 轉換為升序陣列
304
- from([6,4,3,5,2]) // 建立流
305
- .sorted() // 按升序排序
306
- .toArray(); // [2, 3, 4, 5, 6]
307
-
308
- // 轉換為降序陣列
309
- from([6,4,3,5,2]) // 建立流
310
- .soted((a: number, b: number): number => b - a) // 按降序排序
311
- .toArray(); // [6, 5, 4, 3, 2]
312
-
313
- // 重定向為倒序陣列
314
- from([6,4,3,5,2])
315
- .redirect((element, index): bigint => -index) // 重定向為倒序
316
- .toOrderd() // 保持重定向順序
317
- .toArray(); // [2, 5, 3, 4, 6]
318
-
319
- // 忽略重定向以倒序陣列
320
- from([6,4,3,5,2])
321
- .redirect((element: number, index: bigint) => -index) // 重定向為倒序
322
- .toUnorderd() // 丟棄重定向順序。此操作將忽略 `redirect`、`reverse`、`shuffle` 和 `translate` 操作
323
- .toArray(); // [2, 5, 3, 4, 6]
324
-
325
- // 反轉流為陣列
326
- from([6, 4, 3, 5, 2])
327
- .reverse() // 反轉流
328
- .toOrdered() // 保證反轉順序
329
- .toArray(); // [2, 5, 3, 4, 6]
330
-
331
- // 覆蓋洗牌的流為陣列
332
- from([6, 4, 3, 5, 2])
333
- .shuffle() // 洗牌流
334
- .sorted() // 覆蓋洗牌順序。此操作將覆蓋 `redirect`、`reverse`、`shuffle` 和 `translate` 操作
335
- .toArray(); // [2, 5, 3, 4, 6]
336
-
337
- // 轉換為視窗收集器
338
- from([6, 4, 3, 5, 2]).toWindow();
339
-
340
- // 轉換為數值統計
341
- from([6, 4, 3, 5, 2]).toNumericStatistics();
342
-
343
- // 轉換為 BigInt 統計
344
- from([6n, 4n, 3n, 5n, 2n]).toBigintStatistics();
345
-
346
- // 定義自訂收集器來收集資料
347
- let customizedCollector = from([1, 2, 3, 4, 5]).toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
348
- ```
165
+ ---
349
166
 
350
- ## Collectable 集合方法
351
-
352
- | 方法 | 描述 | 時間複雜度 | 空間複雜度 |
353
- |------|------|------------|------------|
354
- | `anyMatch(predicate)` | 是否有任何元素符合 | O(n) | O(1) |
355
- | `allMatch(predicate)` | 是否所有元素都符合 | O(n) | O(1) |
356
- | `count()` | 元素計數 | O(n) | O(1) |
357
- | `isEmpty()` | 是否為空 | O(1) | O(1) |
358
- | `findAny()` | 查找任何元素 | O(n) | O(1) |
359
- | `findFirst()` | 查找第一個元素 | O(n) | O(1) |
360
- | `findLast()` | 查找最後一個元素 | O(n) | O(1) |
361
- | `forEach(action)` | 遍歷所有元素 | O(n) | O(1) |
362
- | `group(classifier)` | 按分類器分組 | O(n) | O(n) |
363
- | `groupBy(keyExtractor, valueExtractor)` | 按鍵值提取器分組 | 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) |
368
- | `partitionBy(classifier)` | 按分類器分區 | O(n) | O(n) |
369
- | `reduce(accumulator)` | 歸約操作 | O(n) | O(1) |
370
- | `reduce(identity, accumulator)` | 使用初始值的歸約操作 | O(n) | O(1) |
371
- | `toArray()` | 轉換為陣列 | O(n) | O(n) |
372
- | `toMap(keyExtractor, valueExtractor)` | 轉換為 Map | O(n) | O(n) |
373
- | `toSet()` | 轉換為 Set | O(n) | O(n) |
374
- | `write(stream)` | 寫入流 | O(n) | O(1) |
167
+ ### Характеристики производительности
375
168
 
376
- ```typescript
377
- // Collectable 操作範例
378
- let data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
379
- .filter((n: number): boolean => n % 2 === 0)
380
- .toOrdered();
381
-
382
- // 符合檢查
383
- console.log(data.anyMatch((n: number): boolean => n > 5)); // true
384
- console.log(data.allMatch((n: number): boolean => n < 20)); // true
385
-
386
- // 查找操作
387
- data.findFirst().ifPresent((n: number): void => console.log(n)); // 2
388
- data.findAny().ifPresent((n: number): void => console.log(n)); // 任何元素
389
-
390
- // 分組操作
391
- let grouped = data.groupBy(
392
- (n: number): string => (n > 5 ? "large" : "small"),
393
- (n: number): number => n * 2
394
- ); // {small: [4, 8], large: [12, 16, 20]}
395
-
396
- // 歸約操作
397
- let sum = data.reduce(0, (accumulator: number, n: number): number => accumulator + n); // 30
398
-
399
- // 輸出操作
400
- data.join(", "); // "[2, 4, 6, 8, 10]"
401
- ```
169
+ | Коллектор | Временная сложность | Пространственная сложность | Отсортирован? | Лучше всего для |
170
+ | :--- | :--- | :--- | :--- | :--- |
171
+ | `toUnordered()` | O(n) | O(n) | Нет | Максимальная скорость, порядок не важен. |
172
+ | `toOrdered()` | O(2n) | O(n) | Да | Стабильный порядок, доступ по индексу, аналитика. |
173
+ | `toNumericStatistics()` | O(2n) | O(n) | Да | Статистические операции, требующие сортировки данных. |
174
+ | `toBigIntStatistics()` | O(2n) | O(n) | Да | Статистические операции для `bigint`. |
175
+ | `toWindow()` | O(2n) | O(n) | Да | Временные оконные операции. |
402
176
 
403
- ## 統計分析方法
404
-
405
- ### NumericStatistics 方法
406
-
407
- | 方法 | 描述 | 時間複雜度 | 空間複雜度 |
408
- |------|------|------------|------------|
409
- | `range()` | 範圍 | O(n) | O(1) |
410
- | `variance()` | 變異數 | O(n) | O(1) |
411
- | `standardDeviation()` | 標準差 | O(n) | O(1) |
412
- | `mean()` | 平均 | O(n) | O(1) |
413
- | `median()` | 中位數 | O(n log n) | O(n) |
414
- | `mode()` | 眾數 | O(n) | O(n) |
415
- | `frequency()` | 頻率分佈 | O(n) | O(n) |
416
- | `summate()` | 總和 | O(n) | O(1) |
417
- | `quantile(quantile)` | 分位數 | O(n log n) | O(n) |
418
- | `interquartileRange()` | 四分位距 | O(n log n) | O(n) |
419
- | `skewness()` | 偏態 | O(n) | O(1) |
420
- | `kurtosis()` | 峰態 | O(n) | O(1) |
177
+ Выбирайте `toUnordered()`, когда важнее всего скорость. Используйте `toOrdered()` только когда вам требуется стабильный порядок или статистические методы, зависящие от отсортированных данных.
421
178
 
422
- ```typescript
423
- // 統計分析範例
424
- let numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
425
- .toNumericStatistics();
426
-
427
- console.log("平均:", numbers.mean()); // 5.5
428
- console.log("中位數:", numbers.median()); // 5.5
429
- console.log("標準差:", numbers.standardDeviation()); // ~2.87
430
- console.log("總和:", numbers.summate()); // 55
431
-
432
- // 使用映射器的統計分析
433
- let objects = from([
434
- { value: 10 },
435
- { value: 20 },
436
- { value: 30 }
437
- ]).toNumericStatistics();
438
- console.log("映射後的平均:", objects.mean(obj => obj.value)); // 20
439
- ```
179
+ ---
440
180
 
441
- ## 效能選擇指南
181
+ Сравнение с другими обработчиками потоков для фронтенда
442
182
 
443
- ### 選擇無序收集器(效能優先)
183
+ | Особенность | Semantic-TypeScript | RxJS | Нативные асинхронные итераторы / Генераторы | Most.js |
184
+ | :--- | :--- | :--- | :--- | :--- |
185
+ | Интеграция с TypeScript | Первоклассная, с глубокой типизацией и встроенной осведомлённостью об индексах. | Отличная, но связана со сложными дженериками. | Хорошая, требует ручного описания типов. | Сильная, функционально-ориентированный стиль. |
186
+ | Встроенный статистический анализ | Полная нативная поддержка для `number` и `bigint`. | Недоступен нативно (требует пользовательских операторов). | Отсутствует. | Отсутствует. |
187
+ | Индексирование и осведомлённость о позиции | Нативное, мощное индексирование с помощью `bigint` для каждого элемента. | Требует пользовательских операторов (`scan`, `withLatestFrom`). | Требуется ручной счётчик. | Базовое, без встроенного индекса. |
188
+ | Управление потоками событий | Специализированные, типобезопасные фабрики с явным контролем ранней остановки. | Мощное, но требует ручного управления подписками. | Ручной слушатель событий + отмена. | Хороший `fromEvent`, лёгкий. |
189
+ | Производительность и эффективность памяти | Выдающаяся – оптимизированные коллекторы `toUnordered()` и `toOrdered()`. | Очень хорошая, но цепочки операторов добавляют накладные расходы. | Отличная (нулевые накладные расходы). | Отличная. |
190
+ | Размер бандла | Очень лёгкий. | Большой (даже с tree-shaking). | Нулевой (нативный). | Маленький. |
191
+ | Философия дизайна API | Функциональный паттерн коллекторов с явным индексированием. | Реактивный паттерн Observable. | Паттерн Итератор / Генератор. | Функциональный, бесточечный (`point-free`). |
192
+ | Ранняя остановка и контроль | Явный (`interrupt`, `.limit()`, `.takeWhile()`, `.sub()`). | Хороший (`take`, `takeUntil`, `first`). | Ручной (`break` в `for await…of`). | Хороший (`take`, `until`). |
193
+ | Поддержка синхронных и асинхронных операций | Единый API – первоклассная поддержка обоих. | В основном асинхронный. | Оба, но ручной. | В основном асинхронный. |
194
+ | Кривая обучения | Пологая для разработчиков, знакомых с функциональными и индексированными конвейерами. | Круче (много операторов, горячие/холодные Observable). | Низкая. | Умеренная. |
444
195
 
445
- ```typescript
446
- // 當不需要順序保證時,使用無序收集器以獲得最佳效能
447
- let highPerformance = data
448
- .filter(predicate)
449
- .map(mapper)
450
- .toUnordered(); // 最佳效能
451
- ```
196
+ Ключевые преимущества Semantic-TypeScript
452
197
 
453
- ### 選擇有序收集器(需要順序)
198
+ • Уникальные встроенные возможности статистики и индексирования, устраняющие необходимость в ручном `reduce` или внешних библиотеках.
454
199
 
455
- ```typescript
456
- // 當需要維持元素順序時,使用有序收集器
457
- let ordered = data.sorted(comparator);
458
- ```
200
+ • Явный контроль над потоками событий предотвращает утечки памяти, типичные для RxJS.
459
201
 
460
- ### 選擇視窗收集器(視窗操作)
202
+ • Единый синхронный/асинхронный дизайн предоставляет единый, последовательный API для различных случаев использования.
461
203
 
462
- ```typescript
463
- // 當需要視窗操作時
464
- let window: WindowCollectable<number> = data
465
- .toWindow()
466
- .slide(5n, 2n); // 滑動視窗
467
- ```
204
+ Это сравнение показывает, почему Semantic-TypeScript особенно хорошо подходит для современных TypeScript фронтенд-приложений, которые требуют производительности, типобезопасности и богатой аналитики без сложностей традиционных реактивных библиотек.
468
205
 
469
- ### 選擇統計分析(數值計算)
206
+ ---
470
207
 
471
- ```typescript
472
- // 當需要統計分析時
473
- let statistics: NumericStatistics<number> = data
474
- .toNumericStatistics(); // 數值統計
475
- let bigIntStatistics: BigintStatistics<bigint> = data
476
- .toBigintStatistics(); // 大整數統計
477
- ```
208
+ ### Готовы исследовать?
209
+
210
+ Semantic-TypeScript превращает сложные потоки данных в читаемые, комбинируемые и высокопроизводительные конвейеры. Обрабатываете ли вы события пользовательского интерфейса в реальном времени, обрабатываете большие наборы данных или создаёте аналитические панели — он предоставляет мощь индексирования уровня базы данных с элегантностью функционального программирования.
211
+
212
+ Следующие шаги:
213
+
214
+ • Изучите полностью типизированный API в своей IDE (все экспорты из основного пакета).
215
+
216
+ • Присоединяйтесь к растущему сообществу разработчиков, заменивших запутанные асинхронные итераторы на чистые конвейеры Semantic.
478
217
 
479
- [GitHub](https://github.com/eloyhere/semantic-typescript)
480
- [NPMJS](https://www.npmjs.com/package/semantic-typescript)
481
218
 
482
- ## 重要注意事項
219
+ Semantic-TypeScript — где потоки встречаются со структурой.
483
220
 
484
- 1. **排序操作的影響**:在有序收集器中,`sorted()` 操作會覆蓋 `redirect`、`translate`、`shuffle`、`reverse` 的效果。
485
- 2. **效能考量**:如果不需要順序保證,優先使用 `toUnordered()` 以獲得更好的效能。
486
- 3. **記憶體使用**:排序操作需要額外的 O(n) 空間。
487
- 4. **即時資料**:Semantic 流適用於處理即時資料,並支援異步資料來源。
221
+ Начните создавать сегодня и почувствуйте разницу, которую даёт продуманное индексирование.
488
222
 
489
- 這個庫為 TypeScript 開發者提供了強大而靈活的流處理能力,結合了函數式程式設計的好處和類型安全的保證。
223
+ Стройте ясно, действуйте уверенно и преобразуйте данные с намерением.