semantic-typescript 0.7.0 → 0.7.1

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,223 +1,267 @@
1
- # Semantic-TypeScript
2
- Flow, Indexed. Ваши данные — под точным контролем.
1
+ # **SemanticTypeScript**
2
+ **串流處理,索引化。** 讓您的數據處於精準控制之下。
3
3
 
4
4
  ---
5
5
 
6
- ### Обзор
6
+ ### 概述
7
7
 
8
- Semantic-TypeScript знаменует собой значительный скачок в технологии потоковой обработки данных, синтезируя наиболее эффективные концепции из JavaScript `GeneratorFunction`, Java Streams и MySQL-стиля индексирования. Его основная философия одновременно проста и мощна: создавать исключительно эффективные конвейеры обработки данных с помощью интеллектуального индексирования, а не грубого перебора.
8
+ SemanticTypeScript 代表了串流處理領域的一次重大演進,它巧妙地**融合**了 JavaScript 產生器、Java Streams MySQL 風格索引中最有效的典範。其核心理念強大而明確:透過智慧索引而非傳統的蠻力迭代,建構極其高效的資料處理管道。
9
9
 
10
- В то время как обычные библиотеки навязывают синхронные циклы или громоздкие цепочки промисов, Semantic-TypeScript обеспечивает полностью асинхронный, функционально чистый и строго типобезопасный опыт, созданный для требований современной фронтенд-разработки.
10
+ 傳統的函式庫通常強制使用同步迴圈或笨重的 Promise 鏈,而 SemanticTypeScript 則提供了一個**完全非同步**、函數式純正且型別絕對安全的體驗,專為滿足現代應用程式開發的需求而設計。
11
11
 
12
- В этой элегантной модели данные доходят до потребителя только тогда, когда вышестоящий конвейер явно вызывает колбэки `accept` (и опционально `interrupt`). Вы полностью контролируете время — именно тогда, когда это необходимо.
12
+ 該模型體現了一種精煉的控制流:資料僅在上游管道明確呼叫 `accept` 回呼時,才會傳遞給下游消費者。您可以對處理時機保持完全、細粒度的掌控——處理僅在需要時、且僅在要求的時刻發生。
13
13
 
14
14
  ---
15
15
 
16
- ### Почему разработчики выбирают его
16
+ ### 開發者為何選擇 Semantic‑TypeScript
17
17
 
18
- Индексирование без шаблонного кода — каждый элемент несёт свой естественный или специально заданный индекс.
19
-
20
- Чистый функциональный стиль с полным выводом типов TypeScript.
21
-
22
- Защищённые от утечек потоковые события — `useWindow`, `useDocument`, `useHTMLElement` и `useWebSocket` созданы с учётом безопасности. Вы определяете границу — с помощью `limit(n)`, `sub(start, end)` или `takeWhile(predicate)` — а библиотека управляет очисткой. Никаких зависших слушателей, никаких утечек памяти.
23
-
24
- Встроенная статистика — всесторонний анализ для чисел (`number`) и больших целых (`bigint`), включая средние значения, медианы, моду, дисперсию, асимметрию и эксцесс.
25
-
26
- • Предсказуемая производительность — выбирайте между упорядоченными (`ordered`) и неупорядоченными (`unordered`) коллекторами в зависимости от ваших требований.
27
-
28
- • Эффективное использование памяти — потоки вычисляются лениво, что снимает проблемы с памятью.
29
-
30
- • Никакого неопределённого поведения — TypeScript гарантирует типобезопасность и обработку null/undefined. Входные данные остаются неизменными, если вы явно не изменяете их в своих функциях обратного вызова.
18
+ - **零模板索引** 每個元素天生擁有其自然或自訂的索引,無需手動追蹤。
19
+ - **純函數式與型別安全** – 在支援不可變操作的同時,享受完整、地道的 TypeScript 型別推論。
20
+ - **無洩漏的事件串流** `useSubscription` 模式將資源安全作為首要原則設計。您透過 `limit(n)`、`sub(start, end)` `takeWhile(predicate)` 定義邏輯邊界,函式庫則管理完整的訂閱生命週期,確保沒有殘留的監聽器和記憶體洩漏。
21
+ - **內建統計套件** – 無需外部依賴,即可存取針對 `number` 和 `bigint` 串流的全面分析功能,包括平均值、中位數、眾數、變異數、偏態和峰態。
22
+ - **可預測、可調校的效能** 根據您對效能和順序的精確需求,選擇有序或無序收集器。
23
+ - **天然的記憶體高效** – 串流採用惰性求值,按需處理元素以減輕記憶體壓力。
24
+ - **無未定義行為** TypeScript 保證完整的型別安全性和可空性。除非在回呼函數中明確修改,否則您的來源資料保持不變。
31
25
 
