semantic-typescript 0.0.8 → 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,529 +1,427 @@
1
- # Semantic-TypeScript Stream Processing Framework
1
+ # Semantic-TypeScript Stream-Verarbeitungsbibliothek
2
2
 
3
3
  ## Einführung
4
4
 
5
- Semantic-TypeScript ist eine moderne Stream-Processing-Bibliothek, inspiriert von JavaScript GeneratorFunction, Java Stream und MySQL Index. Die Kern-Designphilosophie basiert auf dem Aufbau effizienter Datenverarbeitungspipelines durch Datenindizierung und bietet eine typsichere, funktionale Stream-Operation-Erfahrung für die Frontend-Entwicklung.
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.
6
6
 
7
- Im Gegensatz zur traditionellen synchronen Verarbeitung verwendet Semantic ein asynchrones Verarbeitungsmodell. Beim Erstellen von Datenströmen hängt der Zeitpunkt des terminalen Datenempfangs vollständig davon ab, wann der Upstream die `accept`- und `interrupt`-Callback-Funktionen aufruft. Dieses Design ermöglicht es der Bibliothek, Echtzeit-Datenströme, große Datensätze und asynchrone Datenquellen elegant zu verarbeiten.
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.
8
8
 
9
- ## Kernfunktionen
9
+ ## Installation
10
10
 
11
- | Funktion | Beschreibung | Vorteil |
12
- |------|------|------|
13
- | **Typsichere Generics** | Vollständige TypeScript-Typunterstützung | Fehlererkennung zur Kompilierzeit, bessere Entwicklungserfahrung |
14
- | **Funktionale Programmierung** | Unveränderliche Datenstrukturen und reine Funktionen | Vorhersehbarerer Code, einfachere Tests und Wartung |
15
- | **Lazy Evaluation** | Bedarfsgerechte Berechnung, Leistungsoptimierung | Hohe Speichereffizienz bei der Verarbeitung großer Datensätze |
16
- | **Asynchrone Stream-Verarbeitung** | Generator-basierte asynchrone Datenströme | Geeignet für Echtzeitdaten und ereignisgesteuerte Szenarien |
17
- | **Multi-Paradigma-Sammler** | Geordnete, ungeordnete, statistische Sammlungsstrategien | Optimale Strategiewahl basierend auf verschiedenen Szenarien |
18
- | **Statistische Analyse** | Eingebaute vollständige statistische Berechnungsfunktionen | Integrierte Datenanalyse und Berichterstellungsgenerierung |
19
-
20
- ## Leistungsüberlegungen
21
-
22
- **Wichtiger Hinweis**: Die folgenden Methoden opfern Leistung, um Daten zu sammeln und zu sortieren, was zu geordneten Datensammlungen führt:
23
- - `toOrdered()`
24
- - `toWindow()`
25
- - `toNumericStatistics()`
26
- - `toBigIntStatistics()`
27
- - `sorted()`
28
- - `sorted(comparator)`
29
-
30
- Besonders wichtig zu beachten: `sorted()` und `sorted(comparator)` überschreiben die Ergebnisse der folgenden Methoden:
31
- - `redirect(redirector)`
32
- - `translate(translator)`
33
- - `shuffle(mapper)`
34
-
35
- ## Factory-Methoden
36
-
37
- ### Stream-Erstellungs-Factories
11
+ ```bash
12
+ npm install semantic-typescript
13
+ ```
38
14
 
39
- | Methode | Signatur | Beschreibung | Beispiel |
40
- |------|------|------|------|
41
- | `blob` | `(blob: Blob, chunk?: bigint) => Semantic<Uint8Array>` | Konvertiere Blob in Byte-Stream | `blob(fileBlob, 1024n)` |
42
- | `empty` | `<E>() => Semantic<E>` | Erstelle leeren Stream | `empty<number>()` |
43
- | `fill` | `<E>(element: E, count: bigint) => Semantic<E>` | Fülle mit angegebener Anzahl an Elementen | `fill("hallo", 5n)` |
44
- | `from` | `<E>(iterable: Iterable<E>) => Semantic<E>` | Erstelle Stream aus iterierbarem Objekt | `from([1, 2, 3])` |
45
- | `range` | `<N extends number\|bigint>(start: N, end: N, step?: N) => Semantic<N>` | Erstelle numerischen Bereichs-Stream | `range(1, 10, 2)` |
46
- | `iterate` | `<E>(generator: Generator<E>) => Semantic<E>` | Erstelle Stream aus Generator-Funktion | `iterate(myGenerator)` |
47
- | `websocket` | `(websocket: WebSocket) => Semantic<MessageEvent>` | Erstelle Ereignis-Stream aus WebSocket | `websocket(socket)` |
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 |
48
46
 
