semantic-typescript 0.5.3 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/readme.de.md CHANGED
@@ -1,483 +1,213 @@
1
- # Semantic-TypeScript Stream Processing Library
1
+ # **Semantic-TypeScript**
2
+ **Flow, Indexed.** Ihre Daten unter präziser Kontrolle.
2
3
 
3
- ## Einleitung
4
+ ---
4
5
 
5
- Semantic-TypeScript ist eine moderne Stream-Verarbeitungsbibliothek, inspiriert von JavaScript GeneratorFunction, Java Stream und MySQL Index. Seine Kernphilosophie basiert auf dem Aufbau effizienter Datenverarbeitungspipelines mit Hilfe von Datenindizierung und bietet eine typsichere, funktionsbasierte Streaming-Benutzererfahrung für Frontend-Entwicklung.
6
+ ### Übersicht
6
7
 
7
- Im Gegensatz zur traditionellen synchronen Verarbeitung verwendet Semantic ein asynchrones Verarbeitungsmodell. Beim Erstellen eines Datenstroms hängt die Zeit, zu der das Terminal Daten empfängt, vollständig davon ab, wann der Upstream die `accept`- und `interrupt`-Callback-Funktionen aufruft. Dieses Design ermöglicht es der Bibliothek, Echtzeitdatenströme, große Datensätze und asynchrone Datenquellen elegant zu verarbeiten.
8
+ Semantic-TypeScript stellt einen bedeutenden Fortschritt in der Stream-Verarbeitungstechnologie dar, indem es die effektivsten Konzepte von JavaScript-`GeneratorFunction`, Java Streams und MySQL-ähnlicher Indexierung **synthetisiert**. Die Kernphilosophie ist ebenso einfach wie mächtig: Konstruieren Sie außergewöhnlich effiziente Datenverarbeitungspipelines durch intelligente Indexierung, nicht durch rohe Iteration.
8
9
 
9
- ## Installation
10
+ Während konventionelle Bibliotheken synchrone Schleifen oder umständliche Promise-Ketten aufzwingen, bietet Semantic-TypeScript ein **vollständig asynchrones**, funktional reines und rigoros typsicheres Erlebnis, das für die Anforderungen moderner Frontend-Entwicklung konzipiert ist.
10
11
 
11
- ```bash
12
- npm install semantic-typescript
13
- ```
12
+ In seinem eleganten Modell erreichen Daten den Consumer nur dann, wenn die vorgelagerte Pipeline explizit die `accept`- (und optional `interrupt`-) Callbacks aufruft. Sie haben die vollständige Kontrolle über den Zeitpunkt – genau dann, wenn er benötigt wird.
14
13
 
15
- ## Grundlegende Typen
16
-
17
- | Typ | Beschreibung |
18
- |------|-------------|
19
- | `Invalid<T>` | Typ, der sich von `null` oder `undefined` ableitet |
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 primitiver Typ sein kann |
24
- | `OptionalSymbol` | Symbolbezeichner der `Optional`-Klasse |
25
- | `SemanticSymbol` | Symbolbezeichner der `Semantic`-Klasse |
26
- | `CollectorsSymbol` | Symbolbezeichner der `Collector`-Klasse |
27
- | `CollectableSymbol` | Symbolbezeichner der `Collectable`-Klasse |
28
- | `OrderedCollectableSymbol` | Symbolbezeichner der `OrderedCollectable`-Klasse |
29
- | `WindowCollectableSymbol` | Symbolbezeichner der `WindowCollectable`-Klasse |
30
- | `StatisticsSymbol` | Symbolbezeichner der `Statistics`-Klasse |
31
- | `NumericStatisticsSymbol` | Symbolbezeichner der `NumericStatistics`-Klasse |
32
- | `BigIntStatisticsSymbol` | Symbolbezeichner der `BigIntStatistics`-Klasse |
33
- | `UnorderedCollectableSymbol` | Symbolbezeichner der `UnorderedCollectable`-Klasse |
34
-
35
- ## Funktionsorientierte Schnittstellen
36
-
37
- | Schnittstelle | Beschreibung |
38
- |-----------|-------------|
39
- | `Runnable` | Funktion ohne Parameter und ohne Rückgabewert |
40
- | `Supplier<R>` | Funktion ohne Parameter, die `R` zurückgibt |
41
- | `Functional<T, R>` | Einzelparameter-Transformationsfunktion |
42
- | `BiFunctional<T, U, R>` | Zweiparameter-Transformationsfunktion |
43
- | `TriFunctional<T, U, V, R>` | Dreiparameter-Transformationsfunktion |
44
- | `Predicate<T>` | Einzelparameter-Prädikatfunktion |
45
- | `BiPredicate<T, U>` | Zweiparameter-Prädikatfunktion |
46
- | `TriPredicate<T, U, V>` | Dreiparameter-Prädikatfunktion |
47
- | `Consumer<T>` | Einzelparameter-Consumerfunktion |
48
- | `BiConsumer<T, U>` | Zweiparameter-Consumerfunktion |
49
- | `TriConsumer<T, U, V>` | Dreiparameter-Consumerfunktion |
50
- | `Comparator<T>` | Zweiparameter-Vergleichsfunktion |
51
- | `Generator<T>` | Generatorfunktion (Kern und Basis) |
14
+ ---
52
15
 
