semantic-typescript 0.0.7 → 0.1.4

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,335 +1,428 @@
1
- # 📘 semantic-typescript
1
+ # Bibliothèque de Traitement de Flux Semantic-TypeScript
2
2
 
3
- Une bibliothèque TypeScript puissante et typée en toute sécurité, conçue pour le **traitement sémantique de données**.
4
- Elle fournit des constructions fonctionnelles composites pour travailler avec des collections, des flux et des séquences — avec prise en charge du tri, du filtrage, du regroupement, des statistiques et bien plus encore.
3
+ ## Introduction
5
4
 
6
- Que vous traitiez des **données ordonnées ou non ordonnées**, effectuiez des **analyses statistiques**, ou que vous souhaitiez simplement **chaîner des opérations de manière fluide**, cette bibliothèque est faite pour vous.
5
+ Semantic-TypeScript est une bibliothèque moderne de traitement de flux inspirée par JavaScript GeneratorFunction, Java Stream et MySQL Index. La conception centrale de la bibliothèque repose sur la construction de pipelines efficaces de traitement de données utilisant des index de données, offrant aux développeurs frontend une expérience de traitement de flux avec sécurité de type et style fonctionnel.
7
6
 
8
- ---
7
+ Contrairement au traitement synchrone traditionnel, Semantic adopte un mode de traitement asynchrone. Lors de la création de flux de données, le moment où le terminal reçoit les données dépend entièrement du moment où la source en amont appelle les fonctions de callback `accept` et `interrupt`. Cette conception 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.
9
8
 
10
- ## 🧩 Caractéristiques
11
-
12
- - ✅ **Génériques typés en toute sécurité** dans toute la bibliothèque
13
- - ✅ Style **programmation fonctionnelle** (map, filter, reduce, etc.)
14
- - ✅ **Flux de données sémantiques** (`Semantic<E>`) pour une **évaluation paresseuse**
15
- - ✅ **Collecteurs** pour transformer des flux en structures concrètes
16
- - ✅ **Collectables ordonnés et non ordonnés** — `toUnordered()` est **le plus rapide (pas de tri)**
17
- - ✅ **Tri** via `sorted()`, `toOrdered()`, comparateurs personnalisés
18
- - ✅ **Analyse statistique** (`Statistics`, `NumericStatistics`, `BigIntStatistics`)
19
- - ✅ **Optional<T>** — monade pour manipuler en toute sécurité les valeurs nulles
20
- - ✅ Conception basée sur les **itérateurs et générateurs** — adaptée aux gros volumes ou données asynchrones
21
-
22
- ---
23
-
24
- ## 📦 Installation
9
+ ## Installation
25
10
 
26
11
  ```bash
27
12
  npm install semantic-typescript
28
13
  ```
29
14
 
30
- ---
31
-
32
- ## 🧠 Concepts clés
33
-
34
- ### 1. `Optional<T>` Gestion sûre des valeurs nulles
35
-
36
- Un conteneur monadique pour des valeurs pouvant être `null` ou `undefined`.
37
-
38
- #### Méthodes :
39
-
40
- | Méthode | Description | Exemple |
41
- |--------|-------------|---------|
42
- | `of(value)` | Envelopper une valeur (peut être nulle) | `Optional.of(null)` |
43
- | `ofNullable(v)` | Envelopper, autorise les valeurs nulles | `Optional.ofNullable(someVar)` |
44
- | `ofNonNull(v)` | Envelopper, lève une erreur si null/undefined | `Optional.ofNonNull(5)` |
45
- | `get()` | Obtenir la valeur (ou lever une exception si vide) | `opt.get()` |
46
- | `getOrDefault(d)` | Obtenir la valeur ou une valeur par défaut | `opt.getOrDefault(0)` |
47
- | `ifPresent(fn)` | Exécuter un effet de bord si la valeur existe | `opt.ifPresent(x => console.log(x))` |
48
- | `map(fn)` | Transformer la valeur si elle existe | `opt.map(x => x + 1)` |
49
- | `filter(fn)` | Conserver la valeur seulement si le prédicat est vrai | `opt.filter(x => x > 0)` |
50
- | `isEmpty()` | Vérifie si la valeur est absente | `opt.isEmpty()` |
51
- | `isPresent()` | Vérifie si une valeur est présente | `opt.isPresent()` |
52
-
53
- #### Exemple :
15
+ ## Types de Base
16
+
17
+ | Type | Description |
18
+ |------|-------------|
19
+ | `Invalid<T>` | Type étendant null ou undefined |
20
+ | `Valid<T>` | Type excluant null et undefined |
21
+ | `MaybeInvalid<T>` | Type pouvant être null ou undefined |
22
+ | `Primitive` | Collection de types primitifs |
23
+ | `MaybePrimitive<T>` | Type pouvant être un primitif |
24
+ | `OptionalSymbol` | Identificateur symbolique pour la classe Optional |
25
+ | `SemanticSymbol` | Identificateur symbolique pour la classe Semantic |
26
+ | `CollectorsSymbol` | Identificateur symbolique pour la classe Collector |
27
+ | `CollectableSymbol` | Identificateur symbolique pour la classe Collectable |
28
+ | `OrderedCollectableSymbol` | Identificateur symbolique pour la classe OrderedCollectable |
29
+ | `WindowCollectableSymbol` | Identificateur symbolique pour la classe WindowCollectable |
30
+ | `StatisticsSymbol` | Identificateur symbolique pour la classe Statistics |
31
+ | `NumericStatisticsSymbol` | Identificateur symbolique pour la classe NumericStatistics |
32
+ | `BigIntStatisticsSymbol` | Identificateur symbolique pour la classe BigIntStatistics |
33
+ | `UnorderedCollectableSymbol` | Identificateur symbolique pour la classe UnorderedCollectable |
34
+ | `Runnable` | Fonction sans paramètre ni valeur de retour |
35
+ | `Supplier<R>` | Fonction sans paramètre retournant R |
36
+ | `Functional<T, R>` | Fonction de transformation à un paramètre |
37
+ | `Predicate<T>` | Fonction de prédicat à un paramètre |
38
+ | `BiFunctional<T, U, R>` | Fonction de transformation à deux paramètres |
39
+ | `BiPredicate<T, U>` | Fonction de prédicat à deux paramètres |
40
+ | `Comparator<T>` | Fonction de comparaison |
41
+ | `TriFunctional<T, U, V, R>` | Fonction de transformation à trois paramètres |
42
+ | `Consumer<T>` | Fonction consommatrice à un paramètre |
43
+ | `BiConsumer<T, U>` | Fonction consommatrice à deux paramètres |
44
+ | `TriConsumer<T, U, V>` | Fonction consommatrice à trois paramètres |
45
+ | `Generator<T>` | Fonction génératrice |
54
46
 
