semantic-typescript 0.0.7 → 0.0.8

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,529 @@
1
- # 📘 semantic-typescript
1
+ # Cadre 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 GeneratorFunction de JavaScript, Java Stream et MySQL Index. La philosophie de conception centrale repose sur la construction de pipelines efficaces de traitement de données grâce à l'indexation des données, offrant une expérience d'opération de flux de type fonctionnel et sécurisée par les types pour le développement frontend.
7
6
 
8
- ---
7
+ Contrairement au traitement synchrone traditionnel, Semantic utilise un modèle de traitement asynchrone. Lors de la création de flux de données, le moment de la réception des données terminales dépend entièrement du moment où l'amont appelle les fonctions de rappel `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
9
+ ## Caractéristiques Principales
11
10
 
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
11
+ | Caractéristique | Description | Avantage |
12
+ |------|------|------|
13
+ | **Génériques Type-Safe** | Support complet des types TypeScript | Détection d'erreurs à la compilation, meilleure expérience de développement |
14
+ | **Programmation Fonctionnelle** | Structures de données immuables et fonctions pures | Code plus prévisible, tests et maintenance plus faciles |
15
+ | **Évaluation Paresseuse** | Calcul à la demande, optimisation des performances | Haute efficacité mémoire lors du traitement de grands ensembles de données |
16
+ | **Traitement de Flux Asynchrone** | Flux de données asynchrones basés sur les générateurs | Adapté aux données en temps réel et scénarios pilotés par événements |
17
+ | **Collecteurs Multi-Paradigmes** | Stratégies de collecte ordonnées, non ordonnées, statistiques | Sélection de stratégie optimale basée sur différents scénarios |
18
+ | **Analyse Statistique** | Fonctions de calcul statistique complètes intégrées | Génération intégrée d'analyse de données et de rapports |
21
19
 
22
- ---
20
+ ## Considérations de Performance
23
21
 
24
- ## 📦 Installation
22
+ **Note Importante**: Les méthodes suivantes sacrifient les performances pour collecter et trier les données, entraînant des collections de données ordonnées:
23
+ - `toOrdered()`
24
+ - `toWindow()`
25
+ - `toNumericStatistics()`
26
+ - `toBigIntStatistics()`
27
+ - `sorted()`
28
+ - `sorted(comparator)`
25
29
 
26
- ```bash
27
- npm install semantic-typescript
28
- ```
29
-
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`.
30
+ Particulièrement important à noter: `sorted()` et `sorted(comparator)` écraseront les résultats des méthodes suivantes:
31
+ - `redirect(redirector)`
32
+ - `translate(translator)`
33
+ - `shuffle(mapper)`
37
34
 
38
- #### Méthodes :
35
+ ## Méthodes d'Usine
39
36
 
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()` |
37
+ ### Usines de Création de Flux
52
38
 
53
- #### Exemple :
39
+ | Méthode | Signature | Description | Exemple |
40
+ |------|------|------|------|
41
+ | `blob` | `(blob: Blob, chunk?: bigint) => Semantic<Uint8Array>` | Convertir Blob en flux d'octets | `blob(fileBlob, 1024n)` |
42
+ | `empty` | `<E>() => Semantic<E>` | Créer un flux vide | `empty<number>()` |
43
+ | `fill` | `<E>(element: E, count: bigint) => Semantic<E>` | Remplir avec un nombre spécifié d'éléments | `fill("hello", 5n)` |
44
+ | `from` | `<E>(iterable: Iterable<E>) => Semantic<E>` | Créer un flux à partir d'un objet itérable | `from([1, 2, 3])` |
45
+ | `range` | `<N extends number\|bigint>(start: N, end: N, step?: N) => Semantic<N>` | Créer un flux de plage numérique | `range(1, 10, 2)` |
46
+ | `iterate` | `<E>(generator: Generator<E>) => Semantic<E>` | Créer un flux à partir d'une fonction génératrice | `iterate(myGenerator)` |
47
+ | `websocket` | `(websocket: WebSocket) => Semantic<MessageEvent>` | Créer un flux d'événements à partir de WebSocket | `websocket(socket)` |
54
48
 
49
+ **Supplément d'Exemple de Code:**
55
50
  ```typescript
56
- import { Optional } from 'semantic-typescript';
51
+ import { from, range, fill, empty } from 'semantic-typescript';
57
52
 
58
- const value: number | null = Math.random() > 0.5 ? 10 : null;
53
+ // Créer un flux à partir d'un tableau
54
+ const numberStream = from([1, 2, 3, 4, 5]);
59
55
 
60
- const opt = Optional.ofNullable(value);
56
+ // Créer un flux de plage numérique
57
+ const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
61
58
 
62
- const result = opt
63
- .filter(v => v > 5)
64
- .map(v => v * 2)
65
- .getOrDefault(0);
59
+ // Remplir avec des éléments répétés
60
+ const filledStream = fill("hello", 3n); // "hello", "hello", "hello"
66
61
 
67
- console.log(result); // 20 ou 0
62
+ // Créer un flux vide
63
+ const emptyStream = empty<number>();
68
64
  ```
