semantic-typescript 0.5.3 → 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,470 +1,224 @@
1
- # Библиотека потоковой обработки Semantic-TypeScript
1
+ Перевод на русский, с учётом языковых норм, контекста и стилистических особенностей. Собственные имена не переведены:
2
2
 
3
- ## Введение
3
+ # Semantic-TypeScript
4
+ Потоки данных, проиндексированные. Ваши данные под точным контролем.
4
5
 
5
- Semantic-TypeScript — это современная библиотека потоковой обработки, вдохновленная JavaScript GeneratorFunction, Java Stream и индексами MySQL. Её основная концепция дизайна основана на создании эффективных конвейеров обработки данных с использованием индексации данных, предоставляя типобезопасный, функциональный стиль операций потоков для разработки фронтенда.
6
+ ---
6
7
 
7
- В отличие от традиционной синхронной обработки, Semantic использует асинхронную модель обработки. При создании потока данных время, когда терминал получает данные, полностью зависит от того, когда вверх по потоку вызываются функции обратного вызова `accept` и `interrupt`. Этот дизайн позволяет библиотеке изящно обрабатывать потоки реального времени, большие наборы данных и асинхронные источники данных.
8
+ ### Обзор
8
9
 
9
- ## Установка
10
+ Semantic-TypeScript знаменует собой значительный скачок в развитии технологий обработки потоков данных, синтезируя наиболее эффективные концепции из JavaScript `GeneratorFunction`, Java Streams и индексирования в стиле MySQL. Его основная философия одновременно проста и мощна: создавайте исключительно эффективные конвейеры обработки данных с помощью интеллектуального индексирования, а не грубого перебора.
10
11
 
11
- ```bash
12
- npm install semantic-typescript
13
- ```
12
+ Там, где обычные библиотеки навязывают синхронные циклы или громоздкие цепочки промисов, Semantic-TypeScript предлагает полностью асинхронный, функционально чистый и строго типобезопасный опыт, созданный для требований современной фронтенд-разработки.
14
13
 
15
- ## Основные типы
16
-
17
- | Тип | Описание |
18
- |------|-------------|
19
- | `Invalid<T>` | Тип, расширяющий `null` или `undefined` |
20
- | `Valid<T>` | Тип, исключающий `null` и `undefined` |
21
- | `MaybeInvalid<T>` | Тип, который может быть `null` или `undefined` |
22
- | `Primitive` | Коллекция примитивных типов |
23
- | `MaybePrimitive<T>` | Тип, который может быть примитивным типом |
24
- | `OptionalSymbol` | Символьный идентификатор класса `Optional` |
25
- | `SemanticSymbol` | Символьный идентификатор класса `Semantic` |
26
- | `CollectorsSymbol` | Символьный идентификатор класса `Collector` |
27
- | `CollectableSymbol` | Символьный идентификатор класса `Collectable` |
28
- | `OrderedCollectableSymbol` | Символьный идентификатор класса `OrderedCollectable` |
29
- | `WindowCollectableSymbol` | Символьный идентификатор класса `WindowCollectable` |
30
- | `StatisticsSymbol` | Символьный идентификатор класса `Statistics` |
31
- | `NumericStatisticsSymbol` | Символьный идентификатор класса `NumericStatistics` |
32
- | `BigIntStatisticsSymbol` | Символьный идентификатор класса `BigIntStatistics` |
33
- | `UnorderedCollectableSymbol` | Символьный идентификатор класса `UnorderedCollectable` |
34
-
35
- ## Функциональные интерфейсы
36
-
37
- | Интерфейс | Описание |
38
- |-----------|-------------|
39
- | `Runnable` | Функция без параметров и без возвращаемого значения |
40
- | `Supplier<R>` | Функция без параметров, возвращающая `R` |
41
- | `Functional<T, R>` | Функция одного параметра для преобразования |
42
- | `BiFunctional<T, U, R>` | Функция двух параметров для преобразования |
43
- | `TriFunctional<T, U, V, R>` | Функция трех параметров для преобразования |
44
- | `Predicate<T>` | Функция одного параметра для утверждения |
45
- | `BiPredicate<T, U>` | Функция двух параметров для утверждения |
46
- | `TriPredicate<T, U, V>` | Функция трех параметров для утверждения |
47
- | `Consumer<T>` | Функция одного параметра для потребления |
48
- | `BiConsumer<T, U>` | Функция двух параметров для потребления |
49
- | `TriConsumer<T, U, V>` | Функция трех параметров для потребления |
50
- | `Comparator<T>` | Функция двух параметров для сравнения |
51
- | `Generator<T>` | Функция генератора (основа и фундамент) |
14
+ В этой элегантной модели данные достигают потребителя только тогда, когда вышестоящий конвейер явно вызывает коллбэки `accept` (и, опционально, `interrupt`). Вы полностью контролируете время — именно тогда, когда это необходимо.
52
15
 