49
- **Code-Beispiel-Ergänzung:**
50
47
  ```typescript
51
- import { from, range, fill, empty } from 'semantic-typescript';
52
-
53
- // Erstelle Stream aus Array
54
- const numberStream = from([1, 2, 3, 4, 5]);
55
-
56
- // Erstelle numerischen Bereichs-Stream
57
- const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
58
-
59
- // Fülle mit wiederholten Elementen
60
- const filledStream = fill("hallo", 3n); // "hallo", "hallo", "hallo"
61
-
62
- // Erstelle leeren Stream
63
- const emptyStream = empty<number>();
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;
64
52
  ```
65
53
 
66
- ### Hilfsfunktions-Factories
67
-
68
- | Methode | Signatur | Beschreibung | Beispiel |
69
- |------|------|------|------|
70
- | `validate` | `<T>(t: MaybeInvalid<T>) => t is T` | Validiere ob Wert gültig ist | `validate(null)` `false` |
71
- | `invalidate` | `<T>(t: MaybeInvalid<T>) => t is null\|undefined` | Validiere ob Wert ungültig ist | `invalidate(0)` `false` |
72
- | `useCompare` | `<T>(t1: T, t2: T) => number` | Generische Vergleichsfunktion | `useCompare("a", "b")` `-1` |
73
- | `useRandom` | `<T = number\|bigint>(index: T) => T` | Pseudozufallszahlengenerator | `useRandom(5)` Zufallszahl |
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) |
74
79
 
75
- **Code-Beispiel-Ergänzung:**
76
80
  ```typescript
77
- import { validate, invalidate, useCompare, useRandom } from 'semantic-typescript';
81
+ // Typwächter-Verwendungsbeispiele
82
+ const value: unknown = "hello";
78
83
 
79
- // Validiere Datenvalidität
80
- const data: string | null = "hallo";
81
- if (validate(data)) {
82
- console.log(data.toUpperCase()); // Sichere Aufruf, da validate sicherstellt, dass Daten nicht null sind
84
+ if (isString(value)) {
85
+ console.log(value.length); // Typsicher, value wird als string inferiert
83
86
  }
84
87
 
85
- const nullData: string | null = null;
86
- if (invalidate(nullData)) {
87
- console.log("Daten ungültig"); // Wird ausgeführt, da invalidate null erkannt hat
88
+ if (isOptional(someValue)) {
89
+ someValue.ifPresent(val => console.log(val));
88
90
  }
89
-
90
- // Vergleiche Werte
91
- const comparison = useCompare("Apfel", "Banane"); // -1
92
-
93
- // Generiere Zufallszahl
94
- const randomNum = useRandom(42); // Zufallszahl basierend auf Seed 42
95
91
  ```
96
92
 
97
- ## Kernklassen-Details
98
-
99
- ### Optional<T> - Sichere Nullwert-Behandlung
100
-
101
- Die Optional-Klasse bietet einen funktionalen Ansatz zur sicheren Handhabung von Werten, die null oder undefined sein könnten.
93
+ ## Hilfsfunktionen
102
94
 
103
- | Methode | Rückgabetyp | Beschreibung | Zeitkomplexität |
104
- |------|----------|------|------------|
105
- | `filter(predicate: Predicate<T>)` | `Optional<T>` | Filtere Werte, die Bedingung erfüllen | O(1) |
106
- | `get()` | `T` | Hole Wert, wirft Fehler wenn leer | O(1) |
107
- | `getOrDefault(defaultValue: T)` | `T` | Hole Wert oder Standardwert | O(1) |
108
- | `ifPresent(action: Consumer<T>)` | `void` | Führe Aktion aus wenn Wert existiert | O(1) |
109
- | `isEmpty()` | `boolean` | Prüfe ob leer | O(1) |
110
- | `isPresent()` | `boolean` | Prüfe ob Wert existiert | O(1) |
111
- | `map<R>(mapper: Functional<T, R>)` | `Optional<R>` | Mappe und transformiere Wert | O(1) |
112
- | `static of<T>(value: MaybeInvalid<T>)` | `Optional<T>` | Erstelle Optional-Instanz | O(1) |
113
- | `static ofNullable<T>(value?)` | `Optional<T>` | Erstelle nullable Optional | O(1) |
114
- | `static ofNonNull<T>(value: T)` | `Optional<T>` | Erstelle Non-Null Optional | O(1) |
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) |
115
99
 
116
- **Code-Beispiel-Ergänzung:**
117
100
  ```typescript
118
- import { Optional } from 'semantic-typescript';
101
+ // Hilfsfunktions-Verwendungsbeispiele
102
+ const numbers = [3, 1, 4, 1, 5];
103
+ numbers.sort(useCompare); // [1, 1, 3, 4, 5]
119
104
 
120
- // Erstelle Optional-Instanz
121
- const optionalValue = Optional.ofNullable<string>(Math.random() > 0.5 ? "hallo" : null);
105
+ const randomNum = useRandom(42); // Seed-basierte Zufallszahl
106
+ const randomBigInt = useRandom(1000n); // BigInt-Zufallszahl
107
+ ```
122
108
 