53
- ```typescript
54
- // Beispiel für die Verwendung von Typen
55
- let predicate: Predicate<number> = (n: number): boolean => n > 0;
56
- let mapper: Functional<string, number> = (text: string): number => text.length;
57
- let comparator: Comparator<number> = (a: number, b: number): number => a - b;
58
- ```
59
-
60
- ## Typguards
61
-
62
- | Funktion | Beschreibung | Zeitkomplexität | Speicherplatzkomplexität |
63
- |------|------|------------|------------|
64
- | `validate<T>(t: MaybeInvalid<T>): t is T` | Überprüft, ob der Wert nicht null oder undefined ist | O(1) | O(1) |
65
- | `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | Überprüft, ob der Wert null oder undefined ist | O(1) | O(1) |
66
- | `isBoolean(t: unknown): t is boolean` | Überprüft, ob es sich um einen booleschen Wert handelt | O(1) | O(1) |
67
- | `isString(t: unknown): t is string` | Überprüft, ob es sich um einen String handelt | O(1) | O(1) |
68
- | `isNumber(t: unknown): t is number` | Überprüft, ob es sich um eine Zahl handelt | O(1) | O(1) |
69
- | `isFunction(t: unknown): t is Function` | Überprüft, ob es sich um eine Funktion handelt | O(1) | O(1) |
70
- | `isObject(t: unknown): t is object` | Überprüft, ob es sich um ein Objekt handelt | O(1) | O(1) |
71
- | `isSymbol(t: unknown): t is symbol` | Überprüft, ob es sich um ein Symbol handelt | O(1) | O(1) |
72
- | `isBigint(t: unknown): t is bigint` | Überprüft, ob es sich um ein BigInt handelt | O(1) | O(1) |
73
- | `isPrimitive(t: unknown): t is Primitive` | Überprüft, ob es sich um einen primitiven Typ handelt | O(1) | O(1) |
74
- | `isIterable(t: unknown): t is Iterable<unknown>` | Überprüft, ob es sich um ein iterierbares Objekt handelt | O(1) | O(1) |
75
- | `isOptional(t: unknown): t is Optional<unknown>` | Überprüft, ob es sich um eine Optional-Instanz handelt | O(1) | O(1) |
76
- | `isSemantic(t: unknown): t is Semantic<unknown>` | Überprüft, ob es sich um eine Semantic-Instanz handelt | O(1) | O(1) |
77
- | `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Überprüft, ob es sich um eine Collector-Instanz handelt | O(1) | O(1) |
78
- | `isCollectable(t: unknown): t is Collectable<unknown>` | Überprüft, ob es sich um eine Collectable-Instanz handelt | O(1) | O(1) |
79
- | `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | Überprüft, ob es sich um eine OrderedCollectable-Instanz handelt | O(1) | O(1) |
80
- | `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | Überprüft, ob es sich um eine WindowCollectable-Instanz handelt | O(1) | O(1) |
81
- | `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | Überprüft, ob es sich um eine UnorderedCollectable-Instanz handelt | O(1) | O(1) |
82
- | `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Überprüft, ob es sich um eine Statistics-Instanz handelt | O(1) | O(1) |
83
- | `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | Überprüft, ob es sich um eine NumericStatistics-Instanz handelt | O(1) | O(1) |
84
- | `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | Überprüft, ob es sich um eine BigIntStatistics-Instanz handelt | O(1) | O(1) |
85
- | `isPromise(t: unknown): t is Promise<unknown>` | Überprüft, ob es sich um ein Promise-Objekt handelt | O(1) | O(1) |
86
- | `isAsync(t: unknown): t is AsyncFunction` | Überprüft, ob es sich um eine AsyncFunction handelt | O(1) | O(1) |
87
-
88
- ```typescript
89
- // Beispiel für die Verwendung von Typguards
90
- let value: unknown = "hello";
91
-
92
- if (isString(value)) {
93
- console.log(value.length); // Typsicher, value wird als string abgeleitet
94
- }
95
-
96
- if (isOptional(someValue)) {
97
- someValue.ifPresent((value): void => console.log(val));
98
- }
99
-
100
- if(isIterable(value)){
101
- // Typsicher, jetzt ist es ein iterierbares Objekt.
102
- for(let item of value){
103
- console.log(item);
104
- }
105
- }
106
- ```
16
+ ### Warum Entwickler es bevorzugen
107
17
 
108
- ## Hilfsfunktionen
18
+ - **Zero-Boilerplate-Indexierung** – jedes Element trägt seinen natürlichen oder individuellen Index.
19
+ - **Rein funktionaler Stil** — mit vollständiger TypeScript-Inferenz.
20
+ - **Speicherleck-sichere Event-Streams** – `useWindow`, `useDocument`, `useHTMLElement` und `useWebSocket` sind mit Sicherheit im Hinterkopf entwickelt. Sie definieren die Grenze – mittels `limit(n)`, `sub(start, end)` oder `takeWhile(predicate)` – und die Bibliothek übernimmt die Aufräumarbeit. Keine hängen gebliebenen Listener, keine Speicherlecks.
21
+ - **Integrierte Statistik** – umfassende numerische und BigInt-Analysen inklusive Mittelwerten, Medianen, Modus, Varianz, Schiefe und Kurtosis.
22
+ - **Vorhersehbare Performance** – wählen Sie basierend auf Ihren Anforderungen zwischen geordneten und ungeordneten Kollektoren.
23
+ - **Speichereffizient** – Streams werden lazy evaluiert, was Speicherbedenken mindert.
24
+ - **Kein undefiniertes Verhalten** – TypeScript garantiert Typsicherheit und Null-Sicherheit. Eingabedaten bleiben unverändert, es sei denn, sie werden explizit in Ihren Callback-Funktionen modifiziert.
109
25
 
110
- | Funktion | Beschreibung | Zeitkomplexität | Speicherplatzkomplexität |
111
- |------|------|------------|------------|
112
- | `useCompare<T>(t1: T, t2: T): number` | Allgemeine Vergleichsfunktion | O(1) | O(1) |
113
- | `useRandom<T = number \| bigint>(index: T): T` | Pseudozufallszahlengenerator | O(log n) | O(1) |
26
+ ---
114
27
 
