semantic-typescript 0.6.0 → 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,214 +1,213 @@
1
- # Semantic-TypeScript: Eine bahnbrechende Stream-Processing-Bibliothek
1
+ # **Semantic-TypeScript**
2
+ **Flow, Indexed.** Ihre Daten unter präziser Kontrolle.
2
3
 
3
- ## Einführung
4
- Semantic-TypeScript stellt einen bedeutenden Fortschritt in der Stream-Processing-Technologie dar und vereint die effektivsten Konzepte aus JavaScript GeneratorFunctions, Java Streams und Datenbank-Indizierungs-Paradigmen. Ihr grundlegendes Designprinzip zielt darauf ab, durch ausgeklügelte verzögerte Auswertung (Lazy Evaluation) und intelligente Indizierung äußerst effiziente Datenverarbeitungspipelines zu konstruieren. Die Bibliothek bietet eine streng typensichere, funktional reine Streaming-Operation-Erfahrung, die speziell für die moderne TypeScript- und JavaScript-Entwicklung entwickelt wurde.
4
+ ---
5
5
 
6
- Im Gegensatz zu herkömmlichen synchronen Verarbeitungsarchitekturen implementiert Semantic-TypeScript ein einheitliches Modell, das sowohl synchrone (Iterable) als auch asynchrone (AsyncIterable) Datenquellen elegant behandelt. Während der Stream-Erzeugung werden der Fluss und die Beendigung von Daten präzise durch Callback-Mechanismen gesteuert, was es der Bibliothek ermöglicht, mit außergewöhnlicher Anmut zu arbeiten:
6
+ ### Übersicht
7
7
 
8
- - Echtzeit-Datenströme (DOM-Events, WebSockets, Intervalle) mit deterministischer Kontrolle
9
- - Große Datensätze über speichereffiziente, verzögerte Pipelines
10
- - Komplexe Datentransformationen mit einer fließenden, deklarativen API
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.
11
9
 
12
- Der innovative Ansatz der Bibliothek überdenkt grundlegend, wie Entwickler mit Datenfolgen interagieren, und bietet beispiellose Leistungsmerkmale und Entwicklerfreundlichkeit in einem einzigen, kohärenten Paket.
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.
13
11
 
14
- ## Kernphilosophie: Trennung von Definition und Ausführung
15
- Eine zentrale architektonische Erkenntnis von Semantic-TypeScript ist die klare Trennung zwischen der Definition eines Streams und seiner Ausführung:
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.
16
13
 
17
- - **Semantic<E>**: Eine unveränderliche, verzögerte Blaupause einer Datentransformationspipeline. Sie definiert, welche Operationen (Filter, Map usw.) ausgeführt werden.
18
- - **Collectable<E>**: Eine materialisierte, ausführbare Ansicht des Streams. Sie wird von einem Semantic erhalten und stellt alle Terminaloperationen (collect, forEach usw.) zur Ausführung der Pipeline und Erzeugung eines Ergebnisses bereit.
14
+ ---
19
15
 
20
- Diese Trennung erzwingt ein klares mentales Modell und ermöglicht leistungsstarke Optimierungen, wie z. B. die Auswahl eines UnorderedCollectable, um unnötige Sortiervorgänge für maximale Geschwindigkeit zu überspringen.
16
+ ### Warum Entwickler es bevorzugen
21
17
 
22
- ## Warum Semantic-TypeScript wählen?
23
- Die Wahl der richtigen Bibliothek für die Verarbeitung von Datenströmen erfordert eine Abwägung zwischen Leistung, Typsicherheit und Ausdruckskraft. Semantic-TypeScript ist so konzipiert, dass es in all diesen Dimensionen herausragt.
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.
24
25
 
25
- ### 1. Ein einheitliches, typsicheres Paradigma für alle Datenfolgen
26
- Es bietet eine konsistente, deklarative API zur Verarbeitung jeder Datenfolge – sei es statische Arrays, Echtzeit-Ereignisse oder asynchrone Datenblöcke – und nutzt gleichzeitig die volle Leistungsfähigkeit von TypeScript, um eine Ende-zu-Ende-Typsicherheit zu gewährleisten. Dadurch wird eine ganze Klasse von Laufzeitfehlern eliminiert und die Stream-Manipulation in eine vorhersehbare, vom Compiler überprüfte Aktivität verwandelt.
26
+ ---
27
27
 