53
- ```typescript
54
- // Примеры использования типов
55
- let predicate: Predicate<number> = (n: number): boolean => n > 0;
56
- let mapper: Functional<string, number> = (text: string): number => text.length;
57
- let comparator: Comparator<number> = (a: number, b: number): number => a - b;
58
- ```
16
+ ---
59
17
 
60
- ## Типовые защитники
61
-
62
- | Функция | Описание | Временная сложность | Пространственная сложность |
63
- |------|------|------------|------------|
64
- | `validate<T>(t: MaybeInvalid<T>): t is T` | Проверить, что значение не является null или undefined | O(1) | O(1) |
65
- | `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | Проверить, что значение является null или undefined | O(1) | O(1) |
66
- | `isBoolean(t: unknown): t is boolean` | Проверить, является ли это булевым значением | O(1) | O(1) |
67
- | `isString(t: unknown): t is string` | Проверить, является ли это строкой | O(1) | O(1) |
68
- | `isNumber(t: unknown): t is number` | Проверить, является ли это числом | O(1) | O(1) |
69
- | `isFunction(t: unknown): t is Function` | Проверить, является ли это функцией | O(1) | O(1) |
70
- | `isObject(t: unknown): t is object` | Проверить, является ли это объектом | O(1) | O(1) |
71
- | `isSymbol(t: unknown): t is symbol` | Проверить, является ли это символом | O(1) | O(1) |
72
- | `isBigint(t: unknown): t is bigint` | Проверить, является ли это BigInt | O(1) | O(1) |
73
- | `isPrimitive(t: unknown): t is Primitive` | Проверить, является ли это примитивным типом | O(1) | O(1) |
74
- | `isIterable(t: unknown): t is Iterable<unknown>` | Проверить, является ли это итерируемым объектом | O(1) | O(1) |
75
- | `isOptional(t: unknown): t is Optional<unknown>` | Проверить, является ли это экземпляром Optional | O(1) | O(1) |
76
- | `isSemantic(t: unknown): t is Semantic<unknown>` | Проверить, является ли это экземпляром Semantic | O(1) | O(1) |
77
- | `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Проверить, является ли это экземпляром Collector | O(1) | O(1) |
78
- | `isCollectable(t: unknown): t is Collectable<unknown>` | Проверить, является ли это экземпляром Collectable | O(1) | O(1) |
79
- | `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | Проверить, является ли это экземпляром OrderedCollectable | O(1) | O(1) |
80
- | `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | Проверить, является ли это экземпляром WindowCollectable | O(1) | O(1) |
81
- | `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | Проверить, является ли это экземпляром UnorderedCollectable | O(1) | O(1) |
82
- | `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Проверить, является ли это экземпляром Statistics | O(1) | O(1) |
83
- | `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | Проверить, является ли это экземпляром NumericStatistics | O(1) | O(1) |
84
- | `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | Проверить, является ли это экземпляром BigIntStatistics | O(1) | O(1) |
85
- | `isPromise(t: unknown): t is Promise<unknown>` | Проверить, является ли это объектом Promise | O(1) | O(1) |
86
- | `isAsync(t: unknown): t is AsyncFunction` | Проверить, является ли это AsyncFunction | O(1) | O(1) |
18
+ ### Почему разработчики выбирают его
87
19
 
88
- ```typescript
89
- // Примеры использования типовых защитников
90
- let value: unknown = "hello";
91
-
92
- if (isString(value)) {
93
- console.log(value.length); // Типобезопасно, значение выводится как строка
94
- }
95
-
96
- if (isOptional(someValue)) {
97
- someValue.ifPresent((value): void => console.log(val));
98
- }
99
-
100
- if(isIterable(value)){
101
- // Типобезопасно, теперь это итерируемый объект.
102
- for(let item of value){
103
- console.log(item);
104
- }
105
- }
106
- ```
20
+ • Индексирование без шаблонного кода — каждый элемент несет свой естественный или специально созданный индекс.
107
21
 
108
- ## Утилитные функции
22
+ Чистый функциональный стиль — с полным выведением типов TypeScript.
109
23
 
