semantic-typescript 0.0.8 → 0.1.4

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,529 +1,428 @@
1
- # Фреймворк для потоковой обработки Semantic-TypeScript
1
+ # Библиотека потоковой обработки Semantic-TypeScript
2
2
 
3
3
  ## Введение
4
4
 
5
- Semantic-TypeScript — это современная библиотека для потоковой обработки данных, вдохновленная JavaScript GeneratorFunction, Java Stream и MySQL Index. Основная философия дизайна основана на построении эффективных конвейеров обработки данных через индексацию данных, предоставляя типобезопасный, функциональный опыт потоковых операций для фронтенд-разработки.
5
+ Semantic-TypeScript — это современная библиотека для обработки потоков, вдохновленная JavaScript GeneratorFunction, Java Stream и MySQL Index. Основной дизайн библиотеки основан на построении эффективных конвейеров обработки данных с использованием индексов данных, предоставляя фронтенд-разработчикам типобезопасный, функциональный опыт работы с потоками.
6
6
 
7
- В отличие от традиционной синхронной обработки, Semantic использует асинхронную модель обработки. При создании потоков данных время получения терминальных данных полностью зависит от того, когда вышестоящий код вызовет функции обратного вызова `accept` и `interrupt`. Этот дизайн позволяет библиотеке изящно обрабатывать потоки данных в реальном времени, большие наборы данных и асинхронные источники данных.
7
+ В отличие от традиционной синхронной обработки, Semantic использует асинхронный режим обработки. При создании потоков данных время получения данных терминалом полностью зависит от того, когда вышестоящий источник вызывает функции обратного вызова `accept` и `interrupt`. Этот дизайн позволяет библиотеке изящно обрабатывать потоки данных в реальном времени, большие наборы данных и асинхронные источники данных.
8
8
 
9
- ## Основные возможности
9
+ ## Установка
10
10
 
11
- | Возможность | Описание | Преимущество |
12
- |------|------|------|
13
- | **Типобезопасные дженерики** | Полная поддержка типов TypeScript | Обнаружение ошибок на этапе компиляции, лучший опыт разработки |
14
- | **Функциональное программирование** | Неизменяемые структуры данных и чистые функции | Более предсказуемый код, легкое тестирование и сопровождение |
15
- | **Ленивые вычисления** | Вычисления по требованию, оптимизация производительности | Высокая эффективность использования памяти при обработке больших наборов данных |
16
- | **Асинхронная потоковая обработка** | Асинхронные потоки данных на основе генераторов | Подходит для сценариев с данными в реальном времени и событийно-ориентированных сценариев |
17
- | **Мультипарадигменные коллекторы** | Стратегии сбора с упорядочиванием, без упорядочивания, статистические | Выбор оптимальной стратегии на основе разных сценариев |
18
- | **Статистический анализ** | Встроенные полные функции статистических вычислений | Интегрированный анализ данных и генерация отчетов |
19
-
20
- ## Соображения производительности
21
-
22
- **Важное примечание**: Следующие методы жертвуют производительностью для сбора и сортировки данных, что приводит к упорядоченным коллекциям данных:
23
- - `toOrdered()`
24
- - `toWindow()`
25
- - `toNumericStatistics()`
26
- - `toBigIntStatistics()`
27
- - `sorted()`
28
- - `sorted(comparator)`
29
-
30
- Особенно важно отметить: `sorted()` и `sorted(comparator)` переопределяют результаты следующих методов:
31
- - `redirect(redirector)`
32
- - `translate(translator)`
33
- - `shuffle(mapper)`
34
-
35
- ## Фабричные методы
36
-
37
- ### Фабрики создания потоков
11
+ ```bash
12
+ npm install semantic-typescript
13
+ ```
38
14
 
39
- | Метод | Сигнатура | Описание | Пример |
40
- |------|------|------|------|
41
- | `blob` | `(blob: Blob, chunk?: bigint) => Semantic<Uint8Array>` | Преобразовать Blob в поток байтов | `blob(fileBlob, 1024n)` |
42
- | `empty` | `<E>() => Semantic<E>` | Создать пустой поток | `empty<number>()` |
43
- | `fill` | `<E>(element: E, count: bigint) => Semantic<E>` | Заполнить указанным количеством элементов | `fill("hello", 5n)` |
44
- | `from` | `<E>(iterable: Iterable<E>) => Semantic<E>` | Создать поток из итерируемого объекта | `from([1, 2, 3])` |
45
- | `range` | `<N extends number\|bigint>(start: N, end: N, step?: N) => Semantic<N>` | Создать поток числового диапазона | `range(1, 10, 2)` |
46
- | `iterate` | `<E>(generator: Generator<E>) => Semantic<E>` | Создать поток из функции-генератора | `iterate(myGenerator)` |
47
- | `websocket` | `(websocket: WebSocket) => Semantic<MessageEvent>` | Создать поток событий из WebSocket | `websocket(socket)` |
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
+ | `Runnable` | Функция без параметров и возвращаемого значения |
35
+ | `Supplier<R>` | Функция без параметров, возвращающая R |
36
+ | `Functional<T, R>` | Функция преобразования с одним параметром |
37
+ | `Predicate<T>` | Предикатная функция с одним параметром |
38
+ | `BiFunctional<T, U, R>` | Функция преобразования с двумя параметрами |
39
+ | `BiPredicate<T, U>` | Предикатная функция с двумя параметрами |
40
+ | `Comparator<T>` | Функция сравнения |
41
+ | `TriFunctional<T, U, V, R>` | Функция преобразования с тремя параметрами |
42
+ | `Consumer<T>` | Потребительская функция с одним параметром |
43
+ | `BiConsumer<T, U>` | Потребительская функция с двумя параметрами |
44
+ | `TriConsumer<T, U, V>` | Потребительская функция с тремя параметрами |
45
+ | `Generator<T>` | Функция-генератор |
48
46
 
49
- **Дополнение с примером кода:**
50
47
  ```typescript
51
- import { from, range, fill, empty } from 'semantic-typescript';
52
-
53
- // Создать поток из массива
54
- const numberStream = from([1, 2, 3, 4, 5]);
55
-
56
- // Создать поток числового диапазона
57
- const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
58
-
59
- // Заполнить повторяющимися элементами
60
- const filledStream = fill("hello", 3n); // "hello", "hello", "hello"
61
-
62
- // Создать пустой поток
63
- const emptyStream = empty<number>();
48
+ // Примеры использования типов
49
+ const predicate: Predicate<number> = (n) => n > 0;
50
+ const mapper: Functional<string, number> = (str) => str.length;
51
+ const comparator: Comparator<number> = (a, b) => a - b;
64
52
  ```