55
47
  ```typescript
56
- import { Optional } from 'semantic-typescript';
57
-
58
- const value: number | null = Math.random() > 0.5 ? 10 : null;
59
-
60
- const opt = Optional.ofNullable(value);
61
-
62
- const result = opt
63
- .filter(v => v > 5)
64
- .map(v => v * 2)
65
- .getOrDefault(0);
66
-
67
- console.log(result); // 20 ou 0
48
+ // Exemples d'utilisation des types
49
+ const predicate: Predicate<number> = (n) => n > 0;
50
+ const mapper: Functional<string, number> = (str) => str.length;
51
+ const comparator: Comparator<number> = (a, b) => a - b;
68
52
  ```
69
53
 
70
- ---
54
+ ## Gardes de Type
55
+
56
+ | Fonction | Description | Complexité Temporelle | Complexité Spatiale |
57
+ |----------|-------------|----------------------|---------------------|
58
+ | `validate<T>(t: MaybeInvalid<T>): t is T` | Valide que la valeur n'est pas null ou undefined | O(1) | O(1) |
59
+ | `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | Valide que la valeur est null ou undefined | O(1) | O(1) |
60
+ | `isBoolean(t: unknown): t is boolean` | Vérifie si c'est un booléen | O(1) | O(1) |
61
+ | `isString(t: unknown): t is string` | Vérifie si c'est une chaîne | O(1) | O(1) |
62
+ | `isNumber(t: unknown): t is number` | Vérifie si c'est un nombre | O(1) | O(1) |
63
+ | `isFunction(t: unknown): t is Function` | Vérifie si c'est une fonction | O(1) | O(1) |
64
+ | `isObject(t: unknown): t is object` | Vérifie si c'est un objet | O(1) | O(1) |
65
+ | `isSymbol(t: unknown): t is symbol` | Vérifie si c'est un symbole | O(1) | O(1) |
66
+ | `isBigint(t: unknown): t is bigint` | Vérifie si c'est un BigInt | O(1) | O(1) |
67
+ | `isPrimitive(t: unknown): t is Primitive` | Vérifie si c'est un type primitif | O(1) | O(1) |
68
+ | `isIterable(t: unknown): t is Iterable<unknown>` | Vérifie si c'est itérable | O(1) | O(1) |
69
+ | `isOptional(t: unknown): t is Optional<unknown>` | Vérifie si c'est une instance d'Optional | O(1) | O(1) |
70
+ | `isSemantic(t: unknown): t is Semantic<unknown>` | Vérifie si c'est une instance de Semantic | O(1) | O(1) |
71
+ | `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Vérifie si c'est une instance de Collector | O(1) | O(1) |
72
+ | `isCollectable(t: unknown): t is Collectable<unknown>` | Vérifie si c'est une instance de Collectable | O(1) | O(1) |
73
+ | `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | Vérifie si c'est une instance d'OrderedCollectable | O(1) | O(1) |
74
+ | `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | Vérifie si c'est une instance de WindowCollectable | O(1) | O(1) |
75
+ | `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | Vérifie si c'est une instance d'UnorderedCollectable | O(1) | O(1) |
76
+ | `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Vérifie si c'est une instance de Statistics | O(1) | O(1) |
77
+ | `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | Vérifie si c'est une instance de NumericStatistics | O(1) | O(1) |
78
+ | `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | Vérifie si c'est une instance de BigIntStatistics | O(1) | O(1) |
71
79
 
