semantic-typescript 0.0.7 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/readme.de.md CHANGED
@@ -1,335 +1,427 @@
1
- # 📘 semantic-typescript
1
+ # Semantic-TypeScript Stream-Verarbeitungsbibliothek
2
2
 
3
- Eine leistungsstarke, typsichere Utility-Bibliothek für die **semantische Datenverarbeitung** in TypeScript.
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
- Ob Sie **sortierte oder unsortierte Daten** verarbeiten, **statistische Analysen** durchführen oder einfach nur **operationen flüssig verketten** möchten diese Bibliothek deckt Ihr Bedürfnis ab.
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
- ## 🧩 Merkmale
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
- ## 🧠 Kernkonzepte
33
-
34
- ### 1. `Optional<T>` Sicheres Arbeiten mit Nullable-Werten
35
-
36
- Ein monadisches Container-Objekt für Werte, die `null` oder `undefined` sein können.
37
-
38
- #### Methoden:
39
-
40
- | Methode | Beschreibung | Beispiel |
41
- |--------|-------------|---------|
42
- | `of(value)` | Wert einpacken (kann null/undefined sein) | `Optional.of(null)` |
43
- | `ofNullable(v)` | Einpacken, null/undefined erlaubt | `Optional.ofNullable(someVar)` |
44
- | `ofNonNull(v)` | Einpacken, bei null/undefined wird eine Exception geworfen | `Optional.ofNonNull(5)` |
45
- | `get()` | Wert auslesen (bei leerem Optional: Exception) | `opt.get()` |
46
- | `getOrDefault(d)` | Wert auslesen oder Standardwert verwenden | `opt.getOrDefault(0)` |
47
- | `ifPresent(fn)` | Side-Effect ausführen, wenn Wert vorhanden | `opt.ifPresent(x => console.log(x))` |
48
- | `map(fn)` | Wert transformieren (wenn vorhanden) | `opt.map(x => x + 1)` |
49
- | `filter(fn)` | Nur Werte behalten, die den Prädikat erfüllen | `opt.filter(x => x > 0)` |
50
- | `isEmpty()` | Prüfen, ob das Optional leer ist | `opt.isEmpty()` |
51
- | `isPresent()` | Prüfen, ob ein Wert vorhanden ist | `opt.isPresent()` |
52
-
53
- #### Beispiel:
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
- import { Optional } from 'semantic-typescript';
57
-
58
- const value: number | null = Math.random() > 0.5 ? 10 : null;
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
- ### 2. `Semantic<E>` – Lazy Datenstrom
80
+ ```typescript
81
+ // Typwächter-Verwendungsbeispiele
82
+ const value: unknown = "hello";
73
83
 
74
- Ein **Lazy, komponierbarer Sequence-Typ**. Ähnlich wie Java Streams oder Kotlin Sequences.
84
+ if (isString(value)) {
85
+ console.log(value.length); // Typsicher, value wird als string inferiert
86
+ }
75
87
 
76
- Erstellen Sie einen `Semantic`-Datenstrom mit Helfern wie `from()`, `range()`, `iterate()` oder `fill()`.
88
+ if (isOptional(someValue)) {
89
+ someValue.ifPresent(val => console.log(val));
90
+ }
91
+ ```
77
92
 
78
- #### Erzeugungsmethoden:
93
+ ## Hilfsfunktionen
79
94
 
80
- | Funktion | Beschreibung | Beispiel |
81
- |----------|-------------|---------|
82
- | `from(iterable)` | Aus Array/Set/Iterable erstellen | `from([1, 2, 3])` |
83
- | `range(start, end, step?)` | Zahlenbereich erzeugen | `range(0, 5)` 0,1,2,3,4 |
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
- #### Häufig verwendete Operatoren:
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
- | Methode | Beschreibung | Beispiel |
90
- |--------|-------------|---------|
91
- | `map(fn)` | Jedes Element transformieren | `.map(x => x * 2)` |
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
- ### 3. `toUnordered()` – 🚀 Am schnellsten, keine Sortierung
111
+ ### Optional-Fabrikmethoden
108
112
 
109
- Wenn Sie **keine bestimmte Reihenfolge** benötigen und den **schnellsten möglichen Durchsatz** wünschen, verwenden Sie:
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
- const fastest = semanticStream.toUnordered();
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
- 🔥 **Es wird kein Sortieralgorithmus verwendet.**
116
- Idealerweise bei irrelevanter Reihenfolge und maximalem Performancebedarf.
117
-
118
- ---
131
+ ### Collector-Fabrikmethoden
119
132
 