123
- // Kettenoperationen
124
- const result = optionalValue
125
- .filter(val => val.length > 3) // Filtere Werte länger als 3
126
- .map(val => val.toUpperCase()) // Konvertiere zu Großbuchstaben
127
- .getOrDefault("standard"); // Hole Wert oder Standard
109
+ ## Fabrikmethoden
128
110
 
129
- console.log(result); // "HALLO" oder "standard"
111
+ ### Optional-Fabrikmethoden
130
112
 
131
- // Sichere Operationen
132
- optionalValue.ifPresent(val => {
133
- console.log(`Wert existiert: ${val}`);
134
- });
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) |
135
119
 
136
- // Prüfe Status
137
- if (optionalValue.isPresent()) {
138
- console.log("Hat Wert");
139
- } else if (optionalValue.isEmpty()) {
140
- console.log("Ist leer");
141
- }
120
+ ```typescript
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
142
129
  ```
143
130
 
144
- ### Semantic<E> - Lazy Datenstrom
145
-
146
- Semantic ist die Kern-Stream-Verarbeitungsklasse und bietet reichhaltige Stream-Operatoren.
147
-
148
- #### Stream-Transformations-Operationen
149
-
150
- | Methode | Rückgabetyp | Beschreibung | Leistungsauswirkung |
151
- |------|----------|------|----------|
152
- | `concat(other: Semantic<E>)` | `Semantic<E>` | Verkette zwei Streams | O(n+m) |
153
- | `distinct()` | `Semantic<E>` | Entferne Duplikate (mit Set) | O(n) |
154
- | `distinct(comparator)` | `Semantic<E>` | Benutzerdefinierte Comparator-Deduplizierung | O(n²) |
155
- | `dropWhile(predicate)` | `Semantic<E>` | Verwerfe Startelemente, die Bedingung erfüllen | O(n) |
156
- | `filter(predicate)` | `Semantic<E>` | Filtere Elemente | O(n) |
157
- | `flat(mapper)` | `Semantic<E>` | Glätte verschachtelte Streams | O(n×m) |
158
- | `flatMap(mapper)` | `Semantic<R>` | Mappe und glätte | O(n×m) |
159
- | `limit(n)` | `Semantic<E>` | Begrenze Anzahl der Elemente | O(n) |
160
- | `map(mapper)` | `Semantic<R>` | Mappe und transformiere Elemente | O(n) |
161
- | `peek(consumer)` | `Semantic<E>` | Betrachte Elemente ohne Modifikation | O(n) |
162
- | `redirect(redirector)` | `Semantic<E>` | Leite Indizes um | O(n) |
163
- | `reverse()` | `Semantic<E>` | Kehre Stream-Reihenfolge um | O(n) |
164
- | `shuffle()` | `Semantic<E>` | Mische Reihenfolge zufällig | O(n) |
165
- | `shuffle(mapper)` | `Semantic<E>` | Benutzerdefinierte Shuffle-Logik | O(n) |
166
- | `skip(n)` | `Semantic<E>` | Überspringe erste n Elemente | O(n) |
167
- | `sub(start, end)` | `Semantic<E>` | Hole Substream | O(n) |
168
- | `takeWhile(predicate)` | `Semantic<E>` | Hole Startelemente, die Bedingung erfüllen | O(n) |
169
- | `translate(offset)` | `Semantic<E>` | Übersetze Indizes | O(n) |
170
- | `translate(translator)` | `Semantic<E>` | Benutzerdefinierte Index-Transformation | O(n) |
171
-
172
- **Code-Beispiel-Ergänzung:**
173
- ```typescript
174
- import { from } from 'semantic-typescript';
131
+ ### Collector-Fabrikmethoden
175
132
 
176
- const stream = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
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) |
177
137
 
178
- // Stream-Transformations-Operationsbeispiele
179
- const processedStream = stream
180
- .filter(x => x % 2 === 0) // Filtere gerade Zahlen
181
- .map(x => x * 2) // Multipliziere jedes Element mit 2
182
- .distinct() // Entferne Duplikate
183
- .limit(3) // Begrenze auf erste 3 Elemente
184
- .peek((val, index) => console.log(`Element ${val} an Index ${index}`)); // Betrachte Elemente
138
+ ```typescript
139
+ // Collector-Verwendungsbeispiele
140
+ const sumCollector = Collector.full(
141
+ () => 0,
142
+ (sum, num) => sum + num,
143
+ result => result
144
+ );
185
145
 
