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/readme.tw.md CHANGED
@@ -1,214 +1,223 @@
1
- # Semantic-TypeScript:一款範式轉換的串流處理函式庫
1
+ # Semantic-TypeScript
2
+ Flow, Indexed. Ваши данные — под точным контролем.
2
3
 
3
- ## 簡介
4
- Semantic-TypeScript 代表了串流處理技術的一項重大進步,它綜合了 JavaScript GeneratorFunctions、Java Streams 和資料庫索引範式中最有效的概念。其基礎設計原則的核心是透過複雜的惰性求值和智慧索引建構極其高效的資料處理管道。該函式庫提供了一個嚴格型別安全、函數式純正的串流式操作體驗,專門為現代 TypeScript 和 JavaScript 開發而設計。
4
+ ---
5
5
 
6
- 與傳統的同步處理架構相比,Semantic-TypeScript 實現了一個統一模型,優雅地處理同步(Iterable)和非同步(AsyncIterable)資料來源。在串流生成過程中,資料的流動和終止由回呼機制精確控制,使函式庫能夠以超凡的優雅處理:
6
+ ### Обзор
7
7
 
8
- - 具有確定性控制的即時資料流(DOM 事件、WebSockets、時間間隔)
9
- - 透過記憶體高效的惰性管道處理大規模資料集
10
- - 透過流暢、宣告式的 API 進行複雜的資料轉換
8
+ Semantic-TypeScript знаменует собой значительный скачок в технологии потоковой обработки данных, синтезируя наиболее эффективные концепции из JavaScript `GeneratorFunction`, Java Streams и MySQL-стиля индексирования. Его основная философия одновременно проста и мощна: создавать исключительно эффективные конвейеры обработки данных с помощью интеллектуального индексирования, а не грубого перебора.
11
9
 
12
- 該函式庫的創新方法從根本上重新構想了開發者與資料序列互動的方式,在一個單一、內聚的套件中同時提供了前所未有的效能特性和開發者體驗。
10
+ В то время как обычные библиотеки навязывают синхронные циклы или громоздкие цепочки промисов, Semantic-TypeScript обеспечивает полностью асинхронный, функционально чистый и строго типобезопасный опыт, созданный для требований современной фронтенд-разработки.
13
11
 
14
- ## 核心理念:定義與執行的分離
15
- Semantic-TypeScript 的一個關鍵架構洞見是清晰地分離串流的定義和執行:
12
+ В этой элегантной модели данные доходят до потребителя только тогда, когда вышестоящий конвейер явно вызывает колбэки `accept` (и опционально `interrupt`). Вы полностью контролируете время — именно тогда, когда это необходимо.
16
13
 
17
- - **Semantic<E>**:一個不可變的、惰性的資料轉換管道藍圖。它定義了將執行哪些操作(過濾、映射等)
18
- - **Collectable<E>**:一個已實例化的、可執行的串流視圖。它是從 Semantic 獲取的,並提供所有終端操作(收集、遍歷等)來執行管道並產生結果
14
+ ---
19
15
 
20
- 這種分離強化了清晰的心智模型,並釋放了強大的最佳化能力,例如選擇 UnorderedCollectable 來跳過不必要的排序以實現最大速度。
16
+ ### Почему разработчики выбирают его
21
17
 
22
- ## 為什麼選擇 Semantic-TypeScript?
23
- 為資料串流處理選擇合適的函式庫需要在效能、型別安全性和表達能力之間取得平衡。Semantic-TypeScript 的設計旨在所有這些維度上都表現出色。
18
+ Индексирование без шаблонного кода — каждый элемент несёт свой естественный или специально заданный индекс.
24
19
 
25
- ### 1. 適用於所有資料序列的統一、型別安全範式
26
- 它為處理任何資料序列(無論是靜態陣列、即時事件還是非同步區塊)提供了一致的宣告式 API,同時利用 TypeScript 的全部功能確保端到端的型別安全。這消除了一整類執行時錯誤,並將串流操作轉變為可預測的、經過編譯器驗證的活動。
20
+ Чистый функциональный стиль — с полным выводом типов TypeScript.
27
21
 