110
- | Функция | Описание | Временная сложность | Пространственная сложность |
111
- |------|------|------------|------------|
112
- | `useCompare<T>(t1: T, t2: T): number` | Обобщенная функция сравнения | O(1) | O(1) |
113
- | `useRandom<T = number \| bigint>(index: T): T` | Генератор псевдослучайных чисел | O(log n) | O(1) |
24
+ Потоки событий без утечек `useWindow`, `useDocument`, `useHTMLElement` и `useWebSocket` созданы с учетом безопасности. Вы задаете границу — с помощью `limit(n)`, `sub(start, end)` или `takeWhile(predicate)` — а библиотека управляет очисткой. Никаких зависших слушателей, никаких утечек памяти.
114
25
 
115
- ```typescript
116
- // Примеры использования утилитных функций
117
- let numbers: Array<number> = [3, 1, 4, 1, 5];
118
- numbers.sort(useCompare); // [1, 1, 3, 4, 5]
26
+ • Встроенная статистика — всесторонний анализ для чисел и bigint, включая средние значения, медианы, моду, дисперсию, асимметрию и эксцесс.
119
27
 
120
- let randomNum = useRandom(42); // Случайное число на основе семени
121
- ```
28
+ Предсказуемая производительность выбирайте между упорядоченными и неупорядоченными коллекторами в зависимости от ваших требований.
122
29
 
123
- ## Фабричные методы
30
+ Эффективное использование памяти — потоки вычисляются лениво, что снимает проблемы с памятью.
124
31
 
125
- ### Методы фабрики Optional
32
+ Без неопределенного поведения — TypeScript гарантирует типобезопасность и обработку null. Входные данные остаются неизменными, если явно не модифицированы в ваших функциях обратного вызова.
126
33
 
127
- | Метод | Описание | Временная сложность | Пространственная сложность |
128
- |------|------|------------|------------|
129
- | `Optional.empty<T>()` | Создание пустого Optional | O(1) | O(1) |
130
- | `Optional.of<T>(value)` | Создание Optional с содержимым | O(1) | O(1) |
131
- | `Optional.ofNullable<T>(value)` | Создание потенциально пустого Optional | O(1) | O(1) |
132
- | `Optional.ofNonNull<T>(value)` | Создание не-пустого Optional | O(1) | O(1) |
34
+ ---
133
35
 
134
- ```typescript
135
- // Примеры использования Optional
136
- let empty: Optional<number> = Optional.empty();
137
- let present: Optional<number> = Optional.of(42);
138
- let nullable: Optional<string> = Optional.ofNullable<string>(null);
139
- let nonNull: Optional<string> = Optional.ofNonNull("hello");
140
-
141
- presentOpt.ifPresent((val: number): void => console.log(val)); // Выводит 42
142
- console.log(emptyOpt.get(100)); // Выводит 100
36
+ ### Установка
37
+
38
+ ```bash
39
+ npm install semantic-typescript
40
+ ```
41
+ или
42
+ ```bash
43
+ yarn add semantic-typescript
143
44
  ```
144
45
 
145
- ### Методы фабрики Collector
46
+ ---
146
47
 
147
- | Метод | Описание | Временная сложность | Пространственная сложность |
148
- |------|------|------------|------------|
149
- | `Collector.full(identity, accumulator, finisher)` | Создание полного коллектора | O(1) | O(1) |
150
- | `Collector.shortable(identity, interruptor, accumulator, finisher)` | Создание прерываемого коллектора | O(1) | O(1) |
48
+ ### Быстрый старт
151
49
 
152
50
  ```typescript