72
- ### 2. `Semantic<E>` — Flux de données paresseux
80
+ ```typescript
81
+ // Exemples d'utilisation des gardes de type
82
+ const value: unknown = "hello";
73
83
 
74
- Un **flux séquentiel paresseux et composite**. Similaire aux Java Streams ou aux Kotlin Sequences.
84
+ if (isString(value)) {
85
+ console.log(value.length); // Sécurité de type, value est inféré comme string
86
+ }
75
87
 
76
- Créez un `Semantic` à l’aide d’assistants comme `from()`, `range()`, `iterate()` ou `fill()`.
88
+ if (isOptional(someValue)) {
89
+ someValue.ifPresent(val => console.log(val));
90
+ }
91
+ ```
77
92
 
78
- #### Créateurs :
93
+ ## Fonctions Utilitaires
79
94
 
80
- | Fonction | Description | Exemple |
81
- |----------|-------------|---------|
82
- | `from(iterable)` | Créer à partir d’un Array, Set, Iterable | `from([1, 2, 3])` |
83
- | `range(start, end, step?)` | Générer une plage de nombres | `range(0, 5)` 0,1,2,3,4 |
84
- | `fill(element, count)` | Répéter un élément N fois | `fill('a', 3n)` |
85
- | `iterate(gen)` | Utiliser une fonction générateur personnalisée | `iterate(genFn)` |
95
+ | Fonction | Description | Complexité Temporelle | Complexité Spatiale |
96
+ |----------|-------------|----------------------|---------------------|
97
+ | `useCompare<T>(t1: T, t2: T): number` | Fonction de comparaison universelle | O(1) | O(1) |
98
+ | `useRandom<T = number \| bigint>(index: T): T` | Générateur de nombres pseudo-aléatoires | O(log n) | O(1) |
86
99
 
87
- #### Opérateurs courants :
100
+ ```typescript
101
+ // Exemples d'utilisation des fonctions utilitaires
102
+ const numbers = [3, 1, 4, 1, 5];
103
+ numbers.sort(useCompare); // [1, 1, 3, 4, 5]
88
104
 
89
- | Méthode | Description | Exemple |
90
- |--------|-------------|---------|
91
- | `map(fn)` | Transformer chaque élément | `.map(x => x * 2)` |
92
- | `filter(fn)` | Conserver les éléments répondant au prédicat | `.filter(x => x > 10)` |
93
- | `limit(n)` | Limiter aux N premiers éléments | `.limit(5)` |
94
- | `skip(n)` | Ignorer les N premiers éléments | `.skip(2)` |
95
- | `distinct()` | Supprimer les doublons (utilise Set par défaut) | `.distinct()` |
96
- | `sorted()` | Trier les éléments (ordre naturel) | `.sorted()` |
97
- | `sorted(comparator)` | Trier avec un comparateur personnalisé | `.sorted((a, b) => a - b)` |
98
- | `toOrdered()` | Trier et retourner un `OrderedCollectable` | `.toOrdered()` |
99
- | `toUnordered()` | **Pas de tri** — le plus rapide | `.toUnordered()` ✅ |
100
- | `collect(collector)` | Aggréger avec un `Collector` | `.collect(Collector.full(...))` |
101
- | `toArray()` | Convertir en tableau | `.toArray()` |
102
- | `toSet()` | Convertir en Set | `.toSet()` |
103
- | `toMap(keyFn, valFn)` | Convertir en Map | `.toMap(x => x.id, x => x)` |
105
+ const randomNum = useRandom(42); // Nombre aléatoire basé sur seed
106
+ const randomBigInt = useRandom(1000n); // Nombre BigInt aléatoire
107
+ ```
104
108
 
105
- ---
109
+ ## Méthodes d'Usine
106
110
 
107
- ### 3. `toUnordered()` — 🚀 Le plus rapide, sans tri
111
+ ### Méthodes d'Usine d'Optional
108
112
 
109
- Si vous **n’avez pas besoin d’ordre** et que vous souhaitez les **meilleures performances possibles**, utilisez :
113
+ | Méthode | Description | Complexité Temporelle | Complexité Spatiale |
114
+ |---------|-------------|----------------------|---------------------|
115
+ | `Optional.empty<T>()` | Crée un Optional vide | O(1) | O(1) |
116
+ | `Optional.of<T>(value)` | Crée un Optional avec valeur | O(1) | O(1) |
117
+ | `Optional.ofNullable<T>(value)` | Crée un Optional pouvant être null | O(1) | O(1) |
118
+ | `Optional.ofNonNull<T>(value)` | Crée un Optional non null | O(1) | O(1) |
110
119
 
111
120
  ```typescript
112
- const fastest = semanticStream.toUnordered();
121
+ // Exemples d'utilisation d'Optional
122
+ const emptyOpt = Optional.empty<number>();
123
+ const presentOpt = Optional.of(42);
124
+ const nullableOpt = Optional.ofNullable<string>(null);
125
+ const nonNullOpt = Optional.ofNonNull("hello");
126
+
127
+ presentOpt.ifPresent(val => console.log(val)); // Affiche 42
128
+ console.log(emptyOpt.orElse(100)); // Affiche 100
113
129
  ```