28
- ### 2. Kompromisslose Leistung durch intelligente Verzögerung (Lazy Evaluation)
29
- Im Kern basiert die Bibliothek auf Lazy Evaluation. Operationen wie Filter, Map und FlatMap komponieren lediglich eine Verarbeitungspipeline; es wird keine Arbeit ausgeführt, bis eine Terminaloperation aufgerufen wird. Dies wird mit Short-Circuiting-Fähigkeiten (über limit, anyMatch oder benutzerdefinierte Unterbrechungs-Callbacks) kombiniert, wodurch die Verarbeitung vorzeitig gestoppt werden kann, was die Effizienz für große oder unendliche Ströme erheblich verbessert.
28
+ ### Installation
30
29
 
31
- ### 3. Die Leistungsfähigkeit des `Collector<E, A, R>`-Musters
32
- Inspiriert von Java ist das Collector-Muster der Motor der Flexibilität. Es entkoppelt die Spezifikation, wie Stream-Elemente akkumuliert werden sollen, von der Ausführung des Streams selbst. Die Bibliothek bietet eine reichhaltige Auswahl an integrierten Collectors (toArray, groupBy, summate usw.) für alltägliche Aufgaben und macht es gleichzeitig einfach, eigene komplexe, wiederverwendbare Reduktionslogiken zu implementieren. Dies ist weitaus leistungsfähiger und komponierbarer als ein fester Satz von Terminalmethoden.
30
+ ```bash
31
+ npm install semantic-typescript
32
+ ```
33
+ oder
34
+ ```bash
35
+ yarn add semantic-typescript
36
+ ```
33
37
 
34
- ### 4. Erstklassige Unterstützung für moderne Web- und asynchrone Daten
35
- Semantic-TypeScript ist für die moderne Entwicklung konzipiert. Es bietet native Factory-Methoden für moderne Web-Quellen:
38
+ ---
36
39
 
37
- - `useFrom(iterable)`, `useRange()` für statische Daten
38
- - `useInterval()`, `useAnimationFrame()` für zeitbasierte Ströme
39
- - `useBlob()` für die blockweise Verarbeitung von Binärdaten
40
- - `useWebSocket()`, `useDocument()`, `useWindow()` für Echtzeit-Ereignisströme
40
+ ### Schnellstart
41
41
 
42
- ### 5. Jenseits der grundlegenden Aggregation: Integrierte statistische Analyse
43
- Gehen Sie über einfache Summen und Durchschnitte hinaus. Die Bibliothek bietet dedizierte NumericStatistics- und BigIntStatistics-Schnittstellen, die sofortigen Zugang zu fortschrittlichen statistischen Kennzahlen direkt aus Ihren Strömen ermöglichen – Varianz, Standardabweichung, Median, Schiefe und Kurtosis. Dies verwandelt komplexe Datenanalysen in eine einzelne Codezeile.
42
+ ```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()
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();
44
86
 
45
- ### 6. Für eine hervorragende Entwickler-Ergonomie gestaltet
46
- - **Fließende, verkettbare API**: Schreiben Sie komplexe Datenpipelines als lesbare, sequentielle Ketten.
47
- - **Umfassendes Utility-Set**: Wesentliche Guards (isFunction, isIterable), Utilities (useCompare, useTraverse) und funktionale Schnittstellen sind enthalten.
48
- - **Optional<T>-Integration**: Modelliert sicher das Fehlen eines Werts und eliminiert Nullzeiger-Probleme.
49
- - **Leistungsanleitung**: Klare Hinweise, wann ungeordnete Sammlungen für Geschwindigkeit gegenüber geordneten für die Reihenfolge zu verwenden sind.
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}`));
50
92
 
51
- ## Installation
52
- ```bash
53
- npm install semantic-typescript
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: []}`
54
129
  ```
55
130
 
56
- ## Kernkonzepte in der Praxis
131
+ ---
57
132
 
58
- ### 1. Streams erstellen (Semantic)
59
- Streams können aus verschiedenen Quellen mithilfe von Factory-Funktionen erstellt werden.
133
+ ### Kernkonzepte
60
134
 
61
- ```typescript
62
- import { useFrom, useInterval, useDocument } from 'semantic-typescript';
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. |
63
144
 
64
- // Aus einem statischen Array
65
- const staticStream = useFrom([1, 2, 3, 4, 5]);
145
+ ---
66
146
 
67
- // Aus einem asynchronen Generator
68
- const asyncStream = useFrom(async function*() {
69
- yield 1;
70
- yield 2;
71
- });
147
+ **Wichtige Nutzungsregeln**
72
148
 
73
- // Ein zeitbasierter Stream
74
- const tickStream = useInterval(1000); // emittiert jede Sekunde
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.
75
151
 
76
- // Ein DOM-Ereignisstream (siehe wichtigen Hinweis unten)
77
- const clickStream = useDocument('click');
78
- ```
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
+ ```
79
158
 
