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/dist/factory.d.ts +2 -1
- package/dist/factory.js +46 -26
- package/dist/guard.d.ts +3 -1
- package/dist/guard.js +12 -0
- package/dist/hook.d.ts +2 -0
- package/dist/hook.js +36 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +5 -5
- package/dist/optional.d.ts +2 -0
- package/dist/optional.js +11 -0
- package/dist/semantic.d.ts +1 -1
- package/dist/semantic.js +1 -1
- package/dist/utility.d.ts +7 -0
- package/package.json +1 -1
- package/readme.cn.md +166 -151
- package/readme.de.md +292 -283
- package/readme.es.md +244 -241
- package/readme.fr.md +246 -235
- package/readme.jp.md +280 -268
- package/readme.kr.md +254 -248
- package/readme.md +85 -67
- package/readme.ru.md +239 -242
- package/readme.tw.md +245 -244
package/readme.ru.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
## Введение
|
|
4
4
|
|
|
5
|
-
Semantic-TypeScript — это современная библиотека
|
|
5
|
+
Semantic-TypeScript — это современная библиотека потоковой обработки, вдохновленная JavaScript GeneratorFunction, Java Stream и индексами MySQL. Её основная концепция дизайна основана на создании эффективных конвейеров обработки данных с использованием индексации данных, предоставляя типобезопасный, функциональный стиль операций потоков для разработки фронтенда.
|
|
6
6
|
|
|
7
|
-
В отличие от традиционной синхронной обработки, Semantic использует
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
##
|
|
60
|
+
## Типовые защитники
|
|
61
61
|
|
|
62
62
|
| Функция | Описание | Временная сложность | Пространственная сложность |
|
|
63
|
-
|
|
64
|
-
| `validate<T>(t: MaybeInvalid<T>): t is T` |
|
|
65
|
-
| `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` |
|
|
66
|
-
| `isBoolean(t: unknown): t is boolean` |
|
|
67
|
-
| `isString(t: unknown): t is string` |
|
|
68
|
-
| `isNumber(t: unknown): t is number` |
|
|
69
|
-
| `isFunction(t: unknown): t is Function` |
|
|
70
|
-
| `isObject(t: unknown): t is object` |
|
|
71
|
-
| `isSymbol(t: unknown): t is symbol` |
|
|
72
|
-
| `isBigint(t: unknown): t is bigint` |
|
|
73
|
-
| `isPrimitive(t: unknown): t is Primitive` |
|
|
74
|
-
| `isIterable(t: unknown): t is Iterable<unknown>` |
|
|
75
|
-
| `isOptional(t: unknown): t is Optional<unknown>` |
|
|
76
|
-
| `isSemantic(t: unknown): t is Semantic<unknown>` |
|
|
77
|
-
| `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` |
|
|
78
|
-
| `isCollectable(t: unknown): t is Collectable<unknown>` |
|
|
79
|
-
| `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` |
|
|
80
|
-
| `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` |
|
|
81
|
-
| `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` |
|
|
82
|
-
| `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` |
|
|
83
|
-
| `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` |
|
|
84
|
-
| `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` |
|
|
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
|
-
|
|
89
|
+
// Примеры использования типовых защитников
|
|
90
|
+
let value: unknown = "hello";
|
|
89
91
|
|
|
90
92
|
if (isString(value)) {
|
|
91
|
-
console.log(value.length); // Типобезопасно,
|
|
93
|
+
console.log(value.length); // Типобезопасно, значение выводится как строка
|
|
92
94
|
}
|
|
93
95
|
|
|
94
96
|
if (isOptional(someValue)) {
|
|
95
|
-
someValue.ifPresent(
|
|
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` |
|
|
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
|
-
|
|
117
|
+
let numbers: Array<number> = [3, 1, 4, 1, 5];
|
|
109
118
|
numbers.sort(useCompare); // [1, 1, 3, 4, 5]
|
|
110
119
|
|
|
111
|
-
|
|
112
|
-
const randomBigInt = useRandom(1000n); // Случайное BigInt число
|
|
120
|
+
let randomNum = useRandom(42); // Случайное число на основе семени
|
|
113
121
|
```
|
|
114
122
|
|
|
115
123
|
## Фабричные методы
|
|
116
124
|
|
|
117
|
-
###
|
|
125
|
+
### Методы фабрики Optional
|
|
118
126
|
|
|
119
127
|
| Метод | Описание | Временная сложность | Пространственная сложность |
|
|
120
|
-
|
|
121
|
-
| `Optional.empty<T>()` |
|
|
122
|
-
| `Optional.of<T>(value)` |
|
|
123
|
-
| `Optional.ofNullable<T>(value)` |
|
|
124
|
-
| `Optional.ofNonNull<T>(value)` |
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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.
|
|
141
|
+
presentOpt.ifPresent((val: number): void => console.log(val)); // Выводит 42
|
|
142
|
+
console.log(emptyOpt.get(100)); // Выводит 100
|
|
135
143
|
```
|
|
136
144
|
|
|
137
|
-
###
|
|
145
|
+
### Методы фабрики Collector
|
|
138
146
|
|
|
139
147
|
| Метод | Описание | Временная сложность | Пространственная сложность |
|
|
140
|
-
|
|
141
|
-
| `Collector.full(identity, accumulator, finisher)` |
|
|
142
|
-
| `Collector.shortable(identity, interruptor, accumulator, finisher)` |
|
|
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
|
-
|
|
154
|
+
let numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
|
|
147
155
|
|
|
148
|
-
//
|
|
149
|
-
|
|
150
|
-
.filter(n => n > 3)
|
|
151
|
-
.
|
|
156
|
+
// Приоритет производительности: использование неупорядоченного коллектора для лучшей производительности
|
|
157
|
+
let unordered = numbers
|
|
158
|
+
.filter((n: number): boolean => n > 3)
|
|
159
|
+
.toUnordered(); // Лучшая производительность
|
|
152
160
|
|
|
153
|
-
//
|
|
154
|
-
|
|
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
|
|
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
|
-
###
|
|
183
|
+
### Методы фабрики Semantic
|
|
176
184
|
|
|
177
185
|
| Метод | Описание | Временная сложность | Пространственная сложность |
|
|
178
|
-
|
|
179
|
-
| `
|
|
180
|
-
| `
|
|
181
|
-
| `
|
|
182
|
-
| `
|
|
183
|
-
| `
|
|
184
|
-
| `interval(period, delay?)` |
|
|
185
|
-
| `iterate<E>(generator)` |
|
|
186
|
-
| `range(start, end, step)` |
|
|
187
|
-
| `websocket(websocket)` |
|
|
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
|
-
//
|
|
198
|
+
// Примеры использования фабричных методов Semantic
|
|
191
199
|
|
|
192
|
-
//
|
|
200
|
+
// Создание потока из Blob (чтение блоками)
|
|
193
201
|
blob(someBlob, 1024n)
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
202
|
+
.toUnordered()
|
|
203
|
+
.write(WritableStream)
|
|
204
|
+
.then(callback) // Успешная запись потока
|
|
205
|
+
.catch(callback); // Ошибка записи потока
|
|
198
206
|
|
|
199
|
-
//
|
|
207
|
+
// Создание пустого потока, который не будет выполнен до объединения с другими потоками
|
|
200
208
|
empty<string>()
|
|
201
|
-
|
|
202
|
-
|
|
209
|
+
.toUnordered()
|
|
210
|
+
.join(); // []
|
|
203
211
|
|
|
204
|
-
//
|
|
212
|
+
// Создание заполненного потока
|
|
205
213
|
const filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
206
214
|
|
|
207
|
-
//
|
|
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)` |
|
|
232
|
-
| `distinct()` |
|
|
233
|
-
| `distinct(comparator)` |
|
|
234
|
-
| `dropWhile(predicate)` |
|
|
235
|
-
| `filter(predicate)` |
|
|
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)` |
|
|
238
|
-
| `limit(n)` |
|
|
239
|
-
| `map(mapper)` | Преобразование
|
|
240
|
-
| `peek(consumer)` |
|
|
241
|
-
| `redirect(redirector)` | Перенаправление
|
|
242
|
-
| `reverse()` |
|
|
243
|
-
| `shuffle()` |
|
|
244
|
-
| `shuffle(mapper)` |
|
|
245
|
-
| `skip(n)` |
|
|
246
|
-
| `sorted()` |
|
|
247
|
-
| `sorted(comparator)` |
|
|
248
|
-
| `sub(start, end)` |
|
|
249
|
-
| `takeWhile(predicate)` |
|
|
250
|
-
| `translate(offset)` |
|
|
251
|
-
| `translate(translator)` |
|
|
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)
|
|
258
|
-
.skip(1)
|
|
259
|
-
.limit(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)
|
|
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()` |
|
|
279
|
-
| `toUnordered()` |
|
|
280
|
-
| `toOrdered()` |
|
|
281
|
-
| `toNumericStatistics()` |
|
|
282
|
-
| `toBigintStatistics()` |
|
|
283
|
-
| `toWindow()` |
|
|
284
|
-
| `toCollectable()` |
|
|
285
|
-
| `toCollectable(mapper)` |
|
|
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
|
-
|
|
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
|
-
|
|
300
|
-
.
|
|
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
|
-
|
|
306
|
-
.
|
|
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
|
-
|
|
312
|
-
.
|
|
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
|
-
|
|
318
|
-
.
|
|
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
|
-
|
|
323
|
+
from([6, 4, 3, 5, 2]) // Создание потока
|
|
324
|
+
.toWindow(); // Преобразование в оконный коллектор
|
|
324
325
|
|
|
325
|
-
|
|
326
|
-
|
|
326
|
+
from([6, 4, 3, 5, 2]) // Создание потока
|
|
327
|
+
.toNumericStatistics(); // Преобразование в числовую статистику
|
|
327
328
|
|
|
328
|
-
|
|
329
|
-
|
|
329
|
+
from([6n, 4n, 3n, 5n, 2n]) // Создание потока
|
|
330
|
+
.toBigintStatistics(); // Преобразование в статистику BigInt
|
|
330
331
|
|
|
331
|
-
//
|
|
332
|
-
let customizedCollector = from([1, 2, 3, 4, 5])
|
|
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)` |
|
|
340
|
-
| `allMatch(predicate)` |
|
|
341
|
-
| `count()` |
|
|
342
|
-
| `isEmpty()` |
|
|
343
|
-
| `findAny()` |
|
|
344
|
-
| `findFirst()` |
|
|
345
|
-
| `findLast()` |
|
|
346
|
-
| `forEach(action)` |
|
|
347
|
-
| `group(classifier)` |
|
|
348
|
-
| `groupBy(keyExtractor, valueExtractor)` |
|
|
349
|
-
| `join()` |
|
|
350
|
-
| `join(delimiter)` |
|
|
351
|
-
| `nonMatch(predicate)` |
|
|
352
|
-
| `partition(count)` |
|
|
353
|
-
| `partitionBy(classifier)` |
|
|
354
|
-
| `reduce(accumulator)` | Операция
|
|
355
|
-
| `reduce(identity, accumulator)` |
|
|
356
|
-
| `toArray()` |
|
|
357
|
-
| `toMap(keyExtractor, valueExtractor)` |
|
|
358
|
-
| `toSet()` |
|
|
359
|
-
| `write(stream)` |
|
|
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()` |
|
|
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()` |
|
|
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("
|
|
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
|
-
|
|
429
|
+
// Когда не требуется гарантия порядка, используйте неупорядоченный коллектор для лучшей производительности
|
|
430
|
+
let highPerformance = data
|
|
434
431
|
.filter(predicate)
|
|
435
432
|
.map(mapper)
|
|
436
|
-
.
|
|
433
|
+
.toUnordered(); // Лучшая производительность
|
|
437
434
|
```
|
|
438
435
|
|
|
439
|
-
### Выбор упорядоченного
|
|
436
|
+
### Выбор упорядоченного коллектора (требуется порядок)
|
|
440
437
|
```typescript
|
|
441
|
-
// Когда порядок
|
|
442
|
-
|
|
438
|
+
// Когда необходимо сохранить порядок элементов, используйте упорядоченный коллектор
|
|
439
|
+
let ordered = data.sorted(comparator);
|
|
443
440
|
```
|
|
444
441
|
|
|
445
|
-
### Выбор оконного
|
|
442
|
+
### Выбор оконного коллектора (оконные операции)
|
|
446
443
|
```typescript
|
|
447
444
|
// Когда требуются оконные операции
|
|
448
|
-
|
|
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
|
-
|
|
457
|
-
.toNumericStatistics(); //
|
|
453
|
+
let statistics: NumericStatistics<number> = data
|
|
454
|
+
.toNumericStatistics(); // Числовая статистика
|
|
458
455
|
|
|
459
|
-
|
|
460
|
-
.toBigintStatistics(); //
|
|
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. **Влияние операций сортировки**: В упорядоченных
|
|
469
|
-
2.
|
|
470
|
-
3. **Использование памяти**: Операции сортировки требуют O(n)
|
|
471
|
-
4.
|
|
465
|
+
1. **Влияние операций сортировки**: В упорядоченных коллекторах операция `sorted()` переопределяет эффекты `redirect`, `translate`, `shuffle`, `reverse`.
|
|
466
|
+
2. **Рассмотрение производительности**: Если не требуется гарантия порядка, предпочтение следует отдавать использованию `toUnordered()` для улучшения производительности.
|
|
467
|
+
3. **Использование памяти**: Операции сортировки требуют дополнительного пространства O(n).
|
|
468
|
+
4. **Реальное время**: Потоки Semantic подходят для обработки данных в реальном времени и поддерживают асинхронные источники данных.
|
|
472
469
|
|
|
473
|
-
Эта библиотека предоставляет TypeScript
|
|
470
|
+
Эта библиотека предоставляет разработчикам TypeScript мощные и гибкие возможности потоковой обработки, сочетая преимущества функционального программирования с гарантиями типобезопасности.
|