semantic-typescript 0.0.8 → 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,529 +1,428 @@
1
- # Cadre de Traitement de Flux Semantic-TypeScript
1
+ # Bibliothèque de Traitement de Flux Semantic-TypeScript
2
2
 
3
3
  ## Introduction
4
4
 
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.
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.
6
6
 
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.
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 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.
8
8
 
9
- ## Caractéristiques Principales
9
+ ## Installation
10
10
 
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 |
19
-
20
- ## Considérations de Performance
21
-
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)`
29
-
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)`
34
-
35
- ## Méthodes d'Usine
36
-
37
- ### Usines de Création de Flux
11
+ ```bash
12
+ npm install semantic-typescript
13
+ ```
38
14
 
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)` |
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 |
48
46
 
49
- **Supplément d'Exemple de Code:**
50
47
  ```typescript
51
- import { from, range, fill, empty } from 'semantic-typescript';
52
-
53
- // Créer un flux à partir d'un tableau
54
- const numberStream = from([1, 2, 3, 4, 5]);
55
-
56
- // Créer un flux de plage numérique
57
- const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
58
-
59
- // Remplir avec des éléments répétés
60
- const filledStream = fill("hello", 3n); // "hello", "hello", "hello"
61
-
62
- // Créer un flux vide
63
- const emptyStream = empty<number>();
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;
64
52
  ```
65
53
 
66
- ### Usines de Fonctions Utilitaires
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) |
67
79
 
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 |
74
-
75
- **Supplément d'Exemple de Code:**
76
80
  ```typescript
77
- import { validate, invalidate, useCompare, useRandom } from 'semantic-typescript';
81
+ // Exemples d'utilisation des gardes de type
82
+ const value: unknown = "hello";
78
83
 
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
84
+ if (isString(value)) {
85
+ console.log(value.length); // Sécurité de type, value est inféré comme string
83
86
  }
84
87
 
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
+ if (isOptional(someValue)) {
89
+ someValue.ifPresent(val => console.log(val));
88
90
  }
89
-
90
- // Comparer des valeurs
91
- const comparison = useCompare("apple", "banana"); // -1
92
-
93
- // Générer un nombre aléatoire
94
- const randomNum = useRandom(42); // Nombre aléatoire basé sur la graine 42
95
91
  ```
96
92
 
97
- ## Détails de la Classe Principale
98
-
99
- ### Optional<T> - Gestion Sécurisée des Valeurs Nulles
93
+ ## Fonctions Utilitaires
100
94
 
101
- La classe Optional fournit une approche fonctionnelle pour gérer en toute sécurité les valeurs pouvant être nulles ou non définies.
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) |
102
99
 
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) |
115
-
116
- **Supplément d'Exemple de Code:**
117
100
  ```typescript
118
- import { Optional } from 'semantic-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]
119
104
 
120
- // Créer une instance Optional
121
- const optionalValue = Optional.ofNullable<string>(Math.random() > 0.5 ? "hello" : null);
105
+ const randomNum = useRandom(42); // Nombre aléatoire basé sur seed
106
+ const randomBigInt = useRandom(1000n); // Nombre BigInt aléatoire
107
+ ```
122
108
 
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
109
+ ## Méthodes d'Usine
128
110
 
129
- console.log(result); // "HELLO" ou "default"
111
+ ### Méthodes d'Usine d'Optional
130
112
 
131
- // Opérations sécurisées
132
- optionalValue.ifPresent(val => {
133
- console.log(`La valeur existe: ${val}`);
134
- });
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) |
135
119
 
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
- }
120
+ ```typescript
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
142
129
  ```
143
130
 
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';
131
+ ### Méthodes d'Usine de Collector
175
132
 
176
- const stream = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
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) |
177
137
 
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
138
+ ```typescript
139
+ // Exemples d'utilisation de Collector
140
+ const sumCollector = Collector.full(
141
+ () => 0,
142
+ (sum, num) => sum + num,
143
+ result => result
144
+ );
185
145
 