115
- ```typescript
116
- // Beispiel für die Verwendung von Hilfsfunktionen
117
- let numbers: Array<number> = [3, 1, 4, 1, 5];
118
- numbers.sort(useCompare); // [1, 1, 3, 4, 5]
28
+ ### Installation
119
29
 
120
- let randomNum = useRandom(42); // Saat-basierter Zufallszahl
30
+ ```bash
31
+ npm install semantic-typescript
32
+ ```
33
+ oder
34
+ ```bash
35
+ yarn add semantic-typescript
121
36
  ```
122
37
 
123
- ## Fabrikmethoden
124
-
125
- ### Optionale Fabrikmethoden
38
+ ---
126
39
 
127
- | Methode | Beschreibung | Zeitkomplexität | Speicherplatzkomplexität |
128
- |------|------|------------|------------|
129
- | `Optional.empty<T>()` | Erstellt eine leere Optional | O(1) | O(1) |
130
- | `Optional.of<T>(value)` | Erstellt eine Optional, die einen Wert enthält | O(1) | O(1) |
131
- | `Optional.ofNullable<T>(value)` | Erstellt eine potenziell leere Optional | O(1) | O(1) |
132
- | `Optional.ofNonNull<T>(value)` | Erstellt eine nicht-null Optional | O(1) | O(1) |
40
+ ### Schnellstart
133
41
 
134
42
  ```typescript
