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.ru.md CHANGED
@@ -1,205 +1,224 @@
1
- # Semantic-TypeScript: Библиотека потоковой обработки, меняющая парадигму
1
+ Перевод на русский, с учётом языковых норм, контекста и стилистических особенностей. Собственные имена не переведены:
2
2
 
3
- ## Введение
4
- Semantic-TypeScript представляет собой значительный прогресс в технологии потоковой обработки, синтезируя наиболее эффективные концепции из JavaScript GeneratorFunctions, Java Streams и парадигм индексации баз данных. Его фундаментальный принцип проектирования сосредоточен на построении исключительно эффективных конвейеров обработки данных с помощью сложных вычислений с отложенным выполнением (lazy evaluation) и интеллектуальной индексации. Библиотека предоставляет строго типобезопасный, функционально чистый опыт работы с потоками, специально созданный для современной разработки на TypeScript и JavaScript.
3
+ # Semantic-TypeScript
4
+ Потоки данных, проиндексированные. Ваши данные под точным контролем.
5
5
 
6
- В отличие от традиционных синхронных архитектур обработки, Semantic-TypeScript реализует унифицированную модель, которая изящно обрабатывает как синхронные (Iterable), так и асинхронные (AsyncIterable) источники данных. Во время генерации потока поток и завершение данных точно контролируются механизмами обратных вызовов (callback), что позволяет библиотеке исключительно элегантно обрабатывать:
7
- * Потоки данных в реальном времени (события DOM, WebSockets, интервалы) с детерминированным управлением
8
- * Большие наборы данных с помощью эффективных по памяти, "ленивых" (lazy) конвейеров
9
- * Сложные преобразования данных с помощью беглого, декларативного API
6
+ ---
10
7
 
11
- Инновационный подход библиотеки фундаментально переосмысливает то, как разработчики взаимодействуют с последовательностями данных, предоставляя как беспрецедентные характеристики производительности, так и эргономику для разработчиков в едином, целостном пакете.
8
+ ### Обзор
12
9
 
13
- ## Основная философия: разделение определения и выполнения
14
- Ключевая архитектурная идея Semantic-TypeScript — это четкое разделение между определением потока и его выполнением:
15
- * **Semantic<E>**: неизменяемый, "ленивый" (lazy) план конвейера преобразования данных. Он определяет, какие операции (filter, map и т.д.) будут выполнены.
16
- * **Collectable<E>**: материализованное, исполняемое представление потока. Получается из Semantic и предоставляет все терминальные операции (collect, forEach и т.д.) для выполнения конвейера и получения результата.
10
+ Semantic-TypeScript знаменует собой значительный скачок в развитии технологий обработки потоков данных, синтезируя наиболее эффективные концепции из JavaScript `GeneratorFunction`, Java Streams и индексирования в стиле MySQL. Его основная философия одновременно проста и мощна: создавайте исключительно эффективные конвейеры обработки данных с помощью интеллектуального индексирования, а не грубого перебора.
17
11
 
18
- Это разделение обеспечивает четкую ментальную модель и открывает возможность мощных оптимизаций, таких как выбор UnorderedCollectable для пропуска ненужной сортировки для максимальной скорости.
12
+ Там, где обычные библиотеки навязывают синхронные циклы или громоздкие цепочки промисов, Semantic-TypeScript предлагает полностью асинхронный, функционально чистый и строго типобезопасный опыт, созданный для требований современной фронтенд-разработки.
19
13
 
20
- ## Почему стоит выбрать Semantic-TypeScript?
21
- Выбор подходящей библиотеки для обработки потоков данных предполагает баланс между производительностью, типобезопасностью и выразительностью. Semantic-TypeScript создан для превосходства по всем этим параметрам.
14
+ В этой элегантной модели данные достигают потребителя только тогда, когда вышестоящий конвейер явно вызывает коллбэки `accept` (и, опционально, `interrupt`). Вы полностью контролируете время — именно тогда, когда это необходимо.
22
15
 
