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/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-разработчикам мощные и гибкие возможности обработки потоков, сочетая преимущества функционального программирования с типобезопасностью.