186
- // Hinweis: Der Stream wurde noch nicht ausgeführt, muss zu Collectable konvertiert werden für Terminaloperationen
146
+ const numbers = from([1, 2, 3, 4, 5]);
147
+ const total = numbers.toUnoredered().collect(sumCollector); // 15
187
148
  ```
188
149
 
189
- #### Stream-Terminaloperationen
150
+ ### Semantic-Fabrikmethoden
190
151
 
191
- | Methode | Rückgabetyp | Beschreibung | Leistungscharakteristiken |
192
- |------|----------|------|----------|
193
- | `toOrdered()` | `OrderedCollectable<E>` | Konvertiere zu geordneter Sammlung | Sortieroperation, geringere Leistung |
194
- | `toUnordered()` | `UnorderedCollectable<E>` | Konvertiere zu ungeordneter Sammlung | Schnellste, keine Sortierung |
195
- | `toWindow()` | `WindowCollectable<E>` | Konvertiere zu Fenster-Sammlung | Sortieroperation, geringere Leistung |
196
- | `toNumericStatistics()` | `Statistics<E, number>` | Numerische statistische Analyse | Sortieroperation, geringere Leistung |
197
- | `toBigintStatistics()` | `Statistics<E, bigint>` | Big Integer statistische Analyse | Sortieroperation, geringere Leistung |
198
- | `sorted()` | `OrderedCollectable<E>` | Natürliche Sortierung | Überschreibt Umleitungsergebnisse |
199
- | `sorted(comparator)` | `OrderedCollectable<E>` | Benutzerdefinierte Sortierung | Überschreibt Umleitungsergebnisse |
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) |
200
162
 
201
- **Code-Beispiel-Ergänzung:**
202
163
  ```typescript
203
- import { from } from 'semantic-typescript';
164
+ // Beispiel zur Verwendung der Semantic-Fabrikmethoden
204
165
 
205
- const semanticStream = from([5, 2, 8, 1, 9, 3, 7, 4, 6]);
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
206
172
 
207
- // Konvertiere zu geordneter Sammlung (geringere Leistung)
208
- const ordered = semanticStream.toOrdered();
173
+ // Leeren Stream erzeugen, der erst nach Verknüpfung mit anderen Streams ausgeführt wird
174
+ empty<string>()
175
+ .toUnordered()
176
+ .join(); //[]
209
177
 
210
- // Konvertiere zu ungeordneter Sammlung (schnellste)
211
- const unordered = semanticStream.toUnordered();
178
+ // Gefüllten Stream erzeugen
179
+ const filledStream = fill("hello", 3); // "hello", "hello", "hello"
212
180
 
213
- // Natürliche Sortierung
214
- const sortedNatural = semanticStream.sorted();
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);
215
184
 
216
- // Benutzerdefinierte Sortierung
217
- const sortedCustom = semanticStream.sorted((a, b) => b - a); // Absteigende Sortierung
185
+ // Stream aus iterierbarem Objekt erzeugen
186
+ const numberStream = from([1, 2, 3, 4, 5]);
187
+ const stringStream = from(new Set(["Alex", "Bob"]));
218
188
 
219
- // Konvertiere zu statistischem Objekt
220
- const stats = semanticStream.toNumericStatistics();
189
+ // Bereichs-Stream erzeugen
190
+ const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
221
191
 
222
- // Hinweis: Muss obige Methoden durch Semantic-Instanz aufrufen, um Collectable zu erhalten, bevor Terminalmethoden verwendet werden
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
223
198
  ```
224
199
 
225
- ### Collector<E, A, R> - Datensammler
226
-
227
- Collectors werden verwendet, um Stream-Daten in spezifische Strukturen zu aggregieren.
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) |
228
225
 
229
- | Methode | Beschreibung | Verwendungsszenario |
230
- |------|------|----------|
231
- | `collect(generator)` | Führe Datensammlung aus | Stream-Terminaloperation |
232
- | `static full(identity, accumulator, finisher)` | Erstelle vollständigen Collector | Erfordert vollständige Verarbeitung |
233
- | `static shortable(identity, interruptor, accumulator, finisher)` | Erstelle unterbrechbaren Collector | Kann vorzeitig beendet werden |
234
-
235
- **Code-Beispiel-Ergänzung:**
236
226
  ```typescript
237
- import { Collector } from 'semantic-typescript';
238
-
239
- // Erstelle benutzerdefinierten Collector
240
- const sumCollector = Collector.full(
241
- () => 0, // Initialwert
242
- (acc, value) => acc + value, // Akkumulator
243
- result => result // Finisher-Funktion
244
- );
245
-
246
- // Verwende Collector (erfordert Konvertierung von Semantic zu Collectable zuerst)
247
- const numbers = from([1, 2, 3, 4, 5]);
248
- const sum = numbers.toUnordered().collect(sumCollector); // 15
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
249
244
  ```
250
245
 
251
- ### Collectable<E> - Sammelbare Daten Abstrakte Klasse
246
+ ## Collector-Transformationsmethoden
252
247
 
253
- Bietet reichhaltige Datenaggregations- und Transformationsmethoden. **Hinweis: Muss zuerst Collectable-Instanz erhalten, indem sorted(), toOrdered() etc. durch Semantic-Instanz aufgerufen werden, bevor die folgenden Methoden verwendet werden können.**
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) |
254
256
 
255
- #### Datenabfrage-Operationen
257
+ ```typescript
258
+ // Collector-Transformationsbeispiele
259
+ const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
256
260
 