69
65
 
70
- ---
66
+ ### Usines de Fonctions Utilitaires
71
67
 
72
- ### 2. `Semantic<E>` Flux de données paresseux
68
+ | Méthode | Signature | Description | Exemple |
69
+ |------|------|------|------|
70
+ | `validate` | `<T>(t: MaybeInvalid<T>) => t is T` | Valider si la valeur est valide | `validate(null)` → `false` |
71
+ | `invalidate` | `<T>(t: MaybeInvalid<T>) => t is null\|undefined` | Valider si la valeur est invalide | `invalidate(0)` → `false` |
72
+ | `useCompare` | `<T>(t1: T, t2: T) => number` | Fonction de comparaison générique | `useCompare("a", "b")` → `-1` |
73
+ | `useRandom` | `<T = number\|bigint>(index: T) => T` | Générateur de nombres pseudo-aléatoires | `useRandom(5)` → nombre aléatoire |
73
74
 
74
- Un **flux séquentiel paresseux et composite**. Similaire aux Java Streams ou aux Kotlin Sequences.
75
+ **Supplément d'Exemple de Code:**
76
+ ```typescript
77
+ import { validate, invalidate, useCompare, useRandom } from 'semantic-typescript';
75
78
 
76
- Créez un `Semantic` à l’aide d’assistants comme `from()`, `range()`, `iterate()` ou `fill()`.
79
+ // Valider la validité des données
80
+ const data: string | null = "hello";
81
+ if (validate(data)) {
82
+ console.log(data.toUpperCase()); // Appel sécurisé car validate garantit que data n'est pas null
83
+ }
77
84
 
78
- #### Créateurs :
85
+ const nullData: string | null = null;
86
+ if (invalidate(nullData)) {
87
+ console.log("Données invalides"); // S'exécutera car invalidate a détecté null
88
+ }
79
89
 
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)` |
90
+ // Comparer des valeurs
91
+ const comparison = useCompare("apple", "banana"); // -1
86
92
 
87
- #### Opérateurs courants :
93
+ // Générer un nombre aléatoire
94
+ const randomNum = useRandom(42); // Nombre aléatoire basé sur la graine 42
95
+ ```
88
96
 
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)` |
97
+ ## Détails de la Classe Principale
104
98
 
105
- ---
99
+ ### Optional<T> - Gestion Sécurisée des Valeurs Nulles
106
100
 
107
- ### 3. `toUnordered()` 🚀 Le plus rapide, sans tri
101
+ La classe Optional fournit une approche fonctionnelle pour gérer en toute sécurité les valeurs pouvant être nulles ou non définies.
108
102
 
109
- Si vous **n’avez pas besoin d’ordre** et que vous souhaitez les **meilleures performances possibles**, utilisez :
103
+ | Méthode | Type de Retour | Description | Complexité Temporelle |
104
+ |------|----------|------|------------|
105
+ | `filter(predicate: Predicate<T>)` | `Optional<T>` | Filtrer les valeurs satisfaisant la condition | O(1) |
106
+ | `get()` | `T` | Obtenir la valeur, lance une erreur si vide | O(1) |
107
+ | `getOrDefault(defaultValue: T)` | `T` | Obtenir la valeur ou la valeur par défaut | O(1) |
108
+ | `ifPresent(action: Consumer<T>)` | `void` | Exécuter l'action si la valeur existe | O(1) |
109
+ | `isEmpty()` | `boolean` | Vérifier si vide | O(1) |
110
+ | `isPresent()` | `boolean` | Vérifier si la valeur existe | O(1) |
111
+ | `map<R>(mapper: Functional<T, R>)` | `Optional<R>` | Mapper et transformer la valeur | O(1) |
112
+ | `static of<T>(value: MaybeInvalid<T>)` | `Optional<T>` | Créer une instance Optional | O(1) |
113
+ | `static ofNullable<T>(value?)` | `Optional<T>` | Créer une Optional nullable | O(1) |
114
+ | `static ofNonNull<T>(value: T)` | `Optional<T>` | Créer une Optional non nulle | O(1) |
110
115
 