114
130
 
115
- 🔥 **Aucun algorithme de tri n’est appliqué.**
116
- Parfait lorsque l’ordre n’a pas d’importance et que la vitesse est cruciale.
117
-
118
- ---
131
+ ### Méthodes d'Usine de Collector
119
132
 
120
- ### 4. `toOrdered()` et `sorted()` Résultats triés
121
-
122
- Si vous avez besoin d’un **résultat trié**, utilisez :
133
+ | Méthode | Description | Complexité Temporelle | Complexité Spatiale |
134
+ |---------|-------------|----------------------|---------------------|
135
+ | `Collector.full(identity, accumulator, finisher)` | Crée un collecteur complet | O(1) | O(1) |
136
+ | `Collector.shortable(identity, interruptor, accumulator, finisher)` | Crée un collecteur interruptible | O(1) | O(1) |
123
137
 
124
138
  ```typescript
125
- const ordered = semanticStream.sorted(); // Tri naturel
126
- const customSorted = semanticStream.sorted((a, b) => a - b); // Comparateur personnalisé
127
- const orderedCollectable = semanticStream.toOrdered(); // Aussi trié
139
+ // Exemples d'utilisation de Collector
140
+ const sumCollector = Collector.full(
141
+ () => 0,
142
+ (sum, num) => sum + num,
143
+ result => result
144
+ );
145
+
146
+ const numbers = from([1, 2, 3, 4, 5]);
147
+ const total = numbers.toUnoredered().collect(sumCollector); // 15
128
148
  ```
129
149
 
130
- ⚠️ Ces méthodes **trient les éléments**, en utilisant l’ordre naturel ou un comparateur fourni.
131
-
132
- ---
150
+ ### Méthodes d'usine de Semantic
133
151
 
134
- ### 5. `Collector<E, A, R>` Agrégation de données
152
+ | Méthode | Description | Complexité temporelle | Complexité spatiale |
153
+ |---------|-------------|----------------------|----------------------|
154
+ | `blob(blob, chunkSize)` | Crée un flux depuis un Blob | O(n) | O(chunkSize) |
155
+ | `empty<E>()` | Crée un flux vide | O(1) | O(1) |
156
+ | `fill<E>(element, count)` | Crée un flux rempli | O(n) | O(1) |
157
+ | `from<E>(iterable)` | Crée un flux depuis un objet itérable | O(1) | O(1) |
158
+ | `interval(period, delay?)` | Crée un flux d'intervalle régulier | O(1)* | O(1) |
159
+ | `iterate<E>(generator)` | Crée un flux depuis un générateur | O(1) | O(1) |
160
+ | `range(start, end, step)` | Crée un flux de plage numérique | O(n) | O(1) |
161
+ | `websocket(websocket)` | Crée un flux depuis un WebSocket | O(1) | O(1) |
135
162
 
136
- Les collecteurs vous permettent de **réduire un flux en une structure unique ou complexe**.
163
+ ```typescript
164
+ // Exemple d'utilisation des méthodes d'usine de Semantic
165
+
166
+ // Créer un flux depuis un Blob (lecture par blocs)
167
+ blob(someBlob, 1024n)
168
+ .toUnordered()
169
+ .write(WritableStream)
170
+ .then(callback) // Écriture de flux réussie
171
+ .catch(writeFi); // Échec de l'écriture de flux
172
+
173
+ // Créer un flux vide qui ne s'exécutera qu'après concaténation avec d'autres flux
174
+ empty<string>()
175
+ .toUnordered()
176
+ .join(); //[]
177
+
178
+ // Créer un flux rempli
179
+ const filledStream = fill("hello", 3); // "hello", "hello", "hello"
180
+
181
+ // Créer un flux temporel avec délai initial de 2 secondes et cycle de 5 secondes,
182
+ // implémenté via un mécanisme de temporisation, dérives temporelles possibles
183
+ // dues aux limitations de planification du système.
184
+ const intervalStream = interval(5000, 2000);
185
+
186
+ // Créer un flux depuis un objet itérable
187
+ const numberStream = from([1, 2, 3, 4, 5]);
188
+ const stringStream = from(new Set(["Alex", "Bob"]));
189
+
190
+ // Créer un flux de plage
191
+ const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
192
+
193
+ // Flux d'événements WebSocket
194
+ const ws = new WebSocket("ws://localhost:8080");
195
+ websocket(ws)
196
+ .filter((event)=> event.type === "message") // Surveiller uniquement les événements de message
197
+ .toUnordered() // Pour les événements généralement non triés
198
+ .forEach((event)=> receive(event)); // Recevoir les messages
199
+ ```
137
200
 