23
- ### 1. Унифицированная, типобезопасная парадигма для всех последовательностей данных
24
- Он предоставляет единый, декларативный API для обработки любой последовательности данных — будь то статические массивы, события в реальном времени или асинхронные фрагменты (chunks) — при этом используя всю мощь TypeScript для обеспечения сквозной типобезопасности. Это устраняет целый класс ошибок времени выполнения и превращает манипуляции с потоками в предсказуемую, проверяемую компилятором деятельность.
16
+ ---
25
17
 
26
- ### 2. Непреклонная производительность с интеллектуальной "ленивостью" (Laziness)
27
- В своей основе библиотека построена на отложенном выполнении (lazy evaluation). Операции, такие как filter, map и flatMap, лишь составляют конвейер обработки; никакая работа не выполняется до тех пор, пока не будет вызвана терминальная операция. Это сочетается с возможностями короткого замыкания (short-circuiting) (через limit, anyMatch или пользовательские прерывающие обратные вызовы), что позволяет остановить обработку досрочно, значительно повышая эффективность для больших или бесконечных потоков.
18
+ ### Почему разработчики выбирают его
28
19
 
29
- ### 3. Сила паттерна `Collector<E, A, R>`
30
- Вдохновленный Java, паттерн Collector — это двигатель гибкости. Он отделяет спецификацию того, как накапливать элементы потока, от самого выполнения потока. Библиотека предоставляет богатый набор встроенных коллекторов (collectors) (toArray, groupBy, summate и т.д.) для повседневных задач, позволяя при этом с легкостью реализовывать собственную сложную, повторно используемую логику свёртки (reduction). Это намного мощнее и композируемее, чем фиксированный набор терминальных методов.
20
+ Индексирование без шаблонного кода каждый элемент несет свой естественный или специально созданный индекс.
31
21
 
32
- ### 4. Поддержка современного веба и асинхронных данных "из коробки"
33
- Semantic-TypeScript создан для современной разработки. Он предлагает нативные фабричные методы для современных веб-источников:
34
- * `useFrom(iterable)`, `useRange()` для статических данных
35
- * `useInterval()`, `useAnimationFrame()` для потоков, основанных на времени
36
- * `useBlob()` для обработки бинарных данных фрагментами (chunked)
37
- * `useWebSocket()`, `useDocument()`, `useWindow()` для потоков событий в реальном времени
22
+ Чистый функциональный стиль с полным выведением типов TypeScript.
38
23
 
39
- ### 5. За пределами базовой агрегации: встроенный статистический анализ
40
- Выходите за рамки простых сумм и средних значений. Библиотека предоставляет специальные интерфейсы NumericStatistics и BigIntStatistics, предлагая немедленный доступ к расширенным статистическим показателям напрямую из ваших потоков — дисперсия, стандартное отклонение, медиана, асимметрия (skewness) и эксцесс (kurtosis). Это превращает сложный анализ данных в однострочник.
24
+ Потоки событий без утечек `useWindow`, `useDocument`, `useHTMLElement` и `useWebSocket` созданы с учетом безопасности. Вы задаете границу — с помощью `limit(n)`, `sub(start, end)` или `takeWhile(predicate)` — а библиотека управляет очисткой. Никаких зависших слушателей, никаких утечек памяти.
41
25
 
42
- ### 6. Спроектирован с учетом эргономики разработчика
43
- * **Беглый, цепочечный (chainable) API**: Пишите сложные конвейеры данных в виде читаемых, последовательных цепочек.
44
- * **Комплексный набор утилит**: Включены основные защиты (isFunction, isIterable), утилиты (useCompare, useTraverse) и функциональные интерфейсы.
45
- * **Интеграция с Optional&lt;T&gt;**: Безопасно моделирует отсутствие значения, устраняя проблемы с нулевыми указателями (null-pointer).
46
- * **Рекомендации по производительности**: Четкие указания, когда использовать неупорядоченную (unordered) коллекцию для скорости, а когда упорядоченную (ordered) для последовательности.
26
+ Встроенная статистика всесторонний анализ для чисел и bigint, включая средние значения, медианы, моду, дисперсию, асимметрию и эксцесс.
47
27
 
48
- ## Установка
49
- ```bash
50
- npm install semantic-typescript
51
- ```
28
+ Предсказуемая производительность — выбирайте между упорядоченными и неупорядоченными коллекторами в зависимости от ваших требований.
52
29
 
