semantic-typescript 0.0.7 → 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/dist/semantic.d.ts +22 -5
- package/dist/semantic.js +106 -52
- package/package.json +53 -8
- package/readme.cn.md +360 -269
- package/readme.de.md +356 -264
- package/readme.es.md +357 -264
- package/readme.fr.md +357 -264
- package/readme.jp.md +362 -270
- package/readme.kr.md +361 -269
- package/readme.md +361 -270
- package/readme.ru.md +428 -0
- package/readme.tw.md +354 -263
package/readme.ru.md
ADDED
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
# Библиотека потоковой обработки Semantic-TypeScript
|
|
2
|
+
|
|
3
|
+
## Введение
|
|
4
|
+
|
|
5
|
+
Semantic-TypeScript — это современная библиотека для обработки потоков, вдохновленная JavaScript GeneratorFunction, Java Stream и MySQL Index. Основной дизайн библиотеки основан на построении эффективных конвейеров обработки данных с использованием индексов данных, предоставляя фронтенд-разработчикам типобезопасный, функциональный опыт работы с потоками.
|
|
6
|
+
|
|
7
|
+
В отличие от традиционной синхронной обработки, Semantic использует асинхронный режим обработки. При создании потоков данных время получения данных терминалом полностью зависит от того, когда вышестоящий источник вызывает функции обратного вызова `accept` и `interrupt`. Этот дизайн позволяет библиотеке изящно обрабатывать потоки данных в реальном времени, большие наборы данных и асинхронные источники данных.
|
|
8
|
+
|
|
9
|
+
## Установка
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install semantic-typescript
|
|
13
|
+
```
|
|
14
|
+
|
|
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>` | Функция-генератор |
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
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;
|
|
52
|
+
```
|
|
53
|
+
|
|
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) |
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
// Примеры использования защитников типов
|
|
82
|
+
const value: unknown = "hello";
|
|
83
|
+
|
|
84
|
+
if (isString(value)) {
|
|
85
|
+
console.log(value.length); // Типобезопасно, value выводится как string
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (isOptional(someValue)) {
|
|
89
|
+
someValue.ifPresent(val => console.log(val));
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Утилитные функции
|
|
94
|
+
|
|
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) |
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
// Примеры использования утилитных функций
|
|
102
|
+
const numbers = [3, 1, 4, 1, 5];
|
|
103
|
+
numbers.sort(useCompare); // [1, 1, 3, 4, 5]
|
|
104
|
+
|
|
105
|
+
const randomNum = useRandom(42); // Случайное число на основе seed
|
|
106
|
+
const randomBigInt = useRandom(1000n); // Случайное BigInt число
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Фабричные методы
|
|
110
|
+
|
|
111
|
+
### Фабричные методы Optional
|
|
112
|
+
|
|
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) |
|
|
119
|
+
|
|
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
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Фабричные методы Collector
|
|
132
|
+
|
|
133
|
+
| Метод | Описание | Временная сложность | Пространственная сложность |
|
|
134
|
+
|-------|----------|-------------------|--------------------------|
|
|
135
|
+
| `Collector.full(identity, accumulator, finisher)` | Создает полный сборщик | O(1) | O(1) |
|
|
136
|
+
| `Collector.shortable(identity, interruptor, accumulator, finisher)` | Создает прерываемый сборщик | O(1) | O(1) |
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
// Примеры использования Collector
|
|
140
|
+
const sumCollector = Collector.full(
|
|
141
|
+
() => 0,
|
|
142
|
+
(sum, num) => sum + num,
|
|
143
|
+
result => result
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
const numbers = from([1, 2, 3, 4, 5]);
|
|
147
|
+
const total = numbers.toUnoredered().collect(sumCollector); // 15
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Фабричные методы Semantic
|
|
151
|
+
|
|
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) |
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
// Пример использования фабричных методов Semantic
|
|
165
|
+
|
|
166
|
+
// Создать поток из Blob (чтение частями)
|
|
167
|
+
blob(someBlob, 1024n)
|
|
168
|
+
.toUnordered()
|
|
169
|
+
.write(WritableStream)
|
|
170
|
+
.then(callback) // Запись потока успешна
|
|
171
|
+
.catch(writeFi); // Запись потока не удалась
|
|
172
|
+
|
|
173
|
+
// Создать пустой поток, который не будет выполняться до конкатенации с другими потоками
|
|
174
|
+
empty<string>()
|
|
175
|
+
.toUnordered()
|
|
176
|
+
.join(); //[]
|
|
177
|
+
|
|
178
|
+
// Создать заполненный поток
|
|
179
|
+
const filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
180
|
+
|
|
181
|
+
// Создать временной поток с начальной задержкой 2 секунды и циклом выполнения 5 секунд,
|
|
182
|
+
// реализованный через механизм таймера, возможны временные отклонения
|
|
183
|
+
// из-за ограничений системного планирования.
|
|
184
|
+
const intervalStream = interval(5000, 2000);
|
|
185
|
+
|
|
186
|
+
// Создать поток из итерируемого объекта
|
|
187
|
+
const numberStream = from([1, 2, 3, 4, 5]);
|
|
188
|
+
const stringStream = from(new Set(["Alex", "Bob"]));
|
|
189
|
+
|
|
190
|
+
// Создать поток диапазона
|
|
191
|
+
const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
192
|
+
|
|
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)); // Получать сообщения
|
|
199
|
+
```
|
|
200
|
+
|
|
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
|
+
|
|
227
|
+
```typescript
|
|
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(); // Преобразует в массив
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## Методы преобразования сборщиков
|
|
248
|
+
|
|
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) |
|
|
257
|
+
|
|
258
|
+
```typescript
|
|
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
|
+
});
|
|
288
|
+
```
|
|
289
|
+
|
|
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
|
+
|
|
316
|
+
```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();
|
|
321
|
+
|
|
322
|
+
// Проверки совпадения
|
|
323
|
+
console.log(data.anyMatch(n => n > 5)); // true
|
|
324
|
+
console.log(data.allMatch(n => n < 20)); // true
|
|
325
|
+
|
|
326
|
+
// Операции поиска
|
|
327
|
+
data.findFirst().ifPresent(n => console.log(n)); // 2
|
|
328
|
+
data.findAny().ifPresent(n => console.log(n)); // Любой элемент
|
|
329
|
+
|
|
330
|
+
// Операции группировки
|
|
331
|
+
const grouped = data.groupBy(
|
|
332
|
+
n => n > 5 ? "large" : "small",
|
|
333
|
+
n => n * 2
|
|
334
|
+
);
|
|
335
|
+
// {small: [4, 8], large: [12, 16, 20]}
|
|
336
|
+
|
|
337
|
+
// Операции свертки
|
|
338
|
+
const sum = data.reduce(0, (acc, n) => acc + n); // 30
|
|
339
|
+
|
|
340
|
+
// Операции вывода
|
|
341
|
+
data.join(", "); // "2, 4, 6, 8, 10"
|
|
342
|
+
```
|
|
343
|
+
|
|
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) |
|
|
362
|
+
|
|
363
|
+
```typescript
|
|
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
|
+
```
|
|
382
|
+
|
|
383
|
+
## Руководство по выбору производительности
|
|
384
|
+
|
|
385
|
+
### Выбор неупорядоченного сборщика (Приоритет производительности)
|
|
386
|
+
```typescript
|
|
387
|
+
// Когда гарантия порядка не требуется
|
|
388
|
+
const highPerformance = data
|
|
389
|
+
.filter(predicate)
|
|
390
|
+
.map(mapper)
|
|
391
|
+
.toUnoredered(); // Лучшая производительность
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
### Выбор упорядоченного сборщика (Требуется порядок)
|
|
395
|
+
```typescript
|
|
396
|
+
// Когда порядок элементов должен сохраняться
|
|
397
|
+
const ordered = data.sorted(comparator);
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
### Выбор оконного сборщика (Оконные операции)
|
|
401
|
+
```typescript
|
|
402
|
+
// Когда требуются оконные операции
|
|
403
|
+
const windowed = data
|
|
404
|
+
.toWindow()
|
|
405
|
+
.slide(5n, 2n); // Скользящее окно
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### Выбор статистического анализа (Численные вычисления)
|
|
409
|
+
```typescript
|
|
410
|
+
// Когда требуется статистический анализ
|
|
411
|
+
const stats = data
|
|
412
|
+
.toNumericStatistics(); // Численная статистика
|
|
413
|
+
|
|
414
|
+
const bigIntStats = data
|
|
415
|
+
.toBigintStatistics(); // BigInt статистика
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
[GitHub](https://github.com/eloyhere/semantic-typescript)
|
|
419
|
+
[NPMJS](https://www.npmjs.com/package/semantic-typescript)
|
|
420
|
+
|
|
421
|
+
## Важные замечания
|
|
422
|
+
|
|
423
|
+
1. **Влияние операций сортировки**: В упорядоченных сборщиках операция `sorted()` перезаписывает эффекты `redirect`, `translate`, `shuffle`
|
|
424
|
+
2. **Соображения производительности**: Если гарантия порядка не требуется, отдавайте приоритет `toUnoredered()` для лучшей производительности
|
|
425
|
+
3. **Использование памяти**: Операции сортировки требуют O(n) дополнительного пространства
|
|
426
|
+
4. **Данные реального времени**: Потоки Semantic идеально подходят для данных реального времени и поддерживают асинхронные источники данных
|
|
427
|
+
|
|
428
|
+
Эта библиотека предоставляет TypeScript-разработчикам мощные и гибкие возможности обработки потоков, сочетая преимущества функционального программирования с типобезопасностью.
|