semantic-typescript 0.7.0 → 0.7.1

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,32 +1,34 @@
1
- # **Semantic-TypeScript**
2
- **Flow, Indexed.** Ihre Daten unter präziser Kontrolle.
1
+ # **SemanticTypeScript**
2
+ **Ströme, indiziert.** Ihre Daten unter präziser Kontrolle.
3
3
 
4
4
  ---
5
5
 
6
- ### Übersicht
6
+ ### Überblick
7
7
 
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
+ SemanticTypeScript stellt eine bedeutende Weiterentwicklung in der Stream‑Verarbeitung dar und vereint elegant die effektivsten Paradigmen aus JavaScript‑Generatoren, JavaStreams und MySQL‑artiger Indizierung. Die Grundidee ist sowohl leistungsfähig als auch bewusst gewählt: Ausnahmslos effiziente Datenverarbeitungspipelines durch intelligente Indizierung zu konstruieren, anstatt durch konventionelle Brute‑Force‑Iteration.
9
9
 
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
+ Wo typische Bibliotheken synchrone Schleifen oder umständliche PromiseKetten erzwingen, bietet SemanticTypeScript eine **vollständig asynchrone**, funktional reine und rigoros typsichere Erfahrung, die ausdrücklich für die Anforderungen moderner Anwendungsentwicklung konzipiert ist.
11
11
 
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.
12
+ Dieses Modell verkörpert eine raffinierte Form des Kontrollflusses: Daten werden nur dann an den nachgelagerten Verbraucher weitergegeben, wenn die vorgelagerte Pipeline explizit den `accept`‑Callback aufruft. Sie behalten die vollständige, granulare Kontrolle über den Zeitpunkt – die Verarbeitung erfolgt genau dann und nur dann, wenn es erforderlich ist.
13
13
 
14
14
  ---
15
15
 
16
- ### Warum Entwickler es bevorzugen
16
+ ### Warum Entwickler Semantic‑TypeScript wählen
17
17
 
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.
18
+ - **ZeroBoilerplate‑Indizierung** – Jedes Element besitzt inhärent seinen natürlichen oder maßgeschneiderten Index, wodurch manuelle Nachverfolgung entfällt.
19
+ - **Rein funktional & typsicher** Genießen Sie vollständige, idiomatische TypeScriptInferenz zusammen mit unveränderlichen Operationen.
20
+ - **Leck‑sichere Ereignisströme** – Das `useSubscription`‑Muster wurde mit Ressourcensicherheit als erstem Prinzip entworfen. Sie definieren die logische Grenze – mittels `limit(n)`, `sub(start, end)` oder `takeWhile(predicate)` – und die Bibliothek verwaltet den vollständigen Abonnement‑Lebenszyklus. Dies stellt sicher, dass keine verbleibenden Listener und keine Speicherlecks entstehen.
21
+ - **Integrierte Statistik‑Suite** – Greifen Sie ohne externe Abhängigkeiten auf umfassende Analysen für sowohl `number`‑ als auch `bigint`‑Ströme zu, einschließlich Mittelwert, Median, Modus, Varianz, Schiefe und Kurtosis.
22
+ - **Vorhersehbare, fein abstimmbare Leistung** – Wählen Sie zwischen geordneten oder ungeordneten Sammlern, um Ihren genauen Leistungs‑ und Reihenfolgeanforderungen gerecht zu werden.
23
+ - **Inherent speichereffizient** – Ströme werden lazy evaluiert, verarbeiten Elemente bei Bedarf und entlasten so den Speicher.
24
+ - **Kein undefiniertes Verhalten** – TypeScript garantiert vollständige Typsicherheit und Nullsicherheit. Ihre Quelldaten bleiben unveränderlich, es sei denn, sie werden explizit in Ihren CallbackFunktionen geändert.
25
25
 
26
26
  ---
27
27
 
28
28
  ### Installation
29
29
 
30
+ Integrieren Sie Semantic‑TypeScript mit Ihrem bevorzugten Paketmanager in Ihr Projekt:
31
+
30
32
  ```bash
31
33
  npm install semantic-typescript
32
34
  ```