28
- ### 2. 以智慧惰性求值實現的不妥協效能
29
- 該函式庫的核心建立在惰性求值之上。諸如過濾器、映射和扁平映射等操作僅僅是組合一個處理管道;直到呼叫終端操作時,實際工作才會執行。這結合了短路功能(透過限制、任何匹配或自訂中斷回呼),允許處理提前停止,從而極大地提高了大型或無限串流的處理效率。
22
+ Защищённые от утечек потоковые события — `useWindow`, `useDocument`, `useHTMLElement` и `useWebSocket` созданы с учётом безопасности. Вы определяете границу — с помощью `limit(n)`, `sub(start, end)` или `takeWhile(predicate)` — а библиотека управляет очисткой. Никаких зависших слушателей, никаких утечек памяти.
30
23
 
31
- ### 3. `Collector<E, A, R>` 模式的強大之處
32
- 受 Java 啟發,收集器模式是靈活性的引擎。它將如何累積串流元素的規範與串流本身的執行解耦。該函式庫為日常任務提供了一組豐富的內建收集器(toArray、groupBy、summate 等),同時使實現您自己複雜的、可重用的歸約邏輯變得非常簡單。這比固定的一組終端方法要強大和可組合得多。
24
+ Встроенная статистика — всесторонний анализ для чисел (`number`) и больших целых (`bigint`), включая средние значения, медианы, моду, дисперсию, асимметрию и эксцесс.
33
25
 
34
- ### 4. 對現代 Web 和非同步資料的一流支援
35
- Semantic-TypeScript 專為當代開發而設計。它為現代網路來源提供了原生工廠方法:
26
+ Предсказуемая производительность выбирайте между упорядоченными (`ordered`) и неупорядоченными (`unordered`) коллекторами в зависимости от ваших требований.
36
27
 
37
- - `useFrom(iterable)`, `useRange()` 用於靜態資料
38
- - `useInterval()`, `useAnimationFrame()` 用於基於時間的串流
39
- - `useBlob()` 用於分塊二進位資料處理
40
- - `useWebSocket()`, `useDocument()`, `useWindow()` 用於即時事件流
28
+ Эффективное использование памяти — потоки вычисляются лениво, что снимает проблемы с памятью.
41
29
 
42
- ### 5. 超越基本聚合:內建統計分析
43
- 超越簡單的求和與平均。該函式庫提供了專用的 NumericStatistics 和 BigIntStatistics 介面,可以直接從您的串流中即時存取進階統計指標——變異數、標準差、中位數、偏度和峰度。這將複雜的資料分析變成了一行程式碼。
30
+ Никакого неопределённого поведения — TypeScript гарантирует типобезопасность и обработку null/undefined. Входные данные остаются неизменными, если вы явно не изменяете их в своих функциях обратного вызова.
44
31
 
45
- ### 6. 為開發者體驗而設計
46
- - **流暢、可鏈式呼叫的 API**:將複雜的資料管道編寫為可讀的、順序鏈
47
- - **全面的工具套件**:包含必要的守衛(isFunction, isIterable)、實用程式(useCompare, useTraverse)和函數式介面
48
- - **Optional<T> 整合**:安全地建模值的缺失,消除了空指標的擔憂
49
- - **效能指南**:清楚地指導何時使用無序集合以獲得速度,何時使用有序集合以保持序列
32
+ ---
33
+
34
+ ### Установка
50
35
 
51
- ## 安裝
52
36
  ```bash
53
37
  npm install semantic-typescript
54
38
  ```
39
+ или
40
+ ```bash
41
+ yarn add semantic-typescript
42
+ ```
55
43
 
56
- ## 核心概念實踐
44
+ ---
57
45
 
58
- ### 1. 建立串流 (Semantic)
59
- 可以使用工廠函數從各種來源建立串流。
46
+ ### Быстрый старт
60
47
 
61
48
  ```typescript
62
- import { useFrom, useInterval, useDocument } from 'semantic-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()
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();
63
92
 
64
- // 從靜態陣列建立
65
- const staticStream = useFrom([1, 2, 3, 4, 5]);
93
+ // События изменения размера окна в реальном времени (автоматически останавливается после 5 событий)
94
+ useWindow("resize")
95
+ .limit(5n) // Критически важно для потоков событий
96
+ .toUnordered()
97
+ .forEach((ev, idx) => console.log(`Изменение размера #${idx}`));
66
98
 
