semantic-typescript 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/asynchronous/collector.d.ts +62 -58
- package/dist/asynchronous/collector.js +16 -5
- package/dist/asynchronous/semantic.d.ts +2 -2
- package/dist/asynchronous/semantic.js +16 -6
- package/dist/factory.d.ts +8 -0
- package/dist/factory.js +112 -36
- package/dist/hook.d.ts +6 -1
- package/dist/hook.js +20 -3
- package/dist/main.d.ts +1 -0
- package/dist/main.js +6 -0
- package/dist/synchronous/collector.d.ts +8 -4
- package/dist/synchronous/collector.js +74 -59
- package/dist/synchronous/semantic.d.ts +27 -23
- package/dist/synchronous/semantic.js +215 -286
- package/package.json +3 -2
- package/readme.cn.md +213 -214
- package/readme.de.md +172 -173
- package/readme.es.md +177 -172
- package/readme.fr.md +181 -172
- package/readme.jp.md +187 -169
- package/readme.kr.md +182 -169
- package/readme.md +213 -214
- package/readme.ru.md +188 -169
- package/readme.tw.md +178 -169
package/readme.ru.md
CHANGED
|
@@ -1,205 +1,224 @@
|
|
|
1
|
-
|
|
1
|
+
Перевод на русский, с учётом языковых норм, контекста и стилистических особенностей. Собственные имена не переведены:
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
# Semantic-TypeScript
|
|
4
|
+
Потоки данных, проиндексированные. Ваши данные под точным контролем.
|
|
5
5
|
|
|
6
|
-
|
|
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
|
-
|
|
12
|
+
Там, где обычные библиотеки навязывают синхронные циклы или громоздкие цепочки промисов, Semantic-TypeScript предлагает полностью асинхронный, функционально чистый и строго типобезопасный опыт, созданный для требований современной фронтенд-разработки.
|
|
19
13
|
|
|
20
|
-
|
|
21
|
-
Выбор подходящей библиотеки для обработки потоков данных предполагает баланс между производительностью, типобезопасностью и выразительностью. Semantic-TypeScript создан для превосходства по всем этим параметрам.
|
|
14
|
+
В этой элегантной модели данные достигают потребителя только тогда, когда вышестоящий конвейер явно вызывает коллбэки `accept` (и, опционально, `interrupt`). Вы полностью контролируете время — именно тогда, когда это необходимо.
|
|
22
15
|
|
|
23
|
-
|
|
24
|
-
Он предоставляет единый, декларативный API для обработки любой последовательности данных — будь то статические массивы, события в реальном времени или асинхронные фрагменты (chunks) — при этом используя всю мощь TypeScript для обеспечения сквозной типобезопасности. Это устраняет целый класс ошибок времени выполнения и превращает манипуляции с потоками в предсказуемую, проверяемую компилятором деятельность.
|
|
16
|
+
---
|
|
25
17
|
|
|
26
|
-
###
|
|
27
|
-
В своей основе библиотека построена на отложенном выполнении (lazy evaluation). Операции, такие как filter, map и flatMap, лишь составляют конвейер обработки; никакая работа не выполняется до тех пор, пока не будет вызвана терминальная операция. Это сочетается с возможностями короткого замыкания (short-circuiting) (через limit, anyMatch или пользовательские прерывающие обратные вызовы), что позволяет остановить обработку досрочно, значительно повышая эффективность для больших или бесконечных потоков.
|
|
18
|
+
### Почему разработчики выбирают его
|
|
28
19
|
|
|
29
|
-
|
|
30
|
-
Вдохновленный Java, паттерн Collector — это двигатель гибкости. Он отделяет спецификацию того, как накапливать элементы потока, от самого выполнения потока. Библиотека предоставляет богатый набор встроенных коллекторов (collectors) (toArray, groupBy, summate и т.д.) для повседневных задач, позволяя при этом с легкостью реализовывать собственную сложную, повторно используемую логику свёртки (reduction). Это намного мощнее и композируемее, чем фиксированный набор терминальных методов.
|
|
20
|
+
• Индексирование без шаблонного кода — каждый элемент несет свой естественный или специально созданный индекс.
|
|
31
21
|
|
|
32
|
-
|
|
33
|
-
Semantic-TypeScript создан для современной разработки. Он предлагает нативные фабричные методы для современных веб-источников:
|
|
34
|
-
* `useFrom(iterable)`, `useRange()` для статических данных
|
|
35
|
-
* `useInterval()`, `useAnimationFrame()` для потоков, основанных на времени
|
|
36
|
-
* `useBlob()` для обработки бинарных данных фрагментами (chunked)
|
|
37
|
-
* `useWebSocket()`, `useDocument()`, `useWindow()` для потоков событий в реальном времени
|
|
22
|
+
• Чистый функциональный стиль — с полным выведением типов TypeScript.
|
|
38
23
|
|
|
39
|
-
|
|
40
|
-
Выходите за рамки простых сумм и средних значений. Библиотека предоставляет специальные интерфейсы NumericStatistics и BigIntStatistics, предлагая немедленный доступ к расширенным статистическим показателям напрямую из ваших потоков — дисперсия, стандартное отклонение, медиана, асимметрия (skewness) и эксцесс (kurtosis). Это превращает сложный анализ данных в однострочник.
|
|
24
|
+
• Потоки событий без утечек — `useWindow`, `useDocument`, `useHTMLElement` и `useWebSocket` созданы с учетом безопасности. Вы задаете границу — с помощью `limit(n)`, `sub(start, end)` или `takeWhile(predicate)` — а библиотека управляет очисткой. Никаких зависших слушателей, никаких утечек памяти.
|
|
41
25
|
|
|
42
|
-
|
|
43
|
-
* **Беглый, цепочечный (chainable) API**: Пишите сложные конвейеры данных в виде читаемых, последовательных цепочек.
|
|
44
|
-
* **Комплексный набор утилит**: Включены основные защиты (isFunction, isIterable), утилиты (useCompare, useTraverse) и функциональные интерфейсы.
|
|
45
|
-
* **Интеграция с Optional<T>**: Безопасно моделирует отсутствие значения, устраняя проблемы с нулевыми указателями (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
|
-
|
|
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
|
-
|
|
73
|
-
|
|
38
|
+
```bash
|
|
39
|
+
npm install semantic-typescript
|
|
74
40
|
```
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
107
|
-
Потоки событий (useDocument, useWindow, useHTMLElement, useWebSocket) по своей природе бесконечны. Вы должны использовать операции, такие как sub, takeWhile или limit, чтобы определить, когда прекратить сбор событий и завершить поток. В противном случае терминальная операция будет ждать неопределенно долго.
|
|
108
|
-
```typescript
|
|
109
|
-
import { useDocument } from 'semantic-typescript';
|
|
48
|
+
### Быстрый старт
|
|
110
49
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
//
|
|
118
|
-
|
|
119
|
-
.
|
|
95
|
+
// Изменение размера окна в реальном времени (автоматически останавливается после 5 событий)
|
|
96
|
+
useWindow("resize")
|
|
97
|
+
.limit(5n) // Ключевой момент для потоков событий
|
|
120
98
|
.toUnordered()
|
|
121
|
-
.
|
|
99
|
+
.forEach((ev, idx) => console.log(`Изменение размера #${idx}`));
|
|
122
100
|
|
|
123
|
-
//
|
|
124
|
-
|
|
125
|
-
|
|
101
|
+
// Прослушивание HTML-элемента
|
|
102
|
+
// <input id="input" type="text"/>
|
|
103
|
+
useHTMLElement("#input", "change")
|
|
104
|
+
.limit(1)
|
|
126
105
|
.toUnordered()
|
|
127
|
-
.
|
|
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
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
108
|
+
// Прослушивание нескольких элементов и событий
|
|
109
|
+
useHTMLElement("input", ["change", "keyup"])
|
|
110
|
+
.takeWhile((event: Event): boolean => validate(event))
|
|
111
|
+
.toUnordered()
|
|
112
|
+
.forEach((event: Event) => submit(event));
|
|
139
113
|
|
|
140
|
-
|
|
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
|
-
|
|
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<T>**: Монадический контейнер для нулабельных значений, интегрированный с операциями поиска (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
|
-
.
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
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
|
-
|
|
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
|
-
|
|
224
|
+
Стройте с ясностью, действуйте с уверенностью и преобразуйте данные осмысленно.
|