semantic-typescript 0.0.7 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/semantic.d.ts +22 -5
- package/dist/semantic.js +106 -52
- package/package.json +53 -8
- package/readme.cn.md +360 -269
- package/readme.de.md +356 -264
- package/readme.es.md +357 -264
- package/readme.fr.md +357 -264
- package/readme.jp.md +362 -270
- package/readme.kr.md +361 -269
- package/readme.md +361 -270
- package/readme.ru.md +428 -0
- package/readme.tw.md +354 -263
package/readme.de.md
CHANGED
|
@@ -1,335 +1,427 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Semantic-TypeScript Stream-Verarbeitungsbibliothek
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
Sie bietet komponierbare, funktional-programmierende Konstrukte zur Arbeit mit Collections, Streams und Sequenzen – inklusive Unterstützung für Sortieren, Filtern, Gruppieren, Statistik und mehr.
|
|
3
|
+
## Einführung
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
Semantic-TypeScript ist eine moderne Stream-Verarbeitungsbibliothek, die von JavaScript GeneratorFunction, Java Stream und MySQL Index inspiriert wurde. Der Kernentwurf der Bibliothek basiert auf der Erstellung effizienter Datenverarbeitungspipelines mittels Datenindizes, um TypeScript-Entwicklern eine typsichere, funktionale Stream-Verarbeitungserfahrung zu bieten.
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
Im Gegensatz zur traditionellen synchronen Verarbeitung verwendet Semantic einen asynchronen Verarbeitungsmodus. Beim Erstellen von Datenströmen hängt der Zeitpunkt des Datenempfangs vollständig davon ab, wann die Upstream-Quelle die `accept`- und `interrupt`-Callback-Funktionen aufruft. Dieser Entwurf ermöglicht der Bibliothek die elegante Verarbeitung von Echtzeit-Datenströmen, großen Datensätzen und asynchronen Datenquellen.
|
|
9
8
|
|
|
10
|
-
##
|
|
11
|
-
|
|
12
|
-
- ✅ Vollständig **typsichere Generics**
|
|
13
|
-
- ✅ **Funktionale Programmierung** (z. B. map, filter, reduce)
|
|
14
|
-
- ✅ **Semantische Datenströme** (`Semantic<E>`) für **Lazy Evaluation**
|
|
15
|
-
- ✅ **Collector** zum Umwandeln von Streams in konkrete Datenstrukturen
|
|
16
|
-
- ✅ **Sortierte und unsortierte Collectables** – `toUnordered()` ist **am schnellsten (kein Sortieren**
|
|
17
|
-
- ✅ **Sortieren** über `sorted()`, `toOrdered()`, Vergleichsfunktionen
|
|
18
|
-
- ✅ **Statistische Analyse** (`Statistics`, `NumericStatistics`, `BigIntStatistics`)
|
|
19
|
-
- ✅ **Optional<T>** – Monade für sicheres Arbeiten mit potenziell `null` oder `undefined`
|
|
20
|
-
- ✅ **Iteratoren & Generatoren** basiertes Design – ideal auch für große oder asynchrone Daten
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## 📦 Installation
|
|
9
|
+
## Installation
|
|
25
10
|
|
|
26
11
|
```bash
|
|
27
12
|
npm install semantic-typescript
|
|
28
13
|
```
|
|
29
14
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
|
41
|
-
|
|
42
|
-
| `
|
|
43
|
-
| `
|
|
44
|
-
| `
|
|
45
|
-
| `
|
|
46
|
-
| `
|
|
47
|
-
| `
|
|
48
|
-
| `
|
|
49
|
-
| `
|
|
50
|
-
| `
|
|
51
|
-
| `
|
|
52
|
-
|
|
53
|
-
|
|
15
|
+
## Grundlegende Typen
|
|
16
|
+
|
|
17
|
+
| Typ | Beschreibung |
|
|
18
|
+
|-----|-------------|
|
|
19
|
+
| `Invalid<T>` | Typ, der null oder undefined erweitert |
|
|
20
|
+
| `Valid<T>` | Typ, der null und undefined ausschließt |
|
|
21
|
+
| `MaybeInvalid<T>` | Typ, der null oder undefined sein kann |
|
|
22
|
+
| `Primitive` | Sammlung primitiver Typen |
|
|
23
|
+
| `MaybePrimitive<T>` | Typ, der ein Primitiv sein kann |
|
|
24
|
+
| `OptionalSymbol` | Symbolkennung für die Optional-Klasse |
|
|
25
|
+
| `SemanticSymbol` | Symbolkennung für die Semantic-Klasse |
|
|
26
|
+
| `CollectorsSymbol` | Symbolkennung für die Collector-Klasse |
|
|
27
|
+
| `CollectableSymbol` | Symbolkennung für die Collectable-Klasse |
|
|
28
|
+
| `OrderedCollectableSymbol` | Symbolkennung für die OrderedCollectable-Klasse |
|
|
29
|
+
| `WindowCollectableSymbol` | Symbolkennung für die WindowCollectable-Klasse |
|
|
30
|
+
| `StatisticsSymbol` | Symbolkennung für die Statistics-Klasse |
|
|
31
|
+
| `NumericStatisticsSymbol` | Symbolkennung für die NumericStatistics-Klasse |
|
|
32
|
+
| `BigIntStatisticsSymbol` | Symbolkennung für die BigIntStatistics-Klasse |
|
|
33
|
+
| `UnorderedCollectableSymbol` | Symbolkennung für die UnorderedCollectable-Klasse |
|
|
34
|
+
| `Runnable` | Funktion ohne Parameter und Rückgabewert |
|
|
35
|
+
| `Supplier<R>` | Funktion ohne Parameter, die R zurückgibt |
|
|
36
|
+
| `Functional<T, R>` | Ein-Parameter-Transformationsfunktion |
|
|
37
|
+
| `Predicate<T>` | Ein-Parameter-Prüffunktion |
|
|
38
|
+
| `BiFunctional<T, U, R>` | Zwei-Parameter-Transformationsfunktion |
|
|
39
|
+
| `BiPredicate<T, U>` | Zwei-Parameter-Prüffunktion |
|
|
40
|
+
| `Comparator<T>` | Vergleichsfunktion |
|
|
41
|
+
| `TriFunctional<T, U, V, R>` | Drei-Parameter-Transformationsfunktion |
|
|
42
|
+
| `Consumer<T>` | Ein-Parameter-Consumer-Funktion |
|
|
43
|
+
| `BiConsumer<T, U>` | Zwei-Parameter-Consumer-Funktion |
|
|
44
|
+
| `TriConsumer<T, U, V>` | Drei-Parameter-Consumer-Funktion |
|
|
45
|
+
| `Generator<T>` | Generatorfunktion |
|
|
54
46
|
|
|
55
47
|
```typescript
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
const opt = Optional.ofNullable(value);
|
|
61
|
-
|
|
62
|
-
const result = opt
|
|
63
|
-
.filter(v => v > 5)
|
|
64
|
-
.map(v => v * 2)
|
|
65
|
-
.getOrDefault(0);
|
|
66
|
-
|
|
67
|
-
console.log(result); // 20 oder 0
|
|
48
|
+
// Typverwendungsbeispiele
|
|
49
|
+
const predicate: Predicate<number> = (n) => n > 0;
|
|
50
|
+
const mapper: Functional<string, number> = (str) => str.length;
|
|
51
|
+
const comparator: Comparator<number> = (a, b) => a - b;
|
|
68
52
|
```
|
|
69
53
|
|
|
70
|
-
|
|
54
|
+
## Typwächter (Type Guards)
|
|
55
|
+
|
|
56
|
+
| Funktion | Beschreibung | Zeitkomplexität | Raumkomplexität |
|
|
57
|
+
|----------|-------------|-----------------|-----------------|
|
|
58
|
+
| `validate<T>(t: MaybeInvalid<T>): t is T` | Prüft, ob Wert nicht null oder undefined | O(1) | O(1) |
|
|
59
|
+
| `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | Prüft, ob Wert null oder undefined | O(1) | O(1) |
|
|
60
|
+
| `isBoolean(t: unknown): t is boolean` | Prüft auf Boolean | O(1) | O(1) |
|
|
61
|
+
| `isString(t: unknown): t is string` | Prüft auf String | O(1) | O(1) |
|
|
62
|
+
| `isNumber(t: unknown): t is number` | Prüft auf Number | O(1) | O(1) |
|
|
63
|
+
| `isFunction(t: unknown): t is Function` | Prüft auf Function | O(1) | O(1) |
|
|
64
|
+
| `isObject(t: unknown): t is object` | Prüft auf Object | O(1) | O(1) |
|
|
65
|
+
| `isSymbol(t: unknown): t is symbol` | Prüft auf Symbol | O(1) | O(1) |
|
|
66
|
+
| `isBigint(t: unknown): t is bigint` | Prüft auf BigInt | O(1) | O(1) |
|
|
67
|
+
| `isPrimitive(t: unknown): t is Primitive` | Prüft auf Primitivtyp | O(1) | O(1) |
|
|
68
|
+
| `isIterable(t: unknown): t is Iterable<unknown>` | Prüft auf Iterierbarkeit | O(1) | O(1) |
|
|
69
|
+
| `isOptional(t: unknown): t is Optional<unknown>` | Prüft auf Optional-Instanz | O(1) | O(1) |
|
|
70
|
+
| `isSemantic(t: unknown): t is Semantic<unknown>` | Prüft auf Semantic-Instanz | O(1) | O(1) |
|
|
71
|
+
| `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Prüft auf Collector-Instanz | O(1) | O(1) |
|
|
72
|
+
| `isCollectable(t: unknown): t is Collectable<unknown>` | Prüft auf Collectable-Instanz | O(1) | O(1) |
|
|
73
|
+
| `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | Prüft auf OrderedCollectable-Instanz | O(1) | O(1) |
|
|
74
|
+
| `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | Prüft auf WindowCollectable-Instanz | O(1) | O(1) |
|
|
75
|
+
| `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | Prüft auf UnorderedCollectable-Instanz | O(1) | O(1) |
|
|
76
|
+
| `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Prüft auf Statistics-Instanz | O(1) | O(1) |
|
|
77
|
+
| `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | Prüft auf NumericStatistics-Instanz | O(1) | O(1) |
|
|
78
|
+
| `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | Prüft auf BigIntStatistics-Instanz | O(1) | O(1) |
|
|
71
79
|
|
|
72
|
-
|
|
80
|
+
```typescript
|
|
81
|
+
// Typwächter-Verwendungsbeispiele
|
|
82
|
+
const value: unknown = "hello";
|
|
73
83
|
|
|
74
|
-
|
|
84
|
+
if (isString(value)) {
|
|
85
|
+
console.log(value.length); // Typsicher, value wird als string inferiert
|
|
86
|
+
}
|
|
75
87
|
|
|
76
|
-
|
|
88
|
+
if (isOptional(someValue)) {
|
|
89
|
+
someValue.ifPresent(val => console.log(val));
|
|
90
|
+
}
|
|
91
|
+
```
|
|
77
92
|
|
|
78
|
-
|
|
93
|
+
## Hilfsfunktionen
|
|
79
94
|
|
|
80
|
-
| Funktion | Beschreibung |
|
|
81
|
-
|
|
82
|
-
| `
|
|
83
|
-
| `
|
|
84
|
-
| `fill(element, count)` | Einen Wert N-mal wiederholen | `fill('a', 3n)` |
|
|
85
|
-
| `iterate(gen)` | Benutzerdefinierten Generator verwenden | `iterate(genFn)` |
|
|
95
|
+
| Funktion | Beschreibung | Zeitkomplexität | Raumkomplexität |
|
|
96
|
+
|----------|-------------|-----------------|-----------------|
|
|
97
|
+
| `useCompare<T>(t1: T, t2: T): number` | Allgemeine Vergleichsfunktion | O(1) | O(1) |
|
|
98
|
+
| `useRandom<T = number \| bigint>(index: T): T` | Pseudozufallszahlengenerator | O(log n) | O(1) |
|
|
86
99
|
|
|
87
|
-
|
|
100
|
+
```typescript
|
|
101
|
+
// Hilfsfunktions-Verwendungsbeispiele
|
|
102
|
+
const numbers = [3, 1, 4, 1, 5];
|
|
103
|
+
numbers.sort(useCompare); // [1, 1, 3, 4, 5]
|
|
88
104
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
| `filter(fn)` | Nur Elemente behalten, die den Prädikat erfüllen | `.filter(x => x > 10)` |
|
|
93
|
-
| `limit(n)` | Maximale Anzahl von N Elementen | `.limit(5)` |
|
|
94
|
-
| `skip(n)` | Erste N Elemente überspringen | `.skip(2)` |
|
|
95
|
-
| `distinct()` | Duplikate entfernen (nutzt intern Set) | `.distinct()` |
|
|
96
|
-
| `sorted()` | Elemente sortieren (natürliche Reihenfolge) | `.sorted()` |
|
|
97
|
-
| `sorted(comparator)` | Mit benutzerdefinierter Sortierfunktion | `.sorted((a, b) => a - b)` |
|
|
98
|
-
| `toOrdered()` | Sortieren und `OrderedCollectable` zurückgeben | `.toOrdered()` |
|
|
99
|
-
| `toUnordered()` | **Keine Sortierung** – schnellster Weg | `.toUnordered()` ✅ |
|
|
100
|
-
| `collect(collector)` | Mit einem Collector aggregieren | `.collect(Collector.full(...))` |
|
|
101
|
-
| `toArray()` | In Array umwandeln | `.toArray()` |
|
|
102
|
-
| `toSet()` | In Set umwandeln | `.toSet()` |
|
|
103
|
-
| `toMap(keyFn, valFn)` | In Map umwandeln | `.toMap(x => x.id, x => x)` |
|
|
105
|
+
const randomNum = useRandom(42); // Seed-basierte Zufallszahl
|
|
106
|
+
const randomBigInt = useRandom(1000n); // BigInt-Zufallszahl
|
|
107
|
+
```
|
|
104
108
|
|
|
105
|
-
|
|
109
|
+
## Fabrikmethoden
|
|
106
110
|
|
|
107
|
-
###
|
|
111
|
+
### Optional-Fabrikmethoden
|
|
108
112
|
|
|
109
|
-
|
|
113
|
+
| Methode | Beschreibung | Zeitkomplexität | Raumkomplexität |
|
|
114
|
+
|---------|-------------|-----------------|-----------------|
|
|
115
|
+
| `Optional.empty<T>()` | Erstellt leeres Optional | O(1) | O(1) |
|
|
116
|
+
| `Optional.of<T>(value)` | Erstellt Optional mit Wert | O(1) | O(1) |
|
|
117
|
+
| `Optional.ofNullable<T>(value)` | Erstellt Optional, das null sein kann | O(1) | O(1) |
|
|
118
|
+
| `Optional.ofNonNull<T>(value)` | Erstellt nicht-null Optional | O(1) | O(1) |
|
|
110
119
|
|
|
111
120
|
```typescript
|
|
112
|
-
|
|
121
|
+
// Optional-Verwendungsbeispiele
|
|
122
|
+
const emptyOpt = Optional.empty<number>();
|
|
123
|
+
const presentOpt = Optional.of(42);
|
|
124
|
+
const nullableOpt = Optional.ofNullable<string>(null);
|
|
125
|
+
const nonNullOpt = Optional.ofNonNull("hello");
|
|
126
|
+
|
|
127
|
+
presentOpt.ifPresent(val => console.log(val)); // Gibt 42 aus
|
|
128
|
+
console.log(emptyOpt.orElse(100)); // Gibt 100 aus
|
|
113
129
|
```
|
|
114
130
|
|
|
115
|
-
|
|
116
|
-
Idealerweise bei irrelevanter Reihenfolge und maximalem Performancebedarf.
|
|
117
|
-
|
|
118
|
-
---
|
|
131
|
+
### Collector-Fabrikmethoden
|
|
119
132
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
133
|
+
| Methode | Beschreibung | Zeitkomplexität | Raumkomplexität |
|
|
134
|
+
|---------|-------------|-----------------|-----------------|
|
|
135
|
+
| `Collector.full(identity, accumulator, finisher)` | Erstellt vollständigen Collector | O(1) | O(1) |
|
|
136
|
+
| `Collector.shortable(identity, interruptor, accumulator, finisher)` | Erstellt unterbrechbaren Collector | O(1) | O(1) |
|
|
123
137
|
|
|
124
138
|
```typescript
|
|
125
|
-
|
|
126
|
-
const
|
|
127
|
-
|
|
139
|
+
// Collector-Verwendungsbeispiele
|
|
140
|
+
const sumCollector = Collector.full(
|
|
141
|
+
() => 0,
|
|
142
|
+
(sum, num) => sum + num,
|
|
143
|
+
result => result
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
const numbers = from([1, 2, 3, 4, 5]);
|
|
147
|
+
const total = numbers.toUnoredered().collect(sumCollector); // 15
|
|
128
148
|
```
|
|
129
149
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
---
|
|
150
|
+
### Semantic-Fabrikmethoden
|
|
133
151
|
|
|
134
|
-
|
|
152
|
+
| Methode | Beschreibung | Zeitkomplexität | Raumkomplexität |
|
|
153
|
+
|---------|--------------|-----------------|-----------------|
|
|
154
|
+
| `blob(blob, chunkSize)` | Erzeugt Stream aus Blob | O(n) | O(chunkSize) |
|
|
155
|
+
| `empty<E>()` | Erzeugt leeren Stream | O(1) | O(1) |
|
|
156
|
+
| `fill<E>(element, count)` | Erzeugt gefüllten Stream | O(n) | O(1) |
|
|
157
|
+
| `from<E>(iterable)` | Erzeugt Stream aus iterierbarem Objekt | O(1) | O(1) |
|
|
158
|
+
| `interval(period, delay?)` | Erzeugt regelmäßigen Intervall-Stream | O(1)* | O(1) |
|
|
159
|
+
| `iterate<E>(generator)` | Erzeugt Stream aus Generator | O(1) | O(1) |
|
|
160
|
+
| `range(start, end, step)` | Erzeugt numerischen Bereichs-Stream | O(n) | O(1) |
|
|
161
|
+
| `websocket(websocket)` | Erzeugt Stream aus WebSocket | O(1) | O(1) |
|
|
135
162
|
|
|
136
|
-
|
|
163
|
+
```typescript
|
|
164
|
+
// Beispiel zur Verwendung der Semantic-Fabrikmethoden
|
|
165
|
+
|
|
166
|
+
// Stream aus Blob erzeugen (chunkweises Lesen)
|
|
167
|
+
blob(someBlob, 1024n)
|
|
168
|
+
.toUnordered()
|
|
169
|
+
.write(WritableStream)
|
|
170
|
+
.then(callback) // Stream-Schreibvorgang erfolgreich
|
|
171
|
+
.catch(writeFi); // Stream-Schreibvorgang fehlgeschlagen
|
|
172
|
+
|
|
173
|
+
// Leeren Stream erzeugen, der erst nach Verknüpfung mit anderen Streams ausgeführt wird
|
|
174
|
+
empty<string>()
|
|
175
|
+
.toUnordered()
|
|
176
|
+
.join(); //[]
|
|
177
|
+
|
|
178
|
+
// Gefüllten Stream erzeugen
|
|
179
|
+
const filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
180
|
+
|
|
181
|
+
// Zeitgesteuerten Stream mit 2 Sekunden anfänglicher Verzögerung und 5 Sekunden Zyklus erzeugen,
|
|
182
|
+
// implementiert über Timer-Mechanismus, mögliche Zeitabweichungen aufgrund von System-Schedulereinschränkungen.
|
|
183
|
+
const intervalStream = interval(5000, 2000);
|
|
184
|
+
|
|
185
|
+
// Stream aus iterierbarem Objekt erzeugen
|
|
186
|
+
const numberStream = from([1, 2, 3, 4, 5]);
|
|
187
|
+
const stringStream = from(new Set(["Alex", "Bob"]));
|
|
188
|
+
|
|
189
|
+
// Bereichs-Stream erzeugen
|
|
190
|
+
const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
191
|
+
|
|
192
|
+
// WebSocket-Ereignisstream
|
|
193
|
+
const ws = new WebSocket("ws://localhost:8080");
|
|
194
|
+
websocket(ws)
|
|
195
|
+
.filter((event)=> event.type === "message") // Nur Nachrichtenereignisse überwachen
|
|
196
|
+
.toUnordered() // Für Ereignisse normalerweise ungeordnet
|
|
197
|
+
.forEach((event)=> receive(event)); // Nachrichten empfangen
|
|
198
|
+
```
|
|
137
199
|
|
|
138
|
-
|
|
200
|
+
## Semantic-Klassenmethoden
|
|
201
|
+
|
|
202
|
+
| Methode | Beschreibung | Zeitkomplexität | Raumkomplexität |
|
|
203
|
+
|---------|-------------|-----------------|-----------------|
|
|
204
|
+
| `concat(other)` | Verbindet zwei Streams | O(n) | O(1) |
|
|
205
|
+
| `distinct()` | Entfernt Duplikate | O(n) | O(n) |
|
|
206
|
+
| `distinct(comparator)` | Entfernt Duplikate mit Comparator | O(n²) | O(n) |
|
|
207
|
+
| `dropWhile(predicate)` | Verwirft Elemente, die Prädikat erfüllen | O(n) | O(1) |
|
|
208
|
+
| `filter(predicate)` | Filtert Elemente | O(n) | O(1) |
|
|
209
|
+
| `flat(mapper)` | Flache Abbildung | O(n × m) | O(1) |
|
|
210
|
+
| `flatMap(mapper)` | Flache Abbildung auf neuen Typ | O(n × m) | O(1) |
|
|
211
|
+
| `limit(n)` | Begrenzt Elementanzahl | O(n) | O(1) |
|
|
212
|
+
| `map(mapper)` | Transformationsabbildung | O(n) | O(1) |
|
|
213
|
+
| `peek(consumer)` | Zeigt Elemente an | O(n) | O(1) |
|
|
214
|
+
| `redirect(redirector)` | Index-Umleitung | O(n) | O(1) |
|
|
215
|
+
| `reverse()` | Kehrt Stream um | O(n) | O(1) |
|
|
216
|
+
| `shuffle()` | Zufällige Neuanordnung | O(n) | O(1) |
|
|
217
|
+
| `shuffle(mapper)` | Neuanordnung mit Mapper | O(n) | O(1) |
|
|
218
|
+
| `skip(n)` | Überspringt erste n Elemente | O(n) | O(1) |
|
|
219
|
+
| `sorted()` | Sortiert | O(n log n) | O(n) |
|
|
220
|
+
| `sorted(comparator)` | Sortiert mit Comparator | O(n log n) | O(n) |
|
|
221
|
+
| `sub(start, end)` | Erstellt Substream | O(n) | O(1) |
|
|
222
|
+
| `takeWhile(predicate)` | Nimmt Elemente, die Prädikat erfüllen | O(n) | O(1) |
|
|
223
|
+
| `translate(offset)` | Index-Translation | O(n) | O(1) |
|
|
224
|
+
| `translate(translator)` | Index-Translation mit Translator | O(n) | O(1) |
|
|
139
225
|
|
|
140
226
|
```typescript
|
|
141
|
-
|
|
142
|
-
|
|
227
|
+
// Semantic-Operationsbeispiele
|
|
228
|
+
const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
229
|
+
.filter(n => n % 2 === 0) // Filtert gerade Zahlen
|
|
230
|
+
.map(n => n * 2) // Multipliziert mit 2
|
|
231
|
+
.skip(1) // Überspringt erstes Element
|
|
232
|
+
.limit(3) // Begrenzt auf 3 Elemente
|
|
233
|
+
.toArray(); // Konvertiert zu Array
|
|
234
|
+
// Ergebnis: [8, 12, 20]
|
|
235
|
+
|
|
236
|
+
// Komplexe Operationsbeispiele
|
|
237
|
+
const complexResult = range(1, 100, 1)
|
|
238
|
+
.flatMap(n => from([n, n * 2])) // Abbildet jedes Element zu zwei Elementen
|
|
239
|
+
.distinct() // Entfernt Duplikate
|
|
240
|
+
.shuffle() // Mischt zufällig
|
|
241
|
+
.takeWhile(n => n < 50) // Nimmt Elemente < 50
|
|
242
|
+
.toOrdered() // Konvertiert zu geordnetem Collector
|
|
243
|
+
.toArray(); // Konvertiert zu Array
|
|
143
244
|
```
|
|
144
245
|
|
|
145
|
-
|
|
246
|
+
## Collector-Transformationsmethoden
|
|
146
247
|
|
|
147
|
-
|
|
248
|
+
| Methode | Beschreibung | Zeitkomplexität | Raumkomplexität |
|
|
249
|
+
|---------|-------------|-----------------|-----------------|
|
|
250
|
+
| `toUnoredered()` | Konvertiert zu ungeordnetem Collector (Leistungspriorität) | O(1) | O(1) |
|
|
251
|
+
| `toOrdered()` | Konvertiert zu geordnetem Collector | O(1) | O(1) |
|
|
252
|
+
| `sorted()` | Sortiert und konvertiert zu geordnetem Collector | O(n log n) | O(n) |
|
|
253
|
+
| `toWindow()` | Konvertiert zu Fenster-Collector | O(1) | O(1) |
|
|
254
|
+
| `toNumericStatistics()` | Konvertiert zu numerischer Statistik | O(1) | O(1) |
|
|
255
|
+
| `toBigintStatistics()` | Konvertiert zu BigInt-Statistik | O(1) | O(1) |
|
|
148
256
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
257
|
+
```typescript
|
|
258
|
+
// Collector-Transformationsbeispiele
|
|
259
|
+
const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
|
|
152
260
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
261
|
+
// Leistungspriorität: Ungeordneten Collector verwenden
|
|
262
|
+
const unordered = numbers
|
|
263
|
+
.filter(n => n > 3)
|
|
264
|
+
.toUnoredered();
|
|
157
265
|
|
|
158
|
-
|
|
266
|
+
// Sortierung benötigt: Geordneten Collector verwenden
|
|
267
|
+
const ordered = numbers.sorted();
|
|
159
268
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
| `toArray()` | In Array umwandeln | `.toArray()` |
|
|
164
|
-
| `toSet()` | In Set umwandeln | `.toSet()` |
|
|
165
|
-
| `toMap(k, v)` | In Map umwandeln | `.toMap(x => x.id, x => x)` |
|
|
166
|
-
| `group(k)` | Nach Schlüssel gruppieren | `.group(x => x.category)` |
|
|
167
|
-
| `findAny()` | Beliebiges passendes Element (Optional) | `.findAny()` |
|
|
168
|
-
| `findFirst()` | Erstes Element (Optional) | `.findFirst()` |
|
|
169
|
-
| `reduce(...)` | Benutzerdefiniertes Reduzieren | `.reduce((a,b) => a + b, 0)` |
|
|
269
|
+
// Statistische Analyse: Statistik-Collector verwenden
|
|
270
|
+
const stats = numbers
|
|
271
|
+
.toNumericStatistics();
|
|
170
272
|
|
|
171
|
-
|
|
273
|
+
console.log(stats.mean()); // Durchschnitt
|
|
274
|
+
console.log(stats.median()); // Median
|
|
275
|
+
console.log(stats.standardDeviation()); // Standardabweichung
|
|
172
276
|
|
|
173
|
-
|
|
277
|
+
// Fensteroperationen
|
|
278
|
+
const windowed = numbers
|
|
279
|
+
.toWindow()
|
|
280
|
+
.tumble(3n); // Fenster mit je 3 Elementen
|
|
174
281
|
|
|
175
|
-
|
|
282
|
+
windowed.forEach(window => {
|
|
283
|
+
console.log(window.toArray()); // Inhalt jedes Fensters
|
|
284
|
+
});
|
|
285
|
+
```
|
|
176
286
|
|
|
177
|
-
|
|
287
|
+
## Collectable-Sammelmethoden
|
|
288
|
+
|
|
289
|
+
| Methode | Beschreibung | Zeitkomplexität | Raumkomplexität |
|
|
290
|
+
|---------|-------------|-----------------|-----------------|
|
|
291
|
+
| `anyMatch(predicate)` | Prüft auf existierende Übereinstimmung | O(n) | O(1) |
|
|
292
|
+
| `allMatch(predicate)` | Prüft auf vollständige Übereinstimmung | O(n) | O(1) |
|
|
293
|
+
| `count()` | Elementzählung | O(n) | O(1) |
|
|
294
|
+
| `isEmpty()` | Prüft auf Leerheit | O(1) | O(1) |
|
|
295
|
+
| `findAny()` | Findet beliebiges Element | O(n) | O(1) |
|
|
296
|
+
| `findFirst()` | Findet erstes Element | O(n) | O(1) |
|
|
297
|
+
| `findLast()` | Findet letztes Element | O(n) | O(1) |
|
|
298
|
+
| `forEach(action)` | Iteriert über alle Elemente | O(n) | O(1) |
|
|
299
|
+
| `group(classifier)` | Gruppiert nach Klassifikator | O(n) | O(n) |
|
|
300
|
+
| `groupBy(keyExtractor, valueExtractor)` | Gruppiert nach Schlüssel-Wert-Extraktor | O(n) | O(n) |
|
|
301
|
+
| `join()` | Verbindet zu String | O(n) | O(n) |
|
|
302
|
+
| `join(delimiter)` | Verbindet mit Trennzeichen | O(n) | O(n) |
|
|
303
|
+
| `nonMatch(predicate)` | Prüft auf keine Übereinstimmung | O(n) | O(1) |
|
|
304
|
+
| `partition(count)` | Partitioniert nach Anzahl | O(n) | O(n) |
|
|
305
|
+
| `partitionBy(classifier)` | Partitioniert nach Klassifikator | O(n) | O(n) |
|
|
306
|
+
| `reduce(accumulator)` | Reduktionsoperation | O(n) | O(1) |
|
|
307
|
+
| `reduce(identity, accumulator)` | Reduktion mit Initialwert | O(n) | O(1) |
|
|
308
|
+
| `toArray()` | Konvertiert zu Array | O(n) | O(n) |
|
|
309
|
+
| `toMap(keyExtractor, valueExtractor)` | Konvertiert zu Map | O(n) | O(n) |
|
|
310
|
+
| `toSet()` | Konvertiert zu Set | O(n) | O(n) |
|
|
311
|
+
| `write(stream)` | Schreibt in Stream | O(n) | O(1) |
|
|
178
312
|
|
|
179
313
|
```typescript
|
|
180
|
-
|
|
181
|
-
const
|
|
314
|
+
// Collectable-Operationsbeispiele
|
|
315
|
+
const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
316
|
+
.filter(n => n % 2 === 0)
|
|
317
|
+
.toOrdered();
|
|
318
|
+
|
|
319
|
+
// Übereinstimmungsprüfungen
|
|
320
|
+
console.log(data.anyMatch(n => n > 5)); // true
|
|
321
|
+
console.log(data.allMatch(n => n < 20)); // true
|
|
322
|
+
|
|
323
|
+
// Suchoperationen
|
|
324
|
+
data.findFirst().ifPresent(n => console.log(n)); // 2
|
|
325
|
+
data.findAny().ifPresent(n => console.log(n)); // Beliebiges Element
|
|
326
|
+
|
|
327
|
+
// Gruppierungsoperationen
|
|
328
|
+
const grouped = data.groupBy(
|
|
329
|
+
n => n > 5 ? "large" : "small",
|
|
330
|
+
n => n * 2
|
|
331
|
+
);
|
|
332
|
+
// {small: [4, 8], large: [12, 16, 20]}
|
|
333
|
+
|
|
334
|
+
// Reduktionsoperationen
|
|
335
|
+
const sum = data.reduce(0, (acc, n) => acc + n); // 30
|
|
336
|
+
|
|
337
|
+
// Ausgabeoperationen
|
|
338
|
+
data.join(", "); // "2, 4, 6, 8, 10"
|
|
182
339
|
```
|
|
183
340
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
341
|
+
## Statistische Analysemethoden
|
|
342
|
+
|
|
343
|
+
### NumericStatistics-Methoden
|
|
344
|
+
|
|
345
|
+
| Methode | Beschreibung | Zeitkomplexität | Raumkomplexität |
|
|
346
|
+
|---------|-------------|-----------------|-----------------|
|
|
347
|
+
| `range()` | Spannweite | O(n) | O(1) |
|
|
348
|
+
| `variance()` | Varianz | O(n) | O(1) |
|
|
349
|
+
| `standardDeviation()` | Standardabweichung | O(n) | O(1) |
|
|
350
|
+
| `mean()` | Mittelwert | O(n) | O(1) |
|
|
351
|
+
| `median()` | Median | O(n log n) | O(n) |
|
|
352
|
+
| `mode()` | Modus | O(n) | O(n) |
|
|
353
|
+
| `frequency()` | Häufigkeitsverteilung | O(n) | O(n) |
|
|
354
|
+
| `summate()` | Summierung | O(n) | O(1) |
|
|
355
|
+
| `quantile(quantile)` | Quantil | O(n log n) | O(n) |
|
|
356
|
+
| `interquartileRange()` | Interquartilsabstand | O(n log n) | O(n) |
|
|
357
|
+
| `skewness()` | Schiefe | O(n) | O(1) |
|
|
358
|
+
| `kurtosis()` | Wölbung | O(n) | O(1) |
|
|
191
359
|
|
|
192
360
|
```typescript
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
361
|
+
// Statistische Analysebeispiele
|
|
362
|
+
const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
363
|
+
.toNumericStatistics();
|
|
364
|
+
|
|
365
|
+
console.log("Mittelwert:", numbers.mean()); // 5.5
|
|
366
|
+
console.log("Median:", numbers.median()); // 5.5
|
|
367
|
+
console.log("Standardabweichung:", numbers.standardDeviation()); // ~2.87
|
|
368
|
+
console.log("Summe:", numbers.summate()); // 55
|
|
369
|
+
|
|
370
|
+
// Statistische Analyse mit Mapper
|
|
371
|
+
const objects = from([
|
|
372
|
+
{ value: 10 },
|
|
373
|
+
{ value: 20 },
|
|
374
|
+
{ value: 30 }
|
|
375
|
+
]).toNumericStatistics();
|
|
376
|
+
|
|
377
|
+
console.log("Gemappter Mittelwert:", objects.mean(obj => obj.value)); // 20
|
|
196
378
|
```
|
|
197
379
|
|
|
198
|
-
|
|
199
|
-
✅ **Beste Performance, wenn Reihenfolge keine Rolle spielt**
|
|
200
|
-
|
|
201
|
-
---
|
|
202
|
-
|
|
203
|
-
### 9. `Statistics<E, D>` – Statistische Analyse
|
|
204
|
-
|
|
205
|
-
Abstrakte Basisklasse zur Analyse numerischer Daten.
|
|
206
|
-
|
|
207
|
-
#### Unterklassen:
|
|
208
|
-
|
|
209
|
-
- `NumericStatistics<E>` – Für `number`-Werte
|
|
210
|
-
- `BigIntStatistics<E>` – Für `bigint`-Werte
|
|
211
|
-
|
|
212
|
-
##### Häufig verwendete statistische Methoden:
|
|
213
|
-
|
|
214
|
-
| Methode | Beschreibung | Beispiel |
|
|
215
|
-
|--------|-------------|---------|
|
|
216
|
-
| `mean()` | Mittelwert | `.mean()` |
|
|
217
|
-
| `median()` | Median | `.median()` |
|
|
218
|
-
| `mode()` | Modalwert (häufigster Wert) | `.mode()` |
|
|
219
|
-
| `minimum()` | Minimum | `.minimum()` |
|
|
220
|
-
| `maximum()` | Maximum | `.maximum()` |
|
|
221
|
-
| `range()` | Maximum − Minimum | `.range()` |
|
|
222
|
-
| `variance()` | Varianz | `.variance()` |
|
|
223
|
-
| `standardDeviation()` | Standardabweichung | `.standardDeviation()` |
|
|
224
|
-
| `summate()` | Summe aller Werte | `.summate()` |
|
|
225
|
-
| `quantile(q)` | Quantil bei q (0–1) | `.quantile(0.5)` → Median |
|
|
226
|
-
| `frequency()` | Häufigkeit als Map | `.frequency()` |
|
|
227
|
-
|
|
228
|
-
---
|
|
229
|
-
|
|
230
|
-
## 🧪 Vollständiges Beispiel
|
|
380
|
+
## Leistungsauswahlleitfaden
|
|
231
381
|
|
|
382
|
+
### Ungeordneten Collector wählen (Leistungspriorität)
|
|
232
383
|
```typescript
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
// 🚀 Schnellster Weg: keine Sortierung
|
|
239
|
-
const fastest = numbers.toUnordered();
|
|
240
|
-
console.log(fastest.toArray()); // z.B. [10, 2, 8, 4, 5, 6] (wie eingegeben)
|
|
241
|
-
|
|
242
|
-
// 🔢 Natürlich sortiert
|
|
243
|
-
const ordered = numbers.sorted();
|
|
244
|
-
console.log(ordered.toArray()); // [2, 4, 5, 6, 8, 10]
|
|
245
|
-
|
|
246
|
-
// 📊 Statistik auswerten
|
|
247
|
-
const stats = new NumericStatistics(numbers);
|
|
248
|
-
console.log('Mittelwert:', stats.mean());
|
|
249
|
-
console.log('Median:', stats.median());
|
|
250
|
-
console.log('Modalwert:', stats.mode());
|
|
251
|
-
console.log('Bereich:', stats.range());
|
|
252
|
-
console.log('Standardabweichung:', stats.standardDeviation());
|
|
384
|
+
// Wenn keine Reihenfolgegarantie benötigt wird
|
|
385
|
+
const highPerformance = data
|
|
386
|
+
.filter(predicate)
|
|
387
|
+
.map(mapper)
|
|
388
|
+
.toUnoredered(); // Beste Leistung
|
|
253
389
|
```
|
|
254
390
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
## 🛠️ Hilfsfunktionen
|
|
258
|
-
|
|
259
|
-
Die Bibliothek exportiert auch zahlreiche **Typ-Guards** und **Vergleichsfunktionen**:
|
|
260
|
-
|
|
261
|
-
| Funktion | Zweck |
|
|
262
|
-
|----------|-------|
|
|
263
|
-
| `isString(x)` | Typ-Guard für `string` |
|
|
264
|
-
| `isNumber(x)` | Typ-Guard für `number` |
|
|
265
|
-
| `isBoolean(x)` | Typ-Guard für `boolean` |
|
|
266
|
-
| `isIterable(x)` | Prüft, ob ein Objekt iterierbar ist |
|
|
267
|
-
| `useCompare(a, b)` | Universelle Vergleichsfunktion |
|
|
268
|
-
| `useRandom(x)` | Pseudo-Zufallszahlengenerator (spielerisch) |
|
|
269
|
-
|
|
270
|
-
---
|
|
271
|
-
|
|
272
|
-
## 🧩 Erweitert: Eigene Generatoren & Fenster
|
|
273
|
-
|
|
274
|
-
Sie können eigene **Generatoren** für kontrollierte oder unendliche Datenströme erstellen:
|
|
275
|
-
|
|
391
|
+
### Geordneten Collector wählen (Reihenfolge benötigt)
|
|
276
392
|
```typescript
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
}
|
|
282
|
-
};
|
|
283
|
-
|
|
284
|
-
const s = new Semantic(gen);
|
|
393
|
+
// Wenn Elementreihenfolge beibehalten werden muss
|
|
394
|
+
const ordered = data
|
|
395
|
+
.sorted(comparator) // Sortierung überschreibt Umleitungseffekte
|
|
396
|
+
.toOrdered(); // Beibehaltung der Reihenfolge
|
|
285
397
|
```
|
|
286
398
|
|
|
287
|
-
|
|
288
|
-
|
|
399
|
+
### Fenster-Collector wählen (Fensteroperationen)
|
|
289
400
|
```typescript
|
|
290
|
-
|
|
401
|
+
// Bei Fensteroperationsbedarf
|
|
402
|
+
const windowed = data
|
|
403
|
+
.toWindow()
|
|
404
|
+
.slide(5n, 2n); // Gleitendes Fenster
|
|
291
405
|
```
|
|
292
406
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
---
|
|
300
|
-
|
|
301
|
-
## 🙌 Mitwirken
|
|
302
|
-
|
|
303
|
-
Pull Requests, Issues und Ideen sind willkommen!
|
|
304
|
-
|
|
305
|
-
---
|
|
306
|
-
|
|
307
|
-
## 🚀 Schnellstart-Zusammenfassung
|
|
308
|
-
|
|
309
|
-
| Aufgabe | Methode |
|
|
310
|
-
|--------|---------|
|
|
311
|
-
| Null-sicheres Arbeiten | `Optional<T>` |
|
|
312
|
-
| Stream erstellen | `from([...])`, `range()`, `fill()` |
|
|
313
|
-
| Daten transformieren | `map()`, `filter()` |
|
|
314
|
-
| Daten sortieren | `sorted()`, `toOrdered()` |
|
|
315
|
-
| Keine Sortierung (schnell) | `toUnordered()` ✅ |
|
|
316
|
-
| Gruppieren / Aggregieren | `toMap()`, `group()`, `Collector` |
|
|
317
|
-
| Statistik | `NumericStatistics`, `mean()`, `median()` usw. |
|
|
318
|
-
|
|
319
|
-
---
|
|
320
|
-
|
|
321
|
-
## 🔗 Links
|
|
407
|
+
### Statistische Analyse wählen (Numerische Berechnungen)
|
|
408
|
+
```typescript
|
|
409
|
+
// Bei statistischem Analysebedarf
|
|
410
|
+
const stats = data
|
|
411
|
+
.toNumericStatistics(); // Numerische Statistik
|
|
322
412
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
413
|
+
const bigIntStats = data
|
|
414
|
+
.toBigintStatistics(); // BigInt-Statistik
|
|
415
|
+
```
|
|
326
416
|
|
|
327
|
-
|
|
417
|
+
[GitHub](https://github.com/eloyhere/semantic-typescript)
|
|
418
|
+
[NPMJS](https://www.npmjs.com/package/semantic-typescript)
|
|
328
419
|
|
|
329
|
-
|
|
420
|
+
## Wichtige Hinweise
|
|
330
421
|
|
|
331
|
-
|
|
422
|
+
1. **Auswirkungen von Sortieroperationen**: In geordneten Collectors überschreibt `sorted()` die Effekte von `redirect`, `translate`, `shuffle`, `reverse`
|
|
423
|
+
2. **Leistungsüberlegungen**: Bei fehlender Reihenfolgeanforderung priorisiert `toUnoredered()` verwenden
|
|
424
|
+
3. **Speichernutzung**: Sortieroperationen benötigen O(n) zusätzlichen Speicher
|
|
425
|
+
4. **Echtzeitdaten**: Semantic-Streams eignen sich für Echtzeitdaten und unterstützen asynchrone Datenquellen
|
|
332
426
|
|
|
333
|
-
|
|
334
|
-
- `toUnordered()` → **Keine Sortierung, schnellster Weg**
|
|
335
|
-
- Alle anderen (z. B. `sorted()`, `toOrdered()`) → **Sortieren die Daten**
|
|
427
|
+
Diese Bibliothek bietet TypeScript-Entwicklern leistungsstarke und flexible Stream-Verarbeitungsfähigkeiten, die die Vorteile der funktionalen Programmierung mit Typsicherheit kombinieren.
|