65
53
 
66
- ### Фабрики служебных функций
54
+ ## Защитники типов (Type Guards)
55
+
56
+ | Функция | Описание | Временная сложность | Пространственная сложность |
57
+ |---------|----------|-------------------|--------------------------|
58
+ | `validate<T>(t: MaybeInvalid<T>): t is T` | Проверяет, что значение не null или undefined | O(1) | O(1) |
59
+ | `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | Проверяет, что значение null или undefined | O(1) | O(1) |
60
+ | `isBoolean(t: unknown): t is boolean` | Проверяет boolean | O(1) | O(1) |
61
+ | `isString(t: unknown): t is string` | Проверяет string | O(1) | O(1) |
62
+ | `isNumber(t: unknown): t is number` | Проверяет number | O(1) | O(1) |
63
+ | `isFunction(t: unknown): t is Function` | Проверяет function | O(1) | O(1) |
64
+ | `isObject(t: unknown): t is object` | Проверяет object | O(1) | O(1) |
65
+ | `isSymbol(t: unknown): t is symbol` | Проверяет symbol | O(1) | O(1) |
66
+ | `isBigint(t: unknown): t is bigint` | Проверяет BigInt | O(1) | O(1) |
67
+ | `isPrimitive(t: unknown): t is Primitive` | Проверяет примитивный тип | O(1) | O(1) |
68
+ | `isIterable(t: unknown): t is Iterable<unknown>` | Проверяет итерируемость | O(1) | O(1) |
69
+ | `isOptional(t: unknown): t is Optional<unknown>` | Проверяет экземпляр Optional | O(1) | O(1) |
70
+ | `isSemantic(t: unknown): t is Semantic<unknown>` | Проверяет экземпляр Semantic | O(1) | O(1) |
71
+ | `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Проверяет экземпляр Collector | O(1) | O(1) |
72
+ | `isCollectable(t: unknown): t is Collectable<unknown>` | Проверяет экземпляр Collectable | O(1) | O(1) |
73
+ | `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | Проверяет экземпляр OrderedCollectable | O(1) | O(1) |
74
+ | `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | Проверяет экземпляр WindowCollectable | O(1) | O(1) |
75
+ | `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | Проверяет экземпляр UnorderedCollectable | O(1) | O(1) |
76
+ | `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Проверяет экземпляр Statistics | O(1) | O(1) |
77
+ | `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | Проверяет экземпляр NumericStatistics | O(1) | O(1) |
78
+ | `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | Проверяет экземпляр BigIntStatistics | O(1) | O(1) |
67
79
 
68
- | Метод | Сигнатура | Описание | Пример |
69
- |------|------|------|------|
70
- | `validate` | `<T>(t: MaybeInvalid<T>) => t is T` | Проверить, является ли значение валидным | `validate(null)` → `false` |
71
- | `invalidate` | `<T>(t: MaybeInvalid<T>) => t is null\|undefined` | Проверить, является ли значение невалидным | `invalidate(0)` → `false` |
72
- | `useCompare` | `<T>(t1: T, t2: T) => number` | Универсальная функция сравнения | `useCompare("a", "b")` → `-1` |
73
- | `useRandom` | `<T = number\|bigint>(index: T) => T` | Генератор псевдослучайных чисел | `useRandom(5)` → случайное число |
74
-
75
- **Дополнение с примером кода:**
76
80
  ```typescript
77
- import { validate, invalidate, useCompare, useRandom } from 'semantic-typescript';
81
+ // Примеры использования защитников типов
82
+ const value: unknown = "hello";
78
83
 
79
- // Проверить валидность данных
80
- const data: string | null = "hello";
81
- if (validate(data)) {
82
- console.log(data.toUpperCase()); // Безопасный вызов, так как validate гарантирует, что data не null
84
+ if (isString(value)) {
85
+ console.log(value.length); // Типобезопасно, value выводится как string
83
86
  }
84
87
 
85
- const nullData: string | null = null;
86
- if (invalidate(nullData)) {
87
- console.log("Данные невалидны"); // Выполнится, потому что invalidate обнаружил null
88
+ if (isOptional(someValue)) {
89
+ someValue.ifPresent(val => console.log(val));
88
90
  }
89
-
90
- // Сравнить значения
91
- const comparison = useCompare("apple", "banana"); // -1
92
-
93
- // Сгенерировать случайное число
94
- const randomNum = useRandom(42); // Случайное число на основе сида 42
95
91
  ```
96
92
 
97
- ## Детали основного класса
98
-
99
- ### Optional<T> - Безопасная обработка нулевых значений
93
+ ## Утилитные функции
100
94
 
101
- Класс Optional предоставляет функциональный подход для безопасной обработки значений, которые могут быть null или undefined.
95
+ | Функция | Описание | Временная сложность | Пространственная сложность |
96
+ |---------|----------|-------------------|--------------------------|
97
+ | `useCompare<T>(t1: T, t2: T): number` | Универсальная функция сравнения | O(1) | O(1) |
98
+ | `useRandom<T = number \| bigint>(index: T): T` | Генератор псевдослучайных чисел | O(log n) | O(1) |
102
99
 
103
- | Метод | Тип возврата | Описание | Сложность по времени |
104
- |------|----------|------|------------|
105
- | `filter(predicate: Predicate<T>)` | `Optional<T>` | Отфильтровать значения, удовлетворяющие условию | O(1) |
106
- | `get()` | `T` | Получить значение, выбросить ошибку если пустое | O(1) |
107
- | `getOrDefault(defaultValue: T)` | `T` | Получить значение или значение по умолчанию | O(1) |
108
- | `ifPresent(action: Consumer<T>)` | `void` | Выполнить действие, если значение существует | O(1) |
109
- | `isEmpty()` | `boolean` | Проверить, пусто ли | O(1) |
110
- | `isPresent()` | `boolean` | Проверить, существует ли значение | O(1) |
111
- | `map<R>(mapper: Functional<T, R>)` | `Optional<R>` | Отобразить и преобразовать значение | O(1) |
112
- | `static of<T>(value: MaybeInvalid<T>)` | `Optional<T>` | Создать экземпляр Optional | O(1) |
113
- | `static ofNullable<T>(value?)` | `Optional<T>` | Создать nullable Optional | O(1) |
114
- | `static ofNonNull<T>(value: T)` | `Optional<T>` | Создать не-null Optional | O(1) |
115
-
116
- **Дополнение с примером кода:**
117
100
  ```typescript
118
- import { Optional } from 'semantic-typescript';
101
+ // Примеры использования утилитных функций
102
+ const numbers = [3, 1, 4, 1, 5];
103
+ numbers.sort(useCompare); // [1, 1, 3, 4, 5]
119
104
 
120
- // Создать экземпляр Optional
121
- const optionalValue = Optional.ofNullable<string>(Math.random() > 0.5 ? "hello" : null);
105
+ const randomNum = useRandom(42); // Случайное число на основе seed
106
+ const randomBigInt = useRandom(1000n); // Случайное BigInt число
107
+ ```
122
108
 