138
- Des factories statiques sont disponibles :
201
+ ## Méthodes de Classe Semantic
202
+
203
+ | Méthode | Description | Complexité Temporelle | Complexité Spatiale |
204
+ |---------|-------------|----------------------|---------------------|
205
+ | `concat(other)` | Concatène deux flux | O(n) | O(1) |
206
+ | `distinct()` | Supprime les doublons | O(n) | O(n) |
207
+ | `distinct(comparator)` | Supprime les doublons avec comparateur | O(n²) | O(n) |
208
+ | `dropWhile(predicate)` | Ignore les éléments satisfaisant le prédicat | O(n) | O(1) |
209
+ | `filter(predicate)` | Filtre les éléments | O(n) | O(1) |
210
+ | `flat(mapper)` | Aplatissement de mapping | O(n × m) | O(1) |
211
+ | `flatMap(mapper)` | Aplatissement vers nouveau type | O(n × m) | O(1) |
212
+ | `limit(n)` | Limite le nombre d'éléments | O(n) | O(1) |
213
+ | `map(mapper)` | Transformation par mapping | O(n) | O(1) |
214
+ | `peek(consumer)` | Inspecte les éléments | O(n) | O(1) |
215
+ | `redirect(redirector)` | Redirection d'index | O(n) | O(1) |
216
+ | `reverse()` | Inverse le flux | O(n) | O(1) |
217
+ | `shuffle()` | Mélange aléatoire | O(n) | O(1) |
218
+ | `shuffle(mapper)` | Mélange avec mapper | O(n) | O(1) |
219
+ | `skip(n)` | Saute les n premiers éléments | O(n) | O(1) |
220
+ | `sorted()` | Trie | O(n log n) | O(n) |
221
+ | `sorted(comparator)` | Trie avec comparateur | O(n log n) | O(n) |
222
+ | `sub(start, end)` | Obtient un sous-flux | O(n) | O(1) |
223
+ | `takeWhile(predicate)` | Prend les éléments satisfaisant le prédicat | O(n) | O(1) |
224
+ | `translate(offset)` | Translation d'index | O(n) | O(1) |
225
+ | `translate(translator)` | Translation avec traducteur | O(n) | O(1) |
139
226
 
140
227
  ```typescript
141
- Collector.full(identity, accumulator, finisher)
142
- Collector.shortable(identity, interruptor, accumulator, finisher)
228
+ // Exemples d'opérations Semantic
229
+ const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
230
+ .filter(n => n % 2 === 0) // Filtre les nombres pairs
231
+ .map(n => n * 2) // Multiplie par 2
232
+ .skip(1) // Saute le premier
233
+ .limit(3) // Limite à 3 éléments
234
+ .toArray(); // Convertit en tableau
235
+ // Résultat: [8, 12, 20]
236
+
237
+ // Exemple d'opération complexe
238
+ const complexResult = range(1, 100, 1)
239
+ .flatMap(n => from([n, n * 2])) // Map chaque élément vers deux éléments
240
+ .distinct() // Supprime les doublons
241
+ .shuffle() // Mélange aléatoirement
242
+ .takeWhile(n => n < 50) // Prend les éléments < 50
243
+ .toOrdered() // Convertit en collecteur ordonné
244
+ .toArray(); // Convertit en tableau
143
245
  ```
144
246
 
145
- Mais vous utiliserez surtout les méthodes haut niveau fournies par les classes `Collectable`.
247
+ ## Méthodes de Transformation de Collecteurs
146
248
 
147
- ---
249
+ | Méthode | Description | Complexité Temporelle | Complexité Spatiale |
250
+ |---------|-------------|----------------------|---------------------|
251
+ | `toUnoredered()` | Convertit en collecteur non ordonné (priorité performance) | O(1) | O(1) |
252
+ | `toOrdered()` | Convertit en collecteur ordonné | O(1) | O(1) |
253
+ | `sorted()` | Trie et convertit en collecteur ordonné | O(n log n) | O(n) |
254
+ | `toWindow()` | Convertit en collecteur de fenêtre | O(1) | O(1) |
255
+ | `toNumericStatistics()` | Convertit en statistiques numériques | O(1) | O(1) |
256
+ | `toBigintStatistics()` | Convertit en statistiques BigInt | O(1) | O(1) |
148
257
 