153
- // Примеры преобразования коллекторов
154
- let numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
155
-
156
- // Приоритет производительности: использование неупорядоченного коллектора для лучшей производительности
157
- let unordered = numbers
158
- .filter((n: number): boolean => n > 3)
159
- .toUnordered(); // Лучшая производительность
160
-
161
- // Необходимость в сортировке: использование упорядоченного коллектора
162
- let ordered = numbers.sorted();
163
-
164
- // Подсчет элементов
165
- let count = Collector.full(
166
- (): number => 0, // Начальное значение
167
- (accumulator: number, element: number): number => accumulator + element, // Аккумуляция
168
- (accumulator: number): number => accumulator // Завершение
169
- );
170
- count.collect(from([1,2,3,4,5])); // Подсчет из потока
171
- count.collect([1,2,3,4,5]); // Подсчет из итерируемого объекта
172
-
173
- let find = Collector.shortable(
174
- (): Optional<number> => Optional.empty(), // Начальное значение
175
- (element: number, index: bigint, accumulator: Optional<number>): Optional<number> => accumulator.isPresent(), // Прерывание
176
- (accumulator: Optional<number>, element: number, index: bigint): Optional<number> => Optional.of(element), // Аккумуляция
177
- (accumulator: Optional<number>): Optional<number> => accumulator // Завершение
178
- );
179
- find.collect(from([1,2,3,4,5])); // Находит первый элемент
180
- find.collect([1,2,3,4,5]); // Находит первый элемент
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 элементов
92
+ .toUnordered()
93
+ .toArray();
94
+
95
+ // Изменение размера окна в реальном времени (автоматически останавливается после 5 событий)
96
+ useWindow("resize")
97
+ .limit(5n) // Ключевой момент для потоков событий
98
+ .toUnordered()
99
+ .forEach((ev, idx) => console.log(`Изменение размера #${idx}`));
100
+
101
+ // Прослушивание HTML-элемента
102
+ // <input id="input" type="text"/>
103
+ useHTMLElement("#input", "change")
104
+ .limit(1)
105
+ .toUnordered()
106
+ .forEach((event: Event) => submit(event));
107
+
108
+ // Прослушивание нескольких элементов и событий
109
+ useHTMLElement("input", ["change", "keyup"])
110
+ .takeWhile((event: Event): boolean => validate(event))
111
+ .toUnordered()
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));
123
+
124
+ // Итерация по строке по кодовым точкам
125
+ useText("Моё текущее настроение: 😊, а semantic — это 👍")
126
+ .toUnordered()
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: []}`
181
137
  ```
182
138
 
183
- ### Методы фабрики Semantic
139
+ ---
184
140
 
185
- | Метод | Описание | Временная сложность | Пространственная сложность |
186
- |------|------|------------|------------|
187
- | `animationFrame(period: number, delay: number = 0)` | Создание потока на основе анимационных кадров | O(1)* | O(1) |
188
- | `blob(blob, chunkSize)` | Создание потока из Blob | O(n) | O(chunkSize) |
189
- | `empty<E>()` | Создание пустого потока | O(1) | O(1) |
190
- | `fill<E>(element, count)` | Создание заполненного потока | O(n) | O(1) |
191
- | `from<E>(iterable)` | Создание потока из итерируемого объекта | O(1) | O(1) |
192
- | `interval(period, delay?)` | Создание временного интервального потока | O(1)* | O(1) |
193
- | `iterate<E>(generator)` | Создание потока из генератора | O(1) | O(1) |
194
- | `range(start, end, step)` | Создание потока числового диапазона | O(n) | O(1) |
195
- | `websocket(websocket)` | Создание потока из WebSocket | O(1) | O(1) |
141
+ ### Основные концепции
196
142
 
197
- ```typescript
198
- // Примеры использования фабричных методов Semantic
199
-
200
- // Создание потока из Blob (чтение блоками)
201
- blob(someBlob, 1024n)
202
- .toUnordered()
203
- .write(WritableStream)
204
- .then(callback) // Успешная запись потока
205
- .catch(callback); // Ошибка записи потока
206
-
207
- // Создание пустого потока, который не будет выполнен до объединения с другими потоками
208
- empty<string>()
209
- .toUnordered()
210
- .join(); // []
211
-
212
- // Создание заполненного потока
213
- const filledStream = fill("hello", 3); // "hello", "hello", "hello"
214
-
215
- // Создание временного потока с начальной задержкой в 2 секунды и периодом выполнения в 5 секунд, реализованного на основе механизма таймера; может возникать временной дрейф из-за ограничений точности системного планирования.
216
- const intervalStream = interval(5000, 2000);
217
-
218
- // Создание потока из итерируемого объекта
219
- const numberStream = from([1, 2, 3, 4, 5]);
220
- const stringStream = from(new Set(["Alex", "Bob"]));
221
-
222
- // Создание потока числового диапазона
223
- const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
224
-
225
- // Поток событий WebSocket
226
- const ws = new WebSocket("ws://localhost:8080");
227
- websocket(ws)
228
- .filter((event): boolean => event.type === "message") // Слушать только сообщения
229
- .toUnordered() // Обычно события неупорядочены
230
- .forEach((event): void => receive(event)); // Получение сообщений
231
- ```
143
+ | Концепция | Назначение | Когда использовать |
144
+ | :--- | :--- | :--- |
145
+ | `AsynchronousSemantic` | Основной конструктор для асинхронных потоков, событий и ленивых конвейеров. | События в реальном времени, WebSockets, слушатели DOM, долгоиграющие или бесконечные потоки. |
146
+ | `SynchronousSemantic` | Конструктор для синхронных потоков в памяти или на основе циклов. | Статические данные, диапазоны, немедленная итерация. |
147
+ | `toUnordered()` | Самый быстрый терминальный коллектор (индексирование на основе Map). | Критичные к производительности задачи (время и память O(n), без сортировки). |
148
+ | `toOrdered()` | Отсортированный коллектор со стабильной индексацией. | Когда требуется стабильный порядок или доступ по индексу. |
149
+ | `toNumericStatistics()` | Богатый числовой статистический анализ (среднее, медиана, дисперсия, асимметрия, эксцесс и т.д.). | Анализ данных и статистические вычисления. |
150
+ | `toBigIntStatistics()` | Богатый статистический анализ для bigint. | Анализ данных и статистические вычисления для больших целых чисел. |
151
+ | `toWindow()` | Поддержка скользящих и тайм-серийных окон. | Обработка временных рядов, пакетная обработка, оконные операции. |
232
152
 