135
- // Beispiele für die Verwendung von Optional
136
- let empty: Optional<number> = Optional.empty();
137
- let present: Optional<number> = Optional.of(42);
138
- let nullable: Optional<string> = Optional.ofNullable<string>(null);
139
- let nonNull: Optional<string> = Optional.ofNonNull("hello");
140
-
141
- present.ifPresent((value: number): void => console.log(value)); // Gibt 42 aus
142
- console.log(empty.get(100)); // Gibt 100 aus
43
+ import { useOf, useFrom, useRange, useWindow, useHTMLElement, useWebSocket, useText, useStringify } from "semantic-typescript";
44
+
45
+ // Numerische Statistiken
46
+ let summate: number = useOf(10, 20, 30, 40)
47
+ .map((n: number): number => n * 2)
48
+ .toNumericStatistics() // Erforderlich vor Terminal-Operation
49
+ .summate(); // 200
50
+
51
+ // BigInt-Statistiken
52
+ let summate: bigint = useOf(10n, 20n, 30n, 40n)
53
+ .map((n: bigint): bigint => n * 2)
54
+ .toBigIntStatistics() // Erforderlich vor Terminal-Operation
55
+ .summate(); // 200n
56
+
57
+ // Einen Stream per Index umkehren
58
+ useFrom([1, 2, 3, 4, 5])
59
+ .redirect((element: E, index: bigint): bigint => -index) // Negativer Index zur Umkehrung
60
+ .toOrdered() // toOrdered() aufrufen, um die Indexreihenfolge zu erhalten
61
+ .toArray(); // [5, 4, 3, 2, 1]
62
+
63
+ // Einen Stream mischen
64
+ useFrom([1, 2, 3, 4, 5])
65
+ .shuffle()
66
+ .toOrdered()
67
+ .toArray(); // z.B. [2, 5, 1, 4, 3]
68
+
69
+ // Elemente innerhalb eines Streams verschieben
70
+ useFrom([1, 2, 3, 4, 5])
71
+ .translate(2) // Elemente um 2 Positionen nach rechts verschieben
72
+ .toOrdered()
73
+ .toArray(); // [4, 5, 1, 2, 3]
74
+
75
+ useFrom([1, 2, 3, 4, 5])
76
+ .translate(-2) // Elemente um 2 Positionen nach links verschieben
77
+ .toOrdered()
78
+ .toArray(); // [3, 4, 5, 1, 2]
79
+
80
+ // Unendlicher Bereich mit frühem Abbruch
81
+ useRange(0n, 1_000_000n)
82
+ .filter(n => n % 17n === 0n)
83
+ .limit(10n) // Nach 10 Elementen stoppen
84
+ .toUnordered()
85
+ .toArray();
86
+
87
+ // Echtzeit-Fenster-Größenänderung (stoppt automatisch nach 5 Events)
88
+ useWindow("resize")
89
+ .limit(5n) // Entscheidend für Event-Streams
90
+ .toUnordered()
91
+ .forEach((ev, idx) => console.log(`Größenänderung #${idx}`));
92
+
93
+ // Auf ein HTML-Element hören
94
+ // <input id="input" type="text"/>
95
+ useHTMLElement("#input", "change")
96
+ .limit(1)
97
+ .toUnordered()
98
+ .forEach((event: Event) => submit(event));
99
+
100
+ // Auf mehrere Elemente und Events hören
101
+ useHTMLElement("input", ["change", "keyup"])
102
+ .takeWhile((event: Event): boolean => validate(event))
103
+ .toUnordered()
104
+ .forEach((event: Event) => submit(event));
105
+
106
+ // Auf einen WebSocket hören
107
+ let webSocket = new WebSocket("ws://localhost:8080");
108
+ webSocket.addEventListener("close", (): void => {
109
+ webSocket.close(); // WebSocket-Lebenszyklus manuell verwalten
110
+ });
111
+ useWebSocket(webSocket, "message")
112
+ .limit(1)
113
+ .toUnordered()
114
+ .forEach((message: MessageEvent) => console.log(message.data));
115
+
116
+ // Über einen String Code-Punkt für Code-Punkt iterieren
117
+ useText("My emotion now is: 😊, and semantic is 👍")
118
+ .toUnordered()
119
+ .log(); // Gibt den String aus
120
+
121
+ // Ein Objekt mit Zirkelbezügen sicher in einen String umwandeln
122
+ let o = {
123
+ a: 1,
124
+ b: "text",
125
+ c: [o.a, o.b, o.c] // Zirkelbezug
126
+ };
127
+ // let text: string = JSON.stringify(o); // Wirft einen Fehler
128
+ let text: string = useStringify(o); // Ergibt sicher `{a: 1, b: "text", c: []}`
143
129
  ```
144
130
 
145
- ### Collector Fabrikmethoden
131
+ ---
146
132
 
147
- | Methode | Beschreibung | Zeitkomplexität | Speicherplatzkomplexität |
148
- |------|------|------------|------------|
149
- | `Collector.full(identity, accumulator, finisher)` | Erstellt einen vollständigen Collector | O(1) | O(1) |
150
- | `Collector.shortable(identity, interruptor, accumulator, finisher)` | Erstellt einen unterbrechbaren Collector | O(1) | O(1) |
133
+ ### Kernkonzepte
151
134
 
152
- ```typescript
153
- // Beispiele für die Konvertierung von Collectors
154
- let numbers: Semantic<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
155
-
156
- // Leistung zuerst: verwenden Sie den ungeordneten Collector
157
- let unordered: UnorderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
158
- .filter((n: number): boolean => n > 3)
159
- .toUnordered();
160
-
161
- // Sortierung erforderlich: verwenden Sie den geordneten Collector
162
- let ordered: OrderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
163
- .sorted();
164
-
165
- // Zählt die Anzahl der Elemente
166
- let count: Collector<number, number, number> = Collector.full(
167
- (): number => 0, // Anfangswert
168
- (accumulator: number, element: number): number => accumulator + element, // Akkumulieren
169
- (accumulator: number): number => accumulator // Fertigstellen
170
- );
171
- count.collect(from([1,2,3,4,5])); // Zählt aus einem Stream
172
- count.collect([1,2,3,4,5]); // Zählt aus einem iterierbaren Objekt
173
-
174
- let find: Optional<number> = Collector.shortable(
175
- (): Optional<number> => Optional.empty(), // Anfangswert
176
- (element: number, index: bigint, accumulator: Optional<number>): Optional<number> => accumulator.isPresent(), // Unterbrechen
177
- (accumulator: Optional<number>, element: number, index: bigint): Optional<number> => Optional.of(element), // Akkumulieren
178
- (accumulator: Optional<number>): Optional<number> => accumulator // Fertigstellen
179
- );
180
- find.collect(from([1,2,3,4,5])); // Findet das erste Element
181
- find.collect([1,2,3,4,5]); // Findet das erste Element
182
- ```
135
+ | Konzept | Zweck | Wann zu verwenden |
136
+ | :--- | :--- | :--- |
137
+ | `AsynchronousSemantic` | Kern-Builder für asynchrone Streams, Events und faule Pipelines. | Echtzeit-Events, WebSockets, DOM-Listener, lang laufende oder unendliche Streams. |
138
+ | `SynchronousSemantic` | Builder für synchrone, im Speicher basierte oder schleifenbasierte Streams. | Statische Daten, Bereiche, sofortige Iteration. |
139
+ | `toUnordered()` | Schnellster Terminal-Kollektor (Map-basierte Indexierung). | Leistungskritische Pfade (O(n) Zeit & Speicher, keine Sortierung). |
140
+ | `toOrdered()` | Sortierter, indexstabiler Kollektor. | Wenn stabile Ordnung oder indexbasierter Zugriff erforderlich ist. |
141
+ | `toNumericStatistics()` | Umfangreiche numerische statistische Analyse (Mittelwert, Median, Varianz, Schiefe, Kurtosis etc.). | Datenanalyse und statistische Berechnungen. |
142
+ | `toBigIntStatistics()` | Umfangreiche BigInt-Statistikanalyse. | Datenanalyse und statistische Berechnungen für große Integer. |
143
+ | `toWindow()` | Unterstützung für gleitende und fallende Fenster. | Zeitreihenverarbeitung, Batching und Fensteroperationen. |
183
144
 
184
- ### Semantic Fabrikmethoden
145
+ ---
185
146
 
186
- | Methode | Beschreibung | Zeitkomplexität | Speicherplatzkomplexität |
187
- |------|------|------------|------------|
188
- | `animationFrame(period: number, delay: number = 0)` | Erstellt einen zeitgesteuerten Animationsframe-Stream | O(1)* | O(1) |
189
- | `blob(blob, chunkSize)` | Erstellt einen Stream aus einem Blob | O(n) | O(chunkSize) |
190
- | `empty<E>()` | Erstellt einen leeren Stream | O(1) | O(1) |
191
- | `fill<E>(element, count)` | Erstellt einen gefüllten Stream | O(n) | O(1) |
192
- | `from<E>(iterable)` | Erstellt einen Stream aus einem iterierbaren Objekt | O(1) | O(1) |
193
- | `interval(period, delay?)` | Erstellt einen zeitgesteuerten Intervall-Stream | O(1)* | O(1) |
194
- | `iterate<E>(generator)` | Erstellt einen Stream aus einem Generator | O(1) | O(1) |
195
- | `range(start, end, step)` | Erstellt einen numerischen Bereichs-Stream | O(n) | O(1) |
196
- | `websocket(websocket)` | Erstellt einen Stream aus einem WebSocket | O(1) | O(1) |
147
+ **Wichtige Nutzungsregeln**
197
148
 
198
- ```typescript
199
- // Beispiele für die Verwendung von Semantic Fabrikmethoden
200
-
201
- // Erstellt einen Stream aus einem zeitgesteuerten Animationsframe
202
- animationFrame(1000)
203
- .toUnordered()
204
- .forEach(frame => console.log(frame));
205
-
206
- // Erstellt einen Stream aus einem Blob (chunked reading)
207
- blob(someBlob, 1024n)
208
- .toUnordered()
209
- .write(WritableStream)
210
- .then(callback) // Schreiben des Streams erfolgreich
211
- .catch(callback); // Schreiben des Streams fehlgeschlagen
212
-
213
- // Erstellt einen leeren Stream, der erst ausgeführt wird, wenn er mit anderen Streams verkettet wird
214
- empty<string>()
215
- .toUnordered()
216
- .join(); //[]
217
-
218
- // Erstellt einen gefüllten Stream
219
- let filledStream = fill("hello", 3); // "hello", "hello", "hello"
220
-
221
- // Erstellt einen zeitgesteuerten Stream mit einer anfänglichen Verzögerung von 2 Sekunden und einer Ausführungsperiode von 5 Sekunden, implementiert auf der Grundlage eines Timer-Mechanismus; kann aufgrund von Systemplanungsgenauigkeitsbeschränkungen zu Zeitdrift führen.
222
- let intervalStream = interval(5000, 2000);
223
-
224
- // Erstellt einen Stream aus einem iterierbaren Objekt
225
- let numberStream = from([1, 2, 3, 4, 5]);
226
- let stringStream = from(new Set(["Alex", "Bob"]));
227
-
228
- // Erstellt einen Bereichs-Stream
229
- let rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
230
-
231
- // WebSocket-Ereignis-Stream
232
- let ws = new WebSocket("ws://localhost:8080");
233
- websocket(ws)
234
- .filter((event): boolean => event.type === "message"); // Nur Nachrichtenereignisse abhören
235
- .toUnordered() // Ereignisse sind in der Regel nicht geordnet
236
- .forEach((event): void => receive(event)); // Nachrichten empfangen
237
- ```
149
+ 1. **Event-Streams** (`useWindow`, `useDocument`, `useHTMLElement`, `useWebSocket`, …) geben ein `AsynchronousSemantic` zurück.
150
+ Sie **müssen** `.limit(n)`, `.sub(start, end)` oder `.takeWhile()` aufrufen, um das Lauschen zu beenden. Andernfalls bleibt der Listener aktiv.
238
151
 
239
- ## Semantic Klassenmethoden
240
-
241
- | Methode | Beschreibung | Zeitkomplexität | Speicherplatzkomplexität |
242
- |------|------|------------|------------|
243
- | `concat(other)` | Verbindet zwei Streams | O(n) | O(1) |
244
- | `distinct()` | Entfernt Duplikate | O(n) | O(n) |
245
- | `distinct(comparator)` | Entfernt Duplikate mit einem Vergleichsoperator | O(n²) | O(n) |
246
- | `dropWhile(predicate)` | Verwirft Elemente, die die Bedingung erfüllen | O(n) | O(1) |
247
- | `filter(predicate)` | Filtert Elemente | O(n) | O(1) |
248
- | `flat(mapper)` | Flachemapping | O(n × m) | O(1) |
249
- | `flatMap(mapper)` | Flachemapping in einen neuen Typ | O(n × m) | O(1) |
250
- | `limit(n)` | Begrenzt die Anzahl der Elemente | O(n) | O(1) |
251
- | `map(mapper)` | Zuordnungstransformation | O(n) | O(1) |
252
- | `peek(consumer)` | Blickt auf Elemente | O(n) | O(1) |
253
- | `redirect(redirector)` | Leitet den Index um | O(n) | O(1) |
254
- | `reverse()` | Umkehrt den Stream | O(n) | O(1) |
255
- | `shuffle()` | Mischt zufällig | O(n) | O(1) |
256
- | `shuffle(mapper)` | Mischt mit einem Mapper | O(n) | O(1) |
257
- | `skip(n)` | Überspringt die ersten n Elemente | O(n) | O(1) |
258
- | `sorted()` | Sortiert | O(n log n) | O(n) |
259
- | `sorted(comparator)` | Sortiert mit einem Vergleichsoperator | O(n log n) | O(n) |
260
- | `sub(start, end)` | Holt einen Substream | O(n) | O(1) |
261
- | `takeWhile(predicate)` | Holt Elemente, die die Bedingung erfüllen | O(n) | O(1) |
262
- | `translate(offset)` | Übersetzt den Index | O(n) | O(1) |
263
- | `translate(translator)` | Übersetzt den Index mit einem Translator | O(n) | O(1) |
152
+ 2. **Terminale Operationen** (`.toArray()`, `.count()`, `.average()`, `.reduce()`, `.findFirst()`, etc.) sind **nur verfügbar nach** der Konvertierung in einen Kollektor:
153
+ ```typescript
154
+ .toUnordered() // O(n) Zeit & Speicher, keine Sortierung
155
+ // oder
156
+ .toOrdered() // Sortiert, behält die Reihenfolge bei
157
+ ```
264
158
 
265
- ```typescript
266
- // Beispiele für Semantic-Operationen
267
- let result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
268
- .filter((n: number): boolean => n % 2 === 0) // Filtert gerade Zahlen
269
- .map((n: number): number => n * 2) // Multipliziert mit 2
270
- .skip(1) // Überspringt das erste
271
- .limit(3) // Begrenzt auf 3 Elemente
272
- .toUnordered() // Konvertiert in einen ungeordneten Collector
273
- .toArray(); // Konvertiert in ein Array
274
- // Ergebnis: [8, 12, 20]
275
-
276
- // Komplexes Operationsexample
277
- let complexResult = range(1, 100, 1)
278
- .flatMap((n: number): Semantics<number> => from([n, n * 2])) // Mappt jedes Element auf zwei
279
- .distinct() // Entfernt Duplikate
280
- .shuffle() // Mischt die Reihenfolge
281
- .takeWhile((n: number): boolean => n < 50) // Nimmt Elemente kleiner als 50
282
- .toOrdered() // Konvertiert in einen geordneten Collector
283
- .toArray(); // Konvertiert in ein Array
284
- ```
159
+ ---
285
160
 
286
- ## Semantic Konvertierungsmethoden
161
+ ### Leistungsmerkmale
287
162
 
288
- | Methode | Beschreibung | Zeitkomplexität | Speicherplatzkomplexität |
289
- |------------|------------|------------|------------|
290
- | `sorted()` | Konvertiert in einen geordneten Collector | O(n log n) | O(n) |
291
- | `toUnordered()` | Konvertiert in einen ungeordneten Collector | O(1) | O(1) |
292
- | `toOrdered()` | Konvertiert in einen geordneten Collector | O(1) | O(1) |
293
- | `toNumericStatistics()` | Konvertiert in numerische Statistiken | O(n) | O(1) |
294
- | `toBigintStatistics()` | Konvertiert in BigInt-Statistiken | O(n) | O(1) |
295
- | `toWindow()` | Konvertiert in einen Fenstercollector | O(1) | O(1) |
296
- | `toCollectable()` | Konvertiert in `UnorderdCollectable` | O(n) | O(1) |
297
- | `toCollectable(mapper)` | Konvertiert in einen benutzerdefinierten Collectable | O(n) | O(1) |
163
+ | Kollektor | Zeitkomplexität | Speicherkomplexität | Sortiert? | Am besten für |
164
+ | :--- | :--- | :--- | :--- | :--- |
165
+ | `toUnordered()` | O(n) | O(n) | Nein | Rohgeschwindigkeit, Reihenfolge nicht erforderlich. |
166
+ | `toOrdered()` | O(2n) | O(n) | Ja | Stabile Ordnung, indexierter Zugriff, Analysen. |
167
+ | `toNumericStatistics()` | O(2n) | O(n) | Ja | Statistische Operationen, die sortierte Daten erfordern. |
168
+ | `toBigIntStatistics()` | O(2n) | O(n) | Ja | Statistische Operationen für BigInt. |
169
+ | `toWindow()` | O(2n) | O(n) | Ja | Zeitbasierte Fensteroperationen. |
298
170
 
299
- ```typescript
300
- // Konvertiert in ein aufsteigend sortiertes Array
301
- from([6,4,3,5,2]) // Erstellt einen Stream
302
- .sorted() // Sortiert den Stream in aufsteigender Reihenfolge
303
- .toArray(); // [2, 3, 4, 5, 6]
304
-
305
- // Konvertiert in ein absteigend sortiertes Array
306
- from([6,4,3,5,2]) // Erstellt einen Stream
307
- .soted((a: number, b: number): number => b - a) // Sortiert den Stream in absteigender Reihenfolge
308
- .toArray(); // [6, 5, 4, 3, 2]
309
-
310
- // Leitet um in ein umgekehrtes Array
311
- from([6,4,3,5,2])
312
- .redirect((element, index): bigint => -index) // Leitet um in umgekehrter Reihenfolge
313
- .toOrderd() // Behält die umgeleitete Reihenfolge bei
314
- .toArray(); // [2, 5, 3, 4, 6]
315
-
316
- // Ignoriert Umleitungen, um ein umgekehrtes Array zu erhalten
317
- from([6,4,3,5,2])
318
- .redirect((element: number, index: bigint) => -index) // Leitet um in umgekehrter Reihenfolge
319
- .toUnorderd() // Ignoriert die umgeleitete Reihenfolge. Diese Operation ignoriert `redirect`, `reverse`, `shuffle` und `translate` Operationen
320
- .toArray(); // [2, 5, 3, 4, 6]
321
-
322
- // Kehrt den Stream in ein Array um
323
- from([6, 4, 3, 5, 2])
324
- .reverse() // Kehrt den Stream um
325
- .toOrdered() // Garantiert die umgekehrte Reihenfolge
326
- .toArray(); // [2, 5, 3, 4, 6]
327
-
328
- // Überschreibt den gemischten Stream in ein Array
329
- from([6, 4, 3, 5, 2])
330
- .shuffle() // Mischt den Stream
331
- .sorted() // Überschreibt die gemischte Reihenfolge. Diese Operation überschreibt `redirect`, `reverse`, `shuffle` und `translate` Operationen
332
- .toArray(); // [2, 5, 3, 4, 6]
333
-
334
- // Konvertiert in einen Fenstercollector
335
- from([6, 4, 3, 5, 2]).toWindow();
336
-
337
- // Konvertiert in numerische Statistiken
338
- from([6, 4, 3, 5, 2]).toNumericStatistics();
339
-
340
- // Konvertiert in BigInt-Statistiken
341
- from([6n, 4n, 3n, 5n, 2n]).toBigintStatistics();
342
-
343
- // Definiert einen benutzerdefinierten Collector zum Sammeln von Daten
344
- let customizedCollector = from([1, 2, 3, 4, 5]).toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
345
- ```
171
+ Setzen Sie auf `toUnordered()`, wenn Geschwindigkeit oberste Priorität hat. Verwenden Sie `toOrdered()` nur, wenn Sie eine stabile Ordnung oder statistische Methoden benötigen, die von sortierten Daten abhängen.
346
172
 
347
- ## Collectable Auflistungsmethoden
348
-
349
- | Methode | Beschreibung | Zeitkomplexität | Speicherplatzkomplexität |
350
- |------|------|------------|------------|
351
- | `anyMatch(predicate)` | Ob irgendein Element übereinstimmt | O(n) | O(1) |
352
- | `allMatch(predicate)` | Ob alle Elemente übereinstimmen | O(n) | O(1) |
353
- | `count()` | Elementanzahl | O(n) | O(1) |
354
- | `isEmpty()` | Ob es leer ist | O(1) | O(1) |
355
- | `findAny()` | Finde ein beliebiges Element | O(n) | O(1) |
356
- | `findFirst()` | Finde das erste Element | O(n) | O(1) |
357
- | `findLast()` | Finde das letzte Element | O(n) | O(1) |
358
- | `forEach(action)` | Durchlaufe alle Elemente | O(n) | O(1) |
359
- | `group(classifier)` | Gruppiere nach Klassifizierer | O(n) | O(n) |
360
- | `groupBy(keyExtractor, valueExtractor)` | Gruppiere nach Schlüssel-Wert-Extraktor | O(n) | O(n) |
361
- | `join()` | Verbinde als Zeichenkette | O(n) | O(n) |
362
- | `join(delimiter)` | Verbinde mit einem Trennzeichen | O(n) | O(n) |
363
- | `nonMatch(predicate)` | Ob kein Element übereinstimmt | O(n) | O(1) |
364
- | `partition(count)` | Partitioniere nach Anzahl | O(n) | O(n) |
365
- | `partitionBy(classifier)` | Partitioniere nach Klassifizierer | O(n) | O(n) |
366
- | `reduce(accumulator)` | Reduktionsoperation | O(n) | O(1) |
367
- | `reduce(identity, accumulator)` | Reduzierung mit Anfangswert | O(n) | O(1) |
368
- | `toArray()` | Konvertiere in ein Array | O(n) | O(n) |
369
- | `toMap(keyExtractor, valueExtractor)` | Konvertiere in eine Map | O(n) | O(n) |
370
- | `toSet()` | Konvertiere in eine Menge | O(n) | O(n) |
371
- | `write(stream)` | Schreibe in einen Stream | O(n) | O(1) |
173
+ ---
372
174
 
373
- ```typescript
374
- // Collectable Operationsexamples
375
- let data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
376
- .filter((n: number): boolean => n % 2 === 0)
377
- .toOrdered();
378
-
379
- // Übereinstimmungsüberprüfungen
380
- console.log(data.anyMatch((n: number): boolean => n > 5)); // true
381
- console.log(data.allMatch((n: number): boolean => n < 20)); // true
382
-
383
- // Suchvorgänge
384
- data.findFirst().ifPresent((n: number): void => console.log(n)); // 2
385
- data.findAny().ifPresent((n: number): void => console.log(n)); // Ein beliebiges Element
386
-
387
- // Gruppierungsvorgänge
388
- let grouped = data.groupBy(
389
- (n: number): string => (n > 5 ? "groß" : "klein"),
390
- (n: number): number => n * 2
391
- ); // {klein: [4, 8], groß: [12, 16, 20]}
392
-
393
- // Reduktionsvorgänge
394
- let sum = data.reduce(0, (acc, n) => acc + n); // 30
395
-
396
- // Ausgabeoperationen
397
- data.join(", "); // "[2, 4, 6, 8, 10]"
398
- ```
175
+ **Vergleich mit anderen Frontend-Stream-Prozessoren**
399
176
 
400
- ## Statistische Analysemethode
401
-
402
- ### NumericStatistics Methoden
403
-
404
- | Methode | Beschreibung | Zeitkomplexität | Speicherplatzkomplexität |
405
- |------|------|------------|------------|
406
- | `range()` | Bereich | O(n) | O(1) |
407
- | `variance()` | Varianz | O(n) | O(1) |
408
- | `standardDeviation()` | Standardabweichung | O(n) | O(1) |
409
- | `mean()` | Mittelwert | O(n) | O(1) |
410
- | `median()` | Median | O(n log n) | O(n) |
411
- | `mode()` | Modus | O(n) | O(n) |
412
- | `frequency()` | Häufigkeitsverteilung | O(n) | O(n) |
413
- | `summate()` | Summation | O(n) | O(1) |
414
- | `quantile(quantile)` | Quantil | O(n log n) | O(n) |
415
- | `interquartileRange()` | Interquartilsabstand | O(n log n) | O(n) |
416
- | `skewness()` | Schiefe | O(n) | O(1) |
417
- | `kurtosis()` | Wölbung | O(n) | O(1) |
177
+ | Feature | Semantic-TypeScript | RxJS | Native Async Iteratoren / Generatoren | Most.js |
178
+ | :--- | :--- | :--- | :--- | :--- |
179
+ | **TypeScript-Integration** | Erstklassig, tief typisiert mit nativer Index-Awareness. | Ausgezeichnet, aber mit komplexen Generics. | Gut, erfordert manuelle Typisierung. | Starker, funktionaler Stil. |
180
+ | **Integrierte statistische Analyse** | Umfassende native Unterstützung für `number` und `bigint`. | Nicht nativ verfügbar (benötigt benutzerdefinierte Operatoren). | Keine. | Keine. |
181
+ | **Indexierung & Positionsbewusstsein** | Native, mächtige BigInt-Indexierung für jedes Element. | Benötigt benutzerdefinierte Operatoren (`scan`, `withLatestFrom`). | Manueller Zähler erforderlich. | Grundlegend, kein eingebauter Index. |
182
+ | **Event-Stream-Management** | Dedizierte, typsichere Fabriken mit expliziter Frühstopp-Kontrolle. | Leistungsstark, aber erfordert manuelles Abonnement-Management. | Manueller Event-Listener + Abbruch. | Gute `fromEvent`, leichtgewichtig. |
183
+ | **Leistung & Speichereffizienz** | Hervorragend – optimierte `toUnordered()`- und `toOrdered()`-Kollektoren. | Sehr gut, aber Operator-Ketten verursachen Overhead. | Ausgezeichnet (kein Overhead). | Ausgezeichnet. |
184
+ | **Bundle-Größe** | Sehr leichtgewichtig. | Groß (auch mit Tree-Shaking). | Null (nativ). | Klein. |
185
+ | **API-Design-Philosophie** | Funktionales Kollektor-Muster mit expliziter Indexierung. | Reaktives Observable-Muster. | Iterator- / Generator-Muster. | Funktional, point-free. |
186
+ | **Frühe Beendigung & Kontrolle** | Explizit (`interrupt`, `.limit()`, `.takeWhile()`, `.sub()`). | Gut (`take`, `takeUntil`, `first`). | Manuell (`break` in `for await…of`). | Gut (`take`, `until`). |
187
+ | **Synchroner & asynchroner Support** | Vereinheitlichte API – erstklassiger Support für beides. | Hauptsächlich asynchron. | Beides, aber manuell. | Hauptsächlich asynchron. |
188
+ | **Lernkurve** | Flach für Entwickler, die mit funktionalen und indizierten Pipelines vertraut sind. | Steiler (viele Operatoren, heiße/kalte Observables). | Niedrig. | Mittel. |
418
189
 
419
- ```typescript
420
- // Statistische Analysebeispiele
421
- let numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
422
- .toNumericStatistics();
423
-
424
- console.log("Mittelwert:", numbers.mean()); // 5.5
425
- console.log("Median:", numbers.median()); // 5.5
426
- console.log("Standardabweichung:", numbers.standardDeviation()); // ~2.87
427
- console.log("Summe:", numbers.summate()); // 55
428
-
429
- // Mit Mappern statistische Analyse durchführen
430
- let objects = from([
431
- { value: 10 },
432
- { value: 20 },
433
- { value: 30 }
434
- ]).toNumericStatistics();
435
- console.log("Gemappter Mittelwert:", objects.mean(obj => obj.value)); // 20
436
- ```
190
+ **Hauptvorteile von Semantic-TypeScript**
437
191
 
438
- ## Leistungsauswahlhandbuch
192
+ * Einzigartige, eingebaute statistische und Indexierungs-Fähigkeiten, die manuelles `reduce` oder externe Bibliotheken überflüssig machen.
193
+ * Explizite Kontrolle über Event-Streams verhindert die bei RxJS häufigen Speicherlecks.
194
+ * Ein einheitliches, synchrones/asynchrones Design bietet eine einzige, konsistente API für diverse Anwendungsfälle.
439
195
 
440
- ### Wählen Sie einen ungeordneten Collector (Leistung zuerst)
441
- ```typescript
442
- // Wenn keine Reihenfolgegarantie benötigt wird, verwenden Sie einen ungeordneten Collector für beste Leistung
443
- let highPerformance = data
444
- .filter(predicate)
445
- .map(mapper)
446
- .toUnordered(); // Beste Leistung
447
- ```
196
+ Dieser Vergleich veranschaulicht, warum Semantic-TypeScript besonders gut für moderne TypeScript-Frontend-Anwendungen geeignet ist, die Leistung, Typsicherheit und umfangreiche Analysen ohne den Aufwand traditioneller reaktiver Bibliotheken fordern.
448
197
 
449
- ### Wählen Sie einen geordneten Collector (Reihenfolge erforderlich)
450
- ```typescript
451
- // Wenn die Reihenfolge der Elemente beibehalten werden muss, verwenden Sie einen geordneten Collector
452
- let ordered = data.sorted(comparator);
453
- ```
198
+ ---
454
199
 
455
- ### Wählen Sie einen Fenstercollector (Fensteroperationen)
456
- ```typescript
457
- // Wenn Fensteroperationen benötigt werden
458
- let window: WindowCollectable<number> = data
459
- .toWindow()
460
- .slide(5n, 2n); // Gleitender Fenster
461
- ```
200
+ ### Bereit zu erkunden?
462
201
 
463
- ### Wählen Sie eine statistische Analyse (numerische Berechnungen)
464
- ```typescript
465
- // Wenn eine statistische Analyse benötigt wird
466
- let statistics: NumericStatistics<number> = data
467
- .toNumericStatistics(); // Numerische Statistiken
202
+ Semantic-TypeScript verwandelt komplexe Datenflüsse in lesbare, komponierbare und hochperformante Pipelines. Egal, ob Sie Echtzeit-UI-Events verarbeiten, große Datensätze verarbeiten oder Analyse-Dashboards erstellen – es bietet die Leistungsfähigkeit von Datenbank-gradiger Indexierung mit der Eleganz der funktionalen Programmierung.
468
203
 