80
- ### 2. Streams transformieren (Zwischenoperationen)
81
- Operationen werden träge verkettet, um die Pipeline zu definieren.
159
+ ---
82
160
 
83
- ```typescript
84
- const processedStream = staticStream
85
- .filter(x => x % 2 === 0) // Nur gerade Zahlen behalten
86
- .map(x => x * 10) // Mit 10 multiplizieren
87
- .flatMap(x => [x, x + 1]) // Jedes Element in zwei umwandeln
88
- .distinct(); // Duplikate entfernen
161
+ ### Leistungsmerkmale
89
162
 
90
- // Bisher wurde noch nichts ausgeführt
91
- ```
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. |
92
170
 
93
- ### 3. Streams ausführen (Terminaloperationen)
94
- Um ein Ergebnis zu erhalten, müssen Sie ein Collectable erhalten und eine Terminaloperation aufrufen.
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.
95
172
 
96
- ```typescript
97
- // Ein ungeordnetes Collectable für Leistung erhalten
98
- const resultArray = await processedStream.toUnordered().toArray();
99
- console.log(resultArray); // z.B. [20, 21, 40, 41]
100
-
101
- // Einen eingebauten Collector verwenden
102
- const sum = await processedStream.toUnordered().collect(useSummate());
103
- console.log(sum);
104
-
105
- // Oder die generische collect-Methode verwenden
106
- const customResult = await processedStream.toOrdered().collect(
107
- () => new Map<number, number>(),
108
- (map, element, index) => map.set(index, element),
109
- map => map
110
- );
111
- ```
173
+ ---
112
174
 
113
- ### 4. Wichtig: Umgang mit Ereignisströmen
114
- Ereignisströme (useDocument, useWindow, useHTMLElement, useWebSocket) sind von Natur aus unendlich. Sie müssen Operationen wie sub, takeWhile oder limit verwenden, um zu definieren, wann das Sammeln von Ereignissen beendet und der Stream abgeschlossen werden soll. Andernfalls wartet die Terminaloperation unendlich lange.
175
+ **Vergleich mit anderen Frontend-Stream-Prozessoren**
115
176
 
116
- ```typescript
117
- import { useDocument } from 'semantic-typescript';
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. |
118
189
 
119
- // Nur die ersten 5 Klicks sammeln
120
- const first5Clicks = await useDocument('click')
121
- .limit(5) // <- Essentiell: Begrenzt den Stream auf 5 Ereignisse
122
- .toUnordered()
123
- .toArray();
190
+ **Hauptvorteile von Semantic-TypeScript**
124
191
 
125
- // Klicks in einem 10-Sekunden-Fenster sammeln
126
- const clicksIn10s = await useDocument('click')
127
- .takeWhile((_, index, startTime = Date.now()) => Date.now() - startTime < 10000)
128
- .toUnordered()
129
- .toArray();
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.
130
195
 
131
- // Klicks von Index 2 bis 5 sammeln (0-basiert)
132
- const specificClicks = await useDocument('click')
133
- .sub(2n, 6n) // <- Nimmt Elemente mit Index 2, 3, 4, 5
134
- .toUnordered()
135
- .toArray();
136
- ```
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.
137
197
 
138
- **Wichtige Erkenntnis**: Das Ereignis (z. B. ein MouseEvent) und sein sequenzieller Auslöseindex (als BigInt) werden über den Callback `accept(event, index)` gemeinsam durch die Pipeline geleitet.
198
+ ---
139
199
 
140
- ### 5. Statistikfunktionen nutzen
141
- ```typescript
142
- const numericStream = useFrom([10, 20, 30, 40, 50]).toNumeric();
200
+ ### Bereit zu erkunden?
143
201
 
144
- const average = await numericStream.average();
145
- const median = await numericStream.median();
146
- const standardDeviation = await numericStream.standardDeviation();
147
- const skewness = await numericStream.skewness();
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.
148
203
 
149
- console.log(`Durchschnitt: ${average}, Median: ${median}, Standardabweichung: ${standardDeviation}`);
150
- ```
204
+ **Nächste Schritte:**
151
205
 
