semantic-typescript 0.7.0 → 0.8.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/semantic.d.ts +4 -0
- package/dist/asynchronous/semantic.js +3 -0
- package/dist/factory.d.ts +24 -71
- package/dist/factory.js +161 -648
- package/dist/guard.d.ts +0 -3
- package/dist/guard.js +0 -19
- package/dist/hash.js +3 -0
- package/dist/synchronous/semantic.d.ts +4 -0
- package/dist/synchronous/semantic.js +26 -7
- package/package.json +2 -2
- package/readme.cn.md +185 -131
- package/readme.de.md +186 -132
- package/readme.es.md +186 -132
- package/readme.fr.md +188 -134
- package/readme.jp.md +185 -140
- package/readme.kr.md +184 -139
- package/readme.md +187 -130
- package/readme.ru.md +186 -143
- package/readme.tw.md +190 -146
- package/dist/main.d.ts +0 -1
- package/dist/main.js +0 -6
package/readme.ru.md
CHANGED
|
@@ -1,40 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
# Semantic-TypeScript
|
|
4
|
-
Потоки данных, проиндексированные. Ваши данные под точным контролем.
|
|
1
|
+
# **Semantic‑TypeScript**
|
|
2
|
+
**Потоки, индексированные.** Ваши данные под точным контролем.
|
|
5
3
|
|
|
6
4
|
---
|
|
7
5
|
|
|
8
6
|
### Обзор
|
|
9
7
|
|
|
10
|
-
Semantic
|
|
8
|
+
Semantic‑TypeScript представляет значительный шаг вперёд в обработке потоков, элегантно **синтезируя** наиболее эффективные парадигмы из генераторов JavaScript, потоков Java и индексации в стиле MySQL. Его фундаментальная предпосылка одновременно мощна и продумана: создавать исключительно эффективные конвейеры обработки данных с помощью интеллектуальной индексации, а не посредством обычного полного перебора.
|
|
11
9
|
|
|
12
|
-
|
|
10
|
+
В то время как типичные библиотеки навязывают синхронные циклы или громоздкие цепочки обещаний (Promise), Semantic‑TypeScript предоставляет **полностью асинхронный**, функционально чистый и строго типобезопасный опыт, разработанный специально для требований современной разработки приложений.
|
|
13
11
|
|
|
14
|
-
|
|
12
|
+
Эта модель воплощает утончённую форму управления потоком данных: данные передаются потребителю ниже по течению только тогда, когда вышестоящий конвейер явно вызывает обратный вызов `accept`. Вы сохраняете полный, детальный контроль над моментом обработки — она происходит именно тогда и только тогда, когда это необходимо.
|
|
15
13
|
|
|
16
14
|
---
|
|
17
15
|
|
|
18
|
-
### Почему разработчики выбирают
|
|
19
|
-
|
|
20
|
-
• Индексирование без шаблонного кода — каждый элемент несет свой естественный или специально созданный индекс.
|
|
21
|
-
|
|
22
|
-
• Чистый функциональный стиль — с полным выведением типов TypeScript.
|
|
23
|
-
|
|
24
|
-
• Потоки событий без утечек — `useWindow`, `useDocument`, `useHTMLElement` и `useWebSocket` созданы с учетом безопасности. Вы задаете границу — с помощью `limit(n)`, `sub(start, end)` или `takeWhile(predicate)` — а библиотека управляет очисткой. Никаких зависших слушателей, никаких утечек памяти.
|
|
25
|
-
|
|
26
|
-
• Встроенная статистика — всесторонний анализ для чисел и bigint, включая средние значения, медианы, моду, дисперсию, асимметрию и эксцесс.
|
|
27
|
-
|
|
28
|
-
• Предсказуемая производительность — выбирайте между упорядоченными и неупорядоченными коллекторами в зависимости от ваших требований.
|
|
29
|
-
|
|
30
|
-
• Эффективное использование памяти — потоки вычисляются лениво, что снимает проблемы с памятью.
|
|
16
|
+
### Почему разработчики выбирают Semantic‑TypeScript
|
|
31
17
|
|
|
32
|
-
|
|
18
|
+
- **Индексация без шаблонного кода** – Каждый элемент по своей природе обладает своим естественным или кастомным индексом, что устраняет необходимость ручного отслеживания.
|
|
19
|
+
- **Чисто функциональный и типобезопасный** – Наслаждайтесь полным, идиоматическим выводом типов TypeScript вместе с неизменяемыми операциями.
|
|
20
|
+
- **Потоки событий без утечек** – Паттерн `useSubscription` разработан с безопасностью ресурсов в качестве первого принципа. Вы определяете логическую границу — используя `limit(n)`, `sub(start, end)` или `takeWhile(predicate)` — а библиотека полностью управляет жизненным циклом подписки. Это гарантирует отсутствие зависших слушателей и утечек памяти.
|
|
21
|
+
- **Встроенный статистический набор** – Получайте доступ к комплексному анализу для потоков как `number`, так и `bigint`, включая средние значения, медианы, моду, дисперсию, асимметрию (скошенность) и эксцесс, без внешних зависимостей.
|
|
22
|
+
- **Предсказуемая, настраиваемая производительность** – Выбирайте между упорядоченными или неупорядоченными сборщиками в соответствии с вашими точными требованиями к производительности и порядку.
|
|
23
|
+
- **Внутренне эффективно по памяти** – Потоки вычисляются лениво, обрабатывая элементы по требованию, чтобы снизить нагрузку на память.
|
|
24
|
+
- **Никакого неопределённого поведения** – TypeScript гарантирует полную типобезопасность и null-безопасность. Ваши исходные данные остаются неизменными, если не модифицированы явно в ваших функциях обратного вызова.
|
|
33
25
|
|
|
34
26
|
---
|
|
35
27
|
|
|
36
28
|
### Установка
|
|
37
29
|
|
|
30
|
+
Интегрируйте Semantic‑TypeScript в ваш проект с помощью предпочитаемого менеджера пакетов:
|
|
31
|
+
|
|
38
32
|
```bash
|
|
39
33
|
npm install semantic-typescript
|
|
40
34
|
```
|
|
@@ -45,180 +39,229 @@ yarn add semantic-typescript
|
|
|
45
39
|
|
|
46
40
|
---
|
|
47
41
|
|
|
48
|
-
###
|
|
42
|
+
### Практическое введение
|
|
43
|
+
|
|
44
|
+
Следующие примеры демонстрируют ключевые концепции, от базовых преобразований до обработки событий в реальных условиях.
|
|
49
45
|
|
|
50
46
|
```typescript
|
|
51
|
-
import { useOf, useFrom, useRange,
|
|
52
|
-
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
//
|
|
60
|
-
|
|
61
|
-
.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
.
|
|
47
|
+
import { useOf, useFrom, useRange, useSubscription, useText, useStringify } from "semantic-typescript";
|
|
48
|
+
|
|
49
|
+
// ====================================================================
|
|
50
|
+
// ПРИМЕР 1: Базовые операции и числовая статистика
|
|
51
|
+
// ====================================================================
|
|
52
|
+
// Демонстрирует операции отображения (map) и терминальные статистические операции. После преобразования конвейер должен быть преобразован в сборщик статистики, прежде чем можно будет вызывать терминальные методы, такие как `.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: Перемешивание (Shuffle) потока
|
|
86
|
+
// ====================================================================
|
|
87
|
+
// Случайным образом переставляет индексы элементов, используя алгоритм перемешивания на месте (in‑place).
|
|
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 вправо
|
|
74
102
|
.toOrdered()
|
|
75
|
-
.toArray();
|
|
103
|
+
.toArray(); // Результат: [4, 5, 1, 2, 3]
|
|
76
104
|
|
|
77
|
-
//
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
.toArray(); // [4, 5, 1, 2, 3]
|
|
105
|
+
// ====================================================================
|
|
106
|
+
// ПРИМЕР 6: Ленивое вычисление с бесконечными диапазонами
|
|
107
|
+
// ====================================================================
|
|
108
|
+
// Обрабатывает теоретически бесконечные потоки лениво, вычисляя элементы только тогда, когда они нужны.
|
|
82
109
|
|
|
83
|
-
|
|
84
|
-
.
|
|
85
|
-
.
|
|
86
|
-
.
|
|
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]
|
|
87
115
|
|
|
88
|
-
//
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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()
|
|
93
130
|
.toArray();
|
|
94
131
|
|
|
95
|
-
//
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
+
};
|
|
100
149
|
|
|
101
|
-
|
|
102
|
-
//
|
|
103
|
-
useHTMLElement("#input", "change")
|
|
104
|
-
.limit(1)
|
|
150
|
+
useSubscription(window, windowSubscriber, "resize")
|
|
151
|
+
.limit(5n) // Автоматически отписывается после 5 событий
|
|
105
152
|
.toUnordered()
|
|
106
|
-
.forEach((
|
|
153
|
+
.forEach((ev: Event, idx) =>
|
|
154
|
+
console.log(`Изменение размера #${idx}: ${(ev.target as Window).innerWidth}x${(ev.target as Window).innerHeight}`)
|
|
155
|
+
);
|
|
107
156
|
|
|
108
|
-
//
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
.forEach((event: Event) => submit(event));
|
|
113
|
-
|
|
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));
|
|
157
|
+
// ====================================================================
|
|
158
|
+
// ПРИМЕР 9: Обработка строк по кодпоинтам Unicode
|
|
159
|
+
// ====================================================================
|
|
160
|
+
// Корректно перебирает строку, обрабатывая многобайтовые символы Unicode.
|
|
123
161
|
|
|
124
|
-
|
|
125
|
-
useText("Моё текущее настроение: 😊, а semantic — это 👍")
|
|
162
|
+
useText("My emotion now is: 😊, and semantic is 👍")
|
|
126
163
|
.toUnordered()
|
|
127
|
-
.log(); // Выводит
|
|
164
|
+
.log(); // Выводит каждый символ (включая эмодзи) с новой строки.
|
|
165
|
+
|
|
166
|
+
// ====================================================================
|
|
167
|
+
// ПРИМЕР 10: Безопасное строковое представление объектов с циклическими ссылками
|
|
168
|
+
// ====================================================================
|
|
169
|
+
// Безопасно сериализует объекты, содержащие циклические ссылки.
|
|
128
170
|
|
|
129
|
-
|
|
130
|
-
let o = {
|
|
171
|
+
const obj = {
|
|
131
172
|
a: 1,
|
|
132
|
-
b: "текст"
|
|
133
|
-
c: [o.a, o.b, o.c] // Циклическая ссылка
|
|
173
|
+
b: "текст"
|
|
134
174
|
};
|
|
135
|
-
|
|
136
|
-
|
|
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: "текст", c: []}`
|
|
137
179
|
```
|
|
138
180
|
|
|
139
181
|
---
|
|
140
182
|
|
|
141
|
-
###
|
|
183
|
+
### Ключевые концепции
|
|
142
184
|
|
|
143
|
-
| Концепция |
|
|
185
|
+
| Концепция | Цель | Основной вариант использования |
|
|
144
186
|
| :--- | :--- | :--- |
|
|
145
|
-
| `AsynchronousSemantic` | Основной
|
|
146
|
-
| `SynchronousSemantic` |
|
|
147
|
-
| `toUnordered()` | Самый быстрый терминальный
|
|
148
|
-
| `toOrdered()` |
|
|
149
|
-
| `toNumericStatistics()` |
|
|
150
|
-
| `toBigIntStatistics()` |
|
|
151
|
-
| `toWindow()` |
|
|
187
|
+
| `AsynchronousSemantic` | Основной построитель для асинхронных потоков, событий и ленивых конвейеров, основанных на проталкивании (push). | События в реальном времени, WebSockets, слушатели DOM или любые длительные/бесконечные потоки. |
|
|
188
|
+
| `SynchronousSemantic` | Построитель для синхронных, находящихся в памяти или основанных на вытягивании (pull) немедленных (eager) потоков. | Статические данные, конечные диапазоны или задачи немедленной итерации. |
|
|
189
|
+
| `toUnordered()` | Самый быстрый терминальный сборщик, использует Map для хранения индексов. | Критичные к производительности пути, где стабильный порядок не требуется (время и пространство O(n)). |
|
|
190
|
+
| `toOrdered()` | Упорядоченный, стабильный по индексам терминальный сборщик. | Когда порядок элементов должен быть сохранён или требуется доступ по индексу. |
|
|
191
|
+
| `toNumericStatistics()` | Сборщик, позволяющий проводить расширенный статистический анализ потоков типа `number`. | Анализ данных, метрики и статистические вычисления. |
|
|
192
|
+
| `toBigIntStatistics()` | Сборщик, позволяющий проводить расширенный статистический анализ потоков типа `bigint`. | Анализ и статистика для наборов данных с большими целыми числами. |
|
|
193
|
+
| `toWindow()` | Предоставляет операции скользящего (sliding) и фиксированного (tumbling) окна над потоком. | Анализ временных рядов, пакетная обработка и оконные агрегации. |
|
|
152
194
|
|
|
153
195
|
---
|
|
154
196
|
|
|
155
|
-
|
|
197
|
+
**Основные правила использования**
|
|
156
198
|
|
|
157
|
-
1.
|
|
158
|
-
→ Вы **должны** вызвать `.limit(n)`, `.sub(start, end)` или `.takeWhile()`, чтобы
|
|
199
|
+
1. **Потоки событий** (созданные через фабрики, такие как `useSubscription`) возвращают `AsynchronousSemantic`.
|
|
200
|
+
→ Вы **должны** вызвать метод, определяющий границу, такой как `.limit(n)`, `.sub(start, end)` или `.takeWhile(predicate)`, чтобы завершить прослушивание. В противном случае подписка останется активной.
|
|
159
201
|
|
|
160
|
-
2.
|
|
202
|
+
2. **Терминальные операции** (`.toArray()`, `.count()`, `.forEach()`, `.findFirst()` и т.д.) доступны **только после** преобразования конвейера в сборщик:
|
|
161
203
|
```typescript
|
|
162
|
-
.toUnordered() //
|
|
204
|
+
.toUnordered() // Для максимальной скорости, порядок не гарантируется.
|
|
163
205
|
// или
|
|
164
|
-
.toOrdered() //
|
|
206
|
+
.toOrdered() // Для стабильного, отсортированного вывода.
|
|
207
|
+
// или
|
|
208
|
+
.toNumericStatistics() // Для статистических методов.
|
|
165
209
|
```
|
|
166
210
|
|
|
167
211
|
---
|
|
168
212
|
|
|
169
213
|
### Характеристики производительности
|
|
170
214
|
|
|
171
|
-
|
|
|
215
|
+
| Сборщик | Временная сложность | Пространственная сложность | Порядок гарантирован? | Идеальный сценарий |
|
|
172
216
|
| :--- | :--- | :--- | :--- | :--- |
|
|
173
|
-
| `toUnordered()` | O(n) | O(n) | Нет |
|
|
174
|
-
| `toOrdered()` | O(
|
|
175
|
-
| `toNumericStatistics()` | O(
|
|
176
|
-
| `toBigIntStatistics()` | O(
|
|
177
|
-
| `toWindow()` | O(
|
|
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) | Да (внутренняя сортировка) | Оконные операции, выигрывающие от отсортированных индексов. |
|
|
178
222
|
|
|
179
|
-
Выбирайте `toUnordered()`, когда
|
|
223
|
+
Выбирайте `toUnordered()`, когда абсолютная скорость первостепенна. Выбирайте `toOrdered()` или статистический сборщик только в том случае, если ваша логика зависит от порядка элементов.
|
|
180
224
|
|
|
181
225
|
---
|
|
182
226
|
|
|
183
|
-
|
|
227
|
+
**Сравнительный анализ с современными потоковыми библиотеками**
|
|
184
228
|
|
|
185
|
-
| Особенность | Semantic
|
|
229
|
+
| Особенность | Semantic‑TypeScript | RxJS | Нативные Async Iterators / Generators | Most.js |
|
|
186
230
|
| :--- | :--- | :--- | :--- | :--- |
|
|
187
|
-
|
|
|
188
|
-
|
|
|
189
|
-
|
|
|
190
|
-
|
|
|
191
|
-
|
|
|
192
|
-
|
|
|
193
|
-
|
|
|
194
|
-
|
|
|
195
|
-
|
|
|
196
|
-
|
|
|
197
|
-
|
|
198
|
-
Ключевые преимущества Semantic-TypeScript
|
|
199
|
-
|
|
200
|
-
• Уникальные встроенные возможности статистики и индексирования, исключающие необходимость ручного `reduce` или внешних библиотек.
|
|
231
|
+
| **Интеграция с TypeScript** | Первоклассная, с глубокой типизацией и внутренней осведомлённостью об индексах. | Отличная, но часто связана со сложными цепочками обобщений (generics). | Хорошая, но требуются ручные аннотации типов. | Сильная, с функционально-ориентированным стилем типизации. |
|
|
232
|
+
| **Встроенный статистический анализ** | Полная встроенная поддержка для `number` и `bigint`. | Недоступна нативно (требует пользовательских операторов или других библиотек). | Отсутствует. | Отсутствует. |
|
|
233
|
+
| **Индексация и осведомлённость о позиции** | Встроенная, мощная индексация BigInt для каждого элемента. | Требует пользовательских операторов (напр., `scan`, `withLatestFrom`). | Требуется ручное управление счётчиком. | Базовая, без встроенного свойства индекса. |
|
|
234
|
+
| **Управление потоками событий** | Специализированные, типобезопасные фабрики с явным, декларативным управлением жизненным циклом. | Мощное, но требует тщательного ручного управления подписками для предотвращения утечек. | Ручное присоединение слушателей событий и управление токенами отмены. | Хороший `fromEvent`, как правило, лёгкий. |
|
|
235
|
+
| **Производительность и память** | Исключительная – предлагает оптимизированные сборщики `toUnordered()` и `toOrdered()`. | Очень хорошая, хотя глубокие цепочки операторов могут вносить накладные расходы. | Отличная (минимальные нативные накладные расходы). | Отличная. |
|
|
236
|
+
| **Размер сборки (bundle)** | Очень лёгкий. | Существенный (даже с tree-shaking). | Нулевой (нативная функция языка). | Малый. |
|
|
237
|
+
| **Философия дизайна API** | Функциональный паттерн сборщика с явной семантикой индексов. | Реактивный паттерн Observable. | Императивный Iterator / декларативный Generator паттерн. | Функциональный, бесточечная (point‑free) композиция. |
|
|
238
|
+
| **Управление потоком** | Явное (`interrupt`, `.limit()`, `.takeWhile()`, `.sub()`). | Хорошее (`take`, `takeUntil`, `first`). | Ручное (`break` в циклах). | Хорошее (`take`, `until`). |
|
|
239
|
+
| **Поддержка синхронных и асинхронных операций** | Унифицированный API – первоклассная поддержка обеих парадигм. | В основном асинхронный. | Оба поддерживаются, но требуется ручной мост. | В основном асинхронный. |
|
|
240
|
+
| **Кривая обучения** | Пологая для разработчиков, знакомых с функциональными и индексированными конвейерами коллекций. | Крутая (обширный словарь операторов, концепции горячих/холодных Observable). | Низкая до средней. | Средняя. |
|
|
201
241
|
|
|
202
|
-
|
|
242
|
+
**Преимущество Semantic‑TypeScript**
|
|
203
243
|
|
|
204
|
-
|
|
244
|
+
* **Уникальные возможности:** Встроенные функции статистики и индексации устраняют необходимость ручных операций `reduce` или дополнительных библиотек анализа данных.
|
|
245
|
+
* **Предсказуемое управление ресурсами:** Явный контроль над потоками событий предотвращает утечки памяти, которые могут быть незаметны в приложениях RxJS.
|
|
246
|
+
* **Унифицированный дизайн:** Единообразный API как для синхронных, так и для асинхронных рабочих процессов снижает когнитивную нагрузку и дублирование кода.
|
|
205
247
|
|
|
206
|
-
Это сравнение
|
|
248
|
+
Это сравнение подчёркивает, почему Semantic‑TypeScript особенно хорошо подходит для современных TypeScript-приложений, требующих высокой производительности, надёжной типобезопасности и богатых возможностей обработки данных без сложности традиционных реактивных фреймворков.
|
|
207
249
|
|
|
208
250
|
---
|
|
209
251
|
|
|
210
|
-
###
|
|
252
|
+
### Начните исследование
|
|
211
253
|
|
|
212
|
-
Semantic
|
|
254
|
+
Semantic‑TypeScript преобразует сложные потоки данных в читаемые, композируемые и высокопроизводительные конвейеры. Обрабатываете ли вы события пользовательского интерфейса в реальном времени, обрабатываете большие наборы данных или создаёте аналитические панели мониторинга – он предлагает мощь индексации уровня базы данных с элегантностью функционального программирования.
|
|
213
255
|
|
|
214
|
-
|
|
256
|
+
**Ваши следующие шаги:**
|
|
215
257
|
|
|
216
|
-
|
|
258
|
+
* Изучите полностью типизированный API прямо в вашей IDE (все экспорты доступны из основной точки входа пакета).
|
|
259
|
+
* Присоединяйтесь к растущему сообществу разработчиков, которые заменили сложные асинхронные итераторы и реактивные цепочки на ясные, целенаправленные конвейеры Semantic.
|
|
217
260
|
|
|
218
|
-
|
|
261
|
+
**Semantic‑TypeScript** – где потоки встречаются со структурой.
|
|
219
262
|
|
|
220
|
-
|
|
263
|
+
Начните строить сегодня и ощутите ощутимую разницу, которую приносит продуманное проектирование индексации.
|
|
221
264
|
|
|
222
|
-
|
|
265
|
+
**Стройте с ясностью, действуйте с уверенностью и преобразуйте данные с намерением.**
|
|
223
266
|
|
|
224
|
-
|
|
267
|
+
MIT © Eloy Kim
|