@@ -37,177 +39,229 @@ yarn add semantic-typescript
37
39
 
38
40
  ---
39
41
 
40
- ### Schnellstart
42
+ ### Praktische Einführung
43
+
44
+ Die folgenden Beispiele demonstrieren Kernkonzepte, von grundlegenden Transformationen bis zur praktischen Ereignisbehandlung.
41
45
 
42
46
  ```typescript
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()
47
+ import { useOf, useFrom, useRange, useSubscription, useText, useStringify } from "semantic-typescript";
48
+
49
+ // ====================================================================
50
+ // BEISPIEL 1: Grundlegende Operationen & numerische Statistik
51
+ // ====================================================================
52
+ // Demonstriert Mapping und terminale Statistikoperationen. Nach der Transformation muss die Pipeline in einen Statistik‑Collector umgewandelt werden, bevor terminale Methoden wie `.summate()` aufgerufen werden können.
53
+
54
+ const numericSum: number = useOf(10, 20, 30, 40)
55
+ .map((n: number): number => n * 2) // Verdoppelt jedes Element: [20, 40, 60, 80]
56
+ .toNumericStatistics() // In einen Statistik‑Collector umwandeln
57
+ .summate(); // Terminale Operation: 200
58
+
59
+ // Weitere statistische Methoden (verfügbar nach .toNumericStatistics()):
60
+ // .average(), .median(), .mode(), .variance(), .skewness(), .kurtosis()
61
+
62
+ // ====================================================================
63
+ // BEISPIEL 2: BigInt‑Statistik
64
+ // ====================================================================
65
+ // Funktioniert identisch zur numerischen Statistik, ist jedoch für BigInt‑Daten optimiert.
66
+
67
+ const bigintSum: bigint = useOf(10n, 20n, 30n, 40n)
68
+ .map((n: bigint): bigint => n * 2n) // BigInt‑Arithmetik
69
+ .toBigIntStatistics() // In BigInt‑Statistik‑Collector umwandeln
70
+ .summate(); // Terminale Operation: 200n
71
+
72
+ // ====================================================================
73
+ // BEISPIEL 3: Indexmanipulation zur Stromumkehrung
74
+ // ====================================================================
75
+ // Veranschaulicht die Neuanordnung von Elementen durch strategische Neuzuweisung ihrer Indizes mithilfe der `.redirect()`‑Methode, was benutzerdefinierte Muster wie Umkehrung ermöglicht.
76
+
77
+ const reversedArray: number[] = useFrom([1, 2, 3, 4, 5])
78
+ .redirect((_element: number, index: bigint): bigint => -index) // Auf negative Indizes abbilden
79
+ .toOrdered() // Essentiell: Sammelt Elemente sortiert nach ihren neuen Indizes
80
+ .toArray(); // Ergebnis: [5, 4, 3, 2, 1]
81
+
82
+ // Für einfache Umkehrung ist auch `.reverse()` verfügbar.
83
+
84
+ // ====================================================================
85
+ // BEISPIEL 4: Strom‑Mischen (Shuffle)
86
+ // ====================================================================
87
+ // Permutiert Elementindizes zufällig mit einem In‑Place‑Shuffle‑Algorithmus.
88
+
89
+ const shuffledArray: number[] = useFrom([1, 2, 3, 4, 5])
90
+ .shuffle() // Weist Indizes zufällig neu zu
91
+ .toOrdered() // Sortiert nach den neuen zufälligen Indizes
92
+ .toArray(); // Z.B.: [2, 5, 1, 4, 3] (variiert bei jeder Ausführung)
93
+
94
+ // ====================================================================
95
+ // BEISPIEL 5: Zirkuläre Strom‑Rotation
96
+ // ====================================================================
97
+ // Verschiebt Elemente zyklisch. Positive Werte rotieren nach rechts; negative Werte nach links.
98
+
99
+ // Rechts‑Rotation um 2 Positionen
100
+ const rightRotated: number[] = useFrom([1, 2, 3, 4, 5])
101
+ .translate(2) // Verschiebt Indizes um 2 nach rechts
66
102
  .toOrdered()
67
- .toArray(); // z.B. [2, 5, 1, 4, 3]
103
+ .toArray(); // Ergebnis: [4, 5, 1, 2, 3]
68
104
 
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]
105
+ // ====================================================================
106
+ // BEISPIEL 6: Lazy Evaluation mit unendlichen Bereichen
107
+ // ====================================================================
108
+ // Verarbeitet theoretisch unendliche Ströme lazy, berechnet Elemente nur bei Bedarf.
74
109
 
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]
110
+ const firstTenMultiples: bigint[] = useRange(0n, 1_000_000n)
111
+ .filter(n => n % 17n === 0n) // Behält Vielfache von 17
112
+ .limit(10n) // Kritisch: Stoppt nach dem 10. Treffer
113
+ .toUnordered() // Keine Sortierung erforderlich
114
+ .toArray(); // Ergebnis: [0, 17, 34, 51, 68, 85, 102, 119, 136, 153]
79
115
 
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()
116
+ // Ohne `.limit(10n)` würde die Pipeline alle eine Million Elemente verarbeiten.
117
+
118
+ // ====================================================================
119
+ // BEISPIEL 7: Zusammensetzung einer komplexen Pipeline
120
+ // ====================================================================
121
+ // Demonstriert die sequentielle Komposition mehrerer Operationen.
122
+
123
+ const complexResult: number[] = useRange(1n, 100n)
124
+ .map(n => Number(n) * 2)
125
+ .filter(n => n > 50)
126
+ .shuffle()
127
+ .limit(5n)
128
+ .translate(2)
129
+ .toOrdered()
85
130
  .toArray();
86
131
 
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}`));
132
+ // ====================================================================
133
+ // BEISPIEL 8: Verwaltete DOM‑Ereignis‑Abonnements
134
+ // ====================================================================
135
+ // Hört auf Browser‑Ereignisse mit automatischer, lecksicherer Bereinigung.
136
+ // Der `.limit(n)`‑Aufruf definiert die Grenze für die automatische Listener‑Entfernung.
137
+
138
+ // Definiere einen Abonnenten für ein Window‑Ziel
139
+ const windowSubscriber = {
140
+ mount: (target: Window): void => { /* Setup‑Logik */ },
141
+ subscribe: (target: Window, event: keyof WindowEventMap, handler: EventListener): void => {
142
+ target.addEventListener(event, handler);
143
+ },
144
+ unsubscribe: (target: Window, event: keyof WindowEventMap, handler: EventListener): void => {
145
+ target.removeEventListener(event, handler);
146
+ },
147
+ unmount: (): void => { /* Cleanup‑Logik */ }
148
+ };
92
149
 