257
- | Methode | Rückgabetyp | Beschreibung | Beispiel |
258
- |------|----------|------|------|
259
- | `anyMatch(predicate)` | `boolean` | Ob irgendein Element übereinstimmt | `anyMatch(x => x > 0)` |
260
- | `allMatch(predicate)` | `boolean` | Ob alle Elemente übereinstimmen | `allMatch(x => x > 0)` |
261
- | `count()` | `bigint` | Elementanzahl-Statistiken | `count()` → `5n` |
262
- | `isEmpty()` | `boolean` | Ob Stream leer ist | `isEmpty()` |
263
- | `findAny()` | `Optional<E>` | Finde irgendein Element | `findAny()` |
264
- | `findFirst()` | `Optional<E>` | Finde erstes Element | `findFirst()` |
265
- | `findLast()` | `Optional<E>` | Finde letztes Element | `findLast()` |
261
+ // Leistungspriorität: Ungeordneten Collector verwenden
262
+ const unordered = numbers
263
+ .filter(n => n > 3)
264
+ .toUnoredered();
266
265
 
267
- **Code-Beispiel-Ergänzung:**
268
- ```typescript
269
- import { from } from 'semantic-typescript';
266
+ // Sortierung benötigt: Geordneten Collector verwenden
267
+ const ordered = numbers.sorted();
270
268
 
271
- const numbers = from([1, 2, 3, 4, 5]);
269
+ // Statistische Analyse: Statistik-Collector verwenden
270
+ const stats = numbers
271
+ .toNumericStatistics();
272
+
273
+ console.log(stats.mean()); // Durchschnitt
274
+ console.log(stats.median()); // Median
275
+ console.log(stats.standardDeviation()); // Standardabweichung
272
276
 
273
- // Muss zu Collectable konvertiert werden, bevor Terminalmethoden verwendet werden
274
- const collectable = numbers.toUnordered();
277
+ // Fensteroperationen
278
+ const windowed = numbers
279
+ .toWindow()
280
+ .tumble(3n); // Fenster mit je 3 Elementen
275
281
 
276
- // Datenabfrage-Operationen
277
- const hasEven = collectable.anyMatch(x => x % 2 === 0); // true
278
- const allPositive = collectable.allMatch(x => x > 0); // true
279
- const count = collectable.count(); // 5n
280
- const isEmpty = collectable.isEmpty(); // false
281
- const firstElement = collectable.findFirst(); // Optional.of(1)
282
- const anyElement = collectable.findAny(); // Irgendein Element
282
+ windowed.forEach(window => {
283
+ console.log(window.toArray()); // Inhalt jedes Fensters
284
+ });
283
285
  ```
284
286
 