149
- ### 6. `Collectable<E>` (classe abstraite)
150
-
151
- Classe de base pour :
258
+ ```typescript
259
+ // Exemples de transformation de collecteurs
260
+ const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
152
261
 
153
- - `OrderedCollectable<E>` Résultats triés
154
- - `UnorderedCollectable<E>` Pas de tri, le plus rapide
155
- - `WindowCollectable<E>` Fenêtres glissantes
156
- - `Statistics<E, D>` — Statistiques agrégées
262
+ // Priorité performance: Utiliser collecteur non ordonné
263
+ const unordered = numbers
264
+ .filter(n => n > 3)
265
+ .toUnoredered();
157
266
 
158
- #### Méthodes communes (via héritage) :
267
+ // Nécessite un tri: Utiliser collecteur ordonné
268
+ const ordered = numbers.sorted();
159
269
 
160
- | Méthode | Description | Exemple |
161
- |--------|-------------|---------|
162
- | `count()` | Compter les éléments | `.count()` |
163
- | `toArray()` | Convertir en tableau | `.toArray()` |
164
- | `toSet()` | Convertir en Set | `.toSet()` |
165
- | `toMap(k, v)` | Convertir en Map | `.toMap(x => x.id, x => x)` |
166
- | `group(k)` | Regrouper par clé | `.group(x => x.category)` |
167
- | `findAny()` | Trouver un élément quelconque (Optional) | `.findAny()` |
168
- | `findFirst()` | Trouver le premier élément (Optional) | `.findFirst()` |
169
- | `reduce(...)` | Réduction personnalisée | `.reduce((a,b) => a + b, 0)` |
270
+ // Analyse statistique: Utiliser collecteur statistique
271
+ const stats = numbers
272
+ .toNumericStatistics();
170
273
 
171
- ---
274
+ console.log(stats.mean()); // Moyenne
275
+ console.log(stats.median()); // Médiane
276
+ console.log(stats.standardDeviation()); // Écart-type
172
277
 
173
- ### 7. `OrderedCollectable<E>` — Données triées
278
+ // Opérations de fenêtre
279
+ const windowed = numbers
280
+ .toWindow()
281
+ .tumble(3n); // Fenêtre de 3 éléments
174
282
 
175
- Si vous souhaitez que les éléments soient **triés automatiquement**, utilisez cette classe.
283
+ windowed.forEach(window => {
284
+ console.log(window.toArray()); // Contenu de chaque fenêtre
285
+ });
286
+ ```
176
287
 
177
- Elle accepte un **comparateur personnalisé** ou utilise l’ordre naturel.
288
+ ## Méthodes de Collecte de Collectable
289
+
290
+ | Méthode | Description | Complexité Temporelle | Complexité Spatiale |
291
+ |---------|-------------|----------------------|---------------------|
292
+ | `anyMatch(predicate)` | Vérifie s'il existe une correspondance | O(n) | O(1) |
293
+ | `allMatch(predicate)` | Vérifie si tous correspondent | O(n) | O(1) |
294
+ | `count()` | Compte les éléments | O(n) | O(1) |
295
+ | `isEmpty()` | Vérifie si vide | O(1) | O(1) |
296
+ | `findAny()` | Trouve n'importe quel élément | O(n) | O(1) |
297
+ | `findFirst()` | Trouve le premier élément | O(n) | O(1) |
298
+ | `findLast()` | Trouve le dernier élément | O(n) | O(1) |
299
+ | `forEach(action)` | Itère sur tous les éléments | O(n) | O(1) |
300
+ | `group(classifier)` | Groupe par classificateur | O(n) | O(n) |
301
+ | `groupBy(keyExtractor, valueExtractor)` | Groupe par extracteurs clé-valeur | O(n) | O(n) |
302
+ | `join()` | Joint en chaîne | O(n) | O(n) |
303
+ | `join(delimiter)` | Joint avec séparateur | O(n) | O(n) |
304
+ | `nonMatch(predicate)` | Vérifie s'il n'y a pas de correspondance | O(n) | O(1) |
305
+ | `partition(count)` | Partitionne par quantité | O(n) | O(n) |
306
+ | `partitionBy(classifier)` | Partitionne par classificateur | O(n) | O(n) |
307
+ | `reduce(accumulator)` | Opération de réduction | O(n) | O(1) |
308
+ | `reduce(identity, accumulator)` | Réduction avec valeur initiale | O(n) | O(1) |
309
+ | `toArray()` | Convertit en tableau | O(n) | O(n) |
310
+ | `toMap(keyExtractor, valueExtractor)` | Convertit en Map | O(n) | O(n) |
311
+ | `toSet()` | Convertit en Set | O(n) | O(n) |
312
+ | `write(stream)` | Écrit dans le flux | O(n) | O(1) |
178
313
 
179
314
  ```typescript
180
- const sorted = new OrderedCollectable(stream);
181
- const customSorted = new OrderedCollectable(stream, (a, b) => b - a);
315
+ // Exemples d'opérations Collectable
316
+ const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
317
+ .filter(n => n % 2 === 0)
318
+ .toOrdered();
319
+
320
+ // Vérifications de correspondance
321
+ console.log(data.anyMatch(n => n > 5)); // true
322
+ console.log(data.allMatch(n => n < 20)); // true
323
+
324
+ // Opérations de recherche
325
+ data.findFirst().ifPresent(n => console.log(n)); // 2
326
+ data.findAny().ifPresent(n => console.log(n)); // Élément quelconque
327
+
328
+ // Opérations de groupement
329
+ const grouped = data.groupBy(
330
+ n => n > 5 ? "large" : "small",
331
+ n => n * 2
332
+ );
333
+ // {small: [4, 8], large: [12, 16, 20]}
334
+
335
+ // Opérations de réduction
336
+ const sum = data.reduce(0, (acc, n) => acc + n); // 30
337
+
338
+ // Opérations de sortie
339
+ data.join(", "); // "2, 4, 6, 8, 10"
182
340
  ```
183
341
 