93
- // Auf ein HTML-Element hören
94
- // <input id="input" type="text"/>
95
- useHTMLElement("#input", "change")
96
- .limit(1)
150
+ useSubscription(window, windowSubscriber, "resize")
151
+ .limit(5n) // Automatische Abmeldung nach 5 Ereignissen
97
152
  .toUnordered()
98
- .forEach((event: Event) => submit(event));
153
+ .forEach((ev: Event, idx) =>
154
+ console.log(`Größenänderung #${idx}: ${(ev.target as Window).innerWidth}x${(ev.target as Window).innerHeight}`)
155
+ );
99
156
 
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));
157
+ // ====================================================================
158
+ // BEISPIEL 9: String‑Verarbeitung nach Unicode‑Codepunkten
159
+ // ====================================================================
160
+ // Iteriert korrekt über einen String, behandelt Multi‑Byte‑Unicode‑Zeichen.
115
161
 
116
- // Über einen String Code-Punkt für Code-Punkt iterieren
117
162
  useText("My emotion now is: 😊, and semantic is 👍")
118
163
  .toUnordered()
119
- .log(); // Gibt den String aus
164
+ .log(); // Gibt jedes Zeichen (inkl. Emoji) in einer neuen Zeile aus.
120
165
 
121
- // Ein Objekt mit Zirkelbezügen sicher in einen String umwandeln
122
- let o = {
166
+ // ====================================================================
167
+ // BEISPIEL 10: Sichere Stringifizierung zirkulärer Referenzen
168
+ // ====================================================================
169
+ // Serialisiert sicher Objekte, die zirkuläre Referenzen enthalten.
170
+
171
+ const obj = {
123
172
  a: 1,
124
- b: "text",
125
- c: [o.a, o.b, o.c] // Zirkelbezug
173
+ b: "text"
126
174
  };
127
- // let text: string = JSON.stringify(o); // Wirft einen Fehler
128
- let text: string = useStringify(o); // Ergibt sicher `{a: 1, b: "text", c: []}`
175
+ (obj as any).c = [obj.a, obj.b, (obj as any).c]; // Führt zirkuläre Referenz ein
176
+
177
+ // const text: string = JSON.stringify(obj); // Wirft einen Fehler
178
+ const text: string = useStringify(obj); // Ergibt sicher `{a: 1, b: "text", c: []}`
129
179
  ```
130
180
 
131
181
  ---
132
182
 
133
183
  ### Kernkonzepte
134
184
 
135
- | Konzept | Zweck | Wann zu verwenden |
185
+ | Konzept | Zweck | Hauptanwendungsfall |
136
186
  | :--- | :--- | :--- |
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. |
187
+ | `AsynchronousSemantic` | Der KernBuilder für asynchrone Ströme, Ereignisse und push‑basierte lazy Pipelines. | Echtzeit‑Ereignisse, WebSockets, DOMListener oder jeder langlebige/unendliche Strom. |
188
+ | `SynchronousSemantic` | Der Builder für synchrone, speicherinterne oder pull‑basierte eager Ströme. | Statische Daten, endliche Bereiche oder sofortige Iterationsaufgaben. |
189
+ | `toUnordered()` | Der schnellste terminale Collector, verwendet eine Map zur Indexspeicherung. | Leistungskritische Pfade, bei denen stabile Reihenfolge nicht erforderlich ist (O(n) Zeit & Speicher). |
190
+ | `toOrdered()` | Ein sortierter, indexstabiler terminaler Collector. | Wenn die Elementreihenfolge erhalten bleiben muss oder Indexzugriff benötigt wird. |
191
+ | `toNumericStatistics()` | Ein Collector, der umfangreiche statistische Analysen auf `number`‑Strömen ermöglicht. | Datenanalyse, Metriken und statistische Berechnungen. |
192
+ | `toBigIntStatistics()` | Ein Collector, der umfangreiche statistische Analysen auf `bigint`‑Strömen ermöglicht. | Analyse und Statistik für große Integer‑Datensätze. |
193
+ | `toWindow()` | Bietet Sliding‑ und Tumbling‑Window‑Operationen über einen Strom. | Zeitreihenanalyse, Batch‑Verarbeitung und Fenster‑Aggregationen. |
144
194
 
145
195
  ---
146
196
 
147
- **Wichtige Nutzungsregeln**
197
+ **Wesentliche Nutzungsregeln**
148
198
 
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.
199
+ 1. **Ereignisströme** (erstellt über Fabriken wie `useSubscription`) geben ein `AsynchronousSemantic` zurück.
200
+ → Sie **müssen** eine grenzendefinierende Methode wie `.limit(n)`, `.sub(start, end)` oder `.takeWhile(predicate)` aufrufen, um den Listener zu beenden. Andernfalls bleibt das Abonnement aktiv.
151
201
 
152
- 2. **Terminale Operationen** (`.toArray()`, `.count()`, `.average()`, `.reduce()`, `.findFirst()`, etc.) sind **nur verfügbar nach** der Konvertierung in einen Kollektor:
202
+ 2. **Terminale Operationen** (`.toArray()`, `.count()`, `.forEach()`, `.findFirst()`, etc.) sind **erst nach** der Umwandlung der Pipeline in einen Collector **verfügbar**:
153
203
  ```typescript
154
- .toUnordered() // O(n) Zeit & Speicher, keine Sortierung
204
+ .toUnordered() // Für maximale Geschwindigkeit, Reihenfolge nicht garantiert.
155
205
  // oder
156
- .toOrdered() // Sortiert, behält die Reihenfolge bei
206
+ .toOrdered() // Für stabile, sortierte Ausgabe.
207
+ // oder
208
+ .toNumericStatistics() // Für statistische Methoden.
157
209
  ```
158
210
 
159
211
  ---
160
212
 
161
213
  ### Leistungsmerkmale
162
214
 
163
- | Kollektor | Zeitkomplexität | Speicherkomplexität | Sortiert? | Am besten für |
215
+ | Collector | Zeitkomplexität | Speicherkomplexität | Reihenfolge garantiert? | Ideales Szenario |
164
216
  | :--- | :--- | :--- | :--- | :--- |
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. |
217
+ | `toUnordered()` | O(n) | O(n) | Nein | Rohdurchsatz ist entscheidend; Endreihenfolge irrelevant. |
218
+ | `toOrdered()` | O(n log n) | O(n) | Ja (sortiert) | Stabile Reihenfolge, Indexzugriff oder Vorsortierung für Statistiken. |
219
+ | `toNumericStatistics()` | O(n log n) | O(n) | Ja (interne Sortierung) | Durchführung statistischer Operationen, die sortierte Daten erfordern. |
220
+ | `toBigIntStatistics()` | O(n log n) | O(n) | Ja (interne Sortierung) | Statistische Operationen auf BigInt‑Daten. |
221
+ | `toWindow()` | O(n log n) | O(n) | Ja (interne Sortierung) | Fensteroperationen, die von sortierten Indizes profitieren. |
170
222
 
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.
223
+ Wählen Sie `toUnordered()`, wenn absolute Geschwindigkeit entscheidend ist. Entscheiden Sie sich nur dann für `toOrdered()` oder einen Statistik‑Collector, wenn Ihre Logik von der Elementreihenfolge abhängt.
172
224
 
173
225
  ---
174
226
 
175
- **Vergleich mit anderen Frontend-Stream-Prozessoren**
227
+ **Vergleichende Analyse mit modernen Stream‑Bibliotheken**
176
228
 
177
- | Feature | Semantic-TypeScript | RxJS | Native Async Iteratoren / Generatoren | Most.js |
229
+ | Merkmal | SemanticTypeScript | RxJS | Native Async Iterators / Generators | Most.js |
178
230
  | :--- | :--- | :--- | :--- | :--- |
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. |
231
+ | **TypeScriptIntegration** | Erstklassig, tief typisiert mit inhärenter Index‑Wahrnehmung. | Hervorragend, beinhaltet jedoch oft komplexe Generika‑Ketten. | Gut, erfordert jedoch manuelle Typannotationen. | Stark, mit funktional‑first‑Typisierungsstil. |
232
+ | **Integrierte Statistik‑Analyse** | Umfassende native Unterstützung für `number` und `bigint`. | Nicht nativ verfügbar (erfordert benutzerdefinierte Operatoren oder andere Bibliotheken). | Keine. | Keine. |
233
+ | **Indizierung & Positionsbewusstsein** | Native, leistungsstarke BigInt‑Indizierung für jedes Element. | Erfordert benutzerdefinierte Operatoren (z.B. `scan`, `withLatestFrom`). | Manuelle Zählerverwaltung notwendig. | Basis, keine integrierte Index‑Eigenschaft. |
234
+ | **Ereignisstrom‑Management** | Dedizierte, typsichere Fabriken mit expliziter, deklarativer Lebenszyklus‑Steuerung. | Leistungsstark, erfordert jedoch sorgfältige manuelle Abonnementverwaltung, um Lecks zu verhindern. | Manuelles Anhängen von Event‑Listenern und Verwaltung von Abbruchtokens. | Gutes `fromEvent`, generell leichtgewichtig. |
235
+ | **Leistung & Speicher** | Herausragendbietet optimierte `toUnordered()` und `toOrdered()` Collector. | Sehr gut, tiefe OperatorKetten können jedoch Overhead einführen. | Hervorragend (minimaler nativer Overhead). | Hervorragend. |
236
+ | **BundleGröße** | Sehr leichtgewichtig. | Substantiell (selbst mit TreeShaking). | Null (natives Sprachfeature). | Klein. |
237
+ | **APIDesignPhilosophie** | Funktionales Collector‑Muster mit expliziter Index‑Semantik. | Reaktives ObservableMuster. | Imperatives Iterator / deklaratives GeneratorMuster. | Funktional, pointfree Komposition. |
238
+ | **Flusskontrolle** | Explizit (`interrupt`, `.limit()`, `.takeWhile()`, `.sub()`). | Gut (`take`, `takeUntil`, `first`). | Manuell (`break` in Schleifen). | Gut (`take`, `until`). |
239
+ | **Sync & Async Support** | Vereinheitlichte API – Erstklassiger Support für beide Paradigmen. | Hauptsächlich asynchron. | Beide unterstützt, aber mit manueller Brücke. | Hauptsächlich asynchron. |
240
+ | **Lernkurve** | Flach für Entwickler, die mit funktionalen und indizierten Collection‑Pipelines vertraut sind. | Steiler (umfangreicher Operator‑Wortschatz, Hot/Cold‑Observable‑Konzepte). | Niedrig bis mittel. | Mittel. |
189
241
 
190
- **Hauptvorteile von Semantic-TypeScript**
242
+ **Der SemanticTypeScript‑Vorteil**
191
243
 
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.
244
+ * **Einzigartige Fähigkeiten:** Integrierte Statistik‑ und Index‑Funktionen eliminieren die Notwendigkeit manueller `reduce`‑Operationen oder ergänzender Datenanalyse‑Bibliotheken.
245
+ * **Vorhersehbare Ressourcenverwaltung:** Explizite Kontrolle über Ereignisströme verhindert die speicherlecks, die in RxJS‑Anwendungen subtil auftreten können.
246
+ * **Vereinheitlichtes Design:** Eine konsistente API für sowohl synchrone als auch asynchrone Workflows reduziert kognitive Belastung und Code‑Duplizierung.
195
247
 
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.
248
+ Dieser Vergleich unterstreicht, warum SemanticTypeScript besonders gut für moderne TypeScriptAnwendungen geeignet ist, die hohe Leistung, robuste Typsicherheit und umfangreiche Datenverarbeitungsfunktionen ohne die Komplexität traditioneller reaktiver Frameworks erfordern.
197
249
 
198
250
  ---
199
251
 
200
- ### Bereit zu erkunden?
252
+ ### Beginnen Sie Ihre Erkundung
253
+
254
+ Semantic‑TypeScript verwandelt komplexe Datenflüsse in lesbare, komponierbare und hochleistungsfähige Pipelines. Egal, ob Sie Echtzeit‑UI‑Ereignisse verarbeiten, umfangreiche Datensätze bearbeiten oder Analyse‑Dashboards erstellen – es bietet die Leistung von Datenbank‑Level‑Indizierung mit der Eleganz der funktionalen Programmierung.
201
255
 
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.
256
+ **Ihre nächsten Schritte:**
203
257
 
204
- **Nächste Schritte:**
258
+ * Erkunden Sie die vollständig typisierte API direkt in Ihrer IDE (alle Exporte sind über den Hauptpaket‑Einstiegspunkt verfügbar).
259
+ * Werden Sie Teil der wachsenden Community von Entwicklern, die komplexe asynchrone Iteratoren und reaktive Ketten durch klare, intentionale Semantic‑Pipelines ersetzt haben.
205
260
 
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.
261
+ **Semantic‑TypeScript** wo Ströme auf Struktur treffen.
208
262
 
209
- **Semantic-TypeScript** wo Streams auf Struktur treffen.
263
+ Beginnen Sie noch heute mit dem Bauen und erleben Sie den spürbaren Unterschied, den durchdachte Indizierung bringt.
210
264
 
211
- Beginnen Sie noch heute mit der Entwicklung und erleben Sie den Unterschied, den durchdachte Indexierung bewirkt.
265
+ **Bauen Sie mit Klarheit, handeln Sie mit Vertrauen und transformieren Sie Daten mit Absicht.**
212
266
 
213
- **Erstellen Sie mit Klarheit, agieren Sie mit Zuversicht und transformieren Sie Daten mit Absicht.**
267
+ MIT © Eloy Kim