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/dist/semantic.d.ts +22 -5
- package/dist/semantic.js +106 -52
- package/package.json +53 -8
- package/readme.cn.md +343 -446
- package/readme.de.md +341 -443
- package/readme.es.md +342 -443
- package/readme.fr.md +345 -446
- package/readme.jp.md +346 -448
- package/readme.kr.md +350 -452
- package/readme.md +345 -448
- package/readme.ru.md +347 -448
- package/readme.tw.md +340 -443
package/readme.fr.md
CHANGED
|
@@ -1,529 +1,428 @@
|
|
|
1
|
-
#
|
|
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
|
|
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
|
|
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.
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Installation
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
|
42
|
-
|
|
43
|
-
| `
|
|
44
|
-
| `
|
|
45
|
-
| `
|
|
46
|
-
| `
|
|
47
|
-
| `
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
81
|
+
// Exemples d'utilisation des gardes de type
|
|
82
|
+
const value: unknown = "hello";
|
|
78
83
|
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
86
|
-
|
|
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
|
-
##
|
|
98
|
-
|
|
99
|
-
### Optional<T> - Gestion Sécurisée des Valeurs Nulles
|
|
93
|
+
## Fonctions Utilitaires
|
|
100
94
|
|
|
101
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
121
|
-
const
|
|
105
|
+
const randomNum = useRandom(42); // Nombre aléatoire basé sur seed
|
|
106
|
+
const randomBigInt = useRandom(1000n); // Nombre BigInt aléatoire
|
|
107
|
+
```
|
|
122
108
|
|
|
123
|
-
|
|
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
|
-
|
|
111
|
+
### Méthodes d'Usine d'Optional
|
|
130
112
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
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
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
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
|
-
|
|
146
|
+
const numbers = from([1, 2, 3, 4, 5]);
|
|
147
|
+
const total = numbers.toUnoredered().collect(sumCollector); // 15
|
|
187
148
|
```
|
|
188
149
|
|
|
189
|
-
|
|
150
|
+
### Méthodes d'usine de Semantic
|
|
190
151
|
|
|
191
|
-
| Méthode |
|
|
192
|
-
|
|
193
|
-
| `
|
|
194
|
-
| `
|
|
195
|
-
| `
|
|
196
|
-
| `
|
|
197
|
-
| `
|
|
198
|
-
| `
|
|
199
|
-
| `
|
|
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
|
-
|
|
164
|
+
// Exemple d'utilisation des méthodes d'usine de Semantic
|
|
204
165
|
|
|
205
|
-
|
|
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
|
-
//
|
|
208
|
-
|
|
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
|
-
//
|
|
211
|
-
const
|
|
178
|
+
// Créer un flux rempli
|
|
179
|
+
const filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
212
180
|
|
|
213
|
-
//
|
|
214
|
-
|
|
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
|
-
//
|
|
217
|
-
const
|
|
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
|
-
//
|
|
220
|
-
const
|
|
190
|
+
// Créer un flux de plage
|
|
191
|
+
const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
221
192
|
|
|
222
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
238
|
-
|
|
239
|
-
//
|
|
240
|
-
|
|
241
|
-
()
|
|
242
|
-
(
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
//
|
|
247
|
-
const
|
|
248
|
-
|
|
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
|
-
|
|
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 |
|
|
258
|
-
|
|
259
|
-
| `
|
|
260
|
-
| `
|
|
261
|
-
| `
|
|
262
|
-
| `
|
|
263
|
-
| `
|
|
264
|
-
| `
|
|
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
|
-
|
|
259
|
+
// Exemples de transformation de collecteurs
|
|
260
|
+
const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
|
|
270
261
|
|
|
271
|
-
|
|
262
|
+
// Priorité performance: Utiliser collecteur non ordonné
|
|
263
|
+
const unordered = numbers
|
|
264
|
+
.filter(n => n > 3)
|
|
265
|
+
.toUnoredered();
|
|
272
266
|
|
|
273
|
-
//
|
|
274
|
-
const
|
|
267
|
+
// Nécessite un tri: Utiliser collecteur ordonné
|
|
268
|
+
const ordered = numbers.sorted();
|
|
275
269
|
|
|
276
|
-
//
|
|
277
|
-
const
|
|
278
|
-
|
|
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
|
-
|
|
286
|
-
|
|
287
|
-
|
|
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
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
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
|
-
|
|
312
|
-
|
|
283
|
+
windowed.forEach(window => {
|
|
284
|
+
console.log(window.toArray()); // Contenu de chaque fenêtre
|
|
285
|
+
});
|
|
286
|
+
```
|
|
313
287
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
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
|
-
|
|
319
|
-
|
|
320
|
-
|
|
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
|
-
//
|
|
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
|
|
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
|
-
|
|
338
|
-
|
|
339
|
-
|
|
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
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
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
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
376
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
405
|
-
|
|
406
|
-
|
|
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
|
-
|
|
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
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
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
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
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
|
|
469
|
-
|
|
470
|
-
const sumWithMapper = objectStats.summate(obj => obj.value); // 120
|
|
414
|
+
const bigIntStats = data
|
|
415
|
+
.toBigintStatistics(); // Statistiques BigInt
|
|
471
416
|
```
|
|
472
417
|
|
|
473
|
-
|
|
418
|
+
[GitHub](https://github.com/eloyhere/semantic-typescript)
|
|
419
|
+
[NPMJS](https://www.npmjs.com/package/semantic-typescript)
|
|
474
420
|
|
|
475
|
-
|
|
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
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
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
|
-
|
|
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.
|