67
- // 從非同步產生器建立
68
- const asyncStream = useFrom(async function*() {
69
- yield 1;
70
- yield 2;
71
- });
99
+ // Прослушивание HTML-элемента
100
+ // <input id="input" type="text"/>
101
+ useHTMLElement("#input", "change")
102
+ .limit(1)
103
+ .toUnordered()
104
+ .forEach((event: Event) => submit(event));
72
105
 
73
- // 一個基於時間的串流
74
- const tickStream = useInterval(1000); // 每秒發射一次
106
+ // Прослушивание нескольких элементов и событий
107
+ useHTMLElement("input", ["change", "keyup"])
108
+ .takeWhile((event: Event): boolean => validate(event))
109
+ .toUnordered()
110
+ .forEach((event: Event) => submit(event));
75
111
 
76
- // 一個 DOM 事件流(參見下面的重要說明)
77
- const clickStream = useDocument('click');
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: []}`
78
135
  ```
79
136
 
80
- ### 2. 轉換串流(中間操作)
81
- 透過鏈式惰性呼叫來定義管道。
137
+ ---
82
138
 
83
- ```typescript
84
- const processedStream = staticStream
85
- .filter(x => x % 2 === 0) // 僅保留偶數
86
- .map(x => x * 10) // 乘以 10
87
- .flatMap(x => [x, x + 1]) // 將每個元素轉換為兩個
88
- .distinct(); // 移除重複項
139
+ ### Основные концепции
89
140
 
90
- // 此時尚未執行任何操作
91
- ```
141
+ | Концепция | Назначение | Когда использовать |
142
+ | :--- | :--- | :--- |
143
+ | `AsynchronousSemantic` | Основной строитель для асинхронных потоков, событий и ленивых конвейеров. | События в реальном времени, WebSocket, слушатели DOM, долгие или бесконечные потоки. |
144
+ | `SynchronousSemantic` | Строитель для синхронных, хранящихся в памяти или основанных на циклах потоков. | Статические данные, диапазоны, немедленная итерация. |
145
+ | `toUnordered()` | Самый быстрый терминальный коллектор (индексирование на основе Map). | Критичные к производительности сценарии (O(n) время и память, без сортировки). |
146
+ | `toOrdered()` | Упорядоченный, стабильный по индексам коллектор. | Когда требуется стабильный порядок или доступ по индексу. |
147
+ | `toNumericStatistics()` | Богатый числовой статистический анализ (среднее, медиана, дисперсия, асимметрия, эксцесс и т.д.). | Аналитика данных и статистические вычисления. |
148
+ | `toBigIntStatistics()` | Богатый статистический анализ для больших целых (`bigint`). | Аналитика данных и статистические вычисления для больших целых чисел. |
149
+ | `toWindow()` | Поддержка скользящих и фиксированных окон. | Обработка временных рядов, пакетная обработка и оконные операции. |
92
150
 
93
- ### 3. 執行串流(終端操作)
94
- 要獲得結果,必須取得一個 Collectable 並呼叫終端操作。
151
+ ---
95
152
 
96
- ```typescript
97
- // 取得一個無序收集器以提高效能
98
- const resultArray = await processedStream.toUnordered().toArray();
99
- console.log(resultArray); // 例如:[20, 21, 40, 41]
100
-
101
- // 使用內建收集器
102
- const sum = await processedStream.toUnordered().collect(useSummate());
103
- console.log(sum);
104
-
105
- // 或使用通用的 collect 方法
106
- const customResult = await processedStream.toOrdered().collect(
107
- () => new Map<number, number>(),
108
- (map, element, index) => map.set(index, element),
109
- map => map
110
- );
111
- ```
153
+ Важные правила использования
112
154
 
113
- ### 4. 關鍵:處理事件流
114
- 事件流(useDocument, useWindow, useHTMLElement, useWebSocket)本質上是無限的。您必須使用諸如 sub、takeWhile limit 等操作來定義何時停止收集事件並完成串流。否則,終端操作將無限期等待。
155
+ 1. Потоки событий (`useWindow`, `useDocument`, `useHTMLElement`, `useWebSocket`, …) возвращают `AsynchronousSemantic`.
156
+ Вы **должны** вызвать `.limit(n)`, `.sub(start, end)` или `.takeWhile()`, чтобы прекратить прослушивание. Иначе слушатель останется активным.
115
157
 
