semantic-typescript 0.0.8 → 0.2.5
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/collectable.d.ts +84 -0
- package/dist/collectable.js +476 -0
- package/dist/collector.d.ts +24 -0
- package/dist/collector.js +63 -0
- package/dist/factory.d.ts +11 -0
- package/dist/factory.js +248 -0
- package/dist/guard.d.ts +23 -0
- package/dist/guard.js +85 -0
- package/dist/hook.d.ts +2 -0
- package/dist/hook.js +64 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -0
- package/dist/optional.d.ts +18 -0
- package/dist/optional.js +65 -0
- package/dist/semantic.d.ts +9 -272
- package/dist/semantic.js +38 -1679
- package/dist/statistics.d.ts +101 -0
- package/dist/statistics.js +765 -0
- package/dist/symbol.d.ts +10 -0
- package/dist/symbol.js +10 -0
- package/dist/utility.d.ts +49 -0
- package/dist/utility.js +17 -0
- package/package.json +54 -8
- package/readme.cn.md +387 -445
- package/readme.de.md +393 -448
- package/readme.es.md +392 -446
- package/readme.fr.md +396 -450
- package/readme.jp.md +390 -447
- package/readme.kr.md +396 -453
- package/readme.md +389 -445
- package/readme.ru.md +391 -447
- package/readme.tw.md +403 -444
package/readme.fr.md
CHANGED
|
@@ -1,529 +1,475 @@
|
|
|
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` | Ensemble des types primitifs |
|
|
23
|
+
| `MaybePrimitive<T>` | Type pouvant être un type primitif |
|
|
24
|
+
| `OptionalSymbol` | Symbole identifiant de la classe `Optional` |
|
|
25
|
+
| `SemanticSymbol` | Symbole identifiant de la classe `Semantic` |
|
|
26
|
+
| `CollectorsSymbol` | Symbole identifiant de la classe `Collector` |
|
|
27
|
+
| `CollectableSymbol` | Symbole identifiant de la classe `Collectable` |
|
|
28
|
+
| `OrderedCollectableSymbol` | Symbole identifiant de la classe `OrderedCollectable` |
|
|
29
|
+
| `WindowCollectableSymbol` | Symbole identifiant de la classe `WindowCollectable` |
|
|
30
|
+
| `StatisticsSymbol` | Symbole identifiant de la classe `Statistics` |
|
|
31
|
+
| `NumericStatisticsSymbol` | Symbole identifiant de la classe `NumericStatistics` |
|
|
32
|
+
| `BigIntStatisticsSymbol` | Symbole identifiant de la classe `BigIntStatistics` |
|
|
33
|
+
| `UnorderedCollectableSymbol` | Symbole identifiant de la classe `UnorderedCollectable` |
|
|
34
|
+
|
|
35
|
+
## Interfaces fonctionnelles
|
|
36
|
+
|
|
37
|
+
| Interface | Description |
|
|
38
|
+
|-----------|-------------|
|
|
39
|
+
| `Runnable` | Fonction sans paramètre ni valeur de retour |
|
|
40
|
+
| `Supplier<R>` | Fonction sans paramètre retournant `R` |
|
|
41
|
+
| `Functional<T, R>` | Fonction de transformation à un seul paramètre |
|
|
42
|
+
| `BiFunctional<T, U, R>` | Fonction de transformation à deux paramètres |
|
|
43
|
+
| `TriFunctional<T, U, V, R>` | Fonction de transformation à trois paramètres |
|
|
44
|
+
| `Predicate<T>` | Fonction de prédicat à un seul paramètre |
|
|
45
|
+
| `BiPredicate<T, U>` | Fonction de prédicat à deux paramètres |
|
|
46
|
+
| `TriPredicate<T, U, V>` | Fonction de prédicat à trois paramètres |
|
|
47
|
+
| `Consumer<T>` | Fonction de consommation à un seul paramètre |
|
|
48
|
+
| `BiConsumer<T, U>` | Fonction de consommation à deux paramètres |
|
|
49
|
+
| `TriConsumer<T, U, V>` | Fonction de consommation à trois paramètres |
|
|
50
|
+
| `Comparator<T>` | Fonction de comparaison à deux paramètres |
|
|
51
|
+
| `Generator<T>` | Fonction génératrice (noyau et base) |
|
|
48
52
|
|
|
49
|
-
**Supplément d'Exemple de Code:**
|
|
50
53
|
```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>();
|
|
54
|
+
// Exemples d'utilisation des types
|
|
55
|
+
const predicate: Predicate<number> = (n) => n > 0;
|
|
56
|
+
const mapper: Functional<string, number> = (str) => str.length;
|
|
57
|
+
const comparator: Comparator<number> = (a, b) => a - b;
|
|
64
58
|
```
|
|
65
59
|
|
|
66
|
-
|
|
60
|
+
## Gardes de Type
|
|
61
|
+
|
|
62
|
+
| Fonction | Description | Complexité Temporelle | Complexité Spatiale |
|
|
63
|
+
|----------|-------------|----------------------|---------------------|
|
|
64
|
+
| `validate<T>(t: MaybeInvalid<T>): t is T` | Valide que la valeur n'est pas null ou undefined | O(1) | O(1) |
|
|
65
|
+
| `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | Valide que la valeur est null ou undefined | O(1) | O(1) |
|
|
66
|
+
| `isBoolean(t: unknown): t is boolean` | Vérifie si c'est un booléen | O(1) | O(1) |
|
|
67
|
+
| `isString(t: unknown): t is string` | Vérifie si c'est une chaîne | O(1) | O(1) |
|
|
68
|
+
| `isNumber(t: unknown): t is number` | Vérifie si c'est un nombre | O(1) | O(1) |
|
|
69
|
+
| `isFunction(t: unknown): t is Function` | Vérifie si c'est une fonction | O(1) | O(1) |
|
|
70
|
+
| `isObject(t: unknown): t is object` | Vérifie si c'est un objet | O(1) | O(1) |
|
|
71
|
+
| `isSymbol(t: unknown): t is symbol` | Vérifie si c'est un symbole | O(1) | O(1) |
|
|
72
|
+
| `isBigint(t: unknown): t is bigint` | Vérifie si c'est un BigInt | O(1) | O(1) |
|
|
73
|
+
| `isPrimitive(t: unknown): t is Primitive` | Vérifie si c'est un type primitif | O(1) | O(1) |
|
|
74
|
+
| `isIterable(t: unknown): t is Iterable<unknown>` | Vérifie si c'est itérable | O(1) | O(1) |
|
|
75
|
+
| `isOptional(t: unknown): t is Optional<unknown>` | Vérifie si c'est une instance d'Optional | O(1) | O(1) |
|
|
76
|
+
| `isSemantic(t: unknown): t is Semantic<unknown>` | Vérifie si c'est une instance de Semantic | O(1) | O(1) |
|
|
77
|
+
| `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Vérifie si c'est une instance de Collector | O(1) | O(1) |
|
|
78
|
+
| `isCollectable(t: unknown): t is Collectable<unknown>` | Vérifie si c'est une instance de Collectable | O(1) | O(1) |
|
|
79
|
+
| `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | Vérifie si c'est une instance d'OrderedCollectable | O(1) | O(1) |
|
|
80
|
+
| `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | Vérifie si c'est une instance de WindowCollectable | O(1) | O(1) |
|
|
81
|
+
| `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | Vérifie si c'est une instance d'UnorderedCollectable | O(1) | O(1) |
|
|
82
|
+
| `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Vérifie si c'est une instance de Statistics | O(1) | O(1) |
|
|
83
|
+
| `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | Vérifie si c'est une instance de NumericStatistics | O(1) | O(1) |
|
|
84
|
+
| `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | Vérifie si c'est une instance de BigIntStatistics | O(1) | O(1) |
|
|
67
85
|
|
|
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
86
|
```typescript
|
|
77
|
-
|
|
87
|
+
// Exemples d'utilisation des gardes de type
|
|
88
|
+
const value: unknown = "hello";
|
|
78
89
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if (validate(data)) {
|
|
82
|
-
console.log(data.toUpperCase()); // Appel sécurisé car validate garantit que data n'est pas null
|
|
90
|
+
if (isString(value)) {
|
|
91
|
+
console.log(value.length); // Sécurité de type, value est inféré comme string
|
|
83
92
|
}
|
|
84
93
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
console.log("Données invalides"); // S'exécutera car invalidate a détecté null
|
|
94
|
+
if (isOptional(someValue)) {
|
|
95
|
+
someValue.ifPresent(val => console.log(val));
|
|
88
96
|
}
|
|
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
97
|
```
|
|
96
98
|
|
|
97
|
-
##
|
|
98
|
-
|
|
99
|
-
### Optional<T> - Gestion Sécurisée des Valeurs Nulles
|
|
99
|
+
## Fonctions Utilitaires
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
| Fonction | Description | Complexité Temporelle | Complexité Spatiale |
|
|
102
|
+
|----------|-------------|----------------------|---------------------|
|
|
103
|
+
| `useCompare<T>(t1: T, t2: T): number` | Fonction de comparaison universelle | O(1) | O(1) |
|
|
104
|
+
| `useRandom<T = number \| bigint>(index: T): T` | Générateur de nombres pseudo-aléatoires | O(log n) | O(1) |
|
|
102
105
|
|
|
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
106
|
```typescript
|
|
118
|
-
|
|
107
|
+
// Exemples d'utilisation des fonctions utilitaires
|
|
108
|
+
const numbers = [3, 1, 4, 1, 5];
|
|
109
|
+
numbers.sort(useCompare); // [1, 1, 3, 4, 5]
|
|
119
110
|
|
|
120
|
-
//
|
|
121
|
-
const
|
|
111
|
+
const randomNum = useRandom(42); // Nombre aléatoire basé sur seed
|
|
112
|
+
const randomBigInt = useRandom(1000n); // Nombre BigInt aléatoire
|
|
113
|
+
```
|
|
122
114
|
|
|
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
|
|
115
|
+
## Méthodes d'Usine
|
|
128
116
|
|
|
129
|
-
|
|
117
|
+
### Méthodes d'Usine d'Optional
|
|
130
118
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
119
|
+
| Méthode | Description | Complexité Temporelle | Complexité Spatiale |
|
|
120
|
+
|---------|-------------|----------------------|---------------------|
|
|
121
|
+
| `Optional.empty<T>()` | Crée un Optional vide | O(1) | O(1) |
|
|
122
|
+
| `Optional.of<T>(value)` | Crée un Optional avec valeur | O(1) | O(1) |
|
|
123
|
+
| `Optional.ofNullable<T>(value)` | Crée un Optional pouvant être null | O(1) | O(1) |
|
|
124
|
+
| `Optional.ofNonNull<T>(value)` | Crée un Optional non null | O(1) | O(1) |
|
|
135
125
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
126
|
+
```typescript
|
|
127
|
+
// Exemples d'utilisation d'Optional
|
|
128
|
+
const emptyOpt = Optional.empty<number>();
|
|
129
|
+
const presentOpt = Optional.of(42);
|
|
130
|
+
const nullableOpt = Optional.ofNullable<string>(null);
|
|
131
|
+
const nonNullOpt = Optional.ofNonNull("hello");
|
|
132
|
+
|
|
133
|
+
presentOpt.ifPresent(val => console.log(val)); // Affiche 42
|
|
134
|
+
console.log(emptyOpt.orElse(100)); // Affiche 100
|
|
142
135
|
```
|
|
143
136
|
|
|
144
|
-
###
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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:**
|
|
137
|
+
### Méthodes d'Usine de Collector
|
|
138
|
+
|
|
139
|
+
| Méthode | Description | Complexité Temporelle | Complexité Spatiale |
|
|
140
|
+
|---------|-------------|----------------------|---------------------|
|
|
141
|
+
| `Collector.full(identity, accumulator, finisher)` | Crée un collecteur complet | O(1) | O(1) |
|
|
142
|
+
| `Collector.shortable(identity, interruptor, accumulator, finisher)` | Crée un collecteur interruptible | O(1) | O(1) |
|
|
143
|
+
|
|
173
144
|
```typescript
|
|
174
|
-
|
|
145
|
+
// Exemples de conversion de collecteurs
|
|
146
|
+
const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
|
|
175
147
|
|
|
176
|
-
|
|
148
|
+
// Priorité à la performance : utiliser un collecteur non ordonné
|
|
149
|
+
const unordered = numbers
|
|
150
|
+
.filter(n => n > 3)
|
|
151
|
+
.toUnoredered();
|
|
177
152
|
|
|
178
|
-
//
|
|
179
|
-
const
|
|
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
|
|
153
|
+
// Besoin de tri : utiliser un collecteur ordonné
|
|
154
|
+
const ordered = numbers.sorted();
|
|
185
155
|
|
|
186
|
-
//
|
|
156
|
+
// Compte le nombre d'éléments
|
|
157
|
+
let count = Collector.full(
|
|
158
|
+
() => 0, // Valeur initiale
|
|
159
|
+
(accumulator, element) => accumulator + element, // Accumuler
|
|
160
|
+
(accumulator) => accumulator // Terminer
|
|
161
|
+
);
|
|
162
|
+
count.collect(from([1,2,3,4,5])); // Compte depuis un flux
|
|
163
|
+
count.collect([1,2,3,4,5]); // Compte depuis un objet itérable
|
|
164
|
+
|
|
165
|
+
let find = Collector.shortable(
|
|
166
|
+
() => Optional.empty(), // Valeur initiale
|
|
167
|
+
(element, index, accumulator) => accumulator.isPresent(), // Interrompre
|
|
168
|
+
(accumulator, element, index) => Optional.of(element), // Accumuler
|
|
169
|
+
(accumulator) => accumulator // Terminer
|
|
170
|
+
);
|
|
171
|
+
find.collect(from([1,2,3,4,5])); // Trouve le premier élément
|
|
172
|
+
find.collect([1,2,3,4,5]); // Trouve le premier élément
|
|
187
173
|
```
|
|
188
174
|
|
|
189
|
-
|
|
175
|
+
### Méthodes d'usine de Semantic
|
|
190
176
|
|
|
191
|
-
| Méthode |
|
|
192
|
-
|
|
193
|
-
| `
|
|
194
|
-
| `
|
|
195
|
-
| `
|
|
196
|
-
| `
|
|
197
|
-
| `
|
|
198
|
-
| `
|
|
199
|
-
| `
|
|
177
|
+
| Méthode | Description | Complexité temporelle | Complexité spatiale |
|
|
178
|
+
|---------|-------------|----------------------|----------------------|
|
|
179
|
+
| `blob(blob, chunkSize)` | Crée un flux depuis un Blob | O(n) | O(chunkSize) |
|
|
180
|
+
| `empty<E>()` | Crée un flux vide | O(1) | O(1) |
|
|
181
|
+
| `fill<E>(element, count)` | Crée un flux rempli | O(n) | O(1) |
|
|
182
|
+
| `from<E>(iterable)` | Crée un flux depuis un objet itérable | O(1) | O(1) |
|
|
183
|
+
| `generate<E>(element, interrupt)` | Crée un flux générateur | O(1) | O(1) |
|
|
184
|
+
| `interval(period, delay?)` | Crée un flux d'intervalle régulier | O(1)* | O(1) |
|
|
185
|
+
| `iterate<E>(generator)` | Crée un flux depuis un générateur | O(1) | O(1) |
|
|
186
|
+
| `range(start, end, step)` | Crée un flux de plage numérique | O(n) | O(1) |
|
|
187
|
+
| `websocket(websocket)` | Crée un flux depuis un WebSocket | O(1) | O(1) |
|
|
200
188
|
|
|
201
|
-
**Supplément d'Exemple de Code:**
|
|
202
189
|
```typescript
|
|
203
|
-
|
|
190
|
+
// Exemple d'utilisation des méthodes d'usine de Semantic
|
|
204
191
|
|
|
205
|
-
|
|
192
|
+
// Créer un flux depuis un Blob (lecture par blocs)
|
|
193
|
+
blob(someBlob, 1024n)
|
|
194
|
+
.toUnordered()
|
|
195
|
+
.write(WritableStream)
|
|
196
|
+
.then(callback) // Écriture de flux réussie
|
|
197
|
+
.catch(writeFi); // Échec de l'écriture de flux
|
|
206
198
|
|
|
207
|
-
//
|
|
208
|
-
|
|
199
|
+
// Créer un flux vide qui ne s'exécutera qu'après concaténation avec d'autres flux
|
|
200
|
+
empty<string>()
|
|
201
|
+
.toUnordered()
|
|
202
|
+
.join(); //[]
|
|
209
203
|
|
|
210
|
-
//
|
|
211
|
-
const
|
|
204
|
+
// Créer un flux rempli
|
|
205
|
+
const filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
212
206
|
|
|
213
|
-
//
|
|
214
|
-
|
|
207
|
+
// Créer un flux temporel avec délai initial de 2 secondes et cycle de 5 secondes,
|
|
208
|
+
// implémenté via un mécanisme de temporisation, dérives temporelles possibles
|
|
209
|
+
// dues aux limitations de planification du système.
|
|
210
|
+
const intervalStream = interval(5000, 2000);
|
|
215
211
|
|
|
216
|
-
//
|
|
217
|
-
const
|
|
212
|
+
// Créer un flux depuis un objet itérable
|
|
213
|
+
const numberStream = from([1, 2, 3, 4, 5]);
|
|
214
|
+
const stringStream = from(new Set(["Alex", "Bob"]));
|
|
218
215
|
|
|
219
|
-
//
|
|
220
|
-
const
|
|
216
|
+
// Créer un flux de plage
|
|
217
|
+
const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
221
218
|
|
|
222
|
-
//
|
|
219
|
+
// Flux d'événements WebSocket
|
|
220
|
+
const ws = new WebSocket("ws://localhost:8080");
|
|
221
|
+
websocket(ws)
|
|
222
|
+
.filter((event)=> event.type === "message") // Surveiller uniquement les événements de message
|
|
223
|
+
.toUnordered() // Pour les événements généralement non triés
|
|
224
|
+
.forEach((event)=> receive(event)); // Recevoir les messages
|
|
223
225
|
```
|
|
224
226
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
227
|
+
## Méthodes de Classe Semantic
|
|
228
|
+
|
|
229
|
+
| Méthode | Description | Complexité Temporelle | Complexité Spatiale |
|
|
230
|
+
|---------|-------------|----------------------|---------------------|
|
|
231
|
+
| `concat(other)` | Concatène deux flux | O(n) | O(1) |
|
|
232
|
+
| `distinct()` | Supprime les doublons | O(n) | O(n) |
|
|
233
|
+
| `distinct(comparator)` | Supprime les doublons avec comparateur | O(n²) | O(n) |
|
|
234
|
+
| `dropWhile(predicate)` | Ignore les éléments satisfaisant le prédicat | O(n) | O(1) |
|
|
235
|
+
| `filter(predicate)` | Filtre les éléments | O(n) | O(1) |
|
|
236
|
+
| `flat(mapper)` | Aplatissement de mapping | O(n × m) | O(1) |
|
|
237
|
+
| `flatMap(mapper)` | Aplatissement vers nouveau type | O(n × m) | O(1) |
|
|
238
|
+
| `limit(n)` | Limite le nombre d'éléments | O(n) | O(1) |
|
|
239
|
+
| `map(mapper)` | Transformation par mapping | O(n) | O(1) |
|
|
240
|
+
| `peek(consumer)` | Inspecte les éléments | O(n) | O(1) |
|
|
241
|
+
| `redirect(redirector)` | Redirection d'index | O(n) | O(1) |
|
|
242
|
+
| `reverse()` | Inverse le flux | O(n) | O(1) |
|
|
243
|
+
| `shuffle()` | Mélange aléatoire | O(n) | O(1) |
|
|
244
|
+
| `shuffle(mapper)` | Mélange avec mapper | O(n) | O(1) |
|
|
245
|
+
| `skip(n)` | Saute les n premiers éléments | O(n) | O(1) |
|
|
246
|
+
| `sorted()` | Trie | O(n log n) | O(n) |
|
|
247
|
+
| `sorted(comparator)` | Trie avec comparateur | O(n log n) | O(n) |
|
|
248
|
+
| `sub(start, end)` | Obtient un sous-flux | O(n) | O(1) |
|
|
249
|
+
| `takeWhile(predicate)` | Prend les éléments satisfaisant le prédicat | O(n) | O(1) |
|
|
250
|
+
| `translate(offset)` | Translation d'index | O(n) | O(1) |
|
|
251
|
+
| `translate(translator)` | Translation avec traducteur | O(n) | O(1) |
|
|
228
252
|
|
|
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
253
|
```typescript
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
//
|
|
240
|
-
|
|
241
|
-
()
|
|
242
|
-
(
|
|
243
|
-
|
|
244
|
-
);
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
const
|
|
254
|
+
// Exemples d'opérations Semantic
|
|
255
|
+
const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
256
|
+
.filter(n => n % 2 === 0) // Filtre les nombres pairs
|
|
257
|
+
.map(n => n * 2) // Multiplie par 2
|
|
258
|
+
.skip(1) // Saute le premier
|
|
259
|
+
.limit(3) // Limite à 3 éléments
|
|
260
|
+
.toUnordered() // Convertit en collecteur non ordonné
|
|
261
|
+
.toArray(); // Convertit en tableau
|
|
262
|
+
// Résultat: [8, 12, 20]
|
|
263
|
+
|
|
264
|
+
// Exemple d'opération complexe
|
|
265
|
+
const complexResult = range(1, 100, 1)
|
|
266
|
+
.flatMap(n => from([n, n * 2])) // Map chaque élément vers deux éléments
|
|
267
|
+
.distinct() // Supprime les doublons
|
|
268
|
+
.shuffle() // Mélange aléatoirement
|
|
269
|
+
.takeWhile(n => n < 50) // Prend les éléments < 50
|
|
270
|
+
.toOrdered() // Convertit en collecteur ordonné
|
|
271
|
+
.toArray(); // Convertit en tableau
|
|
249
272
|
```
|
|
250
273
|
|
|
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
|
|
274
|
+
## Méthodes de conversion sémantique
|
|
256
275
|
|
|
257
|
-
| Méthode |
|
|
258
|
-
|
|
259
|
-
| `
|
|
260
|
-
| `
|
|
261
|
-
| `
|
|
262
|
-
| `
|
|
263
|
-
| `
|
|
264
|
-
| `
|
|
265
|
-
| `
|
|
276
|
+
| Méthode | Description | Complexité temporelle | Complexité spatiale |
|
|
277
|
+
|------------|------------|------------|------------|
|
|
278
|
+
| `sorted()` | Convertir en collecteur ordonné | O(n log n) | O(n) |
|
|
279
|
+
| `toUnordered()` | Convertir en collecteur non ordonné | O(1) | O(1) |
|
|
280
|
+
| `toOrdered()` | Convertir en collecteur ordonné | O(1) | O(1) |
|
|
281
|
+
| `toNumericStatistics()` | Convertir en statistiques numériques | O(n) | O(1) |
|
|
282
|
+
| `toBigintStatistics()` | Convertir en statistiques bigint | O(n) | O(1) |
|
|
283
|
+
| `toWindow()` | Convertir en collecteur de fenêtres | O(1) | O(1) |
|
|
284
|
+
| `toCollectable()` | Convertir en `UnorderdCollectable` | O(n) | O(1) |
|
|
285
|
+
| `toCollectable(mapper)` | Convertir en collectable personnalisé | O(n) | O(1) |
|
|
266
286
|
|
|
267
|
-
**Supplément d'Exemple de Code:**
|
|
268
287
|
```typescript
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
//
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
288
|
+
// Convertir en tableau trié par ordre croissant
|
|
289
|
+
from([6,4,3,5,2]) // Crée un flux
|
|
290
|
+
.sorted() // Trie le flux par ordre croissant
|
|
291
|
+
.toArray(); // [2, 3, 4, 5, 6]
|
|
292
|
+
|
|
293
|
+
// Convertir en tableau trié par ordre décroissant
|
|
294
|
+
from([6,4,3,5,2]) // Crée un flux
|
|
295
|
+
.soted((a, b) => b - a) // Trie le flux par ordre décroissant
|
|
296
|
+
.toArray(); // [6, 5, 4, 3, 2]
|
|
297
|
+
|
|
298
|
+
// Rediriger vers un tableau inversé
|
|
299
|
+
from([6,4,3,5,2])
|
|
300
|
+
.redirect((element, index) => -index) // Redirige en ordre inversé
|
|
301
|
+
.toOrderd() // Conserve l’ordre redirigé
|
|
302
|
+
.toArray(); // [2, 5, 3, 4, 6]
|
|
303
|
+
|
|
304
|
+
// Ignorer les redirections pour inverser le tableau
|
|
305
|
+
from([6,4,3,5,2])
|
|
306
|
+
.redirect((element, index) => -index) // Redirige en ordre inversé
|
|
307
|
+
.toUnorderd() // Supprime l’ordre redirigé. Cette opération ignore les opérations `redirect`, `reverse`, `shuffle` et `translate`
|
|
308
|
+
.toArray(); // [2, 5, 3, 4, 6]
|
|
309
|
+
|
|
310
|
+
// Inverser le flux en tableau
|
|
311
|
+
from([6, 4, 3, 5, 2])
|
|
312
|
+
.reverse() // Inverse le flux
|
|
313
|
+
.toOrdered() // Garantit l’ordre inversé
|
|
314
|
+
.toArray(); // [2, 5, 3, 4, 6]
|
|
315
|
+
|
|
316
|
+
// Écraser le flux mélangé dans un tableau
|
|
317
|
+
from([6, 4, 3, 5, 2])
|
|
318
|
+
.shuffle() // Mélange le flux
|
|
319
|
+
.sorted() // Écrase l’ordre mélangé. Cette opération écrase les opérations `redirect`, `reverse`, `shuffle` et `translate`
|
|
320
|
+
.toArray(); // [2, 5, 3, 4, 6]
|
|
321
|
+
|
|
322
|
+
// Convertir en collecteur de fenêtres
|
|
323
|
+
from([6, 4, 3, 5, 2]).toWindow();
|
|
324
|
+
|
|
325
|
+
// Convertir en statistiques numériques
|
|
326
|
+
from([6, 4, 3, 5, 2]).toNumericStatistics();
|
|
327
|
+
|
|
328
|
+
// Convertir en statistiques bigint
|
|
329
|
+
from([6n, 4n, 3n, 5n, 2n]).toBigintStatistics();
|
|
330
|
+
|
|
331
|
+
// Définit un collecteur personnalisé pour collecter les données
|
|
332
|
+
let customizedCollector = from([1, 2, 3, 4, 5]).toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
|
|
283
333
|
```
|
|
284
334
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
| Méthode |
|
|
288
|
-
|
|
289
|
-
| `
|
|
290
|
-
| `
|
|
291
|
-
| `
|
|
292
|
-
| `
|
|
293
|
-
| `
|
|
294
|
-
| `
|
|
295
|
-
| `
|
|
296
|
-
| `
|
|
297
|
-
| `
|
|
298
|
-
| `
|
|
299
|
-
| `
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
// Doit convertir en Collectable avant d'utiliser les opérations d'agrégation
|
|
312
|
-
const collectable = people.toUnordered();
|
|
335
|
+
## Méthodes de Collecte de Collectable
|
|
336
|
+
|
|
337
|
+
| Méthode | Description | Complexité Temporelle | Complexité Spatiale |
|
|
338
|
+
|---------|-------------|----------------------|---------------------|
|
|
339
|
+
| `anyMatch(predicate)` | Vérifie s'il existe une correspondance | O(n) | O(1) |
|
|
340
|
+
| `allMatch(predicate)` | Vérifie si tous correspondent | O(n) | O(1) |
|
|
341
|
+
| `count()` | Compte les éléments | O(n) | O(1) |
|
|
342
|
+
| `isEmpty()` | Vérifie si vide | O(1) | O(1) |
|
|
343
|
+
| `findAny()` | Trouve n'importe quel élément | O(n) | O(1) |
|
|
344
|
+
| `findFirst()` | Trouve le premier élément | O(n) | O(1) |
|
|
345
|
+
| `findLast()` | Trouve le dernier élément | O(n) | O(1) |
|
|
346
|
+
| `forEach(action)` | Itère sur tous les éléments | O(n) | O(1) |
|
|
347
|
+
| `group(classifier)` | Groupe par classificateur | O(n) | O(n) |
|
|
348
|
+
| `groupBy(keyExtractor, valueExtractor)` | Groupe par extracteurs clé-valeur | O(n) | O(n) |
|
|
349
|
+
| `join()` | Joint en chaîne | O(n) | O(n) |
|
|
350
|
+
| `join(delimiter)` | Joint avec séparateur | O(n) | O(n) |
|
|
351
|
+
| `nonMatch(predicate)` | Vérifie s'il n'y a pas de correspondance | O(n) | O(1) |
|
|
352
|
+
| `partition(count)` | Partitionne par quantité | O(n) | O(n) |
|
|
353
|
+
| `partitionBy(classifier)` | Partitionne par classificateur | O(n) | O(n) |
|
|
354
|
+
| `reduce(accumulator)` | Opération de réduction | O(n) | O(1) |
|
|
355
|
+
| `reduce(identity, accumulator)` | Réduction avec valeur initiale | O(n) | O(1) |
|
|
356
|
+
| `toArray()` | Convertit en tableau | O(n) | O(n) |
|
|
357
|
+
| `toMap(keyExtractor, valueExtractor)` | Convertit en Map | O(n) | O(n) |
|
|
358
|
+
| `toSet()` | Convertit en Set | O(n) | O(n) |
|
|
359
|
+
| `write(stream)` | Écrit dans le flux | O(n) | O(1) |
|
|
313
360
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
361
|
+
```typescript
|
|
362
|
+
// Exemples d'opérations Collectable
|
|
363
|
+
const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
364
|
+
.filter(n => n % 2 === 0)
|
|
365
|
+
.toOrdered();
|
|
366
|
+
|
|
367
|
+
// Vérifications de correspondance
|
|
368
|
+
console.log(data.anyMatch(n => n > 5)); // true
|
|
369
|
+
console.log(data.allMatch(n => n < 20)); // true
|
|
370
|
+
|
|
371
|
+
// Opérations de recherche
|
|
372
|
+
data.findFirst().ifPresent(n => console.log(n)); // 2
|
|
373
|
+
data.findAny().ifPresent(n => console.log(n)); // Élément quelconque
|
|
374
|
+
|
|
375
|
+
// Opérations de groupement
|
|
376
|
+
const grouped = data.groupBy(
|
|
377
|
+
n => n > 5 ? "large" : "small",
|
|
378
|
+
n => n * 2
|
|
321
379
|
);
|
|
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 }
|
|
380
|
+
// {small: [4, 8], large: [12, 16, 20]}
|
|
331
381
|
|
|
332
382
|
// 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
|
-
```
|
|
383
|
+
const sum = data.reduce(0, (acc, n) => acc + n); // 30
|
|
336
384
|
|
|
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
|
|
385
|
+
// Opérations de sortie
|
|
386
|
+
data.join(", "); // "2, 4, 6, 8, 10"
|
|
387
|
+
```
|
|
348
388
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
389
|
+
## Méthodes d'Analyse Statistique
|
|
390
|
+
|
|
391
|
+
### Méthodes de NumericStatistics
|
|
392
|
+
|
|
393
|
+
| Méthode | Description | Complexité Temporelle | Complexité Spatiale |
|
|
394
|
+
|---------|-------------|----------------------|---------------------|
|
|
395
|
+
| `range()` | Plage | O(n) | O(1) |
|
|
396
|
+
| `variance()` | Variance | O(n) | O(1) |
|
|
397
|
+
| `standardDeviation()` | Écart-type | O(n) | O(1) |
|
|
398
|
+
| `mean()` | Moyenne | O(n) | O(1) |
|
|
399
|
+
| `median()` | Médiane | O(n log n) | O(n) |
|
|
400
|
+
| `mode()` | Mode | O(n) | O(n) |
|
|
401
|
+
| `frequency()` | Distribution de fréquence | O(n) | O(n) |
|
|
402
|
+
| `summate()` | Sommation | O(n) | O(1) |
|
|
403
|
+
| `quantile(quantile)` | Quantile | O(n log n) | O(n) |
|
|
404
|
+
| `interquartileRange()` | Intervalle interquartile | O(n log n) | O(n) |
|
|
405
|
+
| `skewness()` | Asymétrie | O(n) | O(1) |
|
|
406
|
+
| `kurtosis()` | Aplatissement | O(n) | O(1) |
|
|
355
407
|
|
|
356
|
-
**Supplément d'Exemple de Code:**
|
|
357
408
|
```typescript
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
const
|
|
409
|
+
// Exemples d'analyse statistique
|
|
410
|
+
const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
411
|
+
.toNumericStatistics();
|
|
412
|
+
|
|
413
|
+
console.log("Moyenne:", numbers.mean()); // 5.5
|
|
414
|
+
console.log("Médiane:", numbers.median()); // 5.5
|
|
415
|
+
console.log("Écart-type:", numbers.standardDeviation()); // ~2.87
|
|
416
|
+
console.log("Somme:", numbers.summate()); // 55
|
|
417
|
+
|
|
418
|
+
// Analyse statistique avec mapper
|
|
419
|
+
const objects = from([
|
|
420
|
+
{ value: 10 },
|
|
421
|
+
{ value: 20 },
|
|
422
|
+
{ value: 30 }
|
|
423
|
+
]).toNumericStatistics();
|
|
424
|
+
|
|
425
|
+
console.log("Moyenne mappée:", objects.mean(obj => obj.value)); // 20
|
|
426
|
+
```
|
|
369
427
|
|
|
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], ...
|
|
428
|
+
## Guide de Sélection des Performances
|
|
374
429
|
|
|
375
|
-
|
|
376
|
-
|
|
430
|
+
### Sélectionner Collecteur Non Ordonné (Priorité Performance)
|
|
431
|
+
```typescript
|
|
432
|
+
// Quand aucune garantie d'ordre n'est nécessaire
|
|
433
|
+
const highPerformance = data
|
|
434
|
+
.filter(predicate)
|
|
435
|
+
.map(mapper)
|
|
436
|
+
.toUnoredered(); // Meilleure performance
|
|
377
437
|
```
|
|
378
438
|
|
|
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:**
|
|
439
|
+
### Sélectionner Collecteur Ordonné (Nécessite un Ordre)
|
|
403
440
|
```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, ...}
|
|
441
|
+
// Quand l'ordre des éléments doit être préservé
|
|
442
|
+
const ordered = data
|
|
443
|
+
.sorted(comparator) // Le tri écrase les effets de redirection
|
|
444
|
+
.toOrdered(); // Maintient l'ordre
|
|
430
445
|
```
|
|
431
446
|
|
|
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:**
|
|
447
|
+
### Sélectionner Collecteur de Fenêtre (Opérations de Fenêtre)
|
|
443
448
|
```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
|
|
449
|
+
// Quand des opérations de fenêtre sont nécessaires
|
|
450
|
+
const windowed = data
|
|
451
|
+
.toWindow()
|
|
452
|
+
.slide(5n, 2n); // Fenêtre glissante
|
|
453
|
+
```
|
|
459
454
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
{ value: 45 }
|
|
466
|
-
]);
|
|
455
|
+
### Sélectionner Analyse Statistique (Calculs Numériques)
|
|
456
|
+
```typescript
|
|
457
|
+
// Quand une analyse statistique est nécessaire
|
|
458
|
+
const stats = data
|
|
459
|
+
.toNumericStatistics(); // Statistiques numériques
|
|
467
460
|
|
|
468
|
-
const
|
|
469
|
-
|
|
470
|
-
const sumWithMapper = objectStats.summate(obj => obj.value); // 120
|
|
461
|
+
const bigIntStats = data
|
|
462
|
+
.toBigintStatistics(); // Statistiques BigInt
|
|
471
463
|
```
|
|
472
464
|
|
|
473
|
-
|
|
465
|
+
[GitHub](https://github.com/eloyhere/semantic-typescript)
|
|
466
|
+
[NPMJS](https://www.npmjs.com/package/semantic-typescript)
|
|
474
467
|
|
|
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
|
-
}
|
|
468
|
+
## Considérations Importantes
|
|
504
469
|
|
|
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
|
-
```
|
|
470
|
+
1. **Impact des opérations de tri**: Dans les collecteurs ordonnés, `sorted()` écrase les effets de `redirect`, `translate`, `shuffle`, `reverse`
|
|
471
|
+
2. **Considérations de performance**: Si aucune garantie d'ordre n'est nécessaire, prioriser `toUnoredered()` pour de meilleures performances
|
|
472
|
+
3. **Utilisation de la mémoire**: Les opérations de tri nécessitent un espace supplémentaire O(n)
|
|
473
|
+
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
474
|
|
|
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.
|
|
475
|
+
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.
|