32
26
  ---
33
27
 
34
- ### Установка
28
+ ### 安裝
29
+
30
+ 使用您偏好的套件管理器將 Semantic‑TypeScript 整合到專案中:
35
31
 
36
32
  ```bash
37
33
  npm install semantic-typescript
38
34
  ```
39
- или
35
+
40
36
  ```bash
41
37
  yarn add semantic-typescript
42
38
  ```
43
39
 
44
40
  ---
45
41
 
46
- ### Быстрый старт
42
+ ### 快速入門
43
+
44
+ 以下範例演示了從基礎轉換到實際事件處理的核心概念。
47
45
 
48
46
  ```typescript
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()
47
+ import { useOf, useFrom, useRange, useSubscription, useText, useStringify } from "semantic-typescript";
48
+
49
+ // ====================================================================
50
+ // 範例 1: 基礎操作與數值統計
51
+ // ====================================================================
52
+ // 演示映射和終端統計操作。轉換後,管道必須轉換為統計收集器才能呼叫 `.summate()` 等終端方法。
53
+
54
+ const numericSum: number = useOf(10, 20, 30, 40)
55
+ .map((n: number): number => n * 2) // 每個元素翻倍: [20, 40, 60, 80]
56
+ .toNumericStatistics() // 轉換為統計收集器
57
+ .summate(); // 終端操作: 200
58
+
59
+ // 其他統計方法(在 .toNumericStatistics() 後可用):
60
+ // .average(), .median(), .mode(), .variance(), .skewness(), .kurtosis()
61
+
62
+ // ====================================================================
63
+ // 範例 2: BigInt 統計
64
+ // ====================================================================
65
+ // 與數值統計操作相同,但針對 BigInt 資料進行了最佳化。
66
+
67
+ const bigintSum: bigint = useOf(10n, 20n, 30n, 40n)
68
+ .map((n: bigint): bigint => n * 2n) // BigInt 算術
69
+ .toBigIntStatistics() // 轉換為 BigInt 統計收集器
70
+ .summate(); // 終端操作: 200n
71
+
72
+ // ====================================================================
73
+ // 範例 3: 透過索引操作實現串流反轉
74
+ // ====================================================================
75
+ // 使用 `.redirect()` 方法透過策略性地重新分配元素索引來說明如何重新排序元素,從而實現反轉等自訂模式。
76
+
77
+ const reversedArray: number[] = useFrom([1, 2, 3, 4, 5])
78
+ .redirect((_element: number, index: bigint): bigint => -index) // 映射到負索引
79
+ .toOrdered() // 關鍵步驟:按新索引收集並排序元素
80
+ .toArray(); // 結果: [5, 4, 3, 2, 1]
81
+
82
+ // 對於簡單的反轉,`.reverse()` 方法同樣可用。
83
+
84
+ // ====================================================================
85
+ // 範例 4: 串流洗牌
86
+ // ====================================================================
87
+ // 使用原地洗牌演算法隨機置換元素索引。
88
+
89
+ const shuffledArray: number[] = useFrom([1, 2, 3, 4, 5])
90
+ .shuffle() // 隨機重新分配索引
91
+ .toOrdered() // 按新的隨機索引排序
92
+ .toArray(); // 例如: [2, 5, 1, 4, 3] (每次執行結果不同)
93
+
94
+ // ====================================================================
95
+ // 範例 5: 循環串流旋轉
96
+ // ====================================================================
97
+ // 循環移動元素。正值向右旋轉;負值向左旋轉。
98
+
99
+ // 向右旋轉 2 個位置
100
+ const rightRotated: number[] = useFrom([1, 2, 3, 4, 5])
101
+ .translate(2) // 將索引向右移動 2
72
102
  .toOrdered()
73
- .toArray(); // например, [2, 5, 1, 4, 3]
103
+ .toArray(); // 結果: [4, 5, 1, 2, 3]
74
104
 
75
- // Сдвиг элементов в потоке
76
- useFrom([1, 2, 3, 4, 5])
77
- .translate(2) // Сдвиг элементов вправо на 2 позиции
78
- .toOrdered()
79
- .toArray(); // [4, 5, 1, 2, 3]
105
+ // ====================================================================
106
+ // 範例 6: 無限範圍的惰性求值
107
+ // ====================================================================
108
+ // 惰性地處理理論上的無限串流,僅在需要時計算元素。
80
109
 
81
- useFrom([1, 2, 3, 4, 5])
82
- .translate(-2) // Сдвиг элементов влево на 2 позиции
83
- .toOrdered()
84
- .toArray(); // [3, 4, 5, 1, 2]
110
+ const firstTenMultiples: bigint[] = useRange(0n, 1_000_000n)
111
+ .filter(n => n % 17n === 0n) // 保留 17 的倍數
112
+ .limit(10n) // 關鍵:在第 10 個匹配項後停止
113
+ .toUnordered() // 不需要排序
114
+ .toArray(); // 結果: [0, 17, 34, 51, 68, 85, 102, 119, 136, 153]
85
115
 
86
- // Бесконечный диапазон с ранним завершением
87
- useRange(0n, 1_000_000n)
88
- .filter(n => n % 17n === 0n)
89
- .limit(10n) // Остановиться после 10 элементов
90
- .toUnordered()
116
+ // 沒有 `.limit(10n)` 的話,管道將處理所有一百萬個元素。
117
+
118
+ // ====================================================================
119
+ // 範例 7: 組合複雜管道
120
+ // ====================================================================
121
+ // 演示多個操作的順序組合。
122
+
123
+ const complexResult: number[] = useRange(1n, 100n)
124
+ .map(n => Number(n) * 2)
125
+ .filter(n => n > 50)
126
+ .shuffle()
127
+ .limit(5n)
128
+ .translate(2)
129
+ .toOrdered()
91
130
  .toArray();
92
131
 
93
- // События изменения размера окна в реальном времени (автоматически останавливается после 5 событий)
94
- useWindow("resize")
95
- .limit(5n) // Критически важно для потоков событий
96
- .toUnordered()
97
- .forEach((ev, idx) => console.log(`Изменение размера #${idx}`));
132
+ // ====================================================================
133
+ // 範例 8: 託管 DOM 事件訂閱
134
+ // ====================================================================
135
+ // 監聽瀏覽器事件,並附帶自動、無洩漏的清理功能。
136
+ // `.limit(n)` 呼叫定義了自動移除監聽器的邊界。
137
+
138
+ // 為 Window 目標定義一個訂閱者
139
+ const windowSubscriber = {
140
+ mount: (target: Window): void => { /* 設定邏輯 */ },
141
+ subscribe: (target: Window, event: keyof WindowEventMap, handler: EventListener): void => {
142
+ target.addEventListener(event, handler);
143
+ },
144
+ unsubscribe: (target: Window, event: keyof WindowEventMap, handler: EventListener): void => {
145
+ target.removeEventListener(event, handler);
146
+ },
147
+ unmount: (): void => { /* 清理邏輯 */ }
148
+ };
98
149
 