233
- ## Методы класса Semantic
234
-
235
- | Метод | Описание | Временная сложность | Пространственная сложность |
236
- |------|------|------------|------------|
237
- | `concat(other)` | Объединение двух потоков | O(n) | O(1) |
238
- | `distinct()` | Удаление дубликатов | O(n) | O(n) |
239
- | `distinct(comparator)` | Удаление дубликатов с использованием компаратора | O(n²) | O(n) |
240
- | `dropWhile(predicate)` | Отброс элементов, удовлетворяющих условию | O(n) | O(1) |
241
- | `filter(predicate)` | Фильтрация элементов | O(n) | O(1) |
242
- | `flat(mapper)` | Плоское отображение | O(n × m) | O(1) |
243
- | `flatMap(mapper)` | Отображение в новый тип | O(n × m) | O(1) |
244
- | `limit(n)` | Ограничение количества элементов | O(n) | O(1) |
245
- | `map(mapper)` | Преобразование картой | O(n) | O(1) |
246
- | `peek(consumer)` | Просмотр элементов | O(n) | O(1) |
247
- | `redirect(redirector)` | Перенаправление индекса | O(n) | O(1) |
248
- | `reverse()` | Обращение потока | O(n) | O(1) |
249
- | `shuffle()` | Случайная перестановка | O(n) | O(1) |
250
- | `shuffle(mapper)` | Перестановка с использованием маппера | O(n) | O(1) |
251
- | `skip(n)` | Пропуск первых n элементов | O(n) | O(1) |
252
- | `sorted()` | Сортировка | O(n log n) | O(n) |
253
- | `sorted(comparator)` | Сортировка с использованием компаратора | O(n log n) | O(n) |
254
- | `sub(start, end)` | Получение подпотока | O(n) | O(1) |
255
- | `takeWhile(predicate)` | Получение элементов, удовлетворяющих условию | O(n) | O(1) |
256
- | `translate(offset)` | Перевод индекса | O(n) | O(1) |
257
- | `translate(translator)` | Перевод индекса с использованием транслятора | O(n) | O(1) |
153
+ ---
258
154
 
259
- ```typescript
260
- // Примеры операций Semantic
261
- const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
262
- .filter(n => n % 2 === 0) // Фильтрация четных чисел
263
- .map(n => n * 2) // Умножение на 2
264
- .skip(1) // Пропуск первого
265
- .limit(3) // Ограничение до 3 элементов
266
- .toUnordered() // Преобразование в неупорядоченный коллектор
267
- .toArray(); // Преобразование в массив
268
- // Результат: [8, 12, 20]
269
-
270
- // Пример сложной операции
271
- const complexResult = range(1, 100, 1)
272
- .flatMap(n => from([n, n * 2])) // Каждый элемент к двум
273
- .distinct() // Удаление дубликатов
274
- .shuffle() // Перемешивание порядка
275
- .takeWhile(n => n < 50) // Взятие элементов меньше 50
276
- .toOrdered() // Преобразование в упорядоченный коллектор
277
- .toArray(); // Преобразование в массив
278
- ```
155
+ Важные правила использования
279
156
 