53
- ## Основные концепции на практике
30
+ Эффективное использование памяти — потоки вычисляются лениво, что снимает проблемы с памятью.
54
31
 
55
- ### 1. Создание потоков (Semantic)
56
- Потоки можно создавать из различных источников с помощью фабричных функций.
57
- ```typescript
58
- import { useFrom, useInterval, useDocument } from 'semantic-typescript';
32
+ Без неопределенного поведения — TypeScript гарантирует типобезопасность и обработку null. Входные данные остаются неизменными, если явно не модифицированы в ваших функциях обратного вызова.
59
33
 
60
- // Из статического массива
61
- const staticStream = useFrom([1, 2, 3, 4, 5]);
34
+ ---
62
35
 
63
- // Из асинхронного генератора
64
- const asyncStream = useFrom(async function*() {
65
- yield 1;
66
- yield 2;
67
- });
68
-
69
- // Поток на основе времени
70
- const tickStream = useInterval(1000); // испускает значение каждую секунду
36
+ ### Установка
71
37
 
72
- // Поток событий DOM (см. важное примечание ниже)
73
- const clickStream = useDocument('click');
38
+ ```bash
39
+ npm install semantic-typescript
74
40
  ```
75
-
76
- ### 2. Преобразование потоков (Промежуточные операции)
77
- Операции лениво объединяются в цепочку для определения конвейера.
78
- ```typescript
79
- const processedStream = staticStream
80
- .filter(x => x % 2 === 0) // Оставляем только четные числа
81
- .map(x => x * 10) // Умножаем на 10
82
- .flatMap(x => [x, x + 1]) // Преобразуем каждый элемент в два
83
- .distinct(); // Удаляем дубликаты
84
- // Пока ничего не было выполнено
41
+ или
42
+ ```bash
43
+ yarn add semantic-typescript
85
44
  ```
86
45
 
87
- ### 3. Выполнение потоков (Терминальные операции)
88
- Чтобы получить результат, вы должны получить Collectable и вызвать терминальную операцию.
89
- ```typescript
90
- // Получаем неупорядоченный collectable для производительности
91
- const resultArray = await processedStream.toUnordered().toArray();
92
- console.log(resultArray); // например, [20, 21, 40, 41]
93
-
94
- // Используем встроенный коллектор
95
- const sum = await processedStream.toUnordered().collect(useSummate());
96
- console.log(sum);
97
-
98
- // Или используем общий метод collect
99
- const customResult = await processedStream.toOrdered().collect(
100
- () => new Map<number, number>(),
101
- (map, element, index) => map.set(index, element),
102
- map => map
103
- );
104
- ```
46
+ ---
105
47
 
106
- ### 4. Важно: Работа с потоками событий
107
- Потоки событий (useDocument, useWindow, useHTMLElement, useWebSocket) по своей природе бесконечны. Вы должны использовать операции, такие как sub, takeWhile или limit, чтобы определить, когда прекратить сбор событий и завершить поток. В противном случае терминальная операция будет ждать неопределенно долго.
108
- ```typescript
109
- import { useDocument } from 'semantic-typescript';
48
+ ### Быстрый старт
110
49
 
111
- // Собираем только первые 5 кликов
112
- const first5Clicks = await useDocument('click')
113
- .limit(5) // <- Важно: ограничивает поток 5 событиями
50
+ ```typescript
51
+ import { useOf, useFrom, useRange, useWindow, useHTMLElement, useWebSocket, useText, useStringify } from "semantic-typescript";
52
+
53
+ // Числовая статистика
54
+ let summate: number = useOf(10, 20, 30, 40)
55
+ .map((n: number): number => n * 2)
56
+ .toNumericStatistics() // Требуется перед терминальной операцией
57
+ .summate(); // 200
58
+
59
+ // Статистика для BigInt
60
+ let summate: bigint = useOf(10n, 20n, 30n, 40n)
61
+ .map((n: bigint): bigint => n * 2)
62
+ .toBigIntStatistics() // Требуется перед терминальной операцией
63
+ .summate(); // 200n
64
+
65
+ // Перевернуть поток по индексу
66
+ useFrom([1, 2, 3, 4, 5])
67
+ .redirect((element: E, index: bigint): bigint => -index) // Отрицательный индекс для разворота
68
+ .toOrdered() // Вызов toOrdered() для сохранения порядка индексов
69
+ .toArray(); // [5, 4, 3, 2, 1]
70
+
71
+ // Перемешать поток
72
+ useFrom([1, 2, 3, 4, 5])
73
+ .shuffle()
74
+ .toOrdered()
75
+ .toArray(); // напр., [2, 5, 1, 4, 3]
76
+
77
+ // Сдвинуть элементы внутри потока
78
+ useFrom([1, 2, 3, 4, 5])
79
+ .translate(2) // Сдвиг элементов вправо на 2 позиции
80
+ .toOrdered()
81
+ .toArray(); // [4, 5, 1, 2, 3]
82
+
83
+ useFrom([1, 2, 3, 4, 5])
84
+ .translate(-2) // Сдвиг элементов влево на 2 позиции
85
+ .toOrdered()
86
+ .toArray(); // [3, 4, 5, 1, 2]
87
+
88
+ // Бесконечный диапазон с ранним завершением
89
+ useRange(0n, 1_000_000n)
90
+ .filter(n => n % 17n === 0n)
91
+ .limit(10n) // Остановиться после 10 элементов
114
92
  .toUnordered()