116
+ **Supplément d'Exemple de Code:**
111
117
  ```typescript
112
- const fastest = semanticStream.toUnordered();
113
- ```
118
+ import { Optional } from 'semantic-typescript';
114
119
 
115
- 🔥 **Aucun algorithme de tri n’est appliqué.**
116
- Parfait lorsque l’ordre n’a pas d’importance et que la vitesse est cruciale.
120
+ // Créer une instance Optional
121
+ const optionalValue = Optional.ofNullable<string>(Math.random() > 0.5 ? "hello" : null);
117
122
 
118
- ---
123
+ // Opérations en chaîne
124
+ const result = optionalValue
125
+ .filter(val => val.length > 3) // Filtrer les valeurs plus longues que 3
126
+ .map(val => val.toUpperCase()) // Convertir en majuscules
127
+ .getOrDefault("default"); // Obtenir la valeur ou la valeur par défaut
119
128
 
120
- ### 4. `toOrdered()` et `sorted()` Résultats triés
129
+ console.log(result); // "HELLO" ou "default"
121
130
 
122
- Si vous avez besoin d’un **résultat trié**, utilisez :
131
+ // Opérations sécurisées
132
+ optionalValue.ifPresent(val => {
133
+ console.log(`La valeur existe: ${val}`);
134
+ });
123
135
 
124
- ```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é
136
+ // Vérifier le statut
137
+ if (optionalValue.isPresent()) {
138
+ console.log("A une valeur");
139
+ } else if (optionalValue.isEmpty()) {
140
+ console.log("Est vide");
141
+ }
128
142
  ```
129
143
 
130
- ⚠️ Ces méthodes **trient les éléments**, en utilisant l’ordre naturel ou un comparateur fourni.
131
-
132
- ---
133
-
134
- ### 5. `Collector<E, A, R>` — Agrégation de données
144
+ ### Semantic<E> - Flux de Données Paresseux
145
+
146
+ Semantic est la classe principale de traitement de flux, offrant de riches opérateurs de flux.
147
+
148
+ #### Opérations de Transformation de Flux
149
+
150
+ | Méthode | Type de Retour | Description | Impact sur les Performances |
151
+ |------|----------|------|----------|
152
+ | `concat(other: Semantic<E>)` | `Semantic<E>` | Concaténer deux flux | O(n+m) |
153
+ | `distinct()` | `Semantic<E>` | Supprimer les doublons (en utilisant Set) | O(n) |
154
+ | `distinct(comparator)` | `Semantic<E>` | Déduplication avec comparateur personnalisé | O(n²) |
155
+ | `dropWhile(predicate)` | `Semantic<E>` | Supprimer les éléments de début satisfaisant la condition | O(n) |
156
+ | `filter(predicate)` | `Semantic<E>` | Filtrer les éléments | O(n) |
157
+ | `flat(mapper)` | `Semantic<E>` | Aplatir les flux imbriqués | O(n×m) |
158
+ | `flatMap(mapper)` | `Semantic<R>` | Mapper et aplatir | O(n×m) |
159
+ | `limit(n)` | `Semantic<E>` | Limiter le nombre d'éléments | O(n) |
160
+ | `map(mapper)` | `Semantic<R>` | Mapper et transformer les éléments | O(n) |
161
+ | `peek(consumer)` | `Semantic<E>` | Voir les éléments sans modification | O(n) |
162
+ | `redirect(redirector)` | `Semantic<E>` | Rediriger les indices | O(n) |
163
+ | `reverse()` | `Semantic<E>` | Inverser l'ordre du flux | O(n) |
164
+ | `shuffle()` | `Semantic<E>` | Mélanger aléatoirement l'ordre | O(n) |
165
+ | `shuffle(mapper)` | `Semantic<E>` | Logique de mélange personnalisée | O(n) |
166
+ | `skip(n)` | `Semantic<E>` | Sauter les n premiers éléments | O(n) |
167
+ | `sub(start, end)` | `Semantic<E>` | Obtenir un sous-flux | O(n) |
168
+ | `takeWhile(predicate)` | `Semantic<E>` | Obtenir les éléments de début satisfaisant la condition | O(n) |
169
+ | `translate(offset)` | `Semantic<E>` | Traduire les indices | O(n) |
170
+ | `translate(translator)` | `Semantic<E>` | Transformation d'indice personnalisée | O(n) |
171
+
172
+ **Supplément d'Exemple de Code:**
173
+ ```typescript
174
+ import { from } from 'semantic-typescript';
135
175
 
136
- Les collecteurs vous permettent de **réduire un flux en une structure unique ou complexe**.
176
+ const stream = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
137
177
 
138
- Des factories statiques sont disponibles :
178
+ // Exemples d'opérations de transformation de flux
179
+ const processedStream = stream
180
+ .filter(x => x % 2 === 0) // Filtrer les nombres pairs
181
+ .map(x => x * 2) // Multiplier chaque élément par 2
182
+ .distinct() // Supprimer les doublons
183
+ .limit(3) // Limiter aux 3 premiers éléments
184
+ .peek((val, index) => console.log(`Élément ${val} à l'indice ${index}`)); // Voir les éléments
139
185
 
