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