115
93
  .toArray();
116
94
 
117
- // Собираем клики в течение 10-секундного окна
118
- const clicksIn10s = await useDocument('click')
119
- .takeWhile((_, index, startTime = Date.now()) => Date.now() - startTime < 10000)
95
+ // Изменение размера окна в реальном времени (автоматически останавливается после 5 событий)
96
+ useWindow("resize")
97
+ .limit(5n) // Ключевой момент для потоков событий
120
98
  .toUnordered()
121
- .toArray();
99
+ .forEach((ev, idx) => console.log(`Изменение размера #${idx}`));
122
100
 
123
- // Собираем клики с индекса 2 по 5 (0-based)
124
- const specificClicks = await useDocument('click')
125
- .sub(2n, 6n) // <- Берет элементы с индексами 2, 3, 4, 5
101
+ // Прослушивание HTML-элемента
102
+ // <input id="input" type="text"/>
103
+ useHTMLElement("#input", "change")
104
+ .limit(1)
126
105
  .toUnordered()
127
- .toArray();
128
- ```
129
- **Ключевое понимание**: Событие (например, MouseEvent) и его порядковый индекс срабатывания (в виде bigint) передаются вместе через конвейер с помощью обратного вызова `accept(event, index)`.
130
-
131
- ### 5. Использование статистики
132
- ```typescript
133
- const numericStream = useFrom([10, 20, 30, 40, 50]).toNumeric();
106
+ .forEach((event: Event) => submit(event));
134
107
 
135
- const average = await numericStream.average();
136
- const median = await numericStream.median();
137
- const standardDeviation = await numericStream.standardDeviation();
138
- const skewness = await numericStream.skewness();
108
+ // Прослушивание нескольких элементов и событий
109
+ useHTMLElement("input", ["change", "keyup"])
110
+ .takeWhile((event: Event): boolean => validate(event))
111
+ .toUnordered()
112
+ .forEach((event: Event) => submit(event));
139
113
 