140
- ```typescript
141
- Collector.full(identity, accumulator, finisher)
142
- Collector.shortable(identity, interruptor, accumulator, finisher)
186
+ // Note: Le flux ne s'est pas encore exécuté, doit être converti en Collectable pour les opérations terminales
143
187
  ```
144
188
 
145
- Mais vous utiliserez surtout les méthodes haut niveau fournies par les classes `Collectable`.
146
-
147
- ---
189
+ #### Opérations Terminales de Flux
148
190
 
149
- ### 6. `Collectable<E>` (classe abstraite)
191
+ | Méthode | Type de Retour | Description | Caractéristiques de Performance |
192
+ |------|----------|------|----------|
193
+ | `toOrdered()` | `OrderedCollectable<E>` | Convertir en collection ordonnée | Opération de tri, performance inférieure |
194
+ | `toUnordered()` | `UnorderedCollectable<E>` | Convertir en collection non ordonnée | Plus rapide, pas de tri |
195
+ | `toWindow()` | `WindowCollectable<E>` | Convertir en collection de fenêtre | Opération de tri, performance inférieure |
196
+ | `toNumericStatistics()` | `Statistics<E, number>` | Analyse statistique numérique | Opération de tri, performance inférieure |
197
+ | `toBigintStatistics()` | `Statistics<E, bigint>` | Analyse statistique en grand entier | Opération de tri, performance inférieure |
198
+ | `sorted()` | `OrderedCollectable<E>` | Tri naturel | Écrase les résultats de redirection |
199
+ | `sorted(comparator)` | `OrderedCollectable<E>` | Tri personnalisé | Écrase les résultats de redirection |
150
200
 
151
- Classe de base pour :
152
-
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
201
+ **Supplément d'Exemple de Code:**
202
+ ```typescript
203
+ import { from } from 'semantic-typescript';
157
204
 
158
- #### Méthodes communes (via héritage) :
205
+ const semanticStream = from([5, 2, 8, 1, 9, 3, 7, 4, 6]);
159
206
 
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)` |
207
+ // Convertir en collection ordonnée (performance inférieure)
208
+ const ordered = semanticStream.toOrdered();
170
209
 
171
- ---
210
+ // Convertir en collection non ordonnée (plus rapide)
211
+ const unordered = semanticStream.toUnordered();
172
212
 
173
- ### 7. `OrderedCollectable<E>` — Données triées
213
+ // Tri naturel
214
+ const sortedNatural = semanticStream.sorted();
174
215
 
175
- Si vous souhaitez que les éléments soient **triés automatiquement**, utilisez cette classe.
216
+ // Tri personnalisé
217
+ const sortedCustom = semanticStream.sorted((a, b) => b - a); // Tri décroissant
176
218
 
177
- Elle accepte un **comparateur personnalisé** ou utilise l’ordre naturel.
219
+ // Convertir en objet statistique
220
+ const stats = semanticStream.toNumericStatistics();
178
221
 
179
- ```typescript
180
- const sorted = new OrderedCollectable(stream);
181
- const customSorted = new OrderedCollectable(stream, (a, b) => b - a);
222
+ // Note: Doit appeler les méthodes ci-dessus via une instance Semantic pour obtenir Collectable avant d'utiliser les méthodes terminales
182
223
  ```
183
224
 
184
- 🔒 **Le tri est garanti.**
185
-
186
- ---
225
+ ### Collector<E, A, R> - Collecteur de Données
187
226
 
188
- ### 8. `UnorderedCollectable<E>` Pas de tri (🚀 Le plus rapide)
227
+ Les collecteurs sont utilisés pour agréger les données de flux dans des structures spécifiques.
189
228
 
190
- Si vous **n’avez pas besoin de tri** et que vous voulez les **meilleures performances**, utilisez :
229
+ | Méthode | Description | Scénario d'Utilisation |
230
+ |------|------|----------|
231
+ | `collect(generator)` | Exécuter la collecte de données | Opération terminale de flux |
232
+ | `static full(identity, accumulator, finisher)` | Créer un collecteur complet | Nécessite un traitement complet |
233
+ | `static shortable(identity, interruptor, accumulator, finisher)` | Créer un collecteur interruptible | Peut se terminer prématurément |
191
234
 