152
- ## Hauptmerkmale
153
- - **Duale Stream-Typen**: Volle Unterstützung für sowohl SynchronousSemantic (für Iterable) als auch AsynchronousSemantic (für AsyncIterable und Ereignisse)
154
- - **Umfangreicher Operationensatz**: filter, map, flatMap, concat, distinct, sorted, limit, skip, peek, reverse, shuffle
155
- - **Flexible Terminaloperationen**: collect (mit benutzerdefinierten Collectors), toArray, toSet, toMap, forEach, reduce, findFirst, anyMatch, allMatch, count
156
- - **Erweiterte Collector**: Eingebaute Collector für joining, groupingBy, partitioningBy, summing, averaging, maxBy, minBy
157
- - **Statistikmodul**: Gebrauchsfertige Methoden für Mittelwert, Median, Modus, Varianz, Standardabweichung, Bereich, Quantile, Schiefe, Kurtosis für numerische/BigInt-Streams
158
- - **Hilfsfunktionen**: Typ-Guards (isPromise, isAsyncIterable), Komparatoren (useCompare), Traversal (useTraverse) und Konvertierungs-Hooks
159
- - **Optional<T>**: Ein monadischer Container für nullable Werte, integriert mit Suchoperationen
160
-
161
- ## API-Übersicht
162
- ### Kernklassen und -schnittstellen
163
- - `Semantic<E>` / `AsynchronousSemantic<E>`: Die abstrakte Stream-Definition
164
- - `Collectable<E>` / `AsynchronousCollectable<E>`: Der ausführbare Stream mit Terminaloperationen
165
- - `OrderedCollectable<E>` / `UnorderedCollectable<E>`: Materialisierte Versionen, optimiert für reihenfolgensensitive oder reihenfolgenunempfindliche Operationen
166
- - `Collector<E, A, R>`: Die Abstraktion für mutable Reduktionsoperationen
167
-
168
- ### Factory-Funktionen (use*)
169
- - **Aus Quellen**: useFrom, useRange, useFill, useEmpty
170
- - **Aus Zeit**: useInterval, useAnimationFrame
171
- - **Aus Web-APIs**: useBlob, useDocument, useWindow, useHTMLElement, useWebSocket
172
- - **Collector**: useToArray, useGroupBy, useSummate, useJoin, usw.
173
-
174
- ## Leistungshinweise
175
- - **Lazy Evaluation**: Pipelines werden ohne Ausführung komponiert, bis eine Terminaloperation aufgerufen wird
176
- - **Short-Circuiting**: Operationen wie limit, anyMatch und findFirst stoppen die Verarbeitung von Elementen, sobald das Ergebnis bestimmt ist
177
- - **Geordnet vs. Ungeordnet**:
178
- - Verwenden Sie `.toUnordered()` für Terminaloperationen, wenn die Reihenfolge der Quellelemente für Ihr Ergebnis keine Rolle spielt (z. B. für Summe, Maximum oder toSet). Dies kann interne Optimierungen ermöglichen, die kostspielige Sortierschritte überspringen
179
- - Verwenden Sie `.toOrdered()`, wenn die Reihenfolge wichtig ist (z. B. für toArray, bei dem die Reihenfolge erhalten bleiben muss)
180
-
181
- ## Einstiegsbeispiel
182
- ```typescript
183
- import { useFrom, useSummate, useGroupBy } from 'semantic-typescript';
184
-
185
- interface Transaction {
186
- id: number;
187
- amount: number;
188
- category: string;
189
- }
190
-
191
- const transactions: Transaction[] = [
192
- { id: 1, amount: 100, category: 'Food' },
193
- { id: 2, amount: 200, category: 'Electronics' },
194
- { id: 3, amount: 50, category: 'Food' },
195
- { id: 4, amount: 300, category: 'Electronics' },
196
- ];
197
-
198
- // Gesamtbetrag pro Kategorie berechnen
199
- const totalsByCategory = await useFrom(transactions)
200
- .toUnordered()
201
- .collect(
202
- useGroupBy(
203
- t => t.category,
204
- t => t.amount,
205
- useSummate() // Collector für die Werte
206
- )
207
- );
208
-
209
- console.log(totalsByCategory); // Map { 'Food' => 150, 'Electronics' => 500 }
210
- ```
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.
208
+
209
+ **Semantic-TypeScript** wo Streams auf Struktur treffen.
211
210
 
212
- Semantic-TypeScript wurde für Entwickler gebaut, die eine streng entworfene, typsichere und leistungsstarke Stream-Processing-Bibliothek suchen. Es bringt die Leistungsfähigkeit von Unternehmens-Datentransformationsmustern in das TypeScript-Ökosystem und eignet sich perfekt für datenintensive Frontend-Anwendungen, Node.js-Datenverarbeitung und jedes Szenario, in dem elegante, effiziente Handhabung von Sequenzen erforderlich ist.
211
+ Beginnen Sie noch heute mit der Entwicklung und erleben Sie den Unterschied, den durchdachte Indexierung bewirkt.
213
212
 
214
- [![GitHub](./GitHub.png)](https://github.com/eloyhere/semantic-typescript) [![NPM](./NPM.png)](https://www.npmjs.com/package/semantic-typescript)
213
+ **Erstellen Sie mit Klarheit, agieren Sie mit Zuversicht und transformieren Sie Daten mit Absicht.**