semantic-typescript 0.5.3 → 0.7.0
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/asynchronous/collector.d.ts +235 -0
- package/dist/asynchronous/collector.js +811 -0
- package/dist/asynchronous/semantic.d.ts +257 -0
- package/dist/asynchronous/semantic.js +1863 -0
- package/dist/factory.d.ts +79 -37
- package/dist/factory.js +534 -277
- package/dist/guard.d.ts +24 -14
- package/dist/guard.js +73 -19
- package/dist/hook.d.ts +11 -6
- package/dist/hook.js +22 -5
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/main.js +6 -4
- package/dist/optional.d.ts +2 -2
- package/dist/symbol.d.ts +19 -10
- package/dist/symbol.js +19 -10
- package/dist/synchronous/collector.d.ts +236 -0
- package/dist/{collector.js → synchronous/collector.js} +217 -193
- package/dist/{semantic.d.ts → synchronous/semantic.d.ts} +125 -130
- package/dist/{semantic.js → synchronous/semantic.js} +465 -574
- package/dist/utility.d.ts +7 -1
- package/dist/utility.js +1 -0
- package/package.json +3 -2
- package/readme.cn.md +213 -753
- package/readme.de.md +171 -441
- package/readme.es.md +171 -436
- package/readme.fr.md +170 -443
- package/readme.jp.md +177 -439
- package/readme.kr.md +177 -433
- package/readme.md +213 -1066
- package/readme.ru.md +174 -420
- package/readme.tw.md +175 -441
- package/dist/collector.d.ts +0 -236
- package/dist/map.d.ts +0 -76
- package/dist/map.js +0 -245
- package/dist/node.d.ts +0 -182
- package/dist/node.js +0 -918
- package/dist/set.d.ts +0 -19
- package/dist/set.js +0 -65
- package/dist/tree.d.ts +0 -82
- package/dist/tree.js +0 -257
package/readme.ru.md
CHANGED
|
@@ -1,470 +1,224 @@
|
|
|
1
|
-
|
|
1
|
+
Перевод на русский, с учётом языковых норм, контекста и стилистических особенностей. Собственные имена не переведены:
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
# Semantic-TypeScript
|
|
4
|
+
Потоки данных, проиндексированные. Ваши данные под точным контролем.
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
---
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
### Обзор
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
Semantic-TypeScript знаменует собой значительный скачок в развитии технологий обработки потоков данных, синтезируя наиболее эффективные концепции из JavaScript `GeneratorFunction`, Java Streams и индексирования в стиле MySQL. Его основная философия одновременно проста и мощна: создавайте исключительно эффективные конвейеры обработки данных с помощью интеллектуального индексирования, а не грубого перебора.
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
npm install semantic-typescript
|
|
13
|
-
```
|
|
12
|
+
Там, где обычные библиотеки навязывают синхронные циклы или громоздкие цепочки промисов, Semantic-TypeScript предлагает полностью асинхронный, функционально чистый и строго типобезопасный опыт, созданный для требований современной фронтенд-разработки.
|
|
14
13
|
|
|
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
|
-
|
|
35
|
-
## Функциональные интерфейсы
|
|
36
|
-
|
|
37
|
-
| Интерфейс | Описание |
|
|
38
|
-
|-----------|-------------|
|
|
39
|
-
| `Runnable` | Функция без параметров и без возвращаемого значения |
|
|
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>` | Функция генератора (основа и фундамент) |
|
|
14
|
+
В этой элегантной модели данные достигают потребителя только тогда, когда вышестоящий конвейер явно вызывает коллбэки `accept` (и, опционально, `interrupt`). Вы полностью контролируете время — именно тогда, когда это необходимо.
|
|
52
15
|
|
|
53
|
-
|
|
54
|
-
// Примеры использования типов
|
|
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
|
-
```
|
|
16
|
+
---
|
|
59
17
|
|
|
60
|
-
|
|
61
|
-
|
|
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` | Проверить, является ли это булевым значением | 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) |
|
|
18
|
+
### Почему разработчики выбирают его
|
|
87
19
|
|
|
88
|
-
|
|
89
|
-
// Примеры использования типовых защитников
|
|
90
|
-
let value: unknown = "hello";
|
|
91
|
-
|
|
92
|
-
if (isString(value)) {
|
|
93
|
-
console.log(value.length); // Типобезопасно, значение выводится как строка
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
if (isOptional(someValue)) {
|
|
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
|
-
}
|
|
105
|
-
}
|
|
106
|
-
```
|
|
20
|
+
• Индексирование без шаблонного кода — каждый элемент несет свой естественный или специально созданный индекс.
|
|
107
21
|
|
|
108
|
-
|
|
22
|
+
• Чистый функциональный стиль — с полным выведением типов TypeScript.
|
|
109
23
|
|
|
110
|
-
|
|
111
|
-
|------|------|------------|------------|
|
|
112
|
-
| `useCompare<T>(t1: T, t2: T): number` | Обобщенная функция сравнения | O(1) | O(1) |
|
|
113
|
-
| `useRandom<T = number \| bigint>(index: T): T` | Генератор псевдослучайных чисел | O(log n) | O(1) |
|
|
24
|
+
• Потоки событий без утечек — `useWindow`, `useDocument`, `useHTMLElement` и `useWebSocket` созданы с учетом безопасности. Вы задаете границу — с помощью `limit(n)`, `sub(start, end)` или `takeWhile(predicate)` — а библиотека управляет очисткой. Никаких зависших слушателей, никаких утечек памяти.
|
|
114
25
|
|
|
115
|
-
|
|
116
|
-
// Примеры использования утилитных функций
|
|
117
|
-
let numbers: Array<number> = [3, 1, 4, 1, 5];
|
|
118
|
-
numbers.sort(useCompare); // [1, 1, 3, 4, 5]
|
|
26
|
+
• Встроенная статистика — всесторонний анализ для чисел и bigint, включая средние значения, медианы, моду, дисперсию, асимметрию и эксцесс.
|
|
119
27
|
|
|
120
|
-
|
|
121
|
-
```
|
|
28
|
+
• Предсказуемая производительность — выбирайте между упорядоченными и неупорядоченными коллекторами в зависимости от ваших требований.
|
|
122
29
|
|
|
123
|
-
|
|
30
|
+
• Эффективное использование памяти — потоки вычисляются лениво, что снимает проблемы с памятью.
|
|
124
31
|
|
|
125
|
-
|
|
32
|
+
• Без неопределенного поведения — TypeScript гарантирует типобезопасность и обработку null. Входные данные остаются неизменными, если явно не модифицированы в ваших функциях обратного вызова.
|
|
126
33
|
|
|
127
|
-
|
|
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) |
|
|
34
|
+
---
|
|
133
35
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
console.log(emptyOpt.get(100)); // Выводит 100
|
|
36
|
+
### Установка
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npm install semantic-typescript
|
|
40
|
+
```
|
|
41
|
+
или
|
|
42
|
+
```bash
|
|
43
|
+
yarn add semantic-typescript
|
|
143
44
|
```
|
|
144
45
|
|
|
145
|
-
|
|
46
|
+
---
|
|
146
47
|
|
|
147
|
-
|
|
148
|
-
|------|------|------------|------------|
|
|
149
|
-
| `Collector.full(identity, accumulator, finisher)` | Создание полного коллектора | O(1) | O(1) |
|
|
150
|
-
| `Collector.shortable(identity, interruptor, accumulator, finisher)` | Создание прерываемого коллектора | O(1) | O(1) |
|
|
48
|
+
### Быстрый старт
|
|
151
49
|
|
|
152
50
|
```typescript
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
//
|
|
162
|
-
let
|
|
163
|
-
|
|
164
|
-
//
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
)
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
51
|
+
import { useOf, useFrom, useRange, useWindow, useHTMLElement, useWebSocket, useText, useStringify } from "semantic-typescript";
|
|
52
|
+
|
|
53
|
+
// Числовая статистика
|
|
54
|
+
let summate: number = useOf(10, 20, 30, 40)
|
|
55
|
+
.map((n: number): number => n * 2)
|
|
56
|
+
.toNumericStatistics() // Требуется перед терминальной операцией
|
|
57
|
+
.summate(); // 200
|
|
58
|
+
|
|
59
|
+
// Статистика для BigInt
|
|
60
|
+
let summate: bigint = useOf(10n, 20n, 30n, 40n)
|
|
61
|
+
.map((n: bigint): bigint => n * 2)
|
|
62
|
+
.toBigIntStatistics() // Требуется перед терминальной операцией
|
|
63
|
+
.summate(); // 200n
|
|
64
|
+
|
|
65
|
+
// Перевернуть поток по индексу
|
|
66
|
+
useFrom([1, 2, 3, 4, 5])
|
|
67
|
+
.redirect((element: E, index: bigint): bigint => -index) // Отрицательный индекс для разворота
|
|
68
|
+
.toOrdered() // Вызов toOrdered() для сохранения порядка индексов
|
|
69
|
+
.toArray(); // [5, 4, 3, 2, 1]
|
|
70
|
+
|
|
71
|
+
// Перемешать поток
|
|
72
|
+
useFrom([1, 2, 3, 4, 5])
|
|
73
|
+
.shuffle()
|
|
74
|
+
.toOrdered()
|
|
75
|
+
.toArray(); // напр., [2, 5, 1, 4, 3]
|
|
76
|
+
|
|
77
|
+
// Сдвинуть элементы внутри потока
|
|
78
|
+
useFrom([1, 2, 3, 4, 5])
|
|
79
|
+
.translate(2) // Сдвиг элементов вправо на 2 позиции
|
|
80
|
+
.toOrdered()
|
|
81
|
+
.toArray(); // [4, 5, 1, 2, 3]
|
|
82
|
+
|
|
83
|
+
useFrom([1, 2, 3, 4, 5])
|
|
84
|
+
.translate(-2) // Сдвиг элементов влево на 2 позиции
|
|
85
|
+
.toOrdered()
|
|
86
|
+
.toArray(); // [3, 4, 5, 1, 2]
|
|
87
|
+
|
|
88
|
+
// Бесконечный диапазон с ранним завершением
|
|
89
|
+
useRange(0n, 1_000_000n)
|
|
90
|
+
.filter(n => n % 17n === 0n)
|
|
91
|
+
.limit(10n) // Остановиться после 10 элементов
|
|
92
|
+
.toUnordered()
|
|
93
|
+
.toArray();
|
|
94
|
+
|
|
95
|
+
// Изменение размера окна в реальном времени (автоматически останавливается после 5 событий)
|
|
96
|
+
useWindow("resize")
|
|
97
|
+
.limit(5n) // Ключевой момент для потоков событий
|
|
98
|
+
.toUnordered()
|
|
99
|
+
.forEach((ev, idx) => console.log(`Изменение размера #${idx}`));
|
|
100
|
+
|
|
101
|
+
// Прослушивание HTML-элемента
|
|
102
|
+
// <input id="input" type="text"/>
|
|
103
|
+
useHTMLElement("#input", "change")
|
|
104
|
+
.limit(1)
|
|
105
|
+
.toUnordered()
|
|
106
|
+
.forEach((event: Event) => submit(event));
|
|
107
|
+
|
|
108
|
+
// Прослушивание нескольких элементов и событий
|
|
109
|
+
useHTMLElement("input", ["change", "keyup"])
|
|
110
|
+
.takeWhile((event: Event): boolean => validate(event))
|
|
111
|
+
.toUnordered()
|
|
112
|
+
.forEach((event: Event) => submit(event));
|
|
113
|
+
|
|
114
|
+
// Прослушивание WebSocket
|
|
115
|
+
let webSocket = new WebSocket("ws://localhost:8080");
|
|
116
|
+
webSocket.addEventListener("close", (): void => {
|
|
117
|
+
webSocket.close(); // Управляйте жизненным циклом WebSocket вручную
|
|
118
|
+
});
|
|
119
|
+
useWebSocket(webSocket, "message")
|
|
120
|
+
.limit(1)
|
|
121
|
+
.toUnordered()
|
|
122
|
+
.forEach((message: MessageEvent) => console.log(message.data));
|
|
123
|
+
|
|
124
|
+
// Итерация по строке по кодовым точкам
|
|
125
|
+
useText("Моё текущее настроение: 😊, а semantic — это 👍")
|
|
126
|
+
.toUnordered()
|
|
127
|
+
.log(); // Выводит строку
|
|
128
|
+
|
|
129
|
+
// Безопасная сериализация объекта с циклическими ссылками
|
|
130
|
+
let o = {
|
|
131
|
+
a: 1,
|
|
132
|
+
b: "текст",
|
|
133
|
+
c: [o.a, o.b, o.c] // Циклическая ссылка
|
|
134
|
+
};
|
|
135
|
+
// let text: string = JSON.stringify(o); // Выбросит ошибку
|
|
136
|
+
let text: string = useStringify(o); // Безопасно возвращает `{a: 1, b: "текст", c: []}`
|
|
181
137
|
```
|
|
182
138
|
|
|
183
|
-
|
|
139
|
+
---
|
|
184
140
|
|
|
185
|
-
|
|
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) |
|
|
141
|
+
### Основные концепции
|
|
196
142
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
// Создание пустого потока, который не будет выполнен до объединения с другими потоками
|
|
208
|
-
empty<string>()
|
|
209
|
-
.toUnordered()
|
|
210
|
-
.join(); // []
|
|
211
|
-
|
|
212
|
-
// Создание заполненного потока
|
|
213
|
-
const filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
214
|
-
|
|
215
|
-
// Создание временного потока с начальной задержкой в 2 секунды и периодом выполнения в 5 секунд, реализованного на основе механизма таймера; может возникать временной дрейф из-за ограничений точности системного планирования.
|
|
216
|
-
const intervalStream = interval(5000, 2000);
|
|
217
|
-
|
|
218
|
-
// Создание потока из итерируемого объекта
|
|
219
|
-
const numberStream = from([1, 2, 3, 4, 5]);
|
|
220
|
-
const stringStream = from(new Set(["Alex", "Bob"]));
|
|
221
|
-
|
|
222
|
-
// Создание потока числового диапазона
|
|
223
|
-
const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
224
|
-
|
|
225
|
-
// Поток событий WebSocket
|
|
226
|
-
const ws = new WebSocket("ws://localhost:8080");
|
|
227
|
-
websocket(ws)
|
|
228
|
-
.filter((event): boolean => event.type === "message") // Слушать только сообщения
|
|
229
|
-
.toUnordered() // Обычно события неупорядочены
|
|
230
|
-
.forEach((event): void => receive(event)); // Получение сообщений
|
|
231
|
-
```
|
|
143
|
+
| Концепция | Назначение | Когда использовать |
|
|
144
|
+
| :--- | :--- | :--- |
|
|
145
|
+
| `AsynchronousSemantic` | Основной конструктор для асинхронных потоков, событий и ленивых конвейеров. | События в реальном времени, WebSockets, слушатели DOM, долгоиграющие или бесконечные потоки. |
|
|
146
|
+
| `SynchronousSemantic` | Конструктор для синхронных потоков в памяти или на основе циклов. | Статические данные, диапазоны, немедленная итерация. |
|
|
147
|
+
| `toUnordered()` | Самый быстрый терминальный коллектор (индексирование на основе Map). | Критичные к производительности задачи (время и память O(n), без сортировки). |
|
|
148
|
+
| `toOrdered()` | Отсортированный коллектор со стабильной индексацией. | Когда требуется стабильный порядок или доступ по индексу. |
|
|
149
|
+
| `toNumericStatistics()` | Богатый числовой статистический анализ (среднее, медиана, дисперсия, асимметрия, эксцесс и т.д.). | Анализ данных и статистические вычисления. |
|
|
150
|
+
| `toBigIntStatistics()` | Богатый статистический анализ для bigint. | Анализ данных и статистические вычисления для больших целых чисел. |
|
|
151
|
+
| `toWindow()` | Поддержка скользящих и тайм-серийных окон. | Обработка временных рядов, пакетная обработка, оконные операции. |
|
|
232
152
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
| Метод | Описание | Временная сложность | Пространственная сложность |
|
|
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) |
|
|
242
|
-
| `flat(mapper)` | Плоское отображение | O(n × m) | 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) |
|
|
153
|
+
---
|
|
258
154
|
|
|
259
|
-
|
|
260
|
-
// Примеры операций Semantic
|
|
261
|
-
const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
262
|
-
.filter(n => n % 2 === 0) // Фильтрация четных чисел
|
|
263
|
-
.map(n => n * 2) // Умножение на 2
|
|
264
|
-
.skip(1) // Пропуск первого
|
|
265
|
-
.limit(3) // Ограничение до 3 элементов
|
|
266
|
-
.toUnordered() // Преобразование в неупорядоченный коллектор
|
|
267
|
-
.toArray(); // Преобразование в массив
|
|
268
|
-
// Результат: [8, 12, 20]
|
|
269
|
-
|
|
270
|
-
// Пример сложной операции
|
|
271
|
-
const complexResult = range(1, 100, 1)
|
|
272
|
-
.flatMap(n => from([n, n * 2])) // Каждый элемент к двум
|
|
273
|
-
.distinct() // Удаление дубликатов
|
|
274
|
-
.shuffle() // Перемешивание порядка
|
|
275
|
-
.takeWhile(n => n < 50) // Взятие элементов меньше 50
|
|
276
|
-
.toOrdered() // Преобразование в упорядоченный коллектор
|
|
277
|
-
.toArray(); // Преобразование в массив
|
|
278
|
-
```
|
|
155
|
+
Важные правила использования
|
|
279
156
|
|
|
280
|
-
|
|
157
|
+
1. Потоки событий (`useWindow`, `useDocument`, `useHTMLElement`, `useWebSocket`, …) возвращают `AsynchronousSemantic`.
|
|
158
|
+
→ Вы **должны** вызвать `.limit(n)`, `.sub(start, end)` или `.takeWhile()`, чтобы прекратить прослушивание. В противном случае слушатель останется активным.
|
|
281
159
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
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) |
|
|
160
|
+
2. Терминальные операции (`.toArray()`, `.count()`, `.average()`, `.reduce()`, `.findFirst()` и т.д.) доступны только после преобразования в коллектор:
|
|
161
|
+
```typescript
|
|
162
|
+
.toUnordered() // Время и память O(n), без сортировки
|
|
163
|
+
// или
|
|
164
|
+
.toOrdered() // Отсортирован, сохраняет порядок
|
|
165
|
+
```
|
|
292
166
|
|
|
293
|
-
|
|
294
|
-
// Примеры преобразований
|
|
295
|
-
from([6, 4, 3, 5, 2]) // Создание потока
|
|
296
|
-
.sorted() // Сортировка потока по возрастанию
|
|
297
|
-
.toArray(); // [2, 3, 4, 5, 6]
|
|
298
|
-
|
|
299
|
-
from([6, 4, 3, 5, 2]) // Создание потока
|
|
300
|
-
.soted((a, b) => b - a) // Сортировка потока по убыванию
|
|
301
|
-
.toArray(); // [6, 5, 4, 3, 2]
|
|
302
|
-
|
|
303
|
-
from([6, 4, 3, 5, 2]) // Создание потока
|
|
304
|
-
.redirect((element, index) => -index) // Перенаправление в обратном порядке
|
|
305
|
-
.toOrderd() // Сохранение перенаправленного порядка
|
|
306
|
-
.toArray(); // [2, 5, 3, 4, 6]
|
|
307
|
-
|
|
308
|
-
from([6, 4, 3, 5, 2]) // Создание потока
|
|
309
|
-
.redirect((element, index) => -index) // Перенаправление в обратном порядке
|
|
310
|
-
.toUnorderd() // Игнорирование перенаправления. Эта операция игнорирует `redirect`, `reverse`, `shuffle` и `translate`
|
|
311
|
-
.toArray(); // [2, 5, 3, 4, 6]
|
|
312
|
-
|
|
313
|
-
from([6, 4, 3, 5, 2]) // Создание потока
|
|
314
|
-
.reverse() // Обращение потока
|
|
315
|
-
.toOrdered() // Гарантия обращенного порядка
|
|
316
|
-
.toArray(); // [2, 5, 3, 4, 6]
|
|
317
|
-
|
|
318
|
-
from([6, 4, 3, 5, 2]) // Создание потока
|
|
319
|
-
.shuffle() // Перемешивание потока
|
|
320
|
-
.sorted() // Перезапись перемешанного порядка. Эта операция перезапишет `redirect`, `reverse`, `shuffle` и `translate`
|
|
321
|
-
.toArray(); // [2, 5, 3, 4, 6]
|
|
322
|
-
|
|
323
|
-
from([6, 4, 3, 5, 2]) // Создание потока
|
|
324
|
-
.toWindow(); // Преобразование в оконный коллектор
|
|
325
|
-
|
|
326
|
-
from([6, 4, 3, 5, 2]) // Создание потока
|
|
327
|
-
.toNumericStatistics(); // Преобразование в числовую статистику
|
|
328
|
-
|
|
329
|
-
from([6n, 4n, 3n, 5n, 2n]) // Создание потока
|
|
330
|
-
.toBigintStatistics(); // Преобразование в статистику BigInt
|
|
331
|
-
|
|
332
|
-
// Определение настраиваемого коллектора для сбора данных
|
|
333
|
-
let customizedCollector = from([1, 2, 3, 4, 5])
|
|
334
|
-
.toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
|
|
335
|
-
```
|
|
167
|
+
---
|
|
336
168
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
| Метод | Описание | Временная сложность | Пространственная сложность |
|
|
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) |
|
|
169
|
+
### Характеристики производительности
|
|
362
170
|
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
171
|
+
| Коллектор | Временная сложность | Пространственная сложность | Отсортирован? | Лучше всего для |
|
|
172
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
173
|
+
| `toUnordered()` | O(n) | O(n) | Нет | Максимальная скорость, порядок не важен. |
|
|
174
|
+
| `toOrdered()` | O(2n) | O(n) | Да | Стабильный порядок, доступ по индексу, аналитика. |
|
|
175
|
+
| `toNumericStatistics()` | O(2n) | O(n) | Да | Статистические операции, требующие сортировки данных. |
|
|
176
|
+
| `toBigIntStatistics()` | O(2n) | O(n) | Да | Статистические операции для bigint. |
|
|
177
|
+
| `toWindow()` | O(2n) | O(n) | Да | Временные оконные операции. |
|
|
368
178
|
|
|
369
|
-
|
|
370
|
-
console.log(data.anyMatch(n => n > 5)); // true
|
|
371
|
-
console.log(data.allMatch(n => n < 20)); // true
|
|
179
|
+
Выбирайте `toUnordered()`, когда важна максимальная скорость. Используйте `toOrdered()` только тогда, когда вам требуется стабильный порядок или статистические методы, зависящие от отсортированных данных.
|
|
372
180
|
|
|
373
|
-
|
|
374
|
-
data.findFirst().ifPresent(n => console.log(n)); // 2
|
|
375
|
-
data.findAny().ifPresent(n => console.log(n)); // Любой элемент
|
|
181
|
+
---
|
|
376
182
|
|
|
377
|
-
|
|
378
|
-
const grouped = data.groupBy(n => n > 5 ? "большой" : "маленький", n => n * 2); // {маленький: [4, 8], большой: [12, 16, 20]}
|
|
183
|
+
Сравнение с другими процессорами потоков для фронтенда
|
|
379
184
|
|
|
380
|
-
|
|
381
|
-
|
|
185
|
+
| Особенность | Semantic-TypeScript | RxJS | Нативные асинхронные итераторы / Генераторы | Most.js |
|
|
186
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
187
|
+
| Интеграция с TypeScript | Первоклассная, с глубокой типизацией и нативной осведомлённостью об индексе. | Отличная, но связана со сложными дженериками. | Хорошая, требует ручного описания типов. | Сильная, в функциональном стиле. |
|
|
188
|
+
| Встроенный статистический анализ | Полная нативная поддержка для `number` и `bigint`. | Отсутствует нативно (требует пользовательских операторов). | Отсутствует. | Отсутствует. |
|
|
189
|
+
| Индексирование и осведомленность о позиции | Нативное, мощное индексирование bigint для каждого элемента. | Требует пользовательских операторов (`scan`, `withLatestFrom`). | Требуется ручной счётчик. | Базовая, без встроенного индекса. |
|
|
190
|
+
| Управление потоками событий | Специализированные, типобезопасные фабрики с явным контролем ранней остановки. | Мощное, но требует ручного управления подписками. | Ручной слушатель событий + отмена. | Хороший `fromEvent`, лёгкий. |
|
|
191
|
+
| Производительность и эффективность памяти | Исключительные – оптимизированные коллекторы `toUnordered()` и `toOrdered()`. | Очень хорошая, но цепочки операторов добавляют накладные расходы. | Отличная (нулевые накладные расходы). | Отличная. |
|
|
192
|
+
| Размер бандла | Очень лёгкий. | Большой (даже с tree-shaking). | Нулевой (нативный). | Маленький. |
|
|
193
|
+
| Философия дизайна API | Функциональный паттерн коллектора с явным индексированием. | Реактивный паттерн Observable. | Паттерн Итератор / Генератор. | Функциональный, бесточечный. |
|
|
194
|
+
| Раннее завершение и контроль | Явный (`interrupt`, `.limit()`, `.takeWhile()`, `.sub()`). | Хороший (`take`, `takeUntil`, `first`). | Ручной (`break` в `for await…of`). | Хороший (`take`, `until`). |
|
|
195
|
+
| Поддержка синхронных и асинхронных операций | Унифицированный API – первоклассная поддержка обоих. | В основном асинхронный. | Оба, но ручной. | В основном асинхронный. |
|
|
196
|
+
| Кривая обучения | Плавная для разработчиков, знакомых с функциональным программированием и индексированными конвейерами. | Круче (много операторов, горячие/холодные observable). | Низкая. | Умеренная. |
|
|
382
197
|
|
|
383
|
-
|
|
384
|
-
data.join(", "); // "[2, 4, 6, 8, 10]"
|
|
385
|
-
```
|
|
198
|
+
Ключевые преимущества Semantic-TypeScript
|
|
386
199
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
### Методы NumericStatistics
|
|
390
|
-
|
|
391
|
-
| Метод | Описание | Временная сложность | Пространственная сложность |
|
|
392
|
-
|------|------|------------|------------|
|
|
393
|
-
| `range()` | Диапазон | O(n) | O(1) |
|
|
394
|
-
| `variance()` | Дисперсия | O(n) | O(1) |
|
|
395
|
-
| `standardDeviation()` | Стандартное отклонение | O(n) | O(1) |
|
|
396
|
-
| `mean()` | Среднее значение | O(n) | O(1) |
|
|
397
|
-
| `median()` | Медиана | O(n log n) | O(n) |
|
|
398
|
-
| `mode()` | Мода | O(n) | O(n) |
|
|
399
|
-
| `frequency()` | Распределение частот | O(n) | O(n) |
|
|
400
|
-
| `summate()` | Суммирование | O(n) | O(1) |
|
|
401
|
-
| `quantile(quantile)` | Квантиль | O(n log n) | O(n) |
|
|
402
|
-
| `interquartileRange()` | Межквартильный размах | O(n log n) | O(n) |
|
|
403
|
-
| `skewness()` | Асимметрия | O(n) | O(1) |
|
|
404
|
-
| `kurtosis()` | Эксцесс | O(n) | O(1) |
|
|
200
|
+
• Уникальные встроенные возможности статистики и индексирования, исключающие необходимость ручного `reduce` или внешних библиотек.
|
|
405
201
|
|
|
406
|
-
|
|
407
|
-
// Примеры статистического анализа
|
|
408
|
-
const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
409
|
-
.toNumericStatistics();
|
|
410
|
-
|
|
411
|
-
console.log("Среднее:", numbers.mean()); // 5.5
|
|
412
|
-
console.log("Медиана:", numbers.median()); // 5.5
|
|
413
|
-
console.log("Стандартное отклонение:", numbers.standardDeviation()); // ~2.87
|
|
414
|
-
console.log("Сумма:", numbers.summate()); // 55
|
|
415
|
-
|
|
416
|
-
// Статистический анализ с использованием мапперов
|
|
417
|
-
const objects = from([
|
|
418
|
-
{ value: 10 },
|
|
419
|
-
{ value: 20 },
|
|
420
|
-
{ value: 30 }
|
|
421
|
-
]).toNumericStatistics();
|
|
422
|
-
console.log("Преобразованное среднее:", objects.mean(obj => obj.value)); // 20
|
|
423
|
-
```
|
|
202
|
+
• Явный контроль над потоками событий предотвращает утечки памяти, характерные для RxJS.
|
|
424
203
|
|
|
425
|
-
|
|
204
|
+
• Унифицированный синхронный/асинхронный дизайн предоставляет единый, последовательный API для различных случаев использования.
|
|
426
205
|
|
|
427
|
-
|
|
428
|
-
```typescript
|
|
429
|
-
// Когда не требуется гарантия порядка, используйте неупорядоченный коллектор для лучшей производительности
|
|
430
|
-
let highPerformance = data
|
|
431
|
-
.filter(predicate)
|
|
432
|
-
.map(mapper)
|
|
433
|
-
.toUnordered(); // Лучшая производительность
|
|
434
|
-
```
|
|
206
|
+
Это сравнение показывает, почему Semantic-TypeScript особенно хорошо подходит для современных TypeScript фронтенд-приложений, которые требуют производительности, типобезопасности и богатой аналитики без церемоний традиционных реактивных библиотек.
|
|
435
207
|
|
|
436
|
-
|
|
437
|
-
```typescript
|
|
438
|
-
// Когда необходимо сохранить порядок элементов, используйте упорядоченный коллектор
|
|
439
|
-
let ordered = data.sorted(comparator);
|
|
440
|
-
```
|
|
208
|
+
---
|
|
441
209
|
|
|
442
|
-
###
|
|
443
|
-
```typescript
|
|
444
|
-
// Когда требуются оконные операции
|
|
445
|
-
let windowed: WindowCollectable<number> = data
|
|
446
|
-
.toWindow()
|
|
447
|
-
.slide(5n, 2n); // Скользящее окно
|
|
448
|
-
```
|
|
210
|
+
### Готовы исследовать?
|
|
449
211
|
|
|
450
|
-
|
|
451
|
-
```typescript
|
|
452
|
-
// Когда требуется статистический анализ
|
|
453
|
-
let statistics: NumericStatistics<number> = data
|
|
454
|
-
.toNumericStatistics(); // Числовая статистика
|
|
212
|
+
Semantic-TypeScript превращает сложные потоки данных в читаемые, компонуемые и высокопроизводительные конвейеры. Обрабатываете ли вы события пользовательского интерфейса в реальном времени, обрабатываете большие наборы данных или создаёте аналитические панели — он предоставляет мощь индексирования уровня баз данных с элегантностью функционального программирования.
|
|
455
213
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
214
|
+
Следующие шаги:
|
|
215
|
+
|
|
216
|
+
• Изучите полностью типизированный API в своей IDE (все экспорты из основного пакета).
|
|
459
217
|
|
|
460
|
-
|
|
461
|
-
[NPMJS](https://www.npmjs.com/package/semantic-typescript)
|
|
218
|
+
• Присоединяйтесь к растущему сообществу разработчиков, которые заменили запутанные асинхронные итераторы чистыми Semantic-конвейерами.
|
|
462
219
|
|
|
463
|
-
|
|
220
|
+
Semantic-TypeScript — где потоки встречаются со структурой.
|
|
464
221
|
|
|
465
|
-
|
|
466
|
-
2. **Рассмотрение производительности**: Если не требуется гарантия порядка, предпочтение следует отдавать использованию `toUnordered()` для улучшения производительности.
|
|
467
|
-
3. **Использование памяти**: Операции сортировки требуют дополнительного пространства O(n).
|
|
468
|
-
4. **Реальное время**: Потоки Semantic подходят для обработки данных в реальном времени и поддерживают асинхронные источники данных.
|
|
222
|
+
Начните строить сегодня и ощутите разницу, которую приносит продуманное индексирование.
|
|
469
223
|
|
|
470
|
-
|
|
224
|
+
Стройте с ясностью, действуйте с уверенностью и преобразуйте данные осмысленно.
|