235
+ **Supplément d'Exemple de Code:**
192
236
  ```typescript
193
- const unordered = new UnorderedCollectable(stream);
194
- // OU
195
- const fastest = semanticStream.toUnordered();
237
+ import { Collector } from 'semantic-typescript';
238
+
239
+ // Créer un collecteur personnalisé
240
+ const sumCollector = Collector.full(
241
+ () => 0, // Valeur initiale
242
+ (acc, value) => acc + value, // Accumulateur
243
+ result => result // Fonction de finition
244
+ );
245
+
246
+ // Utiliser le collecteur (nécessite une conversion de Semantic en Collectable d'abord)
247
+ const numbers = from([1, 2, 3, 4, 5]);
248
+ const sum = numbers.toUnordered().collect(sumCollector); // 15
196
249
  ```
197
250
 
198
- **Aucun algorithme de tri n’est exécuté**
199
- ✅ **Meilleure performance lorsque l’ordre n’a pas d’importance**
200
-
201
- ---
251
+ ### Collectable<E> - Classe Abstraite de Données Collectables
202
252
 
203
- ### 9. `Statistics<E, D>` Analyse statistique
253
+ Fournit des méthodes riches d'agrégation et de transformation de données. **Note: Doit d'abord obtenir une instance Collectable en appelant sorted(), toOrdered() etc. via une instance Semantic avant d'utiliser les méthodes suivantes.**
204
254
 
205
- Classe abstraite pour analyser des données numériques.
255
+ #### Opérations de Requête de Données
206
256
 
207
- #### Sous-classes :
257
+ | Méthode | Type de Retour | Description | Exemple |
258
+ |------|----------|------|------|
259
+ | `anyMatch(predicate)` | `boolean` | Si un élément correspond | `anyMatch(x => x > 0)` |
260
+ | `allMatch(predicate)` | `boolean` | Si tous les éléments correspondent | `allMatch(x => x > 0)` |
261
+ | `count()` | `bigint` | Statistiques de nombre d'éléments | `count()` → `5n` |
262
+ | `isEmpty()` | `boolean` | Si le flux est vide | `isEmpty()` |
263
+ | `findAny()` | `Optional<E>` | Trouver n'importe quel élément | `findAny()` |
264
+ | `findFirst()` | `Optional<E>` | Trouver le premier élément | `findFirst()` |
265
+ | `findLast()` | `Optional<E>` | Trouver le dernier élément | `findLast()` |
208
266
 
209
- - `NumericStatistics<E>` — Pour des valeurs de type `number`
210
- - `BigIntStatistics<E>` — Pour des valeurs de type `bigint`
211
-
212
- ##### Méthodes statistiques courantes :
267
+ **Supplément d'Exemple de Code:**
268
+ ```typescript
269
+ import { from } from 'semantic-typescript';
213
270
 
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()` |
271
+ const numbers = from([1, 2, 3, 4, 5]);
227
272
 
228
- ---
273
+ // Doit convertir en Collectable avant d'utiliser les méthodes terminales
274
+ const collectable = numbers.toUnordered();
229
275
 
230
- ## 🧪 Exemple complet
276
+ // Opérations de requête de données
277
+ const hasEven = collectable.anyMatch(x => x % 2 === 0); // true
278
+ const allPositive = collectable.allMatch(x => x > 0); // true
279
+ const count = collectable.count(); // 5n
280
+ const isEmpty = collectable.isEmpty(); // false
281
+ const firstElement = collectable.findFirst(); // Optional.of(1)
282
+ const anyElement = collectable.findAny(); // N'importe quel élément
283
+ ```
231
284
 
285
+ #### Opérations d'Aggrégation de Données
286
+
287
+ | Méthode | Type de Retour | Description | Complexité |
288
+ |------|----------|------|--------|
289
+ | `group(classifier)` | `Map<K, E[]>` | Grouper par classifieur | O(n) |
290
+ | `groupBy(keyExtractor, valueExtractor)` | `Map<K, V[]>` | Grouper par extracteurs clé-valeur | O(n) |
291
+ | `join()` | `string` | Joindre en chaîne | O(n) |
292
+ | `join(delimiter)` | `string` | Joindre avec délimiteur | O(n) |
293
+ | `partition(count)` | `E[][]` | Partitionner par compte | O(n) |
294
+ | `partitionBy(classifier)` | `E[][]` | Partitionner par classifieur | O(n) |
295
+ | `reduce(accumulator)` | `Optional<E>` | Opération de réduction | O(n) |
296
+ | `reduce(identity, accumulator)` | `E` | Réduction avec identité | O(n) |
297
+ | `toArray()` | `E[]` | Convertir en tableau | O(n) |
298
+ | `toMap(keyExtractor, valueExtractor)` | `Map<K, V>` | Convertir en Map | O(n) |
299
+ | `toSet()` | `Set<E>` | Convertir en Set | O(n) |
300
+
301
+ **Supplément d'Exemple de Code:**
232
302
  ```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());