140
- console.log(`Среднее: ${average}, Медиана: ${median}, Стандартное отклонение: ${standardDeviation}`);
141
- ```
114
+ // Прослушивание WebSocket
115
+ let webSocket = new WebSocket("ws://localhost:8080");
116
+ webSocket.addEventListener("close", (): void => {
117
+ webSocket.close(); // Управляйте жизненным циклом WebSocket вручную
118
+ });
119
+ useWebSocket(webSocket, "message")
120
+ .limit(1)
121
+ .toUnordered()
122
+ .forEach((message: MessageEvent) => console.log(message.data));
142
123
 
143
- ## Основные возможности
144
- * **Двойные типы потоков**: Полная поддержка как SynchronousSemantic (для Iterable), так и AsynchronousSemantic (для AsyncIterable и событий)
145
- * **Богатый набор операций**: filter, map, flatMap, concat, distinct, sorted, limit, skip, peek, reverse, shuffle
146
- * **Гибкие терминальные операции**: collect (с пользовательскими коллекторами), toArray, toSet, toMap, forEach, reduce, findFirst, anyMatch, allMatch, count
147
- * **Продвинутые коллекторы**: Встроенные коллекторы для joining, groupingBy, partitioningBy, summing, averaging, maxBy, minBy
148
- * **Статистический модуль**: Готовые к использованию методы для mean, median, mode, variance, standardDeviation, range, quantiles, skewness, kurtosis для числовых/bigint потоков
149
- * **Вспомогательные функции**: Защитники типов (type guards) (isPromise, isAsyncIterable), компараторы (useCompare), обход (useTraverse) и хуки преобразования
150
- * **Optional&lt;T&gt;**: Монадический контейнер для нулабельных значений, интегрированный с операциями поиска (find)
151
-
152
- ## Обзор API
153
- ### Основные классы и интерфейсы
154
- * `Semantic<E>` / `AsynchronousSemantic<E>`: Абстрактное определение потока
155
- * `Collectable<E>` / `AsynchronousCollectable<E>`: Исполняемый поток с терминальными операциями
156
- * `OrderedCollectable<E>` / `UnorderedCollectable<E>`: Материализованные версии, оптимизированные для операций, чувствительных или нечувствительных к порядку
157
- * `Collector<E, A, R>`: Абстракция для изменяемых (mutable) операций свёртки (reduction)
158
-
159
- ### Фабричные функции (use*)
160
- * **Из источников**: useFrom, useRange, useFill, useEmpty
161
- * **Из времени**: useInterval, useAnimationFrame
162
- * **Из веб-API**: useBlob, useDocument, useWindow, useHTMLElement, useWebSocket
163
- * **Коллекторы**: useToArray, useGroupBy, useSummate, useJoin и т.д.
164
-
165
- ## Примечания по производительности
166
- * **Отложенное выполнение (Lazy Evaluation)**: Конвейеры составляются без выполнения до тех пор, пока не будет вызвана терминальная операция.
167
- * **Короткое замыкание (Short-Circuiting)**: Операции, такие как limit, anyMatch и findFirst, остановят обработку элементов, как только результат будет определен.
168
- * **Упорядоченное (Ordered) vs Неупорядоченное (Unordered)**:
169
- * Используйте `.toUnordered()` для терминальных операций, когда порядок исходных элементов не имеет значения для вашего результата (например, для sum, max или toSet). Это может позволить внутренние оптимизации, пропускающие затратные шаги сортировки.
170
- * Используйте `.toOrdered()`, когда важна последовательность (например, для toArray, где порядок должен быть сохранен).
171
-
172
- ## Пример для начала работы
173
- ```typescript
174
- import { useFrom, useSummate, useGroupBy } from 'semantic-typescript';
175
-
176
- interface Transaction {
177
- id: number;
178
- amount: number;
179
- category: string;
180
- }
181
-
182
- const transactions: Transaction[] = [
183
- { id: 1, amount: 100, category: 'Food' },
184
- { id: 2, amount: 200, category: 'Electronics' },
185
- { id: 3, amount: 50, category: 'Food' },
186
- { id: 4, amount: 300, category: 'Electronics' },
187
- ];
188
-
189
- // Вычисляем общую сумму по категориям
190
- const totalsByCategory = await useFrom(transactions)
124
+ // Итерация по строке по кодовым точкам
125
+ useText("Моё текущее настроение: 😊, а semantic это 👍")
191
126
  .toUnordered()