184
- 🔒 **Le tri est garanti.**
185
-
186
- ---
187
-
188
- ### 8. `UnorderedCollectable<E>` Pas de tri (🚀 Le plus rapide)
189
-
190
- Si vous **n’avez pas besoin de tri** et que vous voulez les **meilleures performances**, utilisez :
342
+ ## Méthodes d'Analyse Statistique
343
+
344
+ ### Méthodes de NumericStatistics
345
+
346
+ | Méthode | Description | Complexité Temporelle | Complexité Spatiale |
347
+ |---------|-------------|----------------------|---------------------|
348
+ | `range()` | Plage | O(n) | O(1) |
349
+ | `variance()` | Variance | O(n) | O(1) |
350
+ | `standardDeviation()` | Écart-type | O(n) | O(1) |
351
+ | `mean()` | Moyenne | O(n) | O(1) |
352
+ | `median()` | Médiane | O(n log n) | O(n) |
353
+ | `mode()` | Mode | O(n) | O(n) |
354
+ | `frequency()` | Distribution de fréquence | O(n) | O(n) |
355
+ | `summate()` | Sommation | O(n) | O(1) |
356
+ | `quantile(quantile)` | Quantile | O(n log n) | O(n) |
357
+ | `interquartileRange()` | Intervalle interquartile | O(n log n) | O(n) |
358
+ | `skewness()` | Asymétrie | O(n) | O(1) |
359
+ | `kurtosis()` | Aplatissement | O(n) | O(1) |
191
360
 
192
361
  ```typescript
193
- const unordered = new UnorderedCollectable(stream);
194
- // OU
195
- const fastest = semanticStream.toUnordered();
362
+ // Exemples d'analyse statistique
363
+ const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
364
+ .toNumericStatistics();
365
+
366
+ console.log("Moyenne:", numbers.mean()); // 5.5
367
+ console.log("Médiane:", numbers.median()); // 5.5
368
+ console.log("Écart-type:", numbers.standardDeviation()); // ~2.87
369
+ console.log("Somme:", numbers.summate()); // 55
370
+
371
+ // Analyse statistique avec mapper
372
+ const objects = from([
373
+ { value: 10 },
374
+ { value: 20 },
375
+ { value: 30 }
376
+ ]).toNumericStatistics();
377
+
378
+ console.log("Moyenne mappée:", objects.mean(obj => obj.value)); // 20
196
379
  ```
197
380
 
198
- **Aucun algorithme de tri n’est exécuté**
199
- ✅ **Meilleure performance lorsque l’ordre n’a pas d’importance**
200
-
201
- ---
202
-
203
- ### 9. `Statistics<E, D>` — Analyse statistique
204
-
205
- Classe abstraite pour analyser des données numériques.
206
-
207
- #### Sous-classes :
208
-
209
- - `NumericStatistics<E>` — Pour des valeurs de type `number`
210
- - `BigIntStatistics<E>` — Pour des valeurs de type `bigint`
211
-
212
- ##### Méthodes statistiques courantes :
213
-
214
- | Méthode | Description | Exemple |
215
- |--------|-------------|---------|
216
- | `mean()` | Moyenne | `.mean()` |
217
- | `median()` | Médiane | `.median()` |
218
- | `mode()` | Mode (valeur la plus fréquente) | `.mode()` |
219
- | `minimum()` | Minimum | `.minimum()` |
220
- | `maximum()` | Maximum | `.maximum()` |
221
- | `range()` | Écart (max - min) | `.range()` |
222
- | `variance()` | Variance | `.variance()` |
223
- | `standardDeviation()` | Écart-type | `.standardDeviation()` |
224
- | `summate()` | Somme | `.summate()` |
225
- | `quantile(q)` | Valeur au quantile q (0–1) | `.quantile(0.5)` → médiane |
226
- | `frequency()` | Fréquence sous forme de Map | `.frequency()` |
227
-
228
- ---
229
-
230
- ## 🧪 Exemple complet
381
+ ## Guide de Sélection des Performances
231
382
 
383
+ ### Sélectionner Collecteur Non Ordonné (Priorité Performance)
232
384
  ```typescript
233
- import { from, toUnordered, toOrdered, sorted, NumericStatistics } from 'semantic-typescript';
234
-
235
- // Données d'exemple
236
- const numbers = from([10, 2, 8, 4, 5, 6]);
237
-
238
- // 🚀 Le plus rapide : pas de tri
239
- const fastest = numbers.toUnordered();
240
- console.log(fastest.toArray()); // ex: [10, 2, 8, 4, 5, 6] (ordre d'origine)
241
-
242
- // 🔢 Tri naturel
243
- const ordered = numbers.sorted();
244
- console.log(ordered.toArray()); // [2, 4, 5, 6, 8, 10]
245
-
246
- // 📊 Statistiques
247
- const stats = new NumericStatistics(numbers);
248
- console.log('Moyenne:', stats.mean());
249
- console.log('Médiane:', stats.median());
250
- console.log('Mode:', stats.mode());
251
- console.log('Écart:', stats.range());
252
- console.log('Écart-type:', stats.standardDeviation());
385
+ // Quand aucune garantie d'ordre n'est nécessaire
386
+ const highPerformance = data
387
+ .filter(predicate)
388
+ .map(mapper)
389
+ .toUnoredered(); // Meilleure performance
253
390
  ```
254
391
 