469
- let bigIntStatistics: BigintStatistics<bigint> = data
470
- .toBigintStatistics(); // Große Ganzzahlstatistiken
471
- ```
204
+ **Nächste Schritte:**
472
205
 
473
- [GitHub](https://github.com/eloyhere/semantic-typescript)
474
- [NPMJS](https://www.npmjs.com/package/semantic-typescript)
206
+ * Durchsuchen Sie die vollständig typisierte API in Ihrer IDE (alle Exporte stammen aus dem Hauptpaket).
207
+ * Treten Sie der wachsenden Community von Entwicklern bei, die verschachtelte asynchrone Iteratoren durch saubere Semantic-Pipelines ersetzt haben.
475
208
 
476
- ## Wichtige Hinweise
209
+ **Semantic-TypeScript** wo Streams auf Struktur treffen.
477
210
 
478
- 1. **Auswirkungen von Sortiervorgängen**: In geordneten Collectors überschreibt der `sorted()`-Vorgang die Effekte von `redirect`, `translate`, `shuffle`, `reverse`.
479
- 2. **Leistungserwägungen**: Wenn keine Reihenfolgegarantie benötigt wird, bevorzugen Sie die Verwendung von `toUnordered()` für eine bessere Leistung.
480
- 3. **Speicherverwendung**: Sortiervorgänge erfordern zusätzlichen Speicherplatz von O(n).
481
- 4. **Echtzeitdaten**: Semantic-Streams eignen sich für die Verarbeitung von Echtzeitdaten und unterstützen asynchrone Datenquellen.
211
+ Beginnen Sie noch heute mit der Entwicklung und erleben Sie den Unterschied, den durchdachte Indexierung bewirkt.
482
212
 
483
- Diese Bibliothek bietet TypeScript-Entwicklern leistungsstarke und flexible Streaming-Fähigkeiten und kombiniert die Vorteile der funktionalen Programmierung mit Typsicherheitsgarantien.
213
+ **Erstellen Sie mit Klarheit, agieren Sie mit Zuversicht und transformieren Sie Daten mit Absicht.**