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/readme.fr.md CHANGED
@@ -1,486 +1,213 @@
1
- # Bibliothèque de traitement de flux Semantic-TypeScript
1
+ # **Semantic-TypeScript**
2
+ **Flux, Indexés.** Vos données, sous contrôle précis.
2
3
 
3
- ## Introduction
4
+ ---
4
5
 
5
- Semantic-TypeScript est une bibliothèque moderne de traitement de flux inspirée par les fonctions génératrices de JavaScript, les flux Java et l'index de MySQL. Sa philosophie de conception centrale repose sur la construction de pipelines efficaces de traitement de données en utilisant l'indexation des données, offrant une expérience d'opération de flux fonctionnelle avec sécurité de types pour le développement front-end.
6
+ ### Aperçu
6
7
 
7
- Contrairement au traitement synchrone traditionnel, Semantic utilise un modèle de traitement asynchrone. Lors de la création d'un flux de données, le moment le terminal reçoit les données dépend entièrement de quand l'amont appelle les fonctions de rappel `accept` et `interrupt`. Ce design permet à la bibliothèque de gérer élégamment les flux de données en temps réel, les grands ensembles de données et les sources de données asynchrones.
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
- ## Installation
10
+ 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
- ```bash
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
- ## Gardiens de type
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
- ```typescript
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
- ## Fonctions utilitaires
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
- | Fonction | Description | Complexité temporelle | Complexité spatiale |
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
- ```typescript
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
- let randomNum = useRandom(42); // Nombre aléatoire basé sur une graine
30
+ ```bash
31
+ npm install semantic-typescript
121
32
  ```
122
-
123
- ## Méthodes de fabrique
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
- ### Méthodes de fabrique de Collector
38
+ ---
146
39
 
147
- | Méthode | Description | Complexité temporelle | Complexité spatiale |
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
- // Exemples de conversion de Collector
154
- let numbers: Semantic<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
155
-
156
- // Priorité de performance : utilisez un Collector non ordonné pour obtenir la meilleure performance
157
- let unordered: UnorderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
158
- .filter((n: number): boolean => n > 3)
159
- .toUnordered(); // Meilleure performance
160
-
161
- // Tri nécessaire : utilisez un Collector ordonné
162
- let ordered: OrderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
163
- .sorted();
164
-
165
- // Compte le nombre d'éléments
166
- let count: Collector<number, number, number> = Collector.full(
167
- (): number => 0, // Valeur initiale
168
- (accumulator: number, element: number): number => accumulator + element, // Accumuler
169
- (accumulator: number): number => accumulator // Terminer
170
- );
171
- count.collect(from([1,2,3,4,5])); // Compte depuis un flux
172
- count.collect([1,2,3,4,5]); // Compte depuis un objet itérable
173
-
174
- let find: Optional<number> = Collector.shortable(
175
- (): Optional<number> => Optional.empty(), // Valeur initiale
176
- (element: number, index: bigint, accumulator: Optional<number>): Optional<number> => accumulator.isPresent(), // Interruption
177
- (accumulator: Optional<number>, element: number, index: bigint): Optional<number> => Optional.of(element), // Accumuler
178
- (accumulator: Optional<number>): Optional<number> => accumulator // Terminer
179
- );
180
- find.collect(from([1,2,3,4,5])); // Trouve le premier élément
181
- find.collect([1,2,3,4,5]); // Trouve le premier élément
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
- ### Méthodes de fabrique de Semantic
131
+ ---
185
132
 
186
- | Méthode | Description | Complexité temporelle | Complexité spatiale |
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
- ```typescript
199
- // Exemples de méthodes de fabrique de Semantic
200
-
201
- // Crée un flux à partir d'un Blob (lecture par morceaux)
202
- blob(someBlob, 1024n)
203
- .toUnordered()
204
- .write(WritableStream)
205
- .then(callback) // Écriture du flux réussie
206
- .catch(callback); // Échec de l'écriture du flux
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
- ## Méthodes de classe Semantic
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
- ```typescript
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
- ## Méthodes de conversion Semantic
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
- | Méthode | Description | Complexité temporelle | Complexité spatiale |
284
- |------------|------------|------------|------------|
285
- | `sorted()` | Convertit en collecteur ordonné | O(n log n) | O(n) |
286
- | `toUnordered()` | Convertit en collecteur non ordonné | O(1) | O(1) |
287
- | `toOrdered()` | Convertit en collecteur ordonné | O(1) | O(1) |
288
- | `toNumericStatistics()` | Convertit en statistiques numériques | O(n) | O(1) |
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
- ```typescript
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
- ## Méthodes de collection Collectable
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
- ```typescript
373
- // Exemples d'opérations Collectable
374
- const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
375
- .filter((n: number): boolean => n % 2 === 0)
376
- .toOrdered();
377
-
378
- // Vérifications de correspondance
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
- ## Méthodes d'analyse statistique
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
- ## Guide de sélection des performances
173
+ ---
438
174
 
439
- ### Choisissez un collecteur non ordonné (performance prioritaire)
175
+ **Comparaison avec d'autres Processeurs de Flux Front-End**
440
176
 
441
- ```typescript
442
- // Lorsque la garantie d'ordre n'est pas nécessaire, utilisez un collecteur non ordonné pour obtenir la meilleure performance
443
- let highPerformance = data
444
- .filter(predicate)
445
- .map(mapper)
446
- .toUnordered(); // Meilleure performance
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
- ### Choisissez un collecteur ordonné (ordre requis)
190
+ **Avantages Clés de Semantic-TypeScript**
450
191
 
451
- ```typescript
452
- // Lorsque l'ordre des éléments doit être maintenu, utilisez un collecteur ordonné
453
- let ordered = data.sorted(comparator);
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
- ### Choisissez un collecteur de fenêtre (opérations de fenêtre)
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
- ```typescript
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
- ### Choisissez une analyse statistique (calculs numériques)
200
+ ### Prêt à Explorer ?
466
201
 
467
- ```typescript
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
- let bigIntStatistics: BigintStatistics<bigint> = data
473
- .toBigintStatistics(); // Statistiques BigInt
474
- ```
204
+ **Prochaines Étapes :**
475
205
 
476
- [GitHub](https://github.com/eloyhere/semantic-typescript)
477
- [NPMJS](https://www.npmjs.com/package/semantic-typescript)
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
- ## Notes importantes
209
+ **Semantic-TypeScript** où les flux rencontrent la structure.
480
210
 
481
- 1. **Impact des opérations de tri**: Dans les collecteurs ordonnés, l'opération `sorted()` remplace les effets de `redirect`, `translate`, `shuffle`, `reverse`.
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
- Cette bibliothèque offre aux développeurs TypeScript des capacités de streaming puissantes et flexibles, combinant les avantages de la programmation fonctionnelle avec des garanties de sécurité de types.
213
+ **Construisez avec clarté, agissez avec confiance, et transformez les données avec intention.**