123
- // Цепочка операций
124
- const result = optionalValue
125
- .filter(val => val.length > 3) // Отфильтровать значения длиннее 3
126
- .map(val => val.toUpperCase()) // Преобразовать в верхний регистр
127
- .getOrDefault("default"); // Получить значение или значение по умолчанию
109
+ ## Фабричные методы
128
110
 
129
- console.log(result); // "HELLO" или "default"
111
+ ### Фабричные методы Optional
130
112
 
131
- // Безопасные операции
132
- optionalValue.ifPresent(val => {
133
- console.log(`Значение существует: ${val}`);
134
- });
113
+ | Метод | Описание | Временная сложность | Пространственная сложность |
114
+ |-------|----------|-------------------|--------------------------|
115
+ | `Optional.empty<T>()` | Создает пустой Optional | O(1) | O(1) |
116
+ | `Optional.of<T>(value)` | Создает Optional со значением | O(1) | O(1) |
117
+ | `Optional.ofNullable<T>(value)` | Создает Optional, допускающий null | O(1) | O(1) |
118
+ | `Optional.ofNonNull<T>(value)` | Создает не-null Optional | O(1) | O(1) |
135
119
 
136
- // Проверить статус
137
- if (optionalValue.isPresent()) {
138
- console.log("Есть значение");
139
- } else if (optionalValue.isEmpty()) {
140
- console.log("Пустое");
141
- }
120
+ ```typescript
121
+ // Примеры использования Optional
122
+ const emptyOpt = Optional.empty<number>();
123
+ const presentOpt = Optional.of(42);
124
+ const nullableOpt = Optional.ofNullable<string>(null);
125
+ const nonNullOpt = Optional.ofNonNull("hello");
126
+
127
+ presentOpt.ifPresent(val => console.log(val)); // Выводит 42
128
+ console.log(emptyOpt.orElse(100)); // Выводит 100
142
129
  ```
143
130
 
144
- ### Semantic<E> - Ленивый поток данных
145
-
146
- Semantic - это основной класс потоковой обработки, предоставляющий богатый набор операторов потоков.
147
-
148
- #### Операции преобразования потоков
149
-
150
- | Метод | Тип возврата | Описание | Влияние на производительность |
151
- |------|----------|------|----------|
152
- | `concat(other: Semantic<E>)` | `Semantic<E>` | Объединить два потока | O(n+m) |
153
- | `distinct()` | `Semantic<E>` | Удалить дубликаты (используя Set) | O(n) |
154
- | `distinct(comparator)` | `Semantic<E>` | Дедубликация с пользовательским компаратором | O(n²) |
155
- | `dropWhile(predicate)` | `Semantic<E>` | Отбросить начальные элементы, удовлетворяющие условию | O(n) |
156
- | `filter(predicate)` | `Semantic<E>` | Отфильтровать элементы | O(n) |
157
- | `flat(mapper)` | `Semantic<E>` | Развернуть вложенные потоки | O(n×m) |
158
- | `flatMap(mapper)` | `Semantic<R>` | Отобразить и развернуть | O(n×m) |
159
- | `limit(n)` | `Semantic<E>` | Ограничить количество элементов | O(n) |
160
- | `map(mapper)` | `Semantic<R>` | Отобразить и преобразовать элементы | O(n) |
161
- | `peek(consumer)` | `Semantic<E>` | Просмотреть элементы без модификации | O(n) |
162
- | `redirect(redirector)` | `Semantic<E>` | Перенаправить индексы | O(n) |
163
- | `reverse()` | `Semantic<E>` | Обратить порядок потока | O(n) |
164
- | `shuffle()` | `Semantic<E>` | Случайно перемешать порядок | O(n) |
165
- | `shuffle(mapper)` | `Semantic<E>` | Пользовательская логика перемешивания | O(n) |
166
- | `skip(n)` | `Semantic<E>` | Пропустить первые n элементов | O(n) |
167
- | `sub(start, end)` | `Semantic<E>` | Получить подпоток | O(n) |
168
- | `takeWhile(predicate)` | `Semantic<E>` | Получить начальные элементы, удовлетворяющие условию | O(n) |
169
- | `translate(offset)` | `Semantic<E>` | Транслировать индексы | O(n) |
170
- | `translate(translator)` | `Semantic<E>` | Пользовательское преобразование индексов | O(n) |
171
-
172
- **Дополнение с примером кода:**
173
- ```typescript
174
- import { from } from 'semantic-typescript';
131
+ ### Фабричные методы Collector
175
132
 
176
- const stream = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
133
+ | Метод | Описание | Временная сложность | Пространственная сложность |
134
+ |-------|----------|-------------------|--------------------------|
135
+ | `Collector.full(identity, accumulator, finisher)` | Создает полный сборщик | O(1) | O(1) |
136
+ | `Collector.shortable(identity, interruptor, accumulator, finisher)` | Создает прерываемый сборщик | O(1) | O(1) |
177
137
 
178
- // Примеры операций преобразования потока
179
- const processedStream = stream
180
- .filter(x => x % 2 === 0) // Отфильтровать четные числа
181
- .map(x => x * 2) // Умножить каждый элемент на 2
182
- .distinct() // Удалить дубликаты
183
- .limit(3) // Ограничить первыми 3 элементами
184
- .peek((val, index) => console.log(`Элемент ${val} по индексу ${index}`)); // Просмотреть элементы
138
+ ```typescript
139
+ // Примеры использования Collector
140
+ const sumCollector = Collector.full(
141
+ () => 0,
142
+ (sum, num) => sum + num,
143
+ result => result
144
+ );
185
145
 
