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/dist/asynchronous/collector.d.ts +235 -0
- package/dist/asynchronous/collector.js +811 -0
- package/dist/asynchronous/semantic.d.ts +257 -0
- package/dist/asynchronous/semantic.js +1863 -0
- package/dist/factory.d.ts +79 -37
- package/dist/factory.js +534 -277
- package/dist/guard.d.ts +24 -14
- package/dist/guard.js +73 -19
- package/dist/hook.d.ts +11 -6
- package/dist/hook.js +22 -5
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/main.js +6 -4
- package/dist/optional.d.ts +2 -2
- package/dist/symbol.d.ts +19 -10
- package/dist/symbol.js +19 -10
- package/dist/synchronous/collector.d.ts +236 -0
- package/dist/{collector.js → synchronous/collector.js} +217 -193
- package/dist/{semantic.d.ts → synchronous/semantic.d.ts} +125 -130
- package/dist/{semantic.js → synchronous/semantic.js} +465 -574
- package/dist/utility.d.ts +7 -1
- package/dist/utility.js +1 -0
- package/package.json +3 -2
- package/readme.cn.md +213 -753
- package/readme.de.md +171 -441
- package/readme.es.md +171 -436
- package/readme.fr.md +170 -443
- package/readme.jp.md +177 -439
- package/readme.kr.md +177 -433
- package/readme.md +213 -1066
- package/readme.ru.md +174 -420
- package/readme.tw.md +175 -441
- package/dist/collector.d.ts +0 -236
- package/dist/map.d.ts +0 -76
- package/dist/map.js +0 -245
- package/dist/node.d.ts +0 -182
- package/dist/node.js +0 -918
- package/dist/set.d.ts +0 -19
- package/dist/set.js +0 -65
- package/dist/tree.d.ts +0 -82
- package/dist/tree.js +0 -257
package/readme.de.md
CHANGED
|
@@ -1,483 +1,213 @@
|
|
|
1
|
-
# Semantic-TypeScript
|
|
1
|
+
# **Semantic-TypeScript**
|
|
2
|
+
**Flow, Indexed.** Ihre Daten unter präziser Kontrolle.
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
---
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
### Übersicht
|
|
6
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
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
11
|
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
30
|
+
```bash
|
|
31
|
+
npm install semantic-typescript
|
|
32
|
+
```
|
|
33
|
+
oder
|
|
34
|
+
```bash
|
|
35
|
+
yarn add semantic-typescript
|
|
121
36
|
```
|
|
122
37
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
### Optionale Fabrikmethoden
|
|
38
|
+
---
|
|
126
39
|
|
|
127
|
-
|
|
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
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
let
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
|
|
131
|
+
---
|
|
146
132
|
|
|
147
|
-
|
|
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
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
145
|
+
---
|
|
185
146
|
|
|
186
|
-
|
|
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
|
-
|
|
199
|
-
|
|
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
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
-
|
|
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
|
-
|
|
161
|
+
### Leistungsmerkmale
|
|
287
162
|
|
|
288
|
-
|
|
|
289
|
-
|
|
290
|
-
| `
|
|
291
|
-
| `
|
|
292
|
-
| `
|
|
293
|
-
| `
|
|
294
|
-
| `
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
|
405
|
-
|
|
406
|
-
| `
|
|
407
|
-
|
|
|
408
|
-
|
|
|
409
|
-
| `
|
|
410
|
-
|
|
|
411
|
-
|
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
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
|
-
|
|
470
|
-
.toBigintStatistics(); // Große Ganzzahlstatistiken
|
|
471
|
-
```
|
|
204
|
+
**Nächste Schritte:**
|
|
472
205
|
|
|
473
|
-
|
|
474
|
-
|
|
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
|
-
|
|
209
|
+
**Semantic-TypeScript** – wo Streams auf Struktur treffen.
|
|
477
210
|
|
|
478
|
-
|
|
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
|
-
|
|
213
|
+
**Erstellen Sie mit Klarheit, agieren Sie mit Zuversicht und transformieren Sie Daten mit Absicht.**
|