285
- #### Datenaggregations-Operationen
286
-
287
- | Methode | Rückgabetyp | Beschreibung | Komplexität |
288
- |------|----------|------|--------|
289
- | `group(classifier)` | `Map<K, E[]>` | Gruppiere nach Classifier | O(n) |
290
- | `groupBy(keyExtractor, valueExtractor)` | `Map<K, V[]>` | Gruppiere nach Schlüssel-Wert-Extraktoren | O(n) |
291
- | `join()` | `string` | Verbinde als String | O(n) |
292
- | `join(delimiter)` | `string` | Verbinde mit Trennzeichen | O(n) |
293
- | `partition(count)` | `E[][]` | Partitioniere nach Anzahl | O(n) |
294
- | `partitionBy(classifier)` | `E[][]` | Partitioniere nach Classifier | O(n) |
295
- | `reduce(accumulator)` | `Optional<E>` | Reduktionsoperation | O(n) |
296
- | `reduce(identity, accumulator)` | `E` | Reduktion mit Identität | O(n) |
297
- | `toArray()` | `E[]` | Konvertiere zu Array | O(n) |
298
- | `toMap(keyExtractor, valueExtractor)` | `Map<K, V>` | Konvertiere zu Map | O(n) |
299
- | `toSet()` | `Set<E>` | Konvertiere zu Set | O(n) |
300
-
301
- **Code-Beispiel-Ergänzung:**
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) |
312
+
302
313
  ```typescript
303
- import { from } from 'semantic-typescript';
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();
304
318
 
305
- const people = from([
306
- { name: "Alice", age: 25, city: "New York" },
307
- { name: "Bob", age: 30, city: "London" },
308
- { name: "Charlie", age: 25, city: "New York" }
309
- ]);
319
+ // Übereinstimmungsprüfungen
320
+ console.log(data.anyMatch(n => n > 5)); // true
321
+ console.log(data.allMatch(n => n < 20)); // true
310
322
 
311
- // Muss zu Collectable konvertiert werden, bevor Aggregationsoperationen verwendet werden
312
- const collectable = people.toUnordered();
323
+ // Suchoperationen
324
+ data.findFirst().ifPresent(n => console.log(n)); // 2
325
+ data.findAny().ifPresent(n => console.log(n)); // Beliebiges Element
313
326
 
314
327
  // Gruppierungsoperationen
315
- const byCity = collectable.group(person => person.city);
316
- // Map { "New York" => [{name: "Alice", ...}, {name: "Charlie", ...}], "London" => [{name: "Bob", ...}] }
317
-
318
- const byAge = collectable.groupBy(
319
- person => person.age,
320
- person => person.name
328
+ const grouped = data.groupBy(
329
+ n => n > 5 ? "large" : "small",
330
+ n => n * 2
321
331
  );
322
- // Map { 25 => ["Alice", "Charlie"], 30 => ["Bob"] }
323
-
324
- // Konvertiere zu Sammlungen
325
- const array = collectable.toArray(); // Ursprüngliches Array
326
- const set = collectable.toSet(); // Set-Sammlung
327
- const map = collectable.toMap(
328
- person => person.name,
329
- person => person.age
330
- ); // Map { "Alice" => 25, "Bob" => 30, "Charlie" => 25 }
332
+ // {small: [4, 8], large: [12, 16, 20]}
331
333
 
332
334
  // Reduktionsoperationen
333
- const totalAge = collectable.reduce(0, (acc, person) => acc + person.age); // 80
334
- const oldest = collectable.reduce((a, b) => a.age > b.age ? a : b); // Optional.of({name: "Bob", age: 30, ...})
335
- ```
336
-
337
- ### Spezifische Collector-Implementierungen
335
+ const sum = data.reduce(0, (acc, n) => acc + n); // 30
338
336
 
339
- #### UnorderedCollectable<E>
340
- - **Charakteristiken**: Schnellster Collector, keine Sortierung
341
- - **Verwendungsszenarien**: Reihenfolge unwichtig, maximale Leistung gewünscht
342
- - **Methoden**: Erbt alle Collectable-Methoden
343
-
344
- #### OrderedCollectable<E>
345
- - **Charakteristiken**: Garantiert Elementreihenfolge, geringere Leistung
346
- - **Verwendungsszenarien**: Erfordern sortierte Ergebnisse
347
- - **Spezielle Methoden**: Erbt alle Methoden, behält internen Sortierzustand bei
337
+ // Ausgabeoperationen
338
+ data.join(", "); // "2, 4, 6, 8, 10"
339
+ ```
348
340
 
349
- #### WindowCollectable<E>
350
- - **Charakteristiken**: Unterstützt Gleitfenster-Operationen
351
- - **Verwendungsszenarien**: Zeitreihendatenanalyse
352
- - **Spezielle Methoden**:
353
- - `slide(size, step)` - Gleitfenster
354
- - `tumble(size)` - Tumbling-Fenster
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) |
355
359
 
356
- **Code-Beispiel-Ergänzung:**
357
360
  ```typescript