186
- // Примечание: Поток еще не выполнен, требуется преобразование в Collectable для терминальных операций
146
+ const numbers = from([1, 2, 3, 4, 5]);
147
+ const total = numbers.toUnoredered().collect(sumCollector); // 15
187
148
  ```
188
149
 
189
- #### Терминальные операции потоков
150
+ ### Фабричные методы Semantic
190
151
 
191
- | Метод | Тип возврата | Описание | Характеристики производительности |
192
- |------|----------|------|----------|
193
- | `toOrdered()` | `OrderedCollectable<E>` | Преобразовать в упорядоченную коллекцию | Операция сортировки, низкая производительность |
194
- | `toUnordered()` | `UnorderedCollectable<E>` | Преобразовать в неупорядоченную коллекцию | Самый быстрый, без сортировки |
195
- | `toWindow()` | `WindowCollectable<E>` | Преобразовать в оконную коллекцию | Операция сортировки, низкая производительность |
196
- | `toNumericStatistics()` | `Statistics<E, number>` | Численный статистический анализ | Операция сортировки, низкая производительность |
197
- | `toBigintStatistics()` | `Statistics<E, bigint>` | Статистический анализ для больших целых чисел | Операция сортировки, низкая производительность |
198
- | `sorted()` | `OrderedCollectable<E>` | Естественная сортировка | Переопределяет результаты перенаправления |
199
- | `sorted(comparator)` | `OrderedCollectable<E>` | Пользовательская сортировка | Переопределяет результаты перенаправления |
152
+ | Метод | Описание | Временная сложность | Пространственная сложность |
153
+ |-------|----------|---------------------|----------------------------|
154
+ | `blob(blob, chunkSize)` | Создает поток из Blob | O(n) | O(chunkSize) |
155
+ | `empty<E>()` | Создает пустой поток | O(1) | O(1) |
156
+ | `fill<E>(element, count)` | Создает заполненный поток | O(n) | O(1) |
157
+ | `from<E>(iterable)` | Создает поток из итерируемого объекта | O(1) | O(1) |
158
+ | `interval(period, delay?)` | Создает регулярный интервальный поток | O(1)* | O(1) |
159
+ | `iterate<E>(generator)` | Создает поток из генератора | O(1) | O(1) |
160
+ | `range(start, end, step)` | Создает числовой диапазонный поток | O(n) | O(1) |
161
+ | `websocket(websocket)` | Создает поток из WebSocket | O(1) | O(1) |
200
162
 
201
- **Дополнение с примером кода:**
202
163
  ```typescript
203
- import { from } from 'semantic-typescript';
164
+ // Пример использования фабричных методов Semantic
204
165
 
205
- const semanticStream = from([5, 2, 8, 1, 9, 3, 7, 4, 6]);
166
+ // Создать поток из Blob (чтение частями)
167
+ blob(someBlob, 1024n)
168
+ .toUnordered()
169
+ .write(WritableStream)
170
+ .then(callback) // Запись потока успешна
171
+ .catch(writeFi); // Запись потока не удалась
206
172
 
207
- // Преобразовать в упорядоченную коллекцию (низкая производительность)
208
- const ordered = semanticStream.toOrdered();
173
+ // Создать пустой поток, который не будет выполняться до конкатенации с другими потоками
174
+ empty<string>()
175
+ .toUnordered()
176
+ .join(); //[]
209
177
 
210
- // Преобразовать в неупорядоченную коллекцию (самый быстрый)
211
- const unordered = semanticStream.toUnordered();
178
+ // Создать заполненный поток
179
+ const filledStream = fill("hello", 3); // "hello", "hello", "hello"
212
180
 
213
- // Естественная сортировка
214
- const sortedNatural = semanticStream.sorted();
181
+ // Создать временной поток с начальной задержкой 2 секунды и циклом выполнения 5 секунд,
182
+ // реализованный через механизм таймера, возможны временные отклонения
183
+ // из-за ограничений системного планирования.
184
+ const intervalStream = interval(5000, 2000);
215
185
 
216
- // Пользовательская сортировка
217
- const sortedCustom = semanticStream.sorted((a, b) => b - a); // Сортировка по убыванию
186
+ // Создать поток из итерируемого объекта
187
+ const numberStream = from([1, 2, 3, 4, 5]);
188
+ const stringStream = from(new Set(["Alex", "Bob"]));
218
189
 
219
- // Преобразовать в статистический объект
220
- const stats = semanticStream.toNumericStatistics();
190
+ // Создать поток диапазона
191
+ const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
221
192
 
222
- // Примечание: Необходимо вызывать указанные выше методы через экземпляр Semantic, чтобы получить Collectable, перед использованием терминальных методов
193
+ // Поток событий WebSocket
194
+ const ws = new WebSocket("ws://localhost:8080");
195
+ websocket(ws)
196
+ .filter((event)=> event.type === "message") // Отслеживать только события сообщений
197
+ .toUnordered() // Для событий обычно без сортировки
198
+ .forEach((event)=> receive(event)); // Получать сообщения
223
199
  ```
224
200
 
225
- ### Collector<E, A, R> - Сборщик данных
201
+ ## Методы класса Semantic
202
+
203
+ | Метод | Описание | Временная сложность | Пространственная сложность |
204
+ |-------|----------|-------------------|--------------------------|
205
+ | `concat(other)` | Объединяет два потока | O(n) | O(1) |
206
+ | `distinct()` | Удаляет дубликаты | O(n) | O(n) |
207
+ | `distinct(comparator)` | Удаляет дубликаты с компаратором | O(n²) | O(n) |
208
+ | `dropWhile(predicate)` | Отбрасывает элементы, удовлетворяющие предикату | O(n) | O(1) |
209
+ | `filter(predicate)` | Фильтрует элементы | O(n) | O(1) |
210
+ | `flat(mapper)` | Плоское отображение | O(n × m) | O(1) |
211
+ | `flatMap(mapper)` | Плоское отображение в новый тип | O(n × m) | O(1) |
212
+ | `limit(n)` | Ограничивает количество элементов | O(n) | O(1) |
213
+ | `map(mapper)` | Преобразование отображения | O(n) | O(1) |
214
+ | `peek(consumer)` | Просматривает элементы | O(n) | O(1) |
215
+ | `redirect(redirector)` | Перенаправление индексов | O(n) | O(1) |
216
+ | `reverse()` | Обращает поток | O(n) | O(1) |
217
+ | `shuffle()` | Случайное перемешивание | O(n) | O(1) |
218
+ | `shuffle(mapper)` | Перемешивание с маппером | O(n) | O(1) |
219
+ | `skip(n)` | Пропускает первые n элементов | O(n) | O(1) |
220
+ | `sorted()` | Сортирует | O(n log n) | O(n) |
221
+ | `sorted(comparator)` | Сортирует с компаратором | O(n log n) | O(n) |
222
+ | `sub(start, end)` | Получает подпоток | O(n) | O(1) |
223
+ | `takeWhile(predicate)` | Берет элементы, удовлетворяющие предикату | O(n) | O(1) |
224
+ | `translate(offset)` | Сдвиг индексов | O(n) | O(1) |
225
+ | `translate(translator)` | Сдвиг с транслятором | O(n) | O(1) |
226
226
 
227
- Коллекторы используются для агрегации потоковых данных в определенные структуры.
228
-
229
- | Метод | Описание | Сценарий использования |
230
- |------|------|----------|
231
- | `collect(generator)` | Выполнить сбор данных | Терминальная операция потока |
232
- | `static full(identity, accumulator, finisher)` | Создать полный коллектор | Требует полной обработки |
233
- | `static shortable(identity, interruptor, accumulator, finisher)` | Создать прерываемый коллектор | Может завершиться досрочно |
234
-
235
- **Дополнение с примером кода:**
236
227
  ```typescript