255
- ---
256
-
257
- ## 🛠️ Fonctions utilitaires
258
-
259
- La bibliothèque exporte aussi plusieurs **tests de type (type guards)** et **outils de comparaison** :
260
-
261
- | Fonction | But |
262
- |----------|-----|
263
- | `isString(x)` | Test de type pour `string` |
264
- | `isNumber(x)` | Test de type pour `number` |
265
- | `isBoolean(x)` | Test de type pour `boolean` |
266
- | `isIterable(x)` | Vérifie si un objet est itérable |
267
- | `useCompare(a, b)` | Fonction de comparaison universelle |
268
- | `useRandom(x)` | Générateur de nombre aléatoire (divertissant) |
269
-
270
- ---
271
-
272
- ## 🧩 Avancé : Générateurs personnalisés et fenêtres
273
-
274
- Vous pouvez créer des **générateurs personnalisés** pour des flux de données contrôlés ou infinis :
275
-
392
+ ### Sélectionner Collecteur Ordonné (Nécessite un Ordre)
276
393
  ```typescript
277
- const gen = (accept: BiConsumer<number, bigint>, interrupt: Predicate<number>) => {
278
- for (let i = 0; i < 10; i++) {
279
- accept(i, BigInt(i));
280
- if (i === 5) interrupt(i);
281
- }
282
- };
283
-
284
- const s = new Semantic(gen);
394
+ // Quand l'ordre des éléments doit être préservé
395
+ const ordered = data
396
+ .sorted(comparator) // Le tri écrase les effets de redirection
397
+ .toOrdered(); // Maintient l'ordre
285
398
  ```
286
399
 
287
- Ou utiliser des **fenêtres glissantes** :
288
-
400
+ ### Sélectionner Collecteur de Fenêtre (Opérations de Fenêtre)
289
401
  ```typescript
290
- const windowed = ordered.slide(3n, 2n); // fenêtres de taille 3, pas de 2
402
+ // Quand des opérations de fenêtre sont nécessaires
403
+ const windowed = data
404
+ .toWindow()
405
+ .slide(5n, 2n); // Fenêtre glissante
291
406
  ```
292
407
 
293
- ---
294
-
295
- ## 📄 Licence
296
-
297
- Ce projet est sous **licence MIT** — libre pour un usage commercial ou personnel.
298
-
299
- ---
300
-
301
- ## 🙌 Contribution
302
-
303
- Les pull requests, problèmes (issues) et idées sont les bienvenus !
304
-
305
- ---
306
-
307
- ## 🚀 Résumé du démarrage rapide
308
-
309
- | Tâche | Méthode |
310
- |-------|---------|
311
- | Gérer les valeurs nulles | `Optional<T>` |
312
- | Créer un flux | `from([...])`, `range()`, `fill()` |
313
- | Transformer des données | `map()`, `filter()` |
314
- | Trier des données | `sorted()`, `toOrdered()` |
315
- | Pas de tri (le plus rapide) | `toUnordered()` ✅ |
316
- | Regrouper / Aggréger | `toMap()`, `group()`, `Collector` |
317
- | Statistiques | `NumericStatistics`, `mean()`, `median()`, etc. |
318
-
319
- ---
320
-
321
- ## 🔗 Liens
408
+ ### Sélectionner Analyse Statistique (Calculs Numériques)
409
+ ```typescript
410
+ // Quand une analyse statistique est nécessaire
411
+ const stats = data
412
+ .toNumericStatistics(); // Statistiques numériques
322
413
 
323
- - 📦 npm: https://www.npmjs.com/package/semantic-typescript
324
- - 🐙 GitHub: https://github.com/eloyhere/semantic-typescript
325
- - 📘 Documentation : voir le code source / définitions de type
414
+ const bigIntStats = data
415
+ .toBigintStatistics(); // Statistiques BigInt
416
+ ```
326
417
 
327
- ---
418
+ [GitHub](https://github.com/eloyhere/semantic-typescript)
419
+ [NPMJS](https://www.npmjs.com/package/semantic-typescript)
328
420
 
329
- **Profitez d’un traitement de données fonctionnel, typé et composable en TypeScript.** 🚀
421
+ ## Considérations Importantes
330
422
 
331
- ---
423
+ 1. **Impact des opérations de tri**: Dans les collecteurs ordonnés, `sorted()` écrase les effets de `redirect`, `translate`, `shuffle`, `reverse`
424
+ 2. **Considérations de performance**: Si aucune garantie d'ordre n'est nécessaire, prioriser `toUnoredered()` pour de meilleures performances
425
+ 3. **Utilisation de la mémoire**: Les opérations de tri nécessitent un espace supplémentaire O(n)
426
+ 4. **Données en temps réel**: Les flux Semantic sont idéaux pour les données en temps réel et prennent en charge les sources de données asynchrones
332
427
 
333
- **À retenir :**
334
- - `toUnordered()` → **Pas de tri, le plus rapide**
335
- - Les autres (`sorted()`, `toOrdered()`, etc.) → **Tri des données**
428
+ Cette bibliothèque offre aux développeurs TypeScript des capacités puissantes et flexibles de traitement de flux, combinant les avantages de la programmation fonctionnelle avec la sécurité de type.