303
+ import { from } from 'semantic-typescript';
304
+
305
+ const people = from([
306
+ { name: "Alice", age: 25, city: "New York" },
307
+ { name: "Bob", age: 30, city: "London" },
308
+ { name: "Charlie", age: 25, city: "New York" }
309
+ ]);
310
+
311
+ // Doit convertir en Collectable avant d'utiliser les opérations d'agrégation
312
+ const collectable = people.toUnordered();
313
+
314
+ // Opérations de regroupement
315
+ const byCity = collectable.group(person => person.city);
316
+ // Map { "New York" => [{name: "Alice", ...}, {name: "Charlie", ...}], "London" => [{name: "Bob", ...}] }
317
+
318
+ const byAge = collectable.groupBy(
319
+ person => person.age,
320
+ person => person.name
321
+ );
322
+ // Map { 25 => ["Alice", "Charlie"], 30 => ["Bob"] }
323
+
324
+ // Convertir en collections
325
+ const array = collectable.toArray(); // Tableau original
326
+ const set = collectable.toSet(); // Collection Set
327
+ const map = collectable.toMap(
328
+ person => person.name,
329
+ person => person.age
330
+ ); // Map { "Alice" => 25, "Bob" => 30, "Charlie" => 25 }
331
+
332
+ // Opérations de réduction
333
+ const totalAge = collectable.reduce(0, (acc, person) => acc + person.age); // 80
334
+ const oldest = collectable.reduce((a, b) => a.age > b.age ? a : b); // Optional.of({name: "Bob", age: 30, ...})
253
335
  ```
254
336
 
255
- ---
337
+ ### Implémentations Spécifiques de Collecteurs
256
338
 
257
- ## 🛠️ Fonctions utilitaires
339
+ #### UnorderedCollectable<E>
340
+ - **Caractéristiques**: Collecteur le plus rapide, pas de tri
341
+ - **Scénarios d'Utilisation**: Ordre non important, performance maximale souhaitée
342
+ - **Méthodes**: Hérite de toutes les méthodes Collectable
258
343
 
259
- La bibliothèque exporte aussi plusieurs **tests de type (type guards)** et **outils de comparaison** :
344
+ #### OrderedCollectable<E>
345
+ - **Caractéristiques**: Garantit l'ordre des éléments, performance inférieure
346
+ - **Scénarios d'Utilisation**: Requiert des résultats triés
347
+ - **Méthodes Spéciales**: Hérite de toutes les méthodes, maintient l'état de tri interne
260
348
 
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) |
349
+ #### WindowCollectable<E>
350
+ - **Caractéristiques**: Prend en charge les opérations de fenêtre glissante
351
+ - **Scénarios d'Utilisation**: Analyse de données de séries temporelles
352
+ - **Méthodes Spéciales**:
353
+ - `slide(size, step)` - Fenêtre glissante
354
+ - `tumble(size)` - Fenêtre tumble
269
355
 
270
- ---
356
+ **Supplément d'Exemple de Code:**
357
+ ```typescript
358
+ import { from } from 'semantic-typescript';
271
359
 
272
- ## 🧩 Avancé : Générateurs personnalisés et fenêtres
360
+ const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
273
361
 
274
- Vous pouvez créer des **générateurs personnalisés** pour des flux de données contrôlés ou infinis :
362
+ // Collecteur non ordonné (plus rapide)
363
+ const unordered = data.toUnordered();
364
+ const unorderedArray = unordered.toArray(); // Peut maintenir l'ordre original [1, 2, 3, ...]
275
365
 
276
- ```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);
285
- ```
366
+ // Collecteur ordonné
367
+ const ordered = data.toOrdered();
368
+ const orderedArray = ordered.toArray(); // Tri garanti [1, 2, 3, ...]
286
369
 
287
- Ou utiliser des **fenêtres glissantes** :
370
+ // Collecteur de fenêtre
371
+ const windowed = data.toWindow();
372
+ const slidingWindows = windowed.slide(3n, 2n); // Taille de fenêtre 3, pas 2
373
+ // Fenêtre 1: [1, 2, 3], Fenêtre 2: [3, 4, 5], Fenêtre 3: [5, 6, 7], ...
288
374
 