120
- ### 4. `toOrdered()` und `sorted()` Sortierte Ausgabe
121
-
122
- Wenn Sie eine **sortierte Ausgabe** benötigen, verwenden Sie:
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
- const ordered = semanticStream.sorted(); // Natürliche Sortierung
126
- const customSorted = semanticStream.sorted((a, b) => a - b); // Eigene Sortierlogik
127
- const orderedCollectable = semanticStream.toOrdered(); // Auch sortiert
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
- ⚠️ Diese Methoden **sortieren die Elemente**, entweder nach natürlicher Ordnung oder mit einem angegebenen Comparator.
131
-
132
- ---
150
+ ### Semantic-Fabrikmethoden
133
151
 
134
- ### 5. `Collector<E, A, R>` Datensammlung / Aggregation
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
- Mit Collectors können Sie Streams in **einzelne oder komplexe Strukturen** umwandeln.
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
- Eingebaute statische Factorys:
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
- Collector.full(identity, accumulator, finisher)
142
- Collector.shortable(identity, interruptor, accumulator, finisher)
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
- In der Praxis werden Sie diese meist über die höherwertigen Methoden der `Collectable`-Klassen verwenden.
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
- ### 6. `Collectable<E>` (abstrakte Klasse)
150
-
151
- Basisklasse für:
257
+ ```typescript
258
+ // Collector-Transformationsbeispiele
259
+ const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
152
260
 
153
- - `OrderedCollectable<E>` Sortierte Ausgabe
154
- - `UnorderedCollectable<E>` Keine Sortierung, schnellster Weg
155
- - `WindowCollectable<E>` Gleitende Fenster
156
- - `Statistics<E, D>` – Statistische Aggregation
261
+ // Leistungspriorität: Ungeordneten Collector verwenden
262
+ const unordered = numbers
263
+ .filter(n => n > 3)
264
+ .toUnoredered();
157
265
 
158
- #### Häufige Methoden (über Vererbung):
266
+ // Sortierung benötigt: Geordneten Collector verwenden
267
+ const ordered = numbers.sorted();
159
268
 
160
- | Methode | Beschreibung | Beispiel |
161
- |--------|-------------|---------|
162
- | `count()` | Anzahl der Elemente | `.count()` |
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
- ### 7. `OrderedCollectable<E>` – Sortierte Daten
277
+ // Fensteroperationen
278
+ const windowed = numbers
279
+ .toWindow()
280
+ .tumble(3n); // Fenster mit je 3 Elementen
174
281
 
175
- Wenn Sie möchten, dass die Elemente **automatisch sortiert** werden, verwenden Sie diese Klasse.
282
+ windowed.forEach(window => {
283
+ console.log(window.toArray()); // Inhalt jedes Fensters
284
+ });
285
+ ```
176
286
 
177
- Akzeptiert einen **benutzerdefinierten Comparator** oder nutzt die natürliche Sortierung.
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
- const sorted = new OrderedCollectable(stream);
181
- const customSorted = new OrderedCollectable(stream, (a, b) => b - a);
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
- 🔒 **Sortierte Ausgabe garantiert.**
185
-
186
- ---
187
-
188
- ### 8. `UnorderedCollectable<E>` Keine Sortierung (🚀 Schnellster)
189
-
190
- Wenn Ihnen die **Reihenfolge egal** ist und Sie die **beste Performance** wünschen, verwenden Sie:
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
- const unordered = new UnorderedCollectable(stream);
194
- // Oder
195
- const fastest = semanticStream.toUnordered();
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
- **Kein Sortieralgorithmus wird ausgeführt**
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
- import { from, toUnordered, toOrdered, sorted, NumericStatistics } from 'semantic-typescript';
234
-
235
- // Beispiel-Daten
236
- const numbers = from([10, 2, 8, 4, 5, 6]);
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
- const gen = (accept: BiConsumer<number, bigint>, interrupt: Predicate<number>) => {
278
- for (let i = 0; i < 10; i++) {
279
- accept(i, BigInt(i));
280
- if (i === 5) interrupt(i);
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
- Oder **gleitende Fenster** verwenden:
288
-
399
+ ### Fenster-Collector wählen (Fensteroperationen)
289
400
  ```typescript
290
- const windowed = ordered.slide(3n, 2n); // Fenstergröße 3, Schritt 2
401
+ // Bei Fensteroperationsbedarf
402
+ const windowed = data
403
+ .toWindow()
404
+ .slide(5n, 2n); // Gleitendes Fenster
291
405
  ```
292
406
 
293
- ---
294
-
295
- ## 📄 Lizenz
296
-
297
- Dieses Projekt steht unter der **MIT-Lizenz** – kostenlos für kommerzielle und private Nutzung.
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
- - 📦 npm: https://www.npmjs.com/package/semantic-typescript
324
- - 🐙 GitHub: https://github.com/eloyhere/semantic-typescript
325
- - 📘 Dokumentation: Siehe Quellcode / Typdefinitionen
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
- **Genießen Sie komponierbares, typsicheres und funktionales Datenhandling in TypeScript.** 🚀
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
- **Wichtig:**
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.