semantic-typescript 0.2.6 → 0.2.9

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