237
- import { Collector } from 'semantic-typescript';
238
-
239
- // Создать пользовательский коллектор
240
- const sumCollector = Collector.full(
241
- () => 0, // Начальное значение
242
- (acc, value) => acc + value, // Аккумулятор
243
- result => result // Функция завершения
244
- );
245
-
246
- // Использовать коллектор (требуется преобразование из Semantic в Collectable сначала)
247
- const numbers = from([1, 2, 3, 4, 5]);
248
- const sum = numbers.toUnordered().collect(sumCollector); // 15
228
+ // Примеры операций Semantic
229
+ const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
230
+ .filter(n => n % 2 === 0) // Фильтрует четные числа
231
+ .map(n => n * 2) // Умножает на 2
232
+ .skip(1) // Пропускает первый
233
+ .limit(3) // Ограничивает 3 элементами
234
+ .toArray(); // Преобразует в массив
235
+ // Результат: [8, 12, 20]
236
+
237
+ // Пример сложной операции
238
+ const complexResult = range(1, 100, 1)
239
+ .flatMap(n => from([n, n * 2])) // Отображает каждый элемент в два элемента
240
+ .distinct() // Удаляет дубликаты
241
+ .shuffle() // Случайно перемешивает
242
+ .takeWhile(n => n < 50) // Берет элементы < 50
243
+ .toOrdered() // Преобразует в упорядоченный сборщик
244
+ .toArray(); // Преобразует в массив
249
245
  ```
250
246
 
251
- ### Collectable<E> - Абстрактный класс собираемых данных
252
-
253
- Предоставляет богатые методы агрегации и преобразования данных. **Примечание: Сначала необходимо получить экземпляр Collectable, вызвав sorted(), toOrdered() и т.д. через экземпляр Semantic, перед использованием следующих методов.**
254
-
255
- #### Операции запроса данных
247
+ ## Методы преобразования сборщиков
256
248
 
257
- | Метод | Тип возврата | Описание | Пример |
258
- |------|----------|------|------|
259
- | `anyMatch(predicate)` | `boolean` | Соответствует ли любой элемент | `anyMatch(x => x > 0)` |
260
- | `allMatch(predicate)` | `boolean` | Соответствуют ли все элементы | `allMatch(x => x > 0)` |
261
- | `count()` | `bigint` | Статистика количества элементов | `count()` `5n` |
262
- | `isEmpty()` | `boolean` | Является ли поток пустым | `isEmpty()` |
263
- | `findAny()` | `Optional<E>` | Найти любой элемент | `findAny()` |
264
- | `findFirst()` | `Optional<E>` | Найти первый элемент | `findFirst()` |
265
- | `findLast()` | `Optional<E>` | Найти последний элемент | `findLast()` |
249
+ | Метод | Описание | Временная сложность | Пространственная сложность |
250
+ |-------|----------|-------------------|--------------------------|
251
+ | `toUnoredered()` | Преобразует в неупорядоченный сборщик (приоритет производительности) | O(1) | O(1) |
252
+ | `toOrdered()` | Преобразует в упорядоченный сборщик | O(1) | O(1) |
253
+ | `sorted()` | Сортирует и преобразует в упорядоченный сборщик | O(n log n) | O(n) |
254
+ | `toWindow()` | Преобразует в оконный сборщик | O(1) | O(1) |
255
+ | `toNumericStatistics()` | Преобразует в числовую статистику | O(1) | O(1) |
256
+ | `toBigintStatistics()` | Преобразует в BigInt статистику | O(1) | O(1) |
266
257
 
267
- **Дополнение с примером кода:**
268
258
  ```typescript