280
- ## Методы преобразования Semantic
157
+ 1. Потоки событий (`useWindow`, `useDocument`, `useHTMLElement`, `useWebSocket`, …) возвращают `AsynchronousSemantic`.
158
+ → Вы **должны** вызвать `.limit(n)`, `.sub(start, end)` или `.takeWhile()`, чтобы прекратить прослушивание. В противном случае слушатель останется активным.
281
159
 
282
- | Метод | Описание | Временная сложность | Пространственная сложность |
283
- |------------|------------|------------|------------|
284
- | `sorted()` | Преобразование в упорядоченный коллектор | O(n log n) | O(n) |
285
- | `toUnordered()` | Преобразование в неупорядоченный коллектор | O(1) | O(1) |
286
- | `toOrdered()` | Преобразование в упорядоченный коллектор | O(1) | O(1) |
287
- | `toNumericStatistics()` | Преобразование в числовую статистику | O(n) | O(1) |
288
- | `toBigintStatistics()` | Преобразование в статистику BigInt | O(n) | O(1) |
289
- | `toWindow()` | Преобразование в оконный коллектор | O(1) | O(1) |
290
- | `toCollectable()` | Преобразование в UnorderdCollectable | O(n) | O(1) |
291
- | `toCollectable(mapper)` | Преобразование в настраиваемый коллектор | O(n) | O(1) |
160
+ 2. Терминальные операции (`.toArray()`, `.count()`, `.average()`, `.reduce()`, `.findFirst()` и т.д.) доступны только после преобразования в коллектор:
161
+ ```typescript
162
+ .toUnordered() // Время и память O(n), без сортировки
163
+ // или
164
+ .toOrdered() // Отсортирован, сохраняет порядок
165
+ ```
292
166
 
293
- ```typescript
294
- // Примеры преобразований
295
- from([6, 4, 3, 5, 2]) // Создание потока
296
- .sorted() // Сортировка потока по возрастанию
297
- .toArray(); // [2, 3, 4, 5, 6]
298
-
299
- from([6, 4, 3, 5, 2]) // Создание потока
300
- .soted((a, b) => b - a) // Сортировка потока по убыванию
301
- .toArray(); // [6, 5, 4, 3, 2]
302
-
303
- from([6, 4, 3, 5, 2]) // Создание потока
304
- .redirect((element, index) => -index) // Перенаправление в обратном порядке
305
- .toOrderd() // Сохранение перенаправленного порядка
306
- .toArray(); // [2, 5, 3, 4, 6]
307
-
308
- from([6, 4, 3, 5, 2]) // Создание потока
309
- .redirect((element, index) => -index) // Перенаправление в обратном порядке
310
- .toUnorderd() // Игнорирование перенаправления. Эта операция игнорирует `redirect`, `reverse`, `shuffle` и `translate`
311
- .toArray(); // [2, 5, 3, 4, 6]
312
-
313
- from([6, 4, 3, 5, 2]) // Создание потока
314
- .reverse() // Обращение потока
315
- .toOrdered() // Гарантия обращенного порядка
316
- .toArray(); // [2, 5, 3, 4, 6]
317
-
318
- from([6, 4, 3, 5, 2]) // Создание потока
319
- .shuffle() // Перемешивание потока
320
- .sorted() // Перезапись перемешанного порядка. Эта операция перезапишет `redirect`, `reverse`, `shuffle` и `translate`
321
- .toArray(); // [2, 5, 3, 4, 6]
322
-
323
- from([6, 4, 3, 5, 2]) // Создание потока
324
- .toWindow(); // Преобразование в оконный коллектор
325
-
326
- from([6, 4, 3, 5, 2]) // Создание потока
327
- .toNumericStatistics(); // Преобразование в числовую статистику
328
-
329
- from([6n, 4n, 3n, 5n, 2n]) // Создание потока
330
- .toBigintStatistics(); // Преобразование в статистику BigInt
331
-
332
- // Определение настраиваемого коллектора для сбора данных
333
- let customizedCollector = from([1, 2, 3, 4, 5])
334
- .toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
335
- ```
167
+ ---
336
168
 