358
- import { from } from 'semantic-typescript';
359
-
360
- const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
361
-
362
- // Ungeordneter Collector (schnellste)
363
- const unordered = data.toUnordered();
364
- const unorderedArray = unordered.toArray(); // Kann ursprüngliche Reihenfolge beibehalten [1, 2, 3, ...]
365
-
366
- // Geordneter Collector
367
- const ordered = data.toOrdered();
368
- const orderedArray = ordered.toArray(); // Garantiert sortiert [1, 2, 3, ...]
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
378
+ ```
369
379
 
370
- // Fenster-Collector
371
- const windowed = data.toWindow();
372
- const slidingWindows = windowed.slide(3n, 2n); // Fenstergröße 3, Schritt 2
373
- // Fenster 1: [1, 2, 3], Fenster 2: [3, 4, 5], Fenster 3: [5, 6, 7], ...
380
+ ## Leistungsauswahlleitfaden
374
381
 
375
- const tumblingWindows = windowed.tumble(4n); // Tumbling-Fenster Größe 4
376
- // Fenster 1: [1, 2, 3, 4], Fenster 2: [5, 6, 7, 8], ...
382
+ ### Ungeordneten Collector wählen (Leistungspriorität)
383
+ ```typescript
384
+ // Wenn keine Reihenfolgegarantie benötigt wird
385
+ const highPerformance = data
386
+ .filter(predicate)
387
+ .map(mapper)
388
+ .toUnoredered(); // Beste Leistung
377
389
  ```
378
390
 
379
- ### Statistics<E, D> - Statistische Analyse
380
-
381
- Statistische Analyse-Basisklasse, die reichhaltige statistische Berechnungsmethoden bietet. **Hinweis: Muss zuerst Statistics-Instanz erhalten, indem toNumericStatistics() oder toBigIntStatistics() durch Semantic-Instanz aufgerufen werden, bevor die folgenden Methoden verwendet werden können.**
382
-
383
- #### Statistische Berechnungs-Operationen
384
-
385
- | Methode | Rückgabetyp | Beschreibung | Algorithmus-Komplexität |
386
- |------|----------|------|------------|
387
- | `maximum()` | `Optional<E>` | Maximalwert | O(n) |
388
- | `minimum()` | `Optional<E>` | Minimalwert | O(n) |
389
- | `range()` | `D` | Bereich (max-min) | O(n) |
390
- | `variance()` | `D` | Varianz | O(n) |
391
- | `standardDeviation()` | `D` | Standardabweichung | O(n) |
392
- | `mean()` | `D` | Mittelwert | O(n) |
393
- | `median()` | `D` | Medianwert | O(n log n) |
394
- | `mode()` | `D` | Modalwert | O(n) |
395
- | `frequency()` | `Map<D, bigint>` | Häufigkeitsverteilung | O(n) |
396
- | `summate()` | `D` | Summierung | O(n) |
397
- | `quantile(quantile)` | `D` | Quantil | O(n log n) |
398
- | `interquartileRange()` | `D` | Interquartilsabstand | O(n log n) |
399
- | `skewness()` | `D` | Schiefe | O(n) |
400
- | `kurtosis()` | `D` | Kurtosis | O(n) |
401
-
402
- **Code-Beispiel-Ergänzung:**
391
+ ### Geordneten Collector wählen (Reihenfolge benötigt)
403
392
  ```typescript
404
- import { from } from 'semantic-typescript';
405
-
406
- const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
407
-
408
- // Muss zu statistischem Objekt konvertiert werden, bevor statistische Methoden verwendet werden
409
- const stats = numbers.toNumericStatistics();
410
-
411
- // Grundlegende Statistiken
412
- const count = stats.count(); // 10n
413
- const max = stats.maximum(); // Optional.of(10)
414
- const min = stats.minimum(); // Optional.of(1)
415
- const range = stats.range(); // 9
416
- const mean = stats.mean(); // 5.5
417
- const median = stats.median(); // 5.5
418
- const sum = stats.summate(); // 55
419
-
420
- // Erweiterte Statistiken
421
- const variance = stats.variance(); // 8.25
422
- const stdDev = stats.standardDeviation(); // 2.872
423
- const mode = stats.mode(); // Irgendein Wert (da alle einmal erscheinen)
424
- const q1 = stats.quantile(0.25); // 3.25
425
- const q3 = stats.quantile(0.75); // 7.75
426
- const iqr = stats.interquartileRange(); // 4.5
427
-
428
- // Häufigkeitsverteilung
429
- const freq = stats.frequency(); // Map {1 => 1n, 2 => 1n, ...}
393
+ // Wenn Elementreihenfolge beibehalten werden muss
394
+ const ordered = data
395
+ .sorted(comparator) // Sortierung überschreibt Umleitungseffekte
396
+ .toOrdered(); // Beibehaltung der Reihenfolge
430
397
  ```
431
398
 
432
- #### Spezifische Statistische Implementierungsklassen
433
-
434
- **NumericStatistics<E>**
435
- - Verarbeitet number-Typ statistische Analyse
436
- - Alle statistischen Berechnungen geben number-Typ zurück
437
-
438
- **BigIntStatistics<E>**
439
- - Verarbeitet bigint-Typ statistische Analyse
440
- - Alle statistischen Berechnungen geben bigint-Typ zurück
441
-
442
- **Code-Beispiel-Ergänzung:**
399
+ ### Fenster-Collector wählen (Fensteroperationen)
443
400
  ```typescript
444
- import { from } from 'semantic-typescript';
445
-
446
- // Numerische Statistiken
447
- const numberData = from([10, 20, 30, 40, 50]);
448
- const numericStats = numberData.toNumericStatistics();
449
-
450
- console.log(numericStats.mean()); // 30
451
- console.log(numericStats.summate()); // 150
452
-
453
- // Big Integer Statistiken
454
- const bigintData = from([100n, 200n, 300n, 400n, 500n]);
455
- const bigintStats = bigintData.toBigIntStatistics();
456
-
457
- console.log(bigintStats.mean()); // 300n
458
- console.log(bigintStats.summate()); // 1500n
401
+ // Bei Fensteroperationsbedarf
402
+ const windowed = data
403
+ .toWindow()
404
+ .slide(5n, 2n); // Gleitendes Fenster
405
+ ```
459
406
 
460
- // Statistiken mit Mapper-Funktionen
461
- const objectData = from([
462
- { value: 15 },
463
- { value: 25 },
464
- { value: 35 },
465
- { value: 45 }
466
- ]);
407
+ ### Statistische Analyse wählen (Numerische Berechnungen)
408
+ ```typescript
409
+ // Bei statistischem Analysebedarf
410
+ const stats = data
411
+ .toNumericStatistics(); // Numerische Statistik
467
412
 
