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.fr.md
CHANGED
|
@@ -1,486 +1,213 @@
|
|
|
1
|
-
#
|
|
1
|
+
# **Semantic-TypeScript**
|
|
2
|
+
**Flux, Indexés.** Vos données, sous contrôle précis.
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
---
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
### Aperçu
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
Semantic-TypeScript marque un bond en avant significatif dans la technologie de traitement des flux, **synthétisant** les concepts les plus efficaces de `GeneratorFunction` JavaScript, Java Streams et de l'indexation de style MySQL. Sa philosophie centrale est à la fois simple et puissante : construire des pipelines de traitement de données exceptionnellement efficaces grâce à une indexation intelligente, et non par itération de force brute.
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
Là où les bibliothèques conventionnelles imposent des boucles synchrones ou des chaînes de promesses maladroites, Semantic-TypeScript offre une expérience **entièrement asynchrone**, fonctionnellement pure et rigoureusement sûre au niveau des types, conçue pour répondre aux exigences du développement front-end moderne.
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
npm install semantic-typescript
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## Types de base
|
|
16
|
-
|
|
17
|
-
| Type | Description |
|
|
18
|
-
|------|-------------|
|
|
19
|
-
| `Invalid<T>` | Type qui étend `null` ou `undefined` |
|
|
20
|
-
| `Valid<T>` | Type qui exclut `null` et `undefined` |
|
|
21
|
-
| `MaybeInvalid<T>` | Type qui peut être `null` ou `undefined` |
|
|
22
|
-
| `Primitive` | Collection de types primitifs |
|
|
23
|
-
| `MaybePrimitive<T>` | Type qui peut être un type primitif |
|
|
24
|
-
| `OptionalSymbol` | Identificateur de symbole de la classe `Optional` |
|
|
25
|
-
| `SemanticSymbol` | Identificateur de symbole de la classe `Semantic` |
|
|
26
|
-
| `CollectorsSymbol` | Identificateur de symbole de la classe `Collector` |
|
|
27
|
-
| `CollectableSymbol` | Identificateur de symbole de la classe `Collectable` |
|
|
28
|
-
| `OrderedCollectableSymbol` | Identificateur de symbole de la classe `OrderedCollectable` |
|
|
29
|
-
| `WindowCollectableSymbol` | Identificateur de symbole de la classe `WindowCollectable` |
|
|
30
|
-
| `StatisticsSymbol` | Identificateur de symbole de la classe `Statistics` |
|
|
31
|
-
| `NumericStatisticsSymbol` | Identificateur de symbole de la classe `NumericStatistics` |
|
|
32
|
-
| `BigIntStatisticsSymbol` | Identificateur de symbole de la classe `BigIntStatistics` |
|
|
33
|
-
| `UnorderedCollectableSymbol` | Identificateur de symbole de la classe `UnorderedCollectable` |
|
|
34
|
-
|
|
35
|
-
## Interfaces fonctionnelles
|
|
36
|
-
|
|
37
|
-
| Interface | Description |
|
|
38
|
-
|-----------|-------------|
|
|
39
|
-
| `Runnable` | Fonction sans paramètres et sans valeur de retour |
|
|
40
|
-
| `Supplier<R>` | Fonction sans paramètres retournant `R` |
|
|
41
|
-
| `Functional<T, R>` | Fonction de transformation à un seul paramètre |
|
|
42
|
-
| `BiFunctional<T, U, R>` | Fonction de transformation à deux paramètres |
|
|
43
|
-
| `TriFunctional<T, U, V, R>` | Fonction de transformation à trois paramètres |
|
|
44
|
-
| `Predicate<T>` | Fonction de prédicat à un seul paramètre |
|
|
45
|
-
| `BiPredicate<T, U>` | Fonction de prédicat à deux paramètres |
|
|
46
|
-
| `TriPredicate<T, U, V>` | Fonction de prédicat à trois paramètres |
|
|
47
|
-
| `Consumer<T>` | Fonction de consommateur à un seul paramètre |
|
|
48
|
-
| `BiConsumer<T, U>` | Fonction de consommateur à deux paramètres |
|
|
49
|
-
| `TriConsumer<T, U, V>` | Fonction de consommateur à trois paramètres |
|
|
50
|
-
| `Comparator<T>` | Fonction de comparaison à deux paramètres |
|
|
51
|
-
| `Generator<T>` | Fonction génératrice (noyau et base) |
|
|
52
|
-
|
|
53
|
-
```typescript
|
|
54
|
-
// Exemples d'utilisation des types
|
|
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
|
-
```
|
|
12
|
+
Dans son modèle élégant, les données n'atteignent le consommateur que lorsque le pipeline en amont invoque explicitement les callbacks `accept` (et optionnellement `interrupt`). Vous avez un contrôle total sur le timing - exactement quand c'est nécessaire.
|
|
59
13
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
| Fonction | Description | Complexité temporelle | Complexité spatiale |
|
|
63
|
-
|------|------|------------|------------|
|
|
64
|
-
| `validate<T>(t: MaybeInvalid<T>): t is T` | Vérifie que la valeur n'est pas null ou undefined | O(1) | O(1) |
|
|
65
|
-
| `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | Vérifie que la valeur est null ou undefined | O(1) | O(1) |
|
|
66
|
-
| `isBoolean(t: unknown): t is boolean` | Vérifie si c'est un booléen | O(1) | O(1) |
|
|
67
|
-
| `isString(t: unknown): t is string` | Vérifie si c'est une chaîne | O(1) | O(1) |
|
|
68
|
-
| `isNumber(t: unknown): t is number` | Vérifie si c'est un nombre | O(1) | O(1) |
|
|
69
|
-
| `isFunction(t: unknown): t is Function` | Vérifie si c'est une fonction | O(1) | O(1) |
|
|
70
|
-
| `isObject(t: unknown): t is object` | Vérifie si c'est un objet | O(1) | O(1) |
|
|
71
|
-
| `isSymbol(t: unknown): t is symbol` | Vérifie si c'est un symbole | O(1) | O(1) |
|
|
72
|
-
| `isBigint(t: unknown): t is bigint` | Vérifie si c'est un BigInt | O(1) | O(1) |
|
|
73
|
-
| `isPrimitive(t: unknown): t is Primitive` | Vérifie si c'est un type primitif | O(1) | O(1) |
|
|
74
|
-
| `isIterable(t: unknown): t is Iterable<unknown>` | Vérifie si c'est un objet itérable | O(1) | O(1) |
|
|
75
|
-
| `isOptional(t: unknown): t is Optional<unknown>` | Vérifie si c'est une instance d'Optional | O(1) | O(1) |
|
|
76
|
-
| `isSemantic(t: unknown): t is Semantic<unknown>` | Vérifie si c'est une instance de Semantic | O(1) | O(1) |
|
|
77
|
-
| `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Vérifie si c'est une instance de Collector | O(1) | O(1) |
|
|
78
|
-
| `isCollectable(t: unknown): t is Collectable<unknown>` | Vérifie si c'est une instance de Collectable | O(1) | O(1) |
|
|
79
|
-
| `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | Vérifie si c'est une instance de OrderedCollectable | O(1) | O(1) |
|
|
80
|
-
| `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | Vérifie si c'est une instance de WindowCollectable | O(1) | O(1) |
|
|
81
|
-
| `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | Vérifie si c'est une instance de UnorderedCollectable | O(1) | O(1) |
|
|
82
|
-
| `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Vérifie si c'est une instance de Statistics | O(1) | O(1) |
|
|
83
|
-
| `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | Vérifie si c'est une instance de NumericStatistics | O(1) | O(1) |
|
|
84
|
-
| `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | Vérifie si c'est une instance de BigIntStatistics | O(1) | O(1) |
|
|
85
|
-
| `isPromise(t: unknown): t is Promise<unknown>` | Vérifie si c'est un objet Promise | O(1) | O(1) |
|
|
86
|
-
| `isAsync(t: unknown): t is AsyncFunction` | Vérifie si c'est une AsyncFunction | O(1) | O(1) |
|
|
14
|
+
---
|
|
87
15
|
|
|
88
|
-
|
|
89
|
-
// Exemples d'utilisation des gardiens de type
|
|
90
|
-
let value: unknown = "hello";
|
|
91
|
-
|
|
92
|
-
if (isString(value)) {
|
|
93
|
-
console.log(value.length); // Sécurité de type, value est inféré comme une chaîne
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
if (isOptional(someValue)) {
|
|
97
|
-
someValue.ifPresent((value): void => console.log(val));
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
if(isIterable(value)){
|
|
101
|
-
// Sécurité de type, maintenant c'est un objet itérable.
|
|
102
|
-
for(let item of value){
|
|
103
|
-
console.log(item);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
```
|
|
16
|
+
### Pourquoi les développeurs le préfèrent
|
|
107
17
|
|
|
108
|
-
|
|
18
|
+
- **Indexation Zéro-Boilerplate** — chaque élément porte son index naturel ou sur mesure.
|
|
19
|
+
- **Style Purement Fonctionnel** — avec une inférence TypeScript complète.
|
|
20
|
+
- **Flux d'Événements Étanches** — `useWindow`, `useDocument`, `useHTMLElement` et `useWebSocket` sont conçus avec la sécurité à l'esprit. Vous définissez la limite (en utilisant `limit(n)`, `sub(start, end)` ou `takeWhile(predicate)`) et la bibliothèque gère le nettoyage. Aucun écouteur résiduel, aucune fuite de mémoire.
|
|
21
|
+
- **Statistiques Intégrées** — analyses numériques et bigint complètes incluant moyennes, médianes, modes, variance, asymétrie et kurtosis.
|
|
22
|
+
- **Performances Prédictibles** — choisissez entre des collecteurs ordonnés ou non ordonnés selon vos besoins.
|
|
23
|
+
- **Efficacité Mémoire** — les flux sont évalués paresseusement, atténuant les préoccupations de mémoire.
|
|
24
|
+
- **Pas de Comportement Indéfini** — TypeScript garantit la sûreté des types et la nullabilité. Les données d'entrée restent inchangées sauf si elles sont explicitement modifiées dans vos fonctions de callback.
|
|
109
25
|
|
|
110
|
-
|
|
111
|
-
|------|------|------------|------------|
|
|
112
|
-
| `useCompare<T>(t1: T, t2: T): number` | Fonction de comparaison générique | O(1) | O(1) |
|
|
113
|
-
| `useRandom<T = number \| bigint>(index: T): T` | Générateur de nombres pseudo-aléatoires | O(log n) | O(1) |
|
|
26
|
+
---
|
|
114
27
|
|
|
115
|
-
|
|
116
|
-
// Exemples d'utilisation des fonctions utilitaires
|
|
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
|
|
121
32
|
```
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
### Méthodes de fabrique d'Optional
|
|
126
|
-
|
|
127
|
-
| Méthode | Description | Complexité temporelle | Complexité spatiale |
|
|
128
|
-
|------|------|------------|------------|
|
|
129
|
-
| `Optional.empty<T>()` | Crée un Optional vide | O(1) | O(1) |
|
|
130
|
-
| `Optional.of<T>(value)` | Crée un Optional contenant une valeur | O(1) | O(1) |
|
|
131
|
-
| `Optional.ofNullable<T>(value)` | Crée un Optional potentiellement vide | O(1) | O(1) |
|
|
132
|
-
| `Optional.ofNonNull<T>(value)` | Crée un Optional non vide | O(1) | O(1) |
|
|
133
|
-
|
|
134
|
-
```typescript
|
|
135
|
-
// Exemples d'utilisation d'Optional
|
|
136
|
-
let emptyOpt: Optional<number> = Optional.empty();
|
|
137
|
-
let presentOpt: Optional<number> = Optional.of(42);
|
|
138
|
-
let nullableOpt: Optional<string> = Optional.ofNullable<string>(null);
|
|
139
|
-
let nonNullOpt: Optional<string> = Optional.ofNonNull("hello");
|
|
140
|
-
|
|
141
|
-
presentOpt.ifPresent((value: number): void => console.log(value)); // Affiche 42
|
|
142
|
-
console.log(emptyOpt.get(100)); // Affiche 100
|
|
33
|
+
ou
|
|
34
|
+
```bash
|
|
35
|
+
yarn add semantic-typescript
|
|
143
36
|
```
|
|
144
37
|
|
|
145
|
-
|
|
38
|
+
---
|
|
146
39
|
|
|
147
|
-
|
|
148
|
-
|------|------|------------|------------|
|
|
149
|
-
| `Collector.full(identity, accumulator, finisher)` | Crée un Collector complet | O(1) | O(1) |
|
|
150
|
-
| `Collector.shortable(identity, interruptor, accumulator, finisher)` | Crée un Collector interruptible | O(1) | O(1) |
|
|
40
|
+
### Démarrage Rapide
|
|
151
41
|
|
|
152
42
|
```typescript
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
//
|
|
162
|
-
let
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
//
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
)
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
43
|
+
import { useOf, useFrom, useRange, useWindow, useHTMLElement, useWebSocket, useText, useStringify } from "semantic-typescript";
|
|
44
|
+
|
|
45
|
+
// Statistiques numériques
|
|
46
|
+
let summate: number = useOf(10, 20, 30, 40)
|
|
47
|
+
.map((n: number): number => n * 2)
|
|
48
|
+
.toNumericStatistics() // Requis avant l'opération terminale
|
|
49
|
+
.summate(); // 200
|
|
50
|
+
|
|
51
|
+
// Statistiques BigInt
|
|
52
|
+
let summate: bigint = useOf(10n, 20n, 30n, 40n)
|
|
53
|
+
.map((n: bigint): bigint => n * 2)
|
|
54
|
+
.toBigIntStatistics() // Requis avant l'opération terminale
|
|
55
|
+
.summate(); // 200n
|
|
56
|
+
|
|
57
|
+
// Inverser un flux par index
|
|
58
|
+
useFrom([1, 2, 3, 4, 5])
|
|
59
|
+
.redirect((element: E, index: bigint): bigint => -index) // Index négatif pour inversion
|
|
60
|
+
.toOrdered() // Appeler toOrdered() pour préserver l'ordre des index
|
|
61
|
+
.toArray(); // [5, 4, 3, 2, 1]
|
|
62
|
+
|
|
63
|
+
// Mélanger un flux
|
|
64
|
+
useFrom([1, 2, 3, 4, 5])
|
|
65
|
+
.shuffle()
|
|
66
|
+
.toOrdered()
|
|
67
|
+
.toArray(); // ex. [2, 5, 1, 4, 3]
|
|
68
|
+
|
|
69
|
+
// Translater des éléments dans un flux
|
|
70
|
+
useFrom([1, 2, 3, 4, 5])
|
|
71
|
+
.translate(2) // Décaler les éléments de 2 positions vers la droite
|
|
72
|
+
.toOrdered()
|
|
73
|
+
.toArray(); // [4, 5, 1, 2, 3]
|
|
74
|
+
|
|
75
|
+
useFrom([1, 2, 3, 4, 5])
|
|
76
|
+
.translate(-2) // Décaler les éléments de 2 positions vers la gauche
|
|
77
|
+
.toOrdered()
|
|
78
|
+
.toArray(); // [3, 4, 5, 1, 2]
|
|
79
|
+
|
|
80
|
+
// Plage infinie avec terminaison anticipée
|
|
81
|
+
useRange(0n, 1_000_000n)
|
|
82
|
+
.filter(n => n % 17n === 0n)
|
|
83
|
+
.limit(10n) // S'arrêter après 10 éléments
|
|
84
|
+
.toUnordered()
|
|
85
|
+
.toArray();
|
|
86
|
+
|
|
87
|
+
// Redimensionnement de fenêtre en temps réel (s'arrête automatiquement après 5 événements)
|
|
88
|
+
useWindow("resize")
|
|
89
|
+
.limit(5n) // Crucial pour les flux d'événements
|
|
90
|
+
.toUnordered()
|
|
91
|
+
.forEach((ev, idx) => console.log(`Redimensionnement #${idx}`));
|
|
92
|
+
|
|
93
|
+
// Écouter un élément HTML
|
|
94
|
+
// <input id="input" type="text"/>
|
|
95
|
+
useHTMLElement("#input", "change")
|
|
96
|
+
.limit(1)
|
|
97
|
+
.toUnordered()
|
|
98
|
+
.forEach((event: Event) => submit(event));
|
|
99
|
+
|
|
100
|
+
// Écouter plusieurs éléments et événements
|
|
101
|
+
useHTMLElement("input", ["change", "keyup"])
|
|
102
|
+
.takeWhile((event: Event): boolean => validate(event))
|
|
103
|
+
.toUnordered()
|
|
104
|
+
.forEach((event: Event) => submit(event));
|
|
105
|
+
|
|
106
|
+
// Écouter un WebSocket
|
|
107
|
+
let webSocket = new WebSocket("ws://localhost:8080");
|
|
108
|
+
webSocket.addEventListener("close", (): void => {
|
|
109
|
+
webSocket.close(); // Gérer le cycle de vie du WebSocket manuellement
|
|
110
|
+
});
|
|
111
|
+
useWebSocket(webSocket, "message")
|
|
112
|
+
.limit(1)
|
|
113
|
+
.toUnordered()
|
|
114
|
+
.forEach((message: MessageEvent) => console.log(message.data));
|
|
115
|
+
|
|
116
|
+
// Itérer sur une chaîne par point de code
|
|
117
|
+
useText("My emotion now is: 😊, and semantic is 👍")
|
|
118
|
+
.toUnordered()
|
|
119
|
+
.log(); // Affiche la chaîne
|
|
120
|
+
|
|
121
|
+
// Sérialiser en toute sécurité un objet avec références circulaires
|
|
122
|
+
let o = {
|
|
123
|
+
a: 1,
|
|
124
|
+
b: "text",
|
|
125
|
+
c: [o.a, o.b, o.c] // Référence circulaire
|
|
126
|
+
};
|
|
127
|
+
// let text: string = JSON.stringify(o); // Lance une erreur
|
|
128
|
+
let text: string = useStringify(o); // Produit en toute sécurité `{a: 1, b: "text", c: []}`
|
|
182
129
|
```
|
|
183
130
|
|
|
184
|
-
|
|
131
|
+
---
|
|
185
132
|
|
|
186
|
-
|
|
187
|
-
|------|------|------------|------------|
|
|
188
|
-
| `animationFrame(period: number, delay: number = 0)` | Crée un flux de trames d'animation basé sur le temps | O(1)* | O(1) |
|
|
189
|
-
| `blob(blob, chunkSize)` | Crée un flux à partir d'un Blob | O(n) | O(chunkSize) |
|
|
190
|
-
| `empty<E>()` | Crée un flux vide | O(1) | O(1) |
|
|
191
|
-
| `fill<E>(element, count)` | Crée un flux rempli | O(n) | O(1) |
|
|
192
|
-
| `from<E>(iterable)` | Crée un flux à partir d'un objet itérable | O(1) | O(1) |
|
|
193
|
-
| `interval(period, delay?)` | Crée un flux d'intervalle de temps | O(1)* | O(1) |
|
|
194
|
-
| `iterate<E>(generator)` | Crée un flux à partir d'un générateur | O(1) | O(1) |
|
|
195
|
-
| `range(start, end, step)` | Crée un flux de plage numérique | O(n) | O(1) |
|
|
196
|
-
| `websocket(websocket)` | Crée un flux à partir d'un WebSocket | O(1) | O(1) |
|
|
133
|
+
### Concepts Fondamentaux
|
|
197
134
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
// Crée un flux vide, ne sera exécuté qu'une fois concaténé avec d'autres flux
|
|
209
|
-
empty<string>()
|
|
210
|
-
.toUnordered()
|
|
211
|
-
.join(); // []
|
|
212
|
-
|
|
213
|
-
// Crée un flux rempli
|
|
214
|
-
let filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
215
|
-
|
|
216
|
-
// Crée un flux d'intervalle avec un délai initial de 2 secondes et une période d'exécution de 5 secondes, implémenté sur un mécanisme de minuterie ; peut subir un décalage temporel en raison des limites de précision de la planification système.
|
|
217
|
-
let intervalStream = interval(5000, 2000);
|
|
218
|
-
|
|
219
|
-
// Crée un flux à partir d'un objet itérable
|
|
220
|
-
let numberStream = from([1, 2, 3, 4, 5]);
|
|
221
|
-
let stringStream = from(new Set(["Alex", "Bob"]));
|
|
222
|
-
|
|
223
|
-
// Crée un flux de plage
|
|
224
|
-
let rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
225
|
-
|
|
226
|
-
// Flux d'événements WebSocket
|
|
227
|
-
let ws = new WebSocket("ws://localhost:8080");
|
|
228
|
-
websocket(ws)
|
|
229
|
-
.filter((event): boolean => event.type === "message") // Écoute uniquement les événements de message
|
|
230
|
-
.toUnordered() // Les événements sont généralement non ordonnés
|
|
231
|
-
.forEach((event): void => receive(event)); // Réception des messages
|
|
232
|
-
```
|
|
135
|
+
| Concept | Objectif | Quand l'utiliser |
|
|
136
|
+
| :--- | :--- | :--- |
|
|
137
|
+
| `AsynchronousSemantic` | Constructeur principal pour les flux asynchrones, événements et pipelines paresseux. | Événements temps réel, WebSockets, écouteurs DOM, flux de longue durée ou infinis. |
|
|
138
|
+
| `SynchronousSemantic` | Constructeur pour les flux synchrones, en mémoire ou basés sur des boucles. | Données statiques, plages, itération immédiate. |
|
|
139
|
+
| `toUnordered()` | Collecteur terminal le plus rapide (indexation basée sur Map). | Chemins critiques en performance (temps et espace O(n), pas de tri). |
|
|
140
|
+
| `toOrdered()` | Collecteur trié, stable en index. | Lorsqu'un ordre stable ou un accès indexé est requis. |
|
|
141
|
+
| `toNumericStatistics()` | Analyse statistique numérique riche (moyenne, médiane, variance, asymétrie, kurtosis, etc.). | Analyse de données et calculs statistiques. |
|
|
142
|
+
| `toBigIntStatistics()` | Analyse statistique bigint riche. | Analyse de données et calculs statistiques pour grands entiers. |
|
|
143
|
+
| `toWindow()` | Prise en charge des fenêtres glissantes et fixes. | Traitement de séries temporelles, traitement par lots et opérations avec fenêtres. |
|
|
233
144
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
| Méthode | Description | Complexité temporelle | Complexité spatiale |
|
|
237
|
-
|------|------|------------|------------|
|
|
238
|
-
| `concat(other)` | Concatène deux flux | O(n) | O(1) |
|
|
239
|
-
| `distinct()` | Supprime les doublons | O(n) | O(n) |
|
|
240
|
-
| `distinct(comparator)` | Supprime les doublons en utilisant un comparateur | O(n²) | O(n) |
|
|
241
|
-
| `dropWhile(predicate)` | Abandonne les éléments satisfaisant la condition | O(n) | O(1) |
|
|
242
|
-
| `filter(predicate)` | Filtre les éléments | O(n) | O(1) |
|
|
243
|
-
| `flat(mapper)` | Aplatissement de la carte | O(n × m) | O(1) |
|
|
244
|
-
| `flatMap(mapper)` | Aplatissement de la carte vers un nouveau type | O(n × m) | O(1) |
|
|
245
|
-
| `limit(n)` | Limite le nombre d'éléments | O(n) | O(1) |
|
|
246
|
-
| `map(mapper)` | Transformation de la carte | O(n) | O(1) |
|
|
247
|
-
| `peek(consumer)` | Jeter un œil aux éléments | O(n) | O(1) |
|
|
248
|
-
| `redirect(redirector)` | Rediriger l'index | O(n) | O(1) |
|
|
249
|
-
| `reverse()` | Inverse le flux | O(n) | O(1) |
|
|
250
|
-
| `shuffle()` | Mélange aléatoirement | O(n) | O(1) |
|
|
251
|
-
| `shuffle(mapper)` | Mélange en utilisant un mappeur | O(n) | O(1) |
|
|
252
|
-
| `skip(n)` | Ignore les n premiers éléments | O(n) | O(1) |
|
|
253
|
-
| `sorted()` | Trie | O(n log n) | O(n) |
|
|
254
|
-
| `sorted(comparator)` | Trie en utilisant un comparateur | O(n log n) | O(n) |
|
|
255
|
-
| `sub(start, end)` | Obtient un sous-flux | O(n) | O(1) |
|
|
256
|
-
| `takeWhile(predicate)` | Prend les éléments satisfaisant la condition | O(n) | O(1) |
|
|
257
|
-
| `translate(offset)` | Traduire l'index | O(n) | O(1) |
|
|
258
|
-
| `translate(translator)` | Traduire l'index à l'aide d'un traducteur | O(n) | O(1) |
|
|
145
|
+
---
|
|
259
146
|
|
|
260
|
-
|
|
261
|
-
// Exemples d'opérations Semantic
|
|
262
|
-
let result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
263
|
-
.filter((n: number): boolean => n % 2 === 0) // Filtre les nombres pairs
|
|
264
|
-
.map((n: number): number => n * 2) // Multiplie par 2
|
|
265
|
-
.skip(1) // Ignore le premier
|
|
266
|
-
.limit(3) // Limite à 3 éléments
|
|
267
|
-
.toUnordered() // Convertit en collecteur non ordonné
|
|
268
|
-
.toArray(); // Convertit en tableau
|
|
269
|
-
// Résultat: [8, 12, 20]
|
|
270
|
-
|
|
271
|
-
// Exemple d'opération complexe
|
|
272
|
-
let complexResult = range(1, 100, 1)
|
|
273
|
-
.flatMap((n: number): Semantics<number> => from([n, n * 2])) // Mappe chaque élément à deux
|
|
274
|
-
.distinct() // Supprime les doublons
|
|
275
|
-
.shuffle() // Mélange l'ordre
|
|
276
|
-
.takeWhile((n: number): boolean => n < 50) // Prend les éléments inférieurs à 50
|
|
277
|
-
.toOrdered() // Convertit en collecteur ordonné
|
|
278
|
-
.toArray(); // Convertit en tableau
|
|
279
|
-
```
|
|
147
|
+
**Règles d'Utilisation Importantes**
|
|
280
148
|
|
|
281
|
-
|
|
149
|
+
1. **Flux d'événements** (`useWindow`, `useDocument`, `useHTMLElement`, `useWebSocket`, …) renvoient un `AsynchronousSemantic`.
|
|
150
|
+
→ Vous **devez** appeler `.limit(n)`, `.sub(start, end)` ou `.takeWhile()` pour cesser l'écoute. Sinon, l'écouteur reste actif.
|
|
282
151
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
| `toBigintStatistics()` | Convertit en statistiques BigInt | O(n) | O(1) |
|
|
290
|
-
| `toWindow()` | Convertit en collecteur de fenêtre | O(1) | O(1) |
|
|
291
|
-
| `toCollectable()` | Convertit en `UnorderdCollectable` | O(n) | O(1) |
|
|
292
|
-
| `toCollectable(mapper)` | Convertit en collecteur personnalisé | O(n) | O(1) |
|
|
152
|
+
2. **Opérations terminales** (`.toArray()`, `.count()`, `.average()`, `.reduce()`, `.findFirst()`, etc.) sont **uniquement disponibles après** conversion en collecteur :
|
|
153
|
+
```typescript
|
|
154
|
+
.toUnordered() // Temps et espace O(n), pas de tri
|
|
155
|
+
// ou
|
|
156
|
+
.toOrdered() // Trié, maintient l'ordre
|
|
157
|
+
```
|
|
293
158
|
|
|
294
|
-
|
|
295
|
-
// Convertit en un tableau trié ascendant
|
|
296
|
-
from([6, 4, 3, 5, 2]) // Crée un flux
|
|
297
|
-
.sorted() // Trie le flux dans l'ordre croissant
|
|
298
|
-
.toArray(); // [2, 3, 4, 5, 6]
|
|
299
|
-
|
|
300
|
-
// Convertit en un tableau trié décroissant
|
|
301
|
-
from([6, 4, 3, 5, 2]) // Crée un flux
|
|
302
|
-
.soted((a: number, b: number): number => b - a) // Trie le flux dans l'ordre décroissant
|
|
303
|
-
.toArray(); // [6, 5, 4, 3, 2]
|
|
304
|
-
|
|
305
|
-
// Redirige vers un tableau inversé
|
|
306
|
-
from([6, 4, 3, 5, 2])
|
|
307
|
-
.redirect((element, index): bigint => -index) // Redirige vers l'ordre inverse
|
|
308
|
-
.toOrderd() // Garde l'ordre redirigé
|
|
309
|
-
.toArray(); // [2, 5, 3, 4, 6]
|
|
310
|
-
|
|
311
|
-
// Ignore les redirections pour inverser le tableau
|
|
312
|
-
from([6, 4, 3, 5, 2])
|
|
313
|
-
.redirect((element, index): bigint => -index) // Redirige vers l'ordre inverse
|
|
314
|
-
.toUnorderd() // Ignore l'ordre redirigé. Cette opération ignorera `redirect`, `reverse`, `shuffle` et `translate`
|
|
315
|
-
.toArray(); // [2, 5, 3, 4, 6]
|
|
316
|
-
|
|
317
|
-
// Inverse le flux dans un tableau
|
|
318
|
-
from([6, 4, 3, 5, 2])
|
|
319
|
-
.reverse() // Inverse le flux
|
|
320
|
-
.toOrdered() // Garantit l'ordre inversé
|
|
321
|
-
.toArray(); // [2, 5, 3, 4, 6]
|
|
322
|
-
|
|
323
|
-
// Remplace le flux mélangé dans un tableau
|
|
324
|
-
from([6, 4, 3, 5, 2])
|
|
325
|
-
.shuffle() // Mélange le flux
|
|
326
|
-
.sorted() // Remplace l'ordre mélangé. Cette opération écrasera `redirect`, `reverse`, `shuffle` et `translate`
|
|
327
|
-
.toArray(); // [2, 5, 3, 4, 6]
|
|
328
|
-
|
|
329
|
-
// Convertit en collecteur de fenêtre
|
|
330
|
-
from([6, 4, 3, 5, 2])
|
|
331
|
-
.toWindow();
|
|
332
|
-
|
|
333
|
-
// Convertit en statistiques numériques
|
|
334
|
-
from([6, 4, 3, 5, 2])
|
|
335
|
-
.toNumericStatistics();
|
|
336
|
-
|
|
337
|
-
// Convertit en statistiques BigInt
|
|
338
|
-
from([6n, 4n, 3n, 5n, 2n])
|
|
339
|
-
.toBigintStatistics();
|
|
340
|
-
|
|
341
|
-
// Définit un collecteur personnalisé pour collecter des données
|
|
342
|
-
let customizedCollector = from([1, 2, 3, 4, 5])
|
|
343
|
-
.toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
|
|
344
|
-
```
|
|
159
|
+
---
|
|
345
160
|
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
| Méthode | Description | Complexité temporelle | Complexité spatiale |
|
|
349
|
-
|------|------|------------|------------|
|
|
350
|
-
| `anyMatch(predicate)` | Si un élément quelconque correspond | O(n) | O(1) |
|
|
351
|
-
| `allMatch(predicate)` | Si tous les éléments correspondent | O(n) | O(1) |
|
|
352
|
-
| `count()` | Comptage des éléments | O(n) | O(1) |
|
|
353
|
-
| `isEmpty()` | Si c'est vide | O(1) | O(1) |
|
|
354
|
-
| `findAny()` | Trouve n'importe quel élément | O(n) | O(1) |
|
|
355
|
-
| `findFirst()` | Trouve le premier élément | O(n) | O(1) |
|
|
356
|
-
| `findLast()` | Trouve le dernier élément | O(n) | O(1) |
|
|
357
|
-
| `forEach(action)` | Itère sur tous les éléments | O(n) | O(1) |
|
|
358
|
-
| `group(classifier)` | Regroupe par classifieur | O(n) | O(n) |
|
|
359
|
-
| `groupBy(keyExtractor, valueExtractor)` | Regroupe par extracteurs de clé-valeur | O(n) | O(n) |
|
|
360
|
-
| `join()` | Jointure en tant que chaîne | O(n) | O(n) |
|
|
361
|
-
| `join(delimiter)` | Jointure en utilisant un délimiteur | O(n) | O(n) |
|
|
362
|
-
| `nonMatch(predicate)` | Si aucun élément ne correspond | O(n) | O(1) |
|
|
363
|
-
| `partition(count)` | Partitionne par nombre | O(n) | O(n) |
|
|
364
|
-
| `partitionBy(classifier)` | Partitionne par classifieur | O(n) | O(n) |
|
|
365
|
-
| `reduce(accumulator)` | Opération de réduction | O(n) | O(1) |
|
|
366
|
-
| `reduce(identity, accumulator)` | Réduction avec valeur initiale | O(n) | O(1) |
|
|
367
|
-
| `toArray()` | Convertit en tableau | O(n) | O(n) |
|
|
368
|
-
| `toMap(keyExtractor, valueExtractor)` | Convertit en Map | O(n) | O(n) |
|
|
369
|
-
| `toSet()` | Convertit en Set | O(n) | O(n) |
|
|
370
|
-
| `write(stream)` | Écrit dans le flux | O(n) | O(1) |
|
|
161
|
+
### Caractéristiques de Performance
|
|
371
162
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
console.log(data.anyMatch((n: number): boolean => n > 5)); // true
|
|
380
|
-
console.log(data.allMatch((n: number): boolean => n < 20)); // true
|
|
381
|
-
|
|
382
|
-
// Opérations de recherche
|
|
383
|
-
data.findFirst().ifPresent((n: number): void => console.log(n)); // 2
|
|
384
|
-
data.findAny().ifPresent((n: number): void => console.log(n)); // N'importe quel élément
|
|
385
|
-
|
|
386
|
-
// Opérations de regroupement
|
|
387
|
-
const grouped = data.groupBy(
|
|
388
|
-
(n: number): string => (n > 5 ? "grand" : "petit"),
|
|
389
|
-
(n: number): number => n * 2
|
|
390
|
-
); // {petit: [4, 8], grand: [12, 16, 20]}
|
|
391
|
-
|
|
392
|
-
// Opérations de réduction
|
|
393
|
-
const sum = data.reduce(0, (acc, n) => acc + n); // 30
|
|
394
|
-
|
|
395
|
-
// Opérations de sortie
|
|
396
|
-
data.join(", "); // "[2, 4, 6, 8, 10]"
|
|
397
|
-
```
|
|
163
|
+
| Collecteur | Complexité Temporelle | Complexité Spatiale | Trié ? | Le meilleur pour |
|
|
164
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
165
|
+
| `toUnordered()` | O(n) | O(n) | Non | Vitesse brute, ordre non requis. |
|
|
166
|
+
| `toOrdered()` | O(2n) | O(n) | Oui | Ordre stable, accès indexé, analyses. |
|
|
167
|
+
| `toNumericStatistics()` | O(2n) | O(n) | Oui | Opérations statistiques nécessitant des données triées. |
|
|
168
|
+
| `toBigIntStatistics()` | O(2n) | O(n) | Oui | Opérations statistiques pour bigint. |
|
|
169
|
+
| `toWindow()` | O(2n) | O(n) | Oui | Opérations de fenêtrage basées sur le temps. |
|
|
398
170
|
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
### Méthodes de NumericStatistics
|
|
402
|
-
|
|
403
|
-
| Méthode | Description | Complexité temporelle | Complexité spatiale |
|
|
404
|
-
|------|------|------------|------------|
|
|
405
|
-
| `range()` | Plage | O(n) | O(1) |
|
|
406
|
-
| `variance()` | Variance | O(n) | O(1) |
|
|
407
|
-
| `standardDeviation()` | Écart-type | O(n) | O(1) |
|
|
408
|
-
| `mean()` | Moyenne | O(n) | O(1) |
|
|
409
|
-
| `median()` | Médiane | O(n log n) | O(n) |
|
|
410
|
-
| `mode()` | Mode | O(n) | O(n) |
|
|
411
|
-
| `frequency()` | Distribution de fréquence | O(n) | O(n) |
|
|
412
|
-
| `summate()` | Somme | O(n) | O(1) |
|
|
413
|
-
| `quantile(quantile)` | Quantile | O(n log n) | O(n) |
|
|
414
|
-
| `interquartileRange()` | Intervalle interquartile | O(n log n) | O(n) |
|
|
415
|
-
| `skewness()` | Asymétrie | O(n) | O(1) |
|
|
416
|
-
| `kurtosis()` | Curtosis | O(n) | O(1) |
|
|
417
|
-
|
|
418
|
-
```typescript
|
|
419
|
-
// Exemples d'analyse statistique
|
|
420
|
-
const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
421
|
-
.toNumericStatistics();
|
|
422
|
-
|
|
423
|
-
console.log("Moyenne:", numbers.mean()); // 5.5
|
|
424
|
-
console.log("Médiane:", numbers.median()); // 5.5
|
|
425
|
-
console.log("Écart-type:", numbers.standardDeviation()); // ~2.87
|
|
426
|
-
console.log("Somme:", numbers.summate()); // 55
|
|
427
|
-
|
|
428
|
-
// Analyse statistique utilisant des mappers
|
|
429
|
-
const objects = from([
|
|
430
|
-
{ value: 10 },
|
|
431
|
-
{ value: 20 },
|
|
432
|
-
{ value: 30 }
|
|
433
|
-
]).toNumericStatistics();
|
|
434
|
-
console.log("Moyenne mappée:", objects.mean(obj => obj.value)); // 20
|
|
435
|
-
```
|
|
171
|
+
Optez pour `toUnordered()` lorsque la vitesse est primordiale. Utilisez `toOrdered()` uniquement lorsque vous avez besoin d'un ordre stable ou de méthodes statistiques dépendant de données triées.
|
|
436
172
|
|
|
437
|
-
|
|
173
|
+
---
|
|
438
174
|
|
|
439
|
-
|
|
175
|
+
**Comparaison avec d'autres Processeurs de Flux Front-End**
|
|
440
176
|
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
177
|
+
| Fonctionnalité | Semantic-TypeScript | RxJS | Itérateurs/Générateurs Async Natifs | Most.js |
|
|
178
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
179
|
+
| **Intégration TypeScript** | De première classe, fortement typé avec conscience native de l'index. | Excellente, mais implique des génériques complexes. | Bonne, nécessite un typage manuel. | Style fonctionnel fort. |
|
|
180
|
+
| **Analyse Statistique Intégrée** | Prise en charge native complète pour `number` et `bigint`. | Non disponible nativement (nécessite des opérateurs personnalisés). | Aucune. | Aucune. |
|
|
181
|
+
| **Indexation et Conscience de Position** | Indexation bigint native et puissante sur chaque élément. | Nécessite des opérateurs personnalisés (`scan`, `withLatestFrom`). | Compteur manuel requis. | Basique, pas d'index intégré. |
|
|
182
|
+
| **Gestion des Flux d'Événements** | Usines dédiées et sûres au niveau des types avec contrôle explicite d'arrêt anticipé. | Puissante mais nécessite une gestion manuelle des abonnements. | Écouteur d'événements manuel + annulation. | Bonne `fromEvent`, léger. |
|
|
183
|
+
| **Performance et Efficacité Mémoire** | Exceptionnelle – collecteurs optimisés `toUnordered()` et `toOrdered()`. | Très bonne, mais les chaînes d'opérateurs ajoutent de la surcharge. | Excellente (surcharge nulle). | Excellente. |
|
|
184
|
+
| **Taille du Bundle** | Très léger. | Grand (même avec tree-shaking). | Zéro (natif). | Petit. |
|
|
185
|
+
| **Philosophie de Conception d'API** | Modèle de collecteur fonctionnel avec indexation explicite. | Modèle Observable Réactif. | Modèle Itérateur / Générateur. | Fonctionnel, point-free. |
|
|
186
|
+
| **Terminaison Anticipée et Contrôle** | Explicite (`interrupt`, `.limit()`, `.takeWhile()`, `.sub()`). | Bon (`take`, `takeUntil`, `first`). | Manuel (`break` dans `for await…of`). | Bon (`take`, `until`). |
|
|
187
|
+
| **Support Synchrone et Asynchrone** | API unifiée – support de première classe pour les deux. | Principalement asynchrone. | Les deux, mais manuel. | Principalement asynchrone. |
|
|
188
|
+
| **Courbe d'Apprentissage** | Douce pour les développeurs familiarisés avec les pipelines fonctionnels et indexés. | Plus raide (nombreux opérateurs, observables chauds/froids). | Faible. | Modérée. |
|
|
448
189
|
|
|
449
|
-
|
|
190
|
+
**Avantages Clés de Semantic-TypeScript**
|
|
450
191
|
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
```
|
|
192
|
+
* Capacités statistiques et d'indexation intégrées uniques, éliminant le besoin d'un `reduce` manuel ou de bibliothèques externes.
|
|
193
|
+
* Contrôle explicite des flux d'événements prévient les fuites de mémoire courantes avec RxJS.
|
|
194
|
+
* Une conception synchrone/asynchrone unifiée fournit une API unique et cohérente pour divers cas d'usage.
|
|
455
195
|
|
|
456
|
-
|
|
196
|
+
Cette comparaison illustre pourquoi Semantic-TypeScript est particulièrement bien adapté aux applications front-end TypeScript modernes qui exigent performance, sûreté des types et analyses riches sans le cérémonial des bibliothèques réactives traditionnelles.
|
|
457
197
|
|
|
458
|
-
|
|
459
|
-
// Lorsque des opérations de fenêtre sont nécessaires
|
|
460
|
-
let windowed: WindowCollectable<number> = data
|
|
461
|
-
.toWindow()
|
|
462
|
-
.slide(5n, 2n); // Fenêtre coulissante
|
|
463
|
-
```
|
|
198
|
+
---
|
|
464
199
|
|
|
465
|
-
###
|
|
200
|
+
### Prêt à Explorer ?
|
|
466
201
|
|
|
467
|
-
|
|
468
|
-
// Lorsqu'une analyse statistique est nécessaire
|
|
469
|
-
let statistics: NumericStatistics<number> = data
|
|
470
|
-
.toNumericStatistics(); // Statistiques numériques
|
|
202
|
+
Semantic-TypeScript transforme les flux de données complexes en pipelines lisibles, composables et haute performance. Que vous manipuliez des événements UI en temps réel, traitiez de grands ensembles de données ou construisiez des tableaux de bord analytiques, il fournit la puissance de l'indexation de niveau base de données avec l'élégance de la programmation fonctionnelle.
|
|
471
203
|
|
|
472
|
-
|
|
473
|
-
.toBigintStatistics(); // Statistiques BigInt
|
|
474
|
-
```
|
|
204
|
+
**Prochaines Étapes :**
|
|
475
205
|
|
|
476
|
-
|
|
477
|
-
|
|
206
|
+
* Parcourez l'API entièrement typée dans votre IDE (toutes les exportations proviennent du package principal).
|
|
207
|
+
* Rejoignez la communauté grandissante de développeurs qui ont remplacé des itérateurs async alambiqués par des pipelines Semantic propres.
|
|
478
208
|
|
|
479
|
-
|
|
209
|
+
**Semantic-TypeScript** — où les flux rencontrent la structure.
|
|
480
210
|
|
|
481
|
-
|
|
482
|
-
2. **Considérations de performance**: Si la garantie d'ordre n'est pas nécessaire, privilégiez l'utilisation de `toUnordered()` pour une meilleure performance.
|
|
483
|
-
3. **Utilisation de la mémoire**: Les opérations de tri nécessitent un espace supplémentaire de O(n).
|
|
484
|
-
4. **Données en temps réel**: Les flux Semantic conviennent pour le traitement de données en temps réel et prennent en charge les sources de données asynchrones.
|
|
211
|
+
Commencez à construire dès aujourd'hui et expérimentez la différence qu'apporte une indexation bien pensée.
|
|
485
212
|
|
|
486
|
-
|
|
213
|
+
**Construisez avec clarté, agissez avec confiance, et transformez les données avec intention.**
|