337
- ## Методы сбора Collectable
338
-
339
- | Метод | Описание | Временная сложность | Пространственная сложность |
340
- |------|------|------------|------------|
341
- | `anyMatch(predicate)` | Соответствие любого элемента | O(n) | O(1) |
342
- | `allMatch(predicate)` | Соответствие всех элементов | O(n) | O(1) |
343
- | `count()` | Подсчет элементов | O(n) | O(1) |
344
- | `isEmpty()` | Проверка на пустоту | O(1) | O(1) |
345
- | `findAny()` | Найти любой элемент | O(n) | O(1) |
346
- | `findFirst()` | Найти первый элемент | O(n) | O(1) |
347
- | `findLast()` | Найти последний элемент | O(n) | O(1) |
348
- | `forEach(action)` | Итерация по всем элементам | O(n) | O(1) |
349
- | `group(classifier)` | Группировка по классификатору | O(n) | O(n) |
350
- | `groupBy(keyExtractor, valueExtractor)` | Группировка по ключу-значению | O(n) | O(n) |
351
- | `join()` | Объединение в строку | O(n) | O(n) |
352
- | `join(delimiter)` | Объединение с использованием разделителя | O(n) | O(n) |
353
- | `nonMatch(predicate)` | Отсутствие соответствия элементов | O(n) | O(1) |
354
- | `partition(count)` | Разделение по количеству | O(n) | O(n) |
355
- | `partitionBy(classifier)` | Разделение по классификатору | O(n) | O(n) |
356
- | `reduce(accumulator)` | Операция уменьшения | O(n) | O(1) |
357
- | `reduce(identity, accumulator)` | Уменьшение с начальным значением | O(n) | O(1) |
358
- | `toArray()` | Преобразование в массив | O(n) | O(n) |
359
- | `toMap(keyExtractor, valueExtractor)` | Преобразование в карту | O(n) | O(n) |
360
- | `toSet()` | Преобразование в множество | O(n) | O(n) |
361
- | `write(stream)` | Запись в поток | O(n) | O(1) |
169
+ ### Характеристики производительности
362
170
 
363
- ```typescript
364
- // Примеры операций Collectable
365
- const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
366
- .filter(n => n % 2 === 0)
367
- .toOrdered();
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) | Да | Временные оконные операции. |
368
178
 
369
- // Проверки соответствия
370
- console.log(data.anyMatch(n => n > 5)); // true
371
- console.log(data.allMatch(n => n < 20)); // true
179
+ Выбирайте `toUnordered()`, когда важна максимальная скорость. Используйте `toOrdered()` только тогда, когда вам требуется стабильный порядок или статистические методы, зависящие от отсортированных данных.
372
180
 
373
- // Операции поиска
374
- data.findFirst().ifPresent(n => console.log(n)); // 2
375
- data.findAny().ifPresent(n => console.log(n)); // Любой элемент
181
+ ---
376
182
 
377
- // Операции группировки
378
- const grouped = data.groupBy(n => n > 5 ? "большой" : "маленький", n => n * 2); // {маленький: [4, 8], большой: [12, 16, 20]}
183
+ Сравнение с другими процессорами потоков для фронтенда
379
184
 
380
- // Операции уменьшения
381
- const sum = data.reduce(0, (acc, n) => acc + n); // 30
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). | Низкая. | Умеренная. |
382
197
 
383
- // Операции вывода
384
- data.join(", "); // "[2, 4, 6, 8, 10]"
385
- ```
198
+ Ключевые преимущества Semantic-TypeScript
386
199
 
387
- ## Методы статистического анализа
388
-
389
- ### Методы NumericStatistics
390
-
391
- | Метод | Описание | Временная сложность | Пространственная сложность |
392
- |------|------|------------|------------|
393
- | `range()` | Диапазон | O(n) | O(1) |
394
- | `variance()` | Дисперсия | O(n) | O(1) |
395
- | `standardDeviation()` | Стандартное отклонение | O(n) | O(1) |
396
- | `mean()` | Среднее значение | O(n) | O(1) |
397
- | `median()` | Медиана | O(n log n) | O(n) |
398
- | `mode()` | Мода | O(n) | O(n) |
399
- | `frequency()` | Распределение частот | O(n) | O(n) |
400
- | `summate()` | Суммирование | O(n) | O(1) |
401
- | `quantile(quantile)` | Квантиль | O(n log n) | O(n) |
402
- | `interquartileRange()` | Межквартильный размах | O(n log n) | O(n) |
403
- | `skewness()` | Асимметрия | O(n) | O(1) |
404
- | `kurtosis()` | Эксцесс | O(n) | O(1) |
200
+ • Уникальные встроенные возможности статистики и индексирования, исключающие необходимость ручного `reduce` или внешних библиотек.
405
201
 