289
- ```typescript
290
- const windowed = ordered.slide(3n, 2n); // fenêtres de taille 3, pas de 2
375
+ const tumblingWindows = windowed.tumble(4n); // Taille de fenêtre tumble 4
376
+ // Fenêtre 1: [1, 2, 3, 4], Fenêtre 2: [5, 6, 7, 8], ...
291
377
  ```
292
378
 
293
- ---
294
-
295
- ## 📄 Licence
296
-
297
- Ce projet est sous **licence MIT** — libre pour un usage commercial ou personnel.
379
+ ### Statistics<E, D> - Analyse Statistique
380
+
381
+ Classe de base d'analyse statistique fournissant de riches méthodes de calcul statistique. **Note: Doit d'abord obtenir une instance Statistics en appelant toNumericStatistics() ou toBigIntStatistics() via une instance Semantic avant d'utiliser les méthodes suivantes.**
382
+
383
+ #### Opérations de Calcul Statistique
384
+
385
+ | Méthode | Type de Retour | Description | Complexité de l'Algorithme |
386
+ |------|----------|------|------------|
387
+ | `maximum()` | `Optional<E>` | Valeur maximale | O(n) |
388
+ | `minimum()` | `Optional<E>` | Valeur minimale | O(n) |
389
+ | `range()` | `D` | Plage (max-min) | O(n) |
390
+ | `variance()` | `D` | Variance | O(n) |
391
+ | `standardDeviation()` | `D` | Écart type | O(n) |
392
+ | `mean()` | `D` | Valeur moyenne | O(n) |
393
+ | `median()` | `D` | Valeur médiane | O(n log n) |
394
+ | `mode()` | `D` | Valeur modale | O(n) |
395
+ | `frequency()` | `Map<D, bigint>` | Distribution de fréquence | O(n) |
396
+ | `summate()` | `D` | Sommation | O(n) |
397
+ | `quantile(quantile)` | `D` | Quantile | O(n log n) |
398
+ | `interquartileRange()` | `D` | Intervalle interquartile | O(n log n) |
399
+ | `skewness()` | `D` | Asymétrie | O(n) |
400
+ | `kurtosis()` | `D` | Aplatissement | O(n) |
401
+
402
+ **Supplément d'Exemple de Code:**
403
+ ```typescript
404
+ import { from } from 'semantic-typescript';
405
+
406
+ const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
407
+
408
+ // Doit convertir en objet statistique avant d'utiliser les méthodes statistiques
409
+ const stats = numbers.toNumericStatistics();
410
+
411
+ // Statistiques de base
412
+ const count = stats.count(); // 10n
413
+ const max = stats.maximum(); // Optional.of(10)
414
+ const min = stats.minimum(); // Optional.of(1)
415
+ const range = stats.range(); // 9
416
+ const mean = stats.mean(); // 5.5
417
+ const median = stats.median(); // 5.5
418
+ const sum = stats.summate(); // 55
419
+
420
+ // Statistiques avancées
421
+ const variance = stats.variance(); // 8.25
422
+ const stdDev = stats.standardDeviation(); // 2.872
423
+ const mode = stats.mode(); // N'importe quelle valeur (puisque toutes apparaissent une fois)
424
+ const q1 = stats.quantile(0.25); // 3.25
425
+ const q3 = stats.quantile(0.75); // 7.75
426
+ const iqr = stats.interquartileRange(); // 4.5
427
+
428
+ // Distribution de fréquence
429
+ const freq = stats.frequency(); // Map {1 => 1n, 2 => 1n, ...}
430
+ ```
298
431
 
299
- ---
432
+ #### Classes d'Implémentation Statistique Spécifiques
300
433
 
301
- ## 🙌 Contribution
434
+ **NumericStatistics<E>**
435
+ - Gère l'analyse statistique de type nombre
436
+ - Tous les calculs statistiques retournent le type nombre
302
437
 
303
- Les pull requests, problèmes (issues) et idées sont les bienvenus !
438
+ **BigIntStatistics<E>**
439
+ - Gère l'analyse statistique de type bigint
440
+ - Tous les calculs statistiques retournent le type bigint
304
441
 