99
- // Прослушивание HTML-элемента
100
- // <input id="input" type="text"/>
101
- useHTMLElement("#input", "change")
102
- .limit(1)
150
+ useSubscription(window, windowSubscriber, "resize")
151
+ .limit(5n) // 5 個事件後自動取消訂閱
103
152
  .toUnordered()
104
- .forEach((event: Event) => submit(event));
153
+ .forEach((ev: Event, idx) =>
154
+ console.log(`調整大小 #${idx}: ${(ev.target as Window).innerWidth}x${(ev.target as Window).innerHeight}`)
155
+ );
105
156
 
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));
157
+ // ====================================================================
158
+ // 範例 9: 按 Unicode 碼點處理字串
159
+ // ====================================================================
160
+ // 正確地遍歷一個字串,處理多位元組 Unicode 字元。
121
161
 
122
- // Итерация по строке по кодовым точкам
123
162
  useText("My emotion now is: 😊, and semantic is 👍")
124
163
  .toUnordered()
125
- .log(); // Выводит строку
164
+ .log(); // 將每個字元(包括表情符號)在新行列印。
165
+
166
+ // ====================================================================
167
+ // 範例 10: 安全的循環引用字串化
168
+ // ====================================================================
169
+ // 安全地序列化包含循環引用的物件。
126
170
 