269
- import { from } from 'semantic-typescript';
270
-
271
- const numbers = from([1, 2, 3, 4, 5]);
272
-
273
- // Необходимо преобразовать в Collectable перед использованием терминальных методов
274
- const collectable = numbers.toUnordered();
275
-
276
- // Операции запроса данных
277
- const hasEven = collectable.anyMatch(x => x % 2 === 0); // true
278
- const allPositive = collectable.allMatch(x => x > 0); // true
279
- const count = collectable.count(); // 5n
280
- const isEmpty = collectable.isEmpty(); // false
281
- const firstElement = collectable.findFirst(); // Optional.of(1)
282
- const anyElement = collectable.findAny(); // Любой элемент
259
+ // Примеры преобразования сборщиков
260
+ const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
261
+
262
+ // Приоритет производительности: Использовать неупорядоченный сборщик
263
+ const unordered = numbers
264
+ .filter(n => n > 3)
265
+ .toUnoredered();
266
+
267
+ // Нужна сортировка: Использовать упорядоченный сборщик
268
+ const ordered = numbers
269
+ .sorted()
270
+ .toOrdered();
271
+
272
+ // Статистический анализ: Использовать статистический сборщик
273
+ const stats = numbers
274
+ .toNumericStatistics();
275
+
276
+ console.log(stats.mean()); // Среднее значение
277
+ console.log(stats.median()); // Медиана
278
+ console.log(stats.standardDeviation()); // Стандартное отклонение
279
+
280
+ // Оконные операции
281
+ const windowed = numbers
282
+ .toWindow()
283
+ .tumble(3n); // Окно из 3 элементов
284
+
285
+ windowed.forEach(window => {
286
+ console.log(window.toArray()); // Содержимое каждого окна
287
+ });
283
288
  ```
284
289
 
285
- #### Операции агрегации данных
286
-
287
- | Метод | Тип возврата | Описание | Сложность |
288
- |------|----------|------|--------|
289
- | `group(classifier)` | `Map<K, E[]>` | Группировать по классификатору | O(n) |
290
- | `groupBy(keyExtractor, valueExtractor)` | `Map<K, V[]>` | Группировать по экстракторам ключ-значение | O(n) |
291
- | `join()` | `string` | Объединить в строку | O(n) |
292
- | `join(delimiter)` | `string` | Объединить с разделителем | O(n) |
293
- | `partition(count)` | `E[][]` | Разделить по количеству | O(n) |
294
- | `partitionBy(classifier)` | `E[][]` | Разделить по классификатору | O(n) |
295
- | `reduce(accumulator)` | `Optional<E>` | Операция редукции | O(n) |
296
- | `reduce(identity, accumulator)` | `E` | Редукция с начальным значением | O(n) |
297
- | `toArray()` | `E[]` | Преобразовать в массив | O(n) |
298
- | `toMap(keyExtractor, valueExtractor)` | `Map<K, V>` | Преобразовать в Map | O(n) |
299
- | `toSet()` | `Set<E>` | Преобразовать в Set | O(n) |
300
-
301
- **Дополнение с примером кода:**
290
+ ## Методы сбора Collectable
291
+
292
+ | Метод | Описание | Временная сложность | Пространственная сложность |
293
+ |-------|----------|-------------------|--------------------------|
294
+ | `anyMatch(predicate)` | Проверяет наличие совпадающих элементов | O(n) | O(1) |
295
+ | `allMatch(predicate)` | Проверяет совпадение всех элементов | O(n) | O(1) |
296
+ | `count()` | Подсчитывает элементы | O(n) | O(1) |
297
+ | `isEmpty()` | Проверяет пустоту | O(1) | O(1) |
298
+ | `findAny()` | Находит любой элемент | O(n) | O(1) |
299
+ | `findFirst()` | Находит первый элемент | O(n) | O(1) |
300
+ | `findLast()` | Находит последний элемент | O(n) | O(1) |
301
+ | `forEach(action)` | Перебирает все элементы | O(n) | O(1) |
302
+ | `group(classifier)` | Группирует по классификатору | O(n) | O(n) |
303
+ | `groupBy(keyExtractor, valueExtractor)` | Группирует по экстракторам ключ-значение | O(n) | O(n) |
304
+ | `join()` | Объединяет в строку | O(n) | O(n) |
305
+ | `join(delimiter)` | Объединяет с разделителем | O(n) | O(n) |
306
+ | `nonMatch(predicate)` | Проверяет отсутствие совпадений | O(n) | O(1) |
307
+ | `partition(count)` | Разделяет по количеству | O(n) | O(n) |
308
+ | `partitionBy(classifier)` | Разделяет по классификатору | O(n) | O(n) |
309
+ | `reduce(accumulator)` | Операция свертки | O(n) | O(1) |
310
+ | `reduce(identity, accumulator)` | Свертка с начальным значением | O(n) | O(1) |
311
+ | `toArray()` | Преобразует в массив | O(n) | O(n) |
312
+ | `toMap(keyExtractor, valueExtractor)` | Преобразует в Map | O(n) | O(n) |
313
+ | `toSet()` | Преобразует в Set | O(n) | O(n) |
314
+ | `write(stream)` | Записывает в поток | O(n) | O(1) |
315
+
302
316
  ```typescript
303
- import { from } from 'semantic-typescript';
317
+ // Примеры операций Collectable
318
+ const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
319
+ .filter(n => n % 2 === 0)
320
+ .toOrdered();
304
321
 
305
- const people = from([
306
- { name: "Alice", age: 25, city: "New York" },
307
- { name: "Bob", age: 30, city: "London" },
308
- { name: "Charlie", age: 25, city: "New York" }
309
- ]);
322
+ // Проверки совпадения
323
+ console.log(data.anyMatch(n => n > 5)); // true
324
+ console.log(data.allMatch(n => n < 20)); // true
310
325
 
311
- // Необходимо преобразовать в Collectable перед использованием операций агрегации
312
- const collectable = people.toUnordered();
326
+ // Операции поиска
327
+ data.findFirst().ifPresent(n => console.log(n)); // 2
328
+ data.findAny().ifPresent(n => console.log(n)); // Любой элемент
313
329
 
314
330
  // Операции группировки