305
- ---
442
+ **Supplément d'Exemple de Code:**
443
+ ```typescript
444
+ import { from } from 'semantic-typescript';
306
445
 
307
- ## 🚀 Résumé du démarrage rapide
446
+ // Statistiques numériques
447
+ const numberData = from([10, 20, 30, 40, 50]);
448
+ const numericStats = numberData.toNumericStatistics();
308
449
 
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. |
450
+ console.log(numericStats.mean()); // 30
451
+ console.log(numericStats.summate()); // 150
318
452
 
319
- ---
453
+ // Statistiques en grand entier
454
+ const bigintData = from([100n, 200n, 300n, 400n, 500n]);
455
+ const bigintStats = bigintData.toBigIntStatistics();
320
456
 
321
- ## 🔗 Liens
457
+ console.log(bigintStats.mean()); // 300n
458
+ console.log(bigintStats.summate()); // 1500n
322
459
 
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
460
+ // Statistiques utilisant des fonctions de mappage
461
+ const objectData = from([
462
+ { value: 15 },
463
+ { value: 25 },
464
+ { value: 35 },
465
+ { value: 45 }
466
+ ]);
326
467
 
327
- ---
468
+ const objectStats = objectData.toNumericStatistics();
469
+ const meanWithMapper = objectStats.mean(obj => obj.value); // 30
470
+ const sumWithMapper = objectStats.summate(obj => obj.value); // 120
471
+ ```
328
472
 
329
- **Profitez d’un traitement de données fonctionnel, typé et composable en TypeScript.** 🚀
473
+ ## Exemple Complet d'Utilisation
330
474
 
331
- ---
475
+ ```typescript
476
+ import { from, validate, invalidate } from 'semantic-typescript';
477
+
478
+ // 1. Créer un flux de données
479
+ const rawData = [5, 2, 8, 1, null, 9, 3, undefined, 7, 4, 6];
480
+ const semanticStream = from(rawData);
481
+
482
+ // 2. Pipeline de traitement de flux
483
+ const processedStream = semanticStream
484
+ .filter(val => validate(val)) // Filtrer les null et undefined
485
+ .map(val => val! * 2) // Multiplier chaque valeur par 2 (en utilisant ! car validate garantit non vide)
486
+ .distinct(); // Supprimer les doublons
487
+
488
+ // 3. Convertir en Collectable et utiliser les opérations terminales
489
+ const collectable = processedStream.toUnordered();
490
+
491
+ // 4. Validation et utilisation des données
492
+ if (!collectable.isEmpty()) {
493
+ const results = collectable
494
+ .filter(x => x > 5) // Filtrer à nouveau
495
+ .toArray(); // Convertir en tableau
496
+
497
+ console.log("Résultats du traitement:", results); // [16, 18, 14, 8, 12]
498
+
499
+ // Informations statistiques
500
+ const stats = processedStream.toNumericStatistics();
501
+ console.log("Valeur moyenne:", stats.mean()); // 11.2
502
+ console.log("Somme totale:", stats.summate()); // 56
503
+ }
504
+
505
+ // 5. Gérer les données potentiellement invalides
506
+ const potentiallyInvalidData: Array<number | null> = [1, null, 3, 4, null];
507
+ const validData = potentiallyInvalidData.filter(validate);
508
+ const invalidData = potentiallyInvalidData.filter(invalidate);
509
+
510
+ console.log("Données valides:", validData); // [1, 3, 4]
511
+ console.log("Données invalides:", invalidData); // [null, null]
512
+ ```
332
513
 
333
- **À retenir :**
334
- - `toUnordered()` → **Pas de tri, le plus rapide**
335
- - Les autres (`sorted()`, `toOrdered()`, etc.) **Tri des données**
514
+ ## Règles d'Utilisation Importantes Résumées
515
+
516
+ 1. **Créer un Flux**: Utiliser les méthodes d'usine `from()`, `range()`, `fill()` etc. pour créer des instances Semantic
517
+ 2. **Transformation de Flux**: Appeler les méthodes `map()`, `filter()`, `distinct()` etc. sur les instances Semantic
518
+ 3. **Convertir en Collectable**: Doit appeler l'une des méthodes suivantes via une instance Semantic:
519
+ - `toOrdered()` - Collecteur ordonné
520
+ - `toUnordered()` - Collecteur non ordonné (plus rapide)
521
+ - `toWindow()` - Collecteur de fenêtre
522
+ - `toNumericStatistics()` - Statistiques numériques
523
+ - `toBigIntStatistics()` - Statistiques en grand entier
524
+ - `sorted()` - Tri naturel
525
+ - `sorted(comparator)` - Tri personnalisé
526
+ 4. **Opérations Terminales**: Appeler les méthodes terminales `toArray()`, `count()`, `summate()` etc. sur les instances Collectable
527
+ 5. **Validation des Données**: Utiliser `validate()` pour garantir que les données ne sont pas nulles/non définies, utiliser `invalidate()` pour vérifier les données invalides
528
+
529
+ Cette conception garantit la sécurité des types et l'optimisation des performances tout en fournissant une fonctionnalité riche de traitement de flux.