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/dist/asynchronous/collector.d.ts +62 -58
- package/dist/asynchronous/collector.js +16 -5
- package/dist/asynchronous/semantic.d.ts +2 -2
- package/dist/asynchronous/semantic.js +16 -6
- package/dist/factory.d.ts +8 -0
- package/dist/factory.js +112 -36
- package/dist/hook.d.ts +6 -1
- package/dist/hook.js +20 -3
- package/dist/main.d.ts +1 -0
- package/dist/main.js +6 -0
- package/dist/synchronous/collector.d.ts +8 -4
- package/dist/synchronous/collector.js +74 -59
- package/dist/synchronous/semantic.d.ts +27 -23
- package/dist/synchronous/semantic.js +215 -286
- package/package.json +3 -2
- package/readme.cn.md +213 -214
- package/readme.de.md +172 -173
- package/readme.es.md +177 -172
- package/readme.fr.md +181 -172
- package/readme.jp.md +187 -169
- package/readme.kr.md +182 -169
- package/readme.md +213 -214
- package/readme.ru.md +188 -169
- package/readme.tw.md +178 -169
package/readme.de.md
CHANGED
|
@@ -1,214 +1,213 @@
|
|
|
1
|
-
# Semantic-TypeScript
|
|
1
|
+
# **Semantic-TypeScript**
|
|
2
|
+
**Flow, Indexed.** Ihre Daten unter präziser Kontrolle.
|
|
2
3
|
|
|
3
|
-
|
|
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
|
-
|
|
6
|
+
### Übersicht
|
|
7
7
|
|
|
8
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
16
|
+
### Warum Entwickler es bevorzugen
|
|
21
17
|
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
32
|
-
|
|
30
|
+
```bash
|
|
31
|
+
npm install semantic-typescript
|
|
32
|
+
```
|
|
33
|
+
oder
|
|
34
|
+
```bash
|
|
35
|
+
yarn add semantic-typescript
|
|
36
|
+
```
|
|
33
37
|
|
|
34
|
-
|
|
35
|
-
Semantic-TypeScript ist für die moderne Entwicklung konzipiert. Es bietet native Factory-Methoden für moderne Web-Quellen:
|
|
38
|
+
---
|
|
36
39
|
|
|
37
|
-
|
|
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
|
-
|
|
43
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
131
|
+
---
|
|
57
132
|
|
|
58
|
-
###
|
|
59
|
-
Streams können aus verschiedenen Quellen mithilfe von Factory-Funktionen erstellt werden.
|
|
133
|
+
### Kernkonzepte
|
|
60
134
|
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
65
|
-
const staticStream = useFrom([1, 2, 3, 4, 5]);
|
|
145
|
+
---
|
|
66
146
|
|
|
67
|
-
|
|
68
|
-
const asyncStream = useFrom(async function*() {
|
|
69
|
-
yield 1;
|
|
70
|
-
yield 2;
|
|
71
|
-
});
|
|
147
|
+
**Wichtige Nutzungsregeln**
|
|
72
148
|
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
77
|
-
|
|
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
|
-
|
|
81
|
-
Operationen werden träge verkettet, um die Pipeline zu definieren.
|
|
159
|
+
---
|
|
82
160
|
|
|
83
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
117
|
-
|
|
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
|
-
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
|
|
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
|
-
|
|
198
|
+
---
|
|
139
199
|
|
|
140
|
-
###
|
|
141
|
-
```typescript
|
|
142
|
-
const numericStream = useFrom([10, 20, 30, 40, 50]).toNumeric();
|
|
200
|
+
### Bereit zu erkunden?
|
|
143
201
|
|
|
144
|
-
|
|
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
|
-
|
|
150
|
-
```
|
|
204
|
+
**Nächste Schritte:**
|
|
151
205
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
-
|
|
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
|
-
|
|
211
|
+
Beginnen Sie noch heute mit der Entwicklung und erleben Sie den Unterschied, den durchdachte Indexierung bewirkt.
|
|
213
212
|
|
|
214
|
-
|
|
213
|
+
**Erstellen Sie mit Klarheit, agieren Sie mit Zuversicht und transformieren Sie Daten mit Absicht.**
|