406
- ```typescript
407
- // Примеры статистического анализа
408
- const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
409
- .toNumericStatistics();
410
-
411
- console.log("Среднее:", numbers.mean()); // 5.5
412
- console.log("Медиана:", numbers.median()); // 5.5
413
- console.log("Стандартное отклонение:", numbers.standardDeviation()); // ~2.87
414
- console.log("Сумма:", numbers.summate()); // 55
415
-
416
- // Статистический анализ с использованием мапперов
417
- const objects = from([
418
- { value: 10 },
419
- { value: 20 },
420
- { value: 30 }
421
- ]).toNumericStatistics();
422
- console.log("Преобразованное среднее:", objects.mean(obj => obj.value)); // 20
423
- ```
202
+ • Явный контроль над потоками событий предотвращает утечки памяти, характерные для RxJS.
424
203
 
425
- ## Руководство по выбору производительности
204
+ • Унифицированный синхронный/асинхронный дизайн предоставляет единый, последовательный API для различных случаев использования.
426
205
 
427
- ### Выбор неупорядоченного коллектора (приоритет производительности)
428
- ```typescript
429
- // Когда не требуется гарантия порядка, используйте неупорядоченный коллектор для лучшей производительности
430
- let highPerformance = data
431
- .filter(predicate)
432
- .map(mapper)
433
- .toUnordered(); // Лучшая производительность
434
- ```
206
+ Это сравнение показывает, почему Semantic-TypeScript особенно хорошо подходит для современных TypeScript фронтенд-приложений, которые требуют производительности, типобезопасности и богатой аналитики без церемоний традиционных реактивных библиотек.
435
207
 
436
- ### Выбор упорядоченного коллектора (требуется порядок)
437
- ```typescript
438
- // Когда необходимо сохранить порядок элементов, используйте упорядоченный коллектор
439
- let ordered = data.sorted(comparator);
440
- ```
208
+ ---
441
209
 
442
- ### Выбор оконного коллектора (оконные операции)
443
- ```typescript
444
- // Когда требуются оконные операции
445
- let windowed: WindowCollectable<number> = data
446
- .toWindow()
447
- .slide(5n, 2n); // Скользящее окно
448
- ```
210
+ ### Готовы исследовать?
449
211
 
450
- ### Выбор статистического анализа (числовые вычисления)
451
- ```typescript
452
- // Когда требуется статистический анализ
453
- let statistics: NumericStatistics<number> = data
454
- .toNumericStatistics(); // Числовая статистика
212
+ Semantic-TypeScript превращает сложные потоки данных в читаемые, компонуемые и высокопроизводительные конвейеры. Обрабатываете ли вы события пользовательского интерфейса в реальном времени, обрабатываете большие наборы данных или создаёте аналитические панели — он предоставляет мощь индексирования уровня баз данных с элегантностью функционального программирования.
455
213
 
456
- let bigIntStatistics: BigintStatistics<bigint> = data
457
- .toBigintStatistics(); // Статистика больших целых чисел
458
- ```
214
+ Следующие шаги:
215
+
216
+ • Изучите полностью типизированный API в своей IDE (все экспорты из основного пакета).
459
217
 
460
- [GitHub](https://github.com/eloyhere/semantic-typescript)
461
- [NPMJS](https://www.npmjs.com/package/semantic-typescript)
218
+ • Присоединяйтесь к растущему сообществу разработчиков, которые заменили запутанные асинхронные итераторы чистыми Semantic-конвейерами.
462
219
 
463
- ## Важные замечания
220
+ Semantic-TypeScript где потоки встречаются со структурой.
464
221
 
465
- 1. **Влияние операций сортировки**: В упорядоченных коллекторах операция `sorted()` переопределяет эффекты `redirect`, `translate`, `shuffle`, `reverse`.
466
- 2. **Рассмотрение производительности**: Если не требуется гарантия порядка, предпочтение следует отдавать использованию `toUnordered()` для улучшения производительности.
467
- 3. **Использование памяти**: Операции сортировки требуют дополнительного пространства O(n).
468
- 4. **Реальное время**: Потоки Semantic подходят для обработки данных в реальном времени и поддерживают асинхронные источники данных.
222
+ Начните строить сегодня и ощутите разницу, которую приносит продуманное индексирование.
469
223
 
470
- Эта библиотека предоставляет разработчикам TypeScript мощные и гибкие возможности потоковой обработки, сочетая преимущества функционального программирования с гарантиями типобезопасности.
224
+ Стройте с ясностью, действуйте с уверенностью и преобразуйте данные осмысленно.