116
- ```typescript
117
- import { useDocument } from 'semantic-typescript';
158
+ 2. Терминальные операции (`.toArray()`, `.count()`, `.average()`, `.reduce()`, `.findFirst()` и т.д.) доступны только после преобразования в коллектор:
159
+ ```typescript
160
+ .toUnordered() // O(n) время и память, без сортировки
161
+ // или
162
+ .toOrdered() // Отсортировано, сохраняет порядок
163
+ ```
118
164
 
119
- // 僅收集前 5 次點擊
120
- const first5Clicks = await useDocument('click')
121
- .limit(5) // <- 關鍵:將串流限制為 5 個事件
122
- .toUnordered()
123
- .toArray();
165
+ ---
124
166
 
125
- // 收集 10 秒視窗內的點擊
126
- const clicksIn10s = await useDocument('click')
127
- .takeWhile((_, index, startTime = Date.now()) => Date.now() - startTime < 10000)
128
- .toUnordered()
129
- .toArray();
167
+ ### Характеристики производительности
130
168
 
131
- // 收集索引 2 5 的點擊(基於 0)
132
- const specificClicks = await useDocument('click')
133
- .sub(2n, 6n) // <- 獲取索引為 2, 3, 4, 5 的元素
134
- .toUnordered()
135
- .toArray();
136
- ```
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) | Да | Временные оконные операции. |
137
176
 
138
- **關鍵見解**:事件(例如 MouseEvent)及其順序觸發索引(作為大整數)透過 `accept(event, index)` 回呼一起在管道中傳遞。
177
+ Выбирайте `toUnordered()`, когда важнее всего скорость. Используйте `toOrdered()` только когда вам требуется стабильный порядок или статистические методы, зависящие от отсортированных данных.
139
178
 
140
- ### 5. 利用統計功能
141
- ```typescript
142
- const numericStream = useFrom([10, 20, 30, 40, 50]).toNumeric();
179
+ ---
143
180
 
144
- const average = await numericStream.average();
145
- const median = await numericStream.median();
146
- const standardDeviation = await numericStream.standardDeviation();
147
- const skewness = await numericStream.skewness();
181
+ Сравнение с другими обработчиками потоков для фронтенда
148
182
 
149
- console.log(`Average: ${average}, Median: ${median}, StdDev: ${standardDeviation}`);
150
- ```
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). | Низкая. | Умеренная. |
151
195
 