186
- // Note: Le flux ne s'est pas encore exécuté, doit être converti en Collectable pour les opérations terminales
146
+ const numbers = from([1, 2, 3, 4, 5]);
147
+ const total = numbers.toUnoredered().collect(sumCollector); // 15
187
148
  ```
188
149
 
189
- #### Opérations Terminales de Flux
150
+ ### Méthodes d'usine de Semantic
190
151
 
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 |
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) |
200
162
 
201
- **Supplément d'Exemple de Code:**
202
163
  ```typescript
203
- import { from } from 'semantic-typescript';
164
+ // Exemple d'utilisation des méthodes d'usine de Semantic
204
165
 
205
- const semanticStream = from([5, 2, 8, 1, 9, 3, 7, 4, 6]);
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
206
172
 
207
- // Convertir en collection ordonnée (performance inférieure)
208
- const ordered = semanticStream.toOrdered();
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(); //[]
209
177
 
210
- // Convertir en collection non ordonnée (plus rapide)
211
- const unordered = semanticStream.toUnordered();
178
+ // Créer un flux rempli
179
+ const filledStream = fill("hello", 3); // "hello", "hello", "hello"
212
180
 
213
- // Tri naturel
214
- const sortedNatural = semanticStream.sorted();
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);
215
185
 
216
- // Tri personnalisé
217
- const sortedCustom = semanticStream.sorted((a, b) => b - a); // Tri décroissant
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"]));
218
189
 
219
- // Convertir en objet statistique
220
- const stats = semanticStream.toNumericStatistics();
190
+ // Créer un flux de plage
191
+ const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
221
192
 
222
- // Note: Doit appeler les méthodes ci-dessus via une instance Semantic pour obtenir Collectable avant d'utiliser les méthodes terminales
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
223
199
  ```
224
200
 
225
- ### Collector<E, A, R> - Collecteur de Données
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) |
226
226
 
227
- Les collecteurs sont utilisés pour agréger les données de flux dans des structures spécifiques.
228
-
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 |
234
-
235
- **Supplément d'Exemple de Code:**
236
227
  ```typescript
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
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
249
245
  ```
250
246
 
251
- ### Collectable<E> - Classe Abstraite de Données Collectables
252
-
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.**
254
-
255
- #### Opérations de Requête de Données
247
+ ## Méthodes de Transformation de Collecteurs
256
248
 
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()` |
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) |
266
257
 
267
- **Supplément d'Exemple de Code:**
268
258
  ```typescript
269
- import { from } from 'semantic-typescript';
259
+ // Exemples de transformation de collecteurs
260
+ const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
270
261
 
271
- const numbers = from([1, 2, 3, 4, 5]);
262
+ // Priorité performance: Utiliser collecteur non ordonné
263
+ const unordered = numbers
264
+ .filter(n => n > 3)
265
+ .toUnoredered();
272
266
 
273
- // Doit convertir en Collectable avant d'utiliser les méthodes terminales
274
- const collectable = numbers.toUnordered();
267
+ // Nécessite un tri: Utiliser collecteur ordonné
268
+ const ordered = numbers.sorted();
275
269
 
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
- ```
270
+ // Analyse statistique: Utiliser collecteur statistique
271
+ const stats = numbers
272
+ .toNumericStatistics();
284
273
 
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:**
302
- ```typescript
303
- import { from } from 'semantic-typescript';
274
+ console.log(stats.mean()); // Moyenne
275
+ console.log(stats.median()); // Médiane
276
+ console.log(stats.standardDeviation()); // Écart-type
304
277
 
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
- ]);
278
+ // Opérations de fenêtre
279
+ const windowed = numbers
280
+ .toWindow()
281
+ .tumble(3n); // Fenêtre de 3 éléments
310
282
 
311
- // Doit convertir en Collectable avant d'utiliser les opérations d'agrégation
312
- const collectable = people.toUnordered();
283
+ windowed.forEach(window => {
284
+ console.log(window.toArray()); // Contenu de chaque fenêtre
285
+ });
286
+ ```
313
287
 
314
- // Opérations de regroupement
315
- const byCity = collectable.group(person => person.city);
316
- // Map { "New York" => [{name: "Alice", ...}, {name: "Charlie", ...}], "London" => [{name: "Bob", ...}] }
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) |
317
313
 