192
- .collect(
193
- useGroupBy(
194
- t => t.category,
195
- t => t.amount,
196
- useSummate() // Коллектор для значений
197
- )
198
- );
199
-
200
- console.log(totalsByCategory); // Map { 'Food' => 150, 'Electronics' => 500 }
127
+ .log(); // Выводит строку
128
+
129
+ // Безопасная сериализация объекта с циклическими ссылками
130
+ let o = {
131
+ a: 1,
132
+ b: "текст",
133
+ c: [o.a, o.b, o.c] // Циклическая ссылка
134
+ };
135
+ // let text: string = JSON.stringify(o); // Выбросит ошибку
136
+ let text: string = useStringify(o); // Безопасно возвращает `{a: 1, b: "текст", c: []}`
201
137
  ```
202
138
 
203
- Semantic-TypeScript создан для разработчиков, которые ищут тщательно спроектированную, типобезопасную и высокопроизводительную библиотеку для потоковой обработки данных. Он привносит мощь шаблонов преобразования данных уровня предприятия в экосистему TypeScript, идеально подходящую для насыщенных данными фронтенд-приложений, обработки данных в Node.js и любого сценария, где требуется элегантная и эффективная обработка последовательностей.
139
+ ---
140
+
141
+ ### Основные концепции
142
+
143
+ | Концепция | Назначение | Когда использовать |
144
+ | :--- | :--- | :--- |
145
+ | `AsynchronousSemantic` | Основной конструктор для асинхронных потоков, событий и ленивых конвейеров. | События в реальном времени, WebSockets, слушатели DOM, долгоиграющие или бесконечные потоки. |
146
+ | `SynchronousSemantic` | Конструктор для синхронных потоков в памяти или на основе циклов. | Статические данные, диапазоны, немедленная итерация. |
147
+ | `toUnordered()` | Самый быстрый терминальный коллектор (индексирование на основе Map). | Критичные к производительности задачи (время и память O(n), без сортировки). |
148
+ | `toOrdered()` | Отсортированный коллектор со стабильной индексацией. | Когда требуется стабильный порядок или доступ по индексу. |
149
+ | `toNumericStatistics()` | Богатый числовой статистический анализ (среднее, медиана, дисперсия, асимметрия, эксцесс и т.д.). | Анализ данных и статистические вычисления. |
150
+ | `toBigIntStatistics()` | Богатый статистический анализ для bigint. | Анализ данных и статистические вычисления для больших целых чисел. |
151
+ | `toWindow()` | Поддержка скользящих и тайм-серийных окон. | Обработка временных рядов, пакетная обработка, оконные операции. |
152
+
153
+ ---
154
+
155
+ Важные правила использования
156
+
157
+ 1. Потоки событий (`useWindow`, `useDocument`, `useHTMLElement`, `useWebSocket`, …) возвращают `AsynchronousSemantic`.
158
+ → Вы **должны** вызвать `.limit(n)`, `.sub(start, end)` или `.takeWhile()`, чтобы прекратить прослушивание. В противном случае слушатель останется активным.
159
+
160
+ 2. Терминальные операции (`.toArray()`, `.count()`, `.average()`, `.reduce()`, `.findFirst()` и т.д.) доступны только после преобразования в коллектор:
161
+ ```typescript
162
+ .toUnordered() // Время и память O(n), без сортировки
163
+ // или
164
+ .toOrdered() // Отсортирован, сохраняет порядок
165
+ ```
166
+
167
+ ---
168
+
169
+ ### Характеристики производительности
170
+
171
+ | Коллектор | Временная сложность | Пространственная сложность | Отсортирован? | Лучше всего для |
172
+ | :--- | :--- | :--- | :--- | :--- |
173
+ | `toUnordered()` | O(n) | O(n) | Нет | Максимальная скорость, порядок не важен. |
174
+ | `toOrdered()` | O(2n) | O(n) | Да | Стабильный порядок, доступ по индексу, аналитика. |
175
+ | `toNumericStatistics()` | O(2n) | O(n) | Да | Статистические операции, требующие сортировки данных. |
176
+ | `toBigIntStatistics()` | O(2n) | O(n) | Да | Статистические операции для bigint. |
177
+ | `toWindow()` | O(2n) | O(n) | Да | Временные оконные операции. |
178
+
179
+ Выбирайте `toUnordered()`, когда важна максимальная скорость. Используйте `toOrdered()` только тогда, когда вам требуется стабильный порядок или статистические методы, зависящие от отсортированных данных.
180
+
181
+ ---
182
+
183
+ Сравнение с другими процессорами потоков для фронтенда
184
+
185
+ | Особенность | Semantic-TypeScript | RxJS | Нативные асинхронные итераторы / Генераторы | Most.js |
186
+ | :--- | :--- | :--- | :--- | :--- |
187
+ | Интеграция с TypeScript | Первоклассная, с глубокой типизацией и нативной осведомлённостью об индексе. | Отличная, но связана со сложными дженериками. | Хорошая, требует ручного описания типов. | Сильная, в функциональном стиле. |
188
+ | Встроенный статистический анализ | Полная нативная поддержка для `number` и `bigint`. | Отсутствует нативно (требует пользовательских операторов). | Отсутствует. | Отсутствует. |
189
+ | Индексирование и осведомленность о позиции | Нативное, мощное индексирование bigint для каждого элемента. | Требует пользовательских операторов (`scan`, `withLatestFrom`). | Требуется ручной счётчик. | Базовая, без встроенного индекса. |
190
+ | Управление потоками событий | Специализированные, типобезопасные фабрики с явным контролем ранней остановки. | Мощное, но требует ручного управления подписками. | Ручной слушатель событий + отмена. | Хороший `fromEvent`, лёгкий. |
191
+ | Производительность и эффективность памяти | Исключительные – оптимизированные коллекторы `toUnordered()` и `toOrdered()`. | Очень хорошая, но цепочки операторов добавляют накладные расходы. | Отличная (нулевые накладные расходы). | Отличная. |
192
+ | Размер бандла | Очень лёгкий. | Большой (даже с tree-shaking). | Нулевой (нативный). | Маленький. |
193
+ | Философия дизайна API | Функциональный паттерн коллектора с явным индексированием. | Реактивный паттерн Observable. | Паттерн Итератор / Генератор. | Функциональный, бесточечный. |
194
+ | Раннее завершение и контроль | Явный (`interrupt`, `.limit()`, `.takeWhile()`, `.sub()`). | Хороший (`take`, `takeUntil`, `first`). | Ручной (`break` в `for await…of`). | Хороший (`take`, `until`). |
195
+ | Поддержка синхронных и асинхронных операций | Унифицированный API – первоклассная поддержка обоих. | В основном асинхронный. | Оба, но ручной. | В основном асинхронный. |
196
+ | Кривая обучения | Плавная для разработчиков, знакомых с функциональным программированием и индексированными конвейерами. | Круче (много операторов, горячие/холодные observable). | Низкая. | Умеренная. |
197
+
198
+ Ключевые преимущества Semantic-TypeScript
199
+
200
+ • Уникальные встроенные возможности статистики и индексирования, исключающие необходимость ручного `reduce` или внешних библиотек.
201
+
202
+ • Явный контроль над потоками событий предотвращает утечки памяти, характерные для RxJS.
203
+
204
+ • Унифицированный синхронный/асинхронный дизайн предоставляет единый, последовательный API для различных случаев использования.
205
+
206
+ Это сравнение показывает, почему Semantic-TypeScript особенно хорошо подходит для современных TypeScript фронтенд-приложений, которые требуют производительности, типобезопасности и богатой аналитики без церемоний традиционных реактивных библиотек.
207
+
208
+ ---
209
+
210
+ ### Готовы исследовать?
211
+
212
+ Semantic-TypeScript превращает сложные потоки данных в читаемые, компонуемые и высокопроизводительные конвейеры. Обрабатываете ли вы события пользовательского интерфейса в реальном времени, обрабатываете большие наборы данных или создаёте аналитические панели — он предоставляет мощь индексирования уровня баз данных с элегантностью функционального программирования.
213
+
214
+ Следующие шаги:
215
+
216
+ • Изучите полностью типизированный API в своей IDE (все экспорты из основного пакета).
217
+
218
+ • Присоединяйтесь к растущему сообществу разработчиков, которые заменили запутанные асинхронные итераторы чистыми Semantic-конвейерами.
219
+
220
+ Semantic-TypeScript — где потоки встречаются со структурой.
221
+
222
+ Начните строить сегодня и ощутите разницу, которую приносит продуманное индексирование.
204
223
 
205
- [![GitHub](./GitHub.png)](https://github.com/eloyhere/semantic-typescript) [![NPM](./NPM.png)](https://www.npmjs.com/package/semantic-typescript)
224
+ Стройте с ясностью, действуйте с уверенностью и преобразуйте данные осмысленно.