468
- const objectStats = objectData.toNumericStatistics();
469
- const meanWithMapper = objectStats.mean(obj => obj.value); // 30
470
- const sumWithMapper = objectStats.summate(obj => obj.value); // 120
413
+ const bigIntStats = data
414
+ .toBigintStatistics(); // BigInt-Statistik
471
415
  ```
472
416
 
473
- ## Vollständiges Verwendungsbeispiel
417
+ [GitHub](https://github.com/eloyhere/semantic-typescript)
418
+ [NPMJS](https://www.npmjs.com/package/semantic-typescript)
474
419
 
475
- ```typescript
476
- import { from, validate, invalidate } from 'semantic-typescript';
477
-
478
- // 1. Erstelle Datenstrom
479
- const rawData = [5, 2, 8, 1, null, 9, 3, undefined, 7, 4, 6];
480
- const semanticStream = from(rawData);
481
-
482
- // 2. Stream-Verarbeitungspipeline
483
- const processedStream = semanticStream
484
- .filter(val => validate(val)) // Filtere null und undefined heraus
485
- .map(val => val! * 2) // Multipliziere jeden Wert mit 2 (verwende !, da validate sicherstellt, dass nicht leer)
486
- .distinct(); // Entferne Duplikate
487
-
488
- // 3. Konvertiere zu Collectable und verwende Terminaloperationen
489
- const collectable = processedStream.toUnordered();
490
-
491
- // 4. Datenvalidierung und Verwendung
492
- if (!collectable.isEmpty()) {
493
- const results = collectable
494
- .filter(x => x > 5) // Filtere erneut
495
- .toArray(); // Konvertiere zu Array
496
-
497
- console.log("Verarbeitungsergebnisse:", results); // [16, 18, 14, 8, 12]
498
-
499
- // Statistische Informationen
500
- const stats = processedStream.toNumericStatistics();
501
- console.log("Mittelwert:", stats.mean()); // 11.2
502
- console.log("Gesamtsumme:", stats.summate()); // 56
503
- }
420
+ ## Wichtige Hinweise
504
421
 
505
- // 5. Behandle potenziell ungültige Daten
506
- const potentiallyInvalidData: Array<number | null> = [1, null, 3, 4, null];
507
- const validData = potentiallyInvalidData.filter(validate);
508
- const invalidData = potentiallyInvalidData.filter(invalidate);
509
-
510
- console.log("Gültige Daten:", validData); // [1, 3, 4]
511
- console.log("Ungültige Daten:", invalidData); // [null, null]
512
- ```
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
513
426
 
514
- ## Wichtige Verwendungsregeln Zusammenfassung
515
-
516
- 1. **Erstelle Stream**: Verwende `from()`, `range()`, `fill()` etc. Factory-Methoden, um Semantic-Instanzen zu erstellen
517
- 2. **Stream-Transformation**: Rufe `map()`, `filter()`, `distinct()` etc. Methoden auf Semantic-Instanzen auf
518
- 3. **Konvertiere zu Collectable**: Muss eine der folgenden Methoden durch Semantic-Instanz aufrufen:
519
- - `toOrdered()` - Geordneter Collector
520
- - `toUnordered()` - Ungeordneter Collector (schnellste)
521
- - `toWindow()` - Fenster-Collector
522
- - `toNumericStatistics()` - Numerische Statistiken
523
- - `toBigIntStatistics()` - Big Integer Statistiken
524
- - `sorted()` - Natürliche Sortierung
525
- - `sorted(comparator)` - Benutzerdefinierte Sortierung
526
- 4. **Terminaloperationen**: Rufe `toArray()`, `count()`, `summate()` etc. Terminalmethoden auf Collectable-Instanzen auf
527
- 5. **Datenvalidierung**: Verwende `validate()` um sicherzustellen, dass Daten nicht null/undefined sind, verwende `invalidate()` um ungültige Daten zu prüfen
528
-
529
- Dieses Design gewährleistet Typsicherheit und Leistungsoptimierung, während es gleichzeitig reichhaltige Stream-Verarbeitungsfunktionalität bietet.
427
+ Diese Bibliothek bietet TypeScript-Entwicklern leistungsstarke und flexible Stream-Verarbeitungsfähigkeiten, die die Vorteile der funktionalen Programmierung mit Typsicherheit kombinieren.