318
- const byAge = collectable.groupBy(
319
- person => person.age,
320
- person => person.name
314
+ ```typescript
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
321
332
  );
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 }
333
+ // {small: [4, 8], large: [12, 16, 20]}
331
334
 
332
335
  // 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, ...})
335
- ```
336
+ const sum = data.reduce(0, (acc, n) => acc + n); // 30
336
337
 
337
- ### Implémentations Spécifiques de Collecteurs
338
-
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
343
-
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
338
+ // Opérations de sortie
339
+ data.join(", "); // "2, 4, 6, 8, 10"
340
+ ```
348
341
 
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
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) |
355
360
 
356
- **Supplément d'Exemple de Code:**
357
361
  ```typescript
358
- import { from } from 'semantic-typescript';
359
-
360
- const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
361
-
362
- // Collecteur non ordonné (plus rapide)
363
- const unordered = data.toUnordered();
364
- const unorderedArray = unordered.toArray(); // Peut maintenir l'ordre original [1, 2, 3, ...]
365
-
366
- // Collecteur ordonné
367
- const ordered = data.toOrdered();
368
- const orderedArray = ordered.toArray(); // Tri garanti [1, 2, 3, ...]
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
379
+ ```
369
380
 
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], ...
381
+ ## Guide de Sélection des Performances
374
382
 
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], ...
383
+ ### Sélectionner Collecteur Non Ordonné (Priorité Performance)
384
+ ```typescript
385
+ // Quand aucune garantie d'ordre n'est nécessaire
386
+ const highPerformance = data
387
+ .filter(predicate)
388
+ .map(mapper)
389
+ .toUnoredered(); // Meilleure performance
377
390
  ```
378
391
 
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:**
392
+ ### Sélectionner Collecteur Ordonné (Nécessite un Ordre)
403
393
  ```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, ...}
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
430
398
  ```
431
399
 
432
- #### Classes d'Implémentation Statistique Spécifiques
433
-
434
- **NumericStatistics<E>**
435
- - Gère l'analyse statistique de type nombre
436
- - Tous les calculs statistiques retournent le type nombre
437
-
438
- **BigIntStatistics<E>**
439
- - Gère l'analyse statistique de type bigint
440
- - Tous les calculs statistiques retournent le type bigint
441
-
442
- **Supplément d'Exemple de Code:**
400
+ ### Sélectionner Collecteur de Fenêtre (Opérations de Fenêtre)
443
401
  ```typescript
444
- import { from } from 'semantic-typescript';
445
-
446
- // Statistiques numériques
447
- const numberData = from([10, 20, 30, 40, 50]);
448
- const numericStats = numberData.toNumericStatistics();
449
-
450
- console.log(numericStats.mean()); // 30
451
- console.log(numericStats.summate()); // 150
452
-
453
- // Statistiques en grand entier
454
- const bigintData = from([100n, 200n, 300n, 400n, 500n]);
455
- const bigintStats = bigintData.toBigIntStatistics();
456
-
457
- console.log(bigintStats.mean()); // 300n
458
- console.log(bigintStats.summate()); // 1500n
402
+ // Quand des opérations de fenêtre sont nécessaires
403
+ const windowed = data
404
+ .toWindow()
405
+ .slide(5n, 2n); // Fenêtre glissante
406
+ ```
459
407
 
460
- // Statistiques utilisant des fonctions de mappage
461
- const objectData = from([
462
- { value: 15 },
463
- { value: 25 },
464
- { value: 35 },
465
- { value: 45 }
466
- ]);
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
467
413
 
468
- const objectStats = objectData.toNumericStatistics();
469
- const meanWithMapper = objectStats.mean(obj => obj.value); // 30
470
- const sumWithMapper = objectStats.summate(obj => obj.value); // 120
414
+ const bigIntStats = data
415
+ .toBigintStatistics(); // Statistiques BigInt
471
416
  ```
472
417
 
473
- ## Exemple Complet d'Utilisation
418
+ [GitHub](https://github.com/eloyhere/semantic-typescript)
419
+ [NPMJS](https://www.npmjs.com/package/semantic-typescript)
474
420
 
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
- }
421
+ ## Considérations Importantes
504
422
 
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
- ```
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
513
427
 
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.
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.