127
- // Безопасная сериализация объекта с циклическими ссылками
128
- let o = {
171
+ const obj = {
129
172
  a: 1,
130
- b: "text",
131
- c: [o.a, o.b, o.c] // Циклическая ссылка
173
+ b: "text"
132
174
  };
133
- // let text: string = JSON.stringify(o); // Выбросит ошибку
134
- let text: string = useStringify(o); // Безопасно возвращает `{a: 1, b: "text", c: []}`
175
+ (obj as any).c = [obj.a, obj.b, (obj as any).c]; // 引入循環引用
176
+
177
+ // const text: string = JSON.stringify(obj); // 拋出錯誤
178
+ const text: string = useStringify(obj); // 安全地產生 `{a: 1, b: "text", c: []}`
135
179
  ```
136
180
 
137
181
  ---
138
182
 
139
- ### Основные концепции
183
+ ### 核心概念
140
184
 
141
- | Концепция | Назначение | Когда использовать |
185
+ | 概念 | 目的 | 主要使用場景 |
142
186
  | :--- | :--- | :--- |
143
- | `AsynchronousSemantic` | Основной строитель для асинхронных потоков, событий и ленивых конвейеров. | События в реальном времени, WebSocket, слушатели DOM, долгие или бесконечные потоки. |
144
- | `SynchronousSemantic` | Строитель для синхронных, хранящихся в памяти или основанных на циклах потоков. | Статические данные, диапазоны, немедленная итерация. |
145
- | `toUnordered()` | Самый быстрый терминальный коллектор (индексирование на основе Map). | Критичные к производительности сценарии (O(n) время и память, без сортировки). |
146
- | `toOrdered()` | Упорядоченный, стабильный по индексам коллектор. | Когда требуется стабильный порядок или доступ по индексу. |
147
- | `toNumericStatistics()` | Богатый числовой статистический анализ (среднее, медиана, дисперсия, асимметрия, эксцесс и т.д.). | Аналитика данных и статистические вычисления. |
148
- | `toBigIntStatistics()` | Богатый статистический анализ для больших целых (`bigint`). | Аналитика данных и статистические вычисления для больших целых чисел. |
149
- | `toWindow()` | Поддержка скользящих и фиксированных окон. | Обработка временных рядов, пакетная обработка и оконные операции. |
187
+ | `AsynchronousSemantic` | 用於非同步串流、事件和基於推送的惰性管道的核心建構器。 | 即時事件、WebSockets、DOM 監聽器或任何長時間執行/無限串流。 |
188
+ | `SynchronousSemantic` | 用於同步、記憶體中或基於拉取的急切串流的建構器。 | 靜態資料、有限範圍或需要立即迭代的任務。 |
189
+ | `toUnordered()` | 最快的終端收集器,使用 Map 儲存索引。 | 效能關鍵路徑,且不需要穩定順序的場景(O(n) 時間和空間)。 |
190
+ | `toOrdered()` | 有序、索引穩定的終端收集器。 | 當需要保持元素順序或需要索引存取時。 |
191
+ | `toNumericStatistics()` | 啟用對 `number` 串流進行豐富統計分析功能的收集器。 | 資料分析、指標和統計計算。 |
192
+ | `toBigIntStatistics()` | 啟用對 `bigint` 串流進行豐富統計分析功能的收集器。 | 大型整數資料集的分析和統計。 |
193
+ | `toWindow()` | 提供對串流進行滑動和滾動視窗操作的功能。 | 時間序列分析、批次處理和視窗聚合。 |
150
194
 
151
195
  ---
152
196
 
153
- Важные правила использования
197
+ **基本使用規則**
154
198
 
155
- 1. Потоки событий (`useWindow`, `useDocument`, `useHTMLElement`, `useWebSocket`, …) возвращают `AsynchronousSemantic`.
156
- Вы **должны** вызвать `.limit(n)`, `.sub(start, end)` или `.takeWhile()`, чтобы прекратить прослушивание. Иначе слушатель останется активным.
199
+ 1. **事件串流**(透過 `useSubscription` 等工廠函數建立)返回一個 `AsynchronousSemantic`。
200
+ 您**必須**呼叫一個定義邊界的方法,如 `.limit(n)`、`.sub(start, end)` `.takeWhile(predicate)` 來終止監聽器。否則訂閱將保持活動狀態。
157
201
 
158
- 2. Терминальные операции (`.toArray()`, `.count()`, `.average()`, `.reduce()`, `.findFirst()` и т.д.) доступны только после преобразования в коллектор:
202
+ 2. **終端操作**(`.toArray()`、`.count()`、`.forEach()`、`.findFirst()` 等)**僅在**將管道轉換為收集器**之後**可用:
159
203
  ```typescript
160
- .toUnordered() // O(n) время и память, без сортировки
161
- // или
162
- .toOrdered() // Отсортировано, сохраняет порядок
204
+ .toUnordered() // 用於最大速度,不保證順序。
205
+ //
206
+ .toOrdered() // 用於穩定、有序的輸出。
207
+ // 或
208
+ .toNumericStatistics() // 用於統計方法。
163
209
  ```
164
210
 
165
211
  ---
166
212
 
167
- ### Характеристики производительности
213
+ ### 效能特徵
168
214
 
169
- | Коллектор | Временная сложность | Пространственная сложность | Отсортирован? | Лучше всего для |
215
+ | 收集器 | 時間複雜度 | 空間複雜度 | 保證順序? | 理想場景 |
170
216
  | :--- | :--- | :--- | :--- | :--- |
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) | Да | Временные оконные операции. |
217
+ | `toUnordered()` | O(n) | O(n) | | 原始吞吐量是關鍵;最終順序無關緊要。 |
218
+ | `toOrdered()` | O(n log n) | O(n) | 是(已排序) | 需要穩定順序、索引存取或為統計進行預排序。 |
219
+ | `toNumericStatistics()` | O(n log n) | O(n) | 是(內部排序) | 執行需要排序資料的統計操作。 |
220
+ | `toBigIntStatistics()` | O(n log n) | O(n) | 是(內部排序) | BigInt 資料進行統計操作。 |
221
+ | `toWindow()` | O(n log n) | O(n) | 是(內部排序) | 能從排序索引中受益的視窗操作。 |
176
222
 
177
- Выбирайте `toUnordered()`, когда важнее всего скорость. Используйте `toOrdered()` только когда вам требуется стабильный порядок или статистические методы, зависящие от отсортированных данных.
223
+ 當絕對速度至關重要時,選擇 `toUnordered()`。僅當您的邏輯依賴於元素順序時,才選擇 `toOrdered()` 或統計收集器。
178
224
 
179
225
  ---
180
226
 
181
- Сравнение с другими обработчиками потоков для фронтенда
227
+ **與現代串流處理函式庫的對比分析**
182
228
 
183
- | Особенность | Semantic-TypeScript | RxJS | Нативные асинхронные итераторы / Генераторы | Most.js |
229
+ | 特性 | SemanticTypeScript | RxJS | 原生 Async Iterators / Generators | Most.js |
184
230
  | :--- | :--- | :--- | :--- | :--- |
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). | Низкая. | Умеренная. |
231
+ | **TypeScript 整合** | 一等公民,深度型別化,具有固有的索引感知。 | 優秀,但通常涉及複雜的泛型鏈。 | 良好,但需要手動型別註解。 | 強大,採用函數優先的編碼風格。 |
232
+ | **內建統計分析** | `number` `bigint` 提供全面的原生支援。 | 非原生支援(需要自訂運算符或其他函式庫)。 | 無。 | 無。 |
233
+ | **索引與位置感知** | 原生、強大的 BigInt 索引,每個元素都具備。 | 需要自訂運算符(如 `scan`、`withLatestFrom`)。 | 需要手動管理計數器。 | 基礎,無內建索引屬性。 |
234
+ | **事件串流管理** | 專用的、型別安全的工廠,具有明確、宣告式的生命週期控制。 | 強大但需要謹慎的手動訂閱管理以防止洩漏。 | 手動事件監聽器附加和取消權杖管理。 | 良好的 `fromEvent`,通常較輕量。 |
235
+ | **效能與記憶體** | 卓越提供最佳化的 `toUnordered()` `toOrdered()` 收集器。 | 非常好,但深度運算符鏈可能引入開銷。 | 優秀(最小的原生開銷)。 | 優秀。 |
236
+ | **套件體積** | 非常輕量。 | 較大(即使有 tree-shaking)。 | 零(原生語言特性)。 | 小。 |
237
+ | **API 設計理念** | 具有明確索引語義的函數式收集器模式。 | 響應式 Observable 模式。 | 命令式 Iterator / 宣告式 Generator 模式。 | 函數式、無點組合。 |
238
+ | **流控制** | 顯式(`interrupt`、`.limit()`、`.takeWhile()`、`.sub()`)。 | 良好(`take`、`takeUntil`、`first`)。 | 手動(迴圈中的 `break`)。 | 良好(`take`、`until`)。 |
239
+ | **同步與非同步支援** | 統一的 API – 對兩種典範都提供一等公民支援。 | 主要面向非同步。 | 兩者都支援,但需要手動橋接。 | 主要面向非同步。 |
240
+ | **學習曲線** | 對於熟悉函數式和索引集合管道的開發者來說較平緩。 | 較陡峭(大量的運算符詞彙、熱/冷 Observable 概念)。 | 低到中等。 | 中等。 |
195
241
 
196
- Ключевые преимущества Semantic-TypeScript
242
+ **SemanticTypeScript 的優勢**
197
243
 
198
- Уникальные встроенные возможности статистики и индексирования, устраняющие необходимость в ручном `reduce` или внешних библиотеках.
244
+ * **獨特能力:** 整合的統計和索引功能,無需手動 `reduce` 操作或輔助的資料分析函式庫。
245
+ * **可預測的資源管理:** 對事件串流的顯式控制,防止了 RxJS 應用中可能出現的微妙記憶體洩漏。
246
+ * **統一設計:** 同步和非同步工作流採用一致的 API,減少了認知負擔和程式碼重複。
199
247
 
200
- • Явный контроль над потоками событий предотвращает утечки памяти, типичные для RxJS.
201
-
202
- • Единый синхронный/асинхронный дизайн предоставляет единый, последовательный API для различных случаев использования.
203
-
204
- Это сравнение показывает, почему Semantic-TypeScript особенно хорошо подходит для современных TypeScript фронтенд-приложений, которые требуют производительности, типобезопасности и богатой аналитики без сложностей традиционных реактивных библиотек.
248
+ 此對比凸顯了為何 Semantic‑TypeScript 特別適合需要高效能、健壯的型別安全性和豐富資料處理功能,而又不希望引入傳統響應式框架複雜性的現代 TypeScript 應用程式。
205
249
 
206
250
  ---
207
251
 
208
- ### Готовы исследовать?
209
-
210
- Semantic-TypeScript превращает сложные потоки данных в читаемые, комбинируемые и высокопроизводительные конвейеры. Обрабатываете ли вы события пользовательского интерфейса в реальном времени, обрабатываете большие наборы данных или создаёте аналитические панели — он предоставляет мощь индексирования уровня базы данных с элегантностью функционального программирования.
252
+ ### 開始探索
211
253
 
212
- Следующие шаги:
254
+ Semantic‑TypeScript 將複雜的資料流轉化為可讀、可組合且高效能的管道。無論您是在處理即時 UI 事件、處理大量資料集,還是建構分析儀表板,它都能提供資料庫級索引的強大功能與函數式程式設計的優雅。
213
255
 
214
- • Изучите полностью типизированный API в своей IDE (все экспорты из основного пакета).
256
+ **您的後續步驟:**
215
257
 
216
- Присоединяйтесь к растущему сообществу разработчиков, заменивших запутанные асинхронные итераторы на чистые конвейеры Semantic.
258
+ * 直接在您的 IDE 中探索完全型別化的 API(所有匯出都可在主套件入口點找到)。
259
+ * 加入不斷壯大的開發者社群,他們已用清晰、有意的 Semantic 管道替代了複雜的非同步迭代器和響應式鏈。
217
260
 
261
+ **Semantic‑TypeScript** – 流與結構的交匯點。
218
262
 
219
- Semantic-TypeScript — где потоки встречаются со структурой.
263
+ 立即開始建構,體驗深思熟慮的索引設計所帶來的切實差異。
220
264
 
221
- Начните создавать сегодня и почувствуйте разницу, которую даёт продуманное индексирование.
265
+ **清晰建構,自信前行,以意圖驅動資料轉換。**
222
266
 
223
- Стройте ясно, действуйте уверенно и преобразуйте данные с намерением.
267
+ MIT © Eloy Kim
package/dist/main.d.ts DELETED
@@ -1 +0,0 @@
1
- export {};
package/dist/main.js DELETED
@@ -1,6 +0,0 @@
1
- import { useHTMLElement } from "./factory";
2
- let input = document.createElement("input");
3
- input.type = "text";
4
- input.placeholder = "Enter your name";
5
- document.body.appendChild(input);
6
- useHTMLElement(input, ["click", "change"]).peek(console.log).limit(5).toUnordered().log();