315
- const byCity = collectable.group(person => person.city);
316
- // Map { "New York" => [{name: "Alice", ...}, {name: "Charlie", ...}], "London" => [{name: "Bob", ...}] }
317
-
318
- const byAge = collectable.groupBy(
319
- person => person.age,
320
- person => person.name
331
+ const grouped = data.groupBy(
332
+ n => n > 5 ? "large" : "small",
333
+ n => n * 2
321
334
  );
322
- // Map { 25 => ["Alice", "Charlie"], 30 => ["Bob"] }
323
-
324
- // Преобразовать в коллекции
325
- const array = collectable.toArray(); // Исходный массив
326
- const set = collectable.toSet(); // Коллекция Set
327
- const map = collectable.toMap(
328
- person => person.name,
329
- person => person.age
330
- ); // Map { "Alice" => 25, "Bob" => 30, "Charlie" => 25 }
331
-
332
- // Операции редукции
333
- const totalAge = collectable.reduce(0, (acc, person) => acc + person.age); // 80
334
- const oldest = collectable.reduce((a, b) => a.age > b.age ? a : b); // Optional.of({name: "Bob", age: 30, ...})
335
- ```
335
+ // {small: [4, 8], large: [12, 16, 20]}
336
336
 
337
- ### Конкретные реализации коллекторов
337
+ // Операции свертки
338
+ const sum = data.reduce(0, (acc, n) => acc + n); // 30
338
339
 
339
- #### UnorderedCollectable<E>
340
- - **Характеристики**: Самый быстрый коллектор, без сортировки
341
- - **Сценарии использования**: Порядок не важен, желательна максимальная производительность
342
- - **Методы**: Наследует все методы Collectable
343
-
344
- #### OrderedCollectable<E>
345
- - **Характеристики**: Гарантирует порядок элементов, низкая производительность
346
- - **Сценарии использования**: Требуются отсортированные результаты
347
- - **Специальные методы**: Наследует все методы, сохраняет внутреннее состояние сортировки
340
+ // Операции вывода
341
+ data.join(", "); // "2, 4, 6, 8, 10"
342
+ ```
348
343
 
349
- #### WindowCollectable<E>
350
- - **Характеристики**: Поддерживает операции скользящего окна
351
- - **Сценарии использования**: Анализ временных рядов
352
- - **Специальные методы**:
353
- - `slide(size, step)` - Скользящее окно
354
- - `tumble(size)` - Тумблинг-окно
344
+ ## Методы статистического анализа
345
+
346
+ ### Методы NumericStatistics
347
+
348
+ | Метод | Описание | Временная сложность | Пространственная сложность |
349
+ |-------|----------|-------------------|--------------------------|
350
+ | `range()` | Размах | O(n) | O(1) |
351
+ | `variance()` | Дисперсия | O(n) | O(1) |
352
+ | `standardDeviation()` | Стандартное отклонение | O(n) | O(1) |
353
+ | `mean()` | Среднее значение | O(n) | O(1) |
354
+ | `median()` | Медиана | O(n log n) | O(n) |
355
+ | `mode()` | Мода | O(n) | O(n) |
356
+ | `frequency()` | Распределение частот | O(n) | O(n) |
357
+ | `summate()` | Суммирование | O(n) | O(1) |
358
+ | `quantile(quantile)` | Квантиль | O(n log n) | O(n) |
359
+ | `interquartileRange()` | Интерквартильный размах | O(n log n) | O(n) |
360
+ | `skewness()` | Асимметрия | O(n) | O(1) |
361
+ | `kurtosis()` | Эксцесс | O(n) | O(1) |
355
362
 
356
- **Дополнение с примером кода:**
357
363
  ```typescript
358
- import { from } from 'semantic-typescript';
359
-
360
- const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
361
-
362
- // Неупорядоченный коллектор (самый быстрый)
363
- const unordered = data.toUnordered();
364
- const unorderedArray = unordered.toArray(); // Может сохранять исходный порядок [1, 2, 3, ...]
365
-
366
- // Упорядоченный коллектор
367
- const ordered = data.toOrdered();
368
- const orderedArray = ordered.toArray(); // Гарантированно отсортирован [1, 2, 3, ...]
364
+ // Примеры статистического анализа
365
+ const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
366
+ .toNumericStatistics();
367
+
368
+ console.log("Среднее значение:", numbers.mean()); // 5.5
369
+ console.log("Медиана:", numbers.median()); // 5.5
370
+ console.log("Стандартное отклонение:", numbers.standardDeviation()); // ~2.87
371
+ console.log("Сумма:", numbers.summate()); // 55
372
+
373
+ // Статистический анализ с маппером
374
+ const objects = from([
375
+ { value: 10 },
376
+ { value: 20 },
377
+ { value: 30 }
378
+ ]).toNumericStatistics();
379
+
380
+ console.log("Отображенное среднее:", objects.mean(obj => obj.value)); // 20
381
+ ```
369
382
 
370
- // Оконный коллектор
371
- const windowed = data.toWindow();
372
- const slidingWindows = windowed.slide(3n, 2n); // Размер окна 3, шаг 2
373
- // Окно 1: [1, 2, 3], Окно 2: [3, 4, 5], Окно 3: [5, 6, 7], ...
383
+ ## Руководство по выбору производительности
374
384
 
375
- const tumblingWindows = windowed.tumble(4n); // Размер тумблинг-окна 4
376
- // Окно 1: [1, 2, 3, 4], Окно 2: [5, 6, 7, 8], ...
385
+ ### Выбор неупорядоченного сборщика (Приоритет производительности)
386
+ ```typescript
387
+ // Когда гарантия порядка не требуется
388
+ const highPerformance = data
389
+ .filter(predicate)
390
+ .map(mapper)
391
+ .toUnoredered(); // Лучшая производительность
377
392
  ```
378
393
 
379
- ### Statistics<E, D> - Статистический анализ
380
-
381
- Базовый класс статистического анализа, предоставляющий богатые методы статистических вычислений. **Примечание: Сначала необходимо получить экземпляр Statistics, вызвав toNumericStatistics() или toBigIntStatistics() через экземпляр Semantic, перед использованием следующих методов.**
382
-
383
- #### Операции статистических вычислений
384
-
385
- | Метод | Тип возврата | Описание | Сложность алгоритма |
386
- |------|----------|------|------------|
387
- | `maximum()` | `Optional<E>` | Максимальное значение | O(n) |
388
- | `minimum()` | `Optional<E>` | Минимальное значение | O(n) |
389
- | `range()` | `D` | Размах (макс-мин) | O(n) |
390
- | `variance()` | `D` | Дисперсия | O(n) |
391
- | `standardDeviation()` | `D` | Стандартное отклонение | O(n) |
392
- | `mean()` | `D` | Среднее значение | O(n) |
393
- | `median()` | `D` | Медиана | O(n log n) |
394
- | `mode()` | `D` | Мода | O(n) |
395
- | `frequency()` | `Map<D, bigint>` | Распределение частот | O(n) |
396
- | `summate()` | `D` | Суммирование | O(n) |
397
- | `quantile(quantile)` | `D` | Квантиль | O(n log n) |
398
- | `interquartileRange()` | `D` | Интерквартильный размах | O(n log n) |
399
- | `skewness()` | `D` | Асимметрия | O(n) |
400
- | `kurtosis()` | `D` | Эксцесс | O(n) |
401
-
402
- **Дополнение с примером кода:**
394
+ ### Выбор упорядоченного сборщика (Требуется порядок)
403
395
  ```typescript
404
- import { from } from 'semantic-typescript';
405
-
406
- const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
407
-
408
- // Необходимо преобразовать в статистический объект перед использованием статистических методов
409
- const stats = numbers.toNumericStatistics();
410
-
411
- // Базовая статистика
412
- const count = stats.count(); // 10n
413
- const max = stats.maximum(); // Optional.of(10)
414
- const min = stats.minimum(); // Optional.of(1)
415
- const range = stats.range(); // 9
416
- const mean = stats.mean(); // 5.5
417
- const median = stats.median(); // 5.5
418
- const sum = stats.summate(); // 55
419
-
420
- // Продвинутая статистика
421
- const variance = stats.variance(); // 8.25
422
- const stdDev = stats.standardDeviation(); // 2.872
423
- const mode = stats.mode(); // Любое значение (так как все встречаются по одному разу)
424
- const q1 = stats.quantile(0.25); // 3.25
425
- const q3 = stats.quantile(0.75); // 7.75
426
- const iqr = stats.interquartileRange(); // 4.5
427
-
428
- // Распределение частот
429
- const freq = stats.frequency(); // Map {1 => 1n, 2 => 1n, ...}
396
+ // Когда порядок элементов должен сохраняться
397
+ const ordered = data.sorted(comparator);
430
398
  ```
431
399
 
432
- #### Конкретные классы статистических реализаций
433
-
434
- **NumericStatistics<E>**
435
- - Обрабатывает статистический анализ числового типа
436
- - Все статистические вычисления возвращают числовой тип
437
-
438
- **BigIntStatistics<E>**
439
- - Обрабатывает статистический анализ типа bigint
440
- - Все статистические вычисления возвращают тип bigint
441
-
442
- **Дополнение с примером кода:**
400
+ ### Выбор оконного сборщика (Оконные операции)
443
401
  ```typescript
444
- import { from } from 'semantic-typescript';
445
-
446
- // Числовая статистика
447
- const numberData = from([10, 20, 30, 40, 50]);
448
- const numericStats = numberData.toNumericStatistics();
449
-
450
- console.log(numericStats.mean()); // 30
451
- console.log(numericStats.summate()); // 150
452
-
453
- // Статистика больших целых чисел
454
- const bigintData = from([100n, 200n, 300n, 400n, 500n]);
455
- const bigintStats = bigintData.toBigIntStatistics();
456
-
457
- console.log(bigintStats.mean()); // 300n
458
- console.log(bigintStats.summate()); // 1500n
402
+ // Когда требуются оконные операции
403
+ const windowed = data
404
+ .toWindow()
405
+ .slide(5n, 2n); // Скользящее окно
406
+ ```
459
407
 
460
- // Статистика с использованием функций-мапперов
461
- const objectData = from([
462
- { value: 15 },
463
- { value: 25 },
464
- { value: 35 },
465
- { value: 45 }
466
- ]);
408
+ ### Выбор статистического анализа (Численные вычисления)
409
+ ```typescript
410
+ // Когда требуется статистический анализ
411
+ const stats = data
412
+ .toNumericStatistics(); // Численная статистика
467
413
 
468
- const objectStats = objectData.toNumericStatistics();
469
- const meanWithMapper = objectStats.mean(obj => obj.value); // 30
470
- const sumWithMapper = objectStats.summate(obj => obj.value); // 120
414
+ const bigIntStats = data
415
+ .toBigintStatistics(); // BigInt статистика
471
416
  ```
472
417
 
473
- ## Полный пример использования
418
+ [GitHub](https://github.com/eloyhere/semantic-typescript)
419
+ [NPMJS](https://www.npmjs.com/package/semantic-typescript)
474
420
 
475
- ```typescript
476
- import { from, validate, invalidate } from 'semantic-typescript';
477
-
478
- // 1. Создать поток данных
479
- const rawData = [5, 2, 8, 1, null, 9, 3, undefined, 7, 4, 6];
480
- const semanticStream = from(rawData);
481
-
482
- // 2. Конвейер обработки потока
483
- const processedStream = semanticStream
484
- .filter(val => validate(val)) // Отфильтровать null и undefined
485
- .map(val => val! * 2) // Умножить каждое значение на 2 (используется !, так как validate гарантирует не пустое)
486
- .distinct(); // Удалить дубликаты
487
-
488
- // 3. Преобразовать в Collectable и использовать терминальные операции
489
- const collectable = processedStream.toUnordered();
490
-
491
- // 4. Проверка данных и использование
492
- if (!collectable.isEmpty()) {
493
- const results = collectable
494
- .filter(x => x > 5) // Снова отфильтровать
495
- .toArray(); // Преобразовать в массив
496
-
497
- console.log("Результаты обработки:", results); // [16, 18, 14, 8, 12]
498
-
499
- // Статистическая информация
500
- const stats = processedStream.toNumericStatistics();
501
- console.log("Среднее значение:", stats.mean()); // 11.2
502
- console.log("Общая сумма:", stats.summate()); // 56
503
- }
421
+ ## Важные замечания
504
422
 
505
- // 5. Обработать потенциально невалидные данные
506
- const potentiallyInvalidData: Array<number | null> = [1, null, 3, 4, null];
507
- const validData = potentiallyInvalidData.filter(validate);
508
- const invalidData = potentiallyInvalidData.filter(invalidate);
509
-
510
- console.log("Валидные данные:", validData); // [1, 3, 4]
511
- console.log("Невалидные данные:", invalidData); // [null, null]
512
- ```
423
+ 1. **Влияние операций сортировки**: В упорядоченных сборщиках операция `sorted()` перезаписывает эффекты `redirect`, `translate`, `shuffle`
424
+ 2. **Соображения производительности**: Если гарантия порядка не требуется, отдавайте приоритет `toUnoredered()` для лучшей производительности
425
+ 3. **Использование памяти**: Операции сортировки требуют O(n) дополнительного пространства
426
+ 4. **Данные реального времени**: Потоки Semantic идеально подходят для данных реального времени и поддерживают асинхронные источники данных
513
427
 
514
- ## Важные правила использования - итог
515
-
516
- 1. **Создать поток**: Используйте фабричные методы `from()`, `range()`, `fill()` и т.д. для создания экземпляров Semantic
517
- 2. **Преобразование потока**: Вызывайте методы `map()`, `filter()`, `distinct()` и т.д. на экземплярах Semantic
518
- 3. **Преобразовать в Collectable**: Необходимо вызвать один из следующих методов через экземпляр Semantic:
519
- - `toOrdered()` - Упорядоченный коллектор
520
- - `toUnordered()` - Неупорядоченный коллектор (самый быстрый)
521
- - `toWindow()` - Оконный коллектор
522
- - `toNumericStatistics()` - Числовая статистика
523
- - `toBigIntStatistics()` - Статистика больших целых чисел
524
- - `sorted()` - Естественная сортировка
525
- - `sorted(comparator)` - Пользовательская сортировка
526
- 4. **Терминальные операции**: Вызывайте терминальные методы `toArray()`, `count()`, `summate()` и т.д. на экземплярах Collectable
527
- 5. **Проверка данных**: Используйте `validate()` для гарантии, что данные не null/undefined, используйте `invalidate()` для проверки невалидных данных
528
-
529
- Этот дизайн обеспечивает типобезопасность и оптимизацию производительности, предоставляя при этом богатый функционал потоковой обработки.
428
+ Эта библиотека предоставляет TypeScript-разработчикам мощные и гибкие возможности обработки потоков, сочетая преимущества функционального программирования с типобезопасностью.