152
- ## 主要特性
153
- - **雙流類型**:完全支援同步語意(用於 Iterable)和非同步語意(用於 AsyncIterable 和事件)
154
- - **豐富的操作集**:過濾器、映射、扁平映射、連接、去重、排序、限制、跳過、檢視、反轉、打亂
155
- - **靈活的終端操作**:收集(使用自訂收集器)、toArray、toSet、toMap、forEach、reduce、findFirst、anyMatch、allMatch、count
156
- - **進階收集器**:用於連接、分組、分割區、求和、平均、最大值、最小值的內建收集器
157
- - **統計模組**:在數值/大整數流上用於均值、中位數、眾數、變異數、標準差、範圍、分位數、偏度、峰度的即用型方法
158
- - **實用函數**:型別守衛(isPromise, isAsyncIterable)、比較器(useCompare)、遍歷(useTraverse)和轉換勾點
159
- - **Optional<T>**:一個用於可空值的單子容器,與查詢操作整合
160
-
161
- ## API 概述
162
- ### 核心類別和介面
163
- - `Semantic<E>` / `AsynchronousSemantic<E>`:抽象的串流定義
164
- - `Collectable<E>` / `AsynchronousCollectable<E>`:具有終端操作的可執行串流
165
- - `OrderedCollectable<E>` / `UnorderedCollectable<E>`:為順序敏感或順序不敏感操作最佳化的實例化版本
166
- - `Collector<E, A, R>`:可變歸約操作的抽象
167
-
168
- ### 工廠函數 (use*)
169
- - **從來源建立**:useFrom, useRange, useFill, useEmpty
170
- - **從時間建立**:useInterval, useAnimationFrame
171
- - **從 Web API 建立**:useBlob, useDocument, useWindow, useHTMLElement, useWebSocket
172
- - **收集器**:useToArray, useGroupBy, useSummate, useJoin
173
-
174
- ## 效能說明
175
- - **惰性求值**:在呼叫終端操作之前,管道僅組合而不執行
176
- - **短路求值**:諸如限制、任何匹配和查詢首個等操作將在結果確定後立即停止處理元素
177
- - **有序與無序**:
178
- - 當來源元素的順序對您的結果不重要時(例如,求和、最大值或 toSet),對終端操作使用 `.toUnordered()`。這允許內部最佳化跳過昂貴的排序步驟
179
- - 當順序很重要時(例如,toArray 必須保留順序),使用 `.toOrdered()`
180
-
181
- ## 入門範例
182
- ```typescript
183
- import { useFrom, useSummate, useGroupBy } from 'semantic-typescript';
184
-
185
- interface Transaction {
186
- id: number;
187
- amount: number;
188
- category: string;
189
- }
190
-
191
- const transactions: Transaction[] = [
192
- { id: 1, amount: 100, category: 'Food' },
193
- { id: 2, amount: 200, category: 'Electronics' },
194
- { id: 3, amount: 50, category: 'Food' },
195
- { id: 4, amount: 300, category: 'Electronics' },
196
- ];
197
-
198
- // 計算每個類別的總金額
199
- const totalsByCategory = await useFrom(transactions)
200
- .toUnordered()
201
- .collect(
202
- useGroupBy(
203
- t => t.category,
204
- t => t.amount,
205
- useSummate() // 值的收集器
206
- )
207
- );
208
-
209
- console.log(totalsByCategory); // Map { 'Food' => 150, 'Electronics' => 500 }
210
- ```
196
+ Ключевые преимущества Semantic-TypeScript
197
+
198
+ • Уникальные встроенные возможности статистики и индексирования, устраняющие необходимость в ручном `reduce` или внешних библиотеках.
199
+
200
+ • Явный контроль над потоками событий предотвращает утечки памяти, типичные для RxJS.
201
+
202
+ • Единый синхронный/асинхронный дизайн предоставляет единый, последовательный API для различных случаев использования.
203
+
204
+ Это сравнение показывает, почему Semantic-TypeScript особенно хорошо подходит для современных TypeScript фронтенд-приложений, которые требуют производительности, типобезопасности и богатой аналитики без сложностей традиционных реактивных библиотек.
205
+
206
+ ---
207
+
208
+ ### Готовы исследовать?
209
+
210
+ Semantic-TypeScript превращает сложные потоки данных в читаемые, комбинируемые и высокопроизводительные конвейеры. Обрабатываете ли вы события пользовательского интерфейса в реальном времени, обрабатываете большие наборы данных или создаёте аналитические панели — он предоставляет мощь индексирования уровня базы данных с элегантностью функционального программирования.
211
+
212
+ Следующие шаги:
213
+
214
+ • Изучите полностью типизированный API в своей IDE (все экспорты из основного пакета).
215
+
216
+ • Присоединяйтесь к растущему сообществу разработчиков, заменивших запутанные асинхронные итераторы на чистые конвейеры Semantic.
217
+
218
+
219
+ Semantic-TypeScript — где потоки встречаются со структурой.
211
220
 
212
- Semantic-TypeScript 是為那些尋求嚴格設計、型別安全和高效能串流處理函式庫的開發者而建構的。它將企業級資料轉換模式的力量帶入了 TypeScript 生態系統,非常適合資料密集型前端應用程式、Node.js 資料處理,以及任何需要優雅、高效處理序列的場景。
221
+ Начните создавать сегодня и почувствуйте разницу, которую даёт продуманное индексирование.
213
222
 
214
- [![GitHub](./GitHub.png)](https://github.com/eloyhere/semantic-typescript) [![NPM](./NPM.png)](https://www.npmjs.com/package/semantic-typescript)
223
+ Стройте ясно, действуйте уверенно и преобразуйте данные с намерением.