semantic-typescript 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/readme.es.md ADDED
@@ -0,0 +1,335 @@
1
+ # 📘 semantic-typescript
2
+
3
+ Una poderosa biblioteca de utilidades para **procesamiento semántico de datos** en TypeScript, completamente **segura y tipada**.
4
+ Proporciona construcciones funcionales compuestas para trabajar con colecciones, flujos y secuencias — con soporte para ordenar, filtrar, agrupar, realizar análisis estadísticos y más.
5
+
6
+ Ya sea que estés procesando **datos ordenados o no ordenados**, realizando **análisis estadísticos**, o simplemente **encadenando operaciones de forma fluida**, esta biblioteca está diseñada para cubrir todas tus necesidades.
7
+
8
+ ---
9
+
10
+ ## 🧩 Características
11
+
12
+ - ✅ **Genéricos tipados de forma segura** en toda la biblioteca
13
+ - ✅ Estilo **funcional** (map, filter, reduce, etc.)
14
+ - ✅ **Flujos de datos semánticos** (`Semantic<E>`) para evaluación diferida (lazy)
15
+ - ✅ **Coleccionadores (Collectors)** para transformar flujos en estructuras concretas
16
+ - ✅ **Collectables ordenados y no ordenados** — `toUnordered()` es **el más rápido (sin ordenar)**
17
+ - ✅ **Soporte para ordenar** mediante `sorted()`, `toOrdered()`, y comparadores personalizados
18
+ - ✅ **Análisis estadístico** (`Statistics`, `NumericStatistics`, `BigIntStatistics`)
19
+ - ✅ **Optional<T>** — monada para manejar valores nulos de forma segura
20
+ - ✅ Diseño basado en **iteradores y generadores** — ideal para grandes volúmenes o datos asíncronos
21
+
22
+ ---
23
+
24
+ ## 📦 Instalación
25
+
26
+ ```bash
27
+ npm install semantic-typescript
28
+ ```
29
+
30
+ ---
31
+
32
+ ## 🧠 Conceptos clave
33
+
34
+ ### 1. `Optional<T>` — Manejo seguro de valores nulos
35
+
36
+ Un contenedor monádico para valores que pueden ser `null` o `undefined`.
37
+
38
+ #### Métodos:
39
+
40
+ | Método | Descripción | Ejemplo |
41
+ |--------|-------------|---------|
42
+ | `of(value)` | Envolver un valor (puede ser nulo) | `Optional.of(null)` |
43
+ | `ofNullable(v)` | Envolver, permite valores nulos | `Optional.ofNullable(someVar)` |
44
+ | `ofNonNull(v)` | Envolver, lanza excepción si es nulo/undefined | `Optional.ofNonNull(5)` |
45
+ | `get()` | Obtener el valor (o lanzar excepción si está vacío) | `opt.get()` |
46
+ | `getOrDefault(d)` | Obtener el valor o un valor por defecto | `opt.getOrDefault(0)` |
47
+ | `ifPresent(fn)` | Ejecutar un efecto secundario si hay valor | `opt.ifPresent(x => console.log(x))` |
48
+ | `map(fn)` | Transformar el valor si existe | `opt.map(x => x + 1)` |
49
+ | `filter(fn)` | Conservar el valor solo si cumple el predicado | `opt.filter(x => x > 0)` |
50
+ | `isEmpty()` | Verificar si está vacío | `opt.isEmpty()` |
51
+ | `isPresent()` | Verificar si tiene un valor | `opt.isPresent()` |
52
+
53
+ #### Ejemplo:
54
+
55
+ ```typescript
56
+ import { Optional } from 'semantic-typescript';
57
+
58
+ const value: number | null = Math.random() > 0.5 ? 10 : null;
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 o 0
68
+ ```
69
+
70
+ ---
71
+
72
+ ### 2. `Semantic<E>` — Flujo de datos diferido
73
+
74
+ Un **flujo secuencial diferido y compuesto**. Similar a Java Streams o Kotlin Sequences.
75
+
76
+ Puedes crear un `Semantic` usando funciones como `from()`, `range()`, `iterate()` o `fill()`.
77
+
78
+ #### Creadores:
79
+
80
+ | Función | Descripción | Ejemplo |
81
+ |--------|-------------|---------|
82
+ | `from(iterable)` | Crear desde un Array, Set, Iterable | `from([1, 2, 3])` |
83
+ | `range(start, end, step?)` | Generar una secuencia de números | `range(0, 5)` → 0,1,2,3,4 |
84
+ | `fill(element, count)` | Repetir un elemento N veces | `fill('a', 3n)` |
85
+ | `iterate(gen)` | Usar una función generadora personalizada | `iterate(genFn)` |
86
+
87
+ #### Operadores comunes:
88
+
89
+ | Método | Descripción | Ejemplo |
90
+ |--------|-------------|---------|
91
+ | `map(fn)` | Transformar cada elemento | `.map(x => x * 2)` |
92
+ | `filter(fn)` | Conservar elementos que cumplen el predicado | `.filter(x => x > 10)` |
93
+ | `limit(n)` | Limitar a los primeros N elementos | `.limit(5)` |
94
+ | `skip(n)` | Saltar los primeros N elementos | `.skip(2)` |
95
+ | `distinct()` | Eliminar duplicados (usa Set por defecto) | `.distinct()` |
96
+ | `sorted()` | Ordenar elementos (orden natural) | `.sorted()` |
97
+ | `sorted(comparator)` | Ordenar con un comparador personalizado | `.sorted((a, b) => a - b)` |
98
+ | `toOrdered()` | Ordenar y devolver un `OrderedCollectable` | `.toOrdered()` |
99
+ | `toUnordered()` | **Sin ordenar** — el más rápido | `.toUnordered()` ✅ |
100
+ | `collect(collector)` | Agregar usando un `Collector` | `.collect(Collector.full(...))` |
101
+ | `toArray()` | Convertir a Array | `.toArray()` |
102
+ | `toSet()` | Convertir a Set | `.toSet()` |
103
+ | `toMap(keyFn, valFn)` | Convertir a Map | `.toMap(x => x.id, x => x)` |
104
+
105
+ ---
106
+
107
+ ### 3. `toUnordered()` — 🚀 El más rápido, sin ordenar
108
+
109
+ Si **no necesitas orden** y quieres el **máximo rendimiento**, utiliza:
110
+
111
+ ```typescript
112
+ const fastest = semanticStream.toUnordered();
113
+ ```
114
+
115
+ 🔥 **No se aplica ningún algoritmo de ordenamiento.**
116
+ Ideal cuando el orden no importa y la velocidad es prioritaria.
117
+
118
+ ---
119
+
120
+ ### 4. `toOrdered()` y `sorted()` — Resultados ordenados
121
+
122
+ Si necesitas un **resultado ordenado**, puedes usar:
123
+
124
+ ```typescript
125
+ const ordered = semanticStream.sorted(); // Orden natural
126
+ const customSorted = semanticStream.sorted((a, b) => a - b); // Comparador personalizado
127
+ const orderedCollectable = semanticStream.toOrdered(); // También ordenado
128
+ ```
129
+
130
+ ⚠️ Estos métodos **ordenarán los elementos**, usando orden natural o el comparador dado.
131
+
132
+ ---
133
+
134
+ ### 5. `Collector<E, A, R>` — Agregación de datos
135
+
136
+ Los **colectores** te permiten **reducir un flujo a una estructura única o compleja**.
137
+
138
+ Existen fábricas estáticas como:
139
+
140
+ ```typescript
141
+ Collector.full(identity, accumulator, finisher)
142
+ Collector.shortable(identity, interruptor, accumulator, finisher)
143
+ ```
144
+
145
+ Pero normalmente los usarás a través de métodos de alto nivel en las clases `Collectable`.
146
+
147
+ ---
148
+
149
+ ### 6. `Collectable<E>` (clase abstracta)
150
+
151
+ Clase base para:
152
+
153
+ - `OrderedCollectable<E>` — Resultados ordenados
154
+ - `UnorderedCollectable<E>` — Sin ordenar, el más rápido
155
+ - `WindowCollectable<E>` — Ventanas deslizantes
156
+ - `Statistics<E, D>` — Estadísticas agregadas
157
+
158
+ #### Métodos comunes (heredados):
159
+
160
+ | Método | Descripción | Ejemplo |
161
+ |--------|-------------|---------|
162
+ | `count()` | Contar elementos | `.count()` |
163
+ | `toArray()` | Convertir a Array | `.toArray()` |
164
+ | `toSet()` | Convertir a Set | `.toSet()` |
165
+ | `toMap(k, v)` | Convertir a Map | `.toMap(x => x.id, x => x)` |
166
+ | `group(k)` | Agrupar por clave | `.group(x => x.category)` |
167
+ | `findAny()` | Encontrar cualquier elemento (Optional) | `.findAny()` |
168
+ | `findFirst()` | Encontrar el primer elemento (Optional) | `.findFirst()` |
169
+ | `reduce(...)` | Reducción personalizada | `.reduce((a,b) => a + b, 0)` |
170
+
171
+ ---
172
+
173
+ ### 7. `OrderedCollectable<E>` — Datos ordenados
174
+
175
+ Si deseas que los elementos estén **ordenados automáticamente**, usa esta clase.
176
+
177
+ Acepta un **comparador personalizado** o el orden natural.
178
+
179
+ ```typescript
180
+ const sorted = new OrderedCollectable(stream);
181
+ const customSorted = new OrderedCollectable(stream, (a, b) => b - a);
182
+ ```
183
+
184
+ 🔒 **El orden está garantizado.**
185
+
186
+ ---
187
+
188
+ ### 8. `UnorderedCollectable<E>` — Sin ordenar (🚀 Más rápido)
189
+
190
+ Si **no te importa el orden** y buscas el **mejor rendimiento**, usa:
191
+
192
+ ```typescript
193
+ const unordered = new UnorderedCollectable(stream);
194
+ // O
195
+ const fastest = semanticStream.toUnordered();
196
+ ```
197
+
198
+ ✅ **No se ejecuta ningún algoritmo de ordenamiento**
199
+ ✅ **Mejor rendimiento cuando el orden no importa**
200
+
201
+ ---
202
+
203
+ ### 9. `Statistics<E, D>` — Análisis estadístico
204
+
205
+ Clase abstracta para analizar datos numéricos.
206
+
207
+ #### Subclases:
208
+
209
+ - `NumericStatistics<E>` — Para valores `number`
210
+ - `BigIntStatistics<E>` — Para valores `bigint`
211
+
212
+ ##### Métodos estadísticos comunes:
213
+
214
+ | Método | Descripción | Ejemplo |
215
+ |--------|-------------|---------|
216
+ | `mean()` | Media | `.mean()` |
217
+ | `median()` | Mediana | `.median()` |
218
+ | `mode()` | Moda (valor más frecuente) | `.mode()` |
219
+ | `minimum()` | Mínimo | `.minimum()` |
220
+ | `maximum()` | Máximo | `.maximum()` |
221
+ | `range()` | Rango (máximo - mínimo) | `.range()` |
222
+ | `variance()` | Varianza | `.variance()` |
223
+ | `standardDeviation()` | Desviación estándar | `.standardDeviation()` |
224
+ | `summate()` | Suma total | `.summate()` |
225
+ | `quantile(q)` | Valor en el percentil q (0–1) | `.quantile(0.5)` → mediana |
226
+ | `frequency()` | Frecuencia como Map | `.frequency()` |
227
+
228
+ ---
229
+
230
+ ## 🧪 Ejemplo completo
231
+
232
+ ```typescript
233
+ import { from, toUnordered, toOrdered, sorted, NumericStatistics } from 'semantic-typescript';
234
+
235
+ // Datos de ejemplo
236
+ const numbers = from([10, 2, 8, 4, 5, 6]);
237
+
238
+ // 🚀 Más rápido: sin ordenar
239
+ const fastest = numbers.toUnordered();
240
+ console.log(fastest.toArray()); // Ej: [10, 2, 8, 4, 5, 6] (orden original)
241
+
242
+ // 🔢 Orden natural
243
+ const ordered = numbers.sorted();
244
+ console.log(ordered.toArray()); // [2, 4, 5, 6, 8, 10]
245
+
246
+ // 📊 Estadísticas
247
+ const stats = new NumericStatistics(numbers);
248
+ console.log('Media:', stats.mean());
249
+ console.log('Mediana:', stats.median());
250
+ console.log('Moda:', stats.mode());
251
+ console.log('Rango:', stats.range());
252
+ console.log('Desviación estándar:', stats.standardDeviation());
253
+ ```
254
+
255
+ ---
256
+
257
+ ## 🛠️ Funciones útiles
258
+
259
+ La librería también exporta varias **guardas de tipo (type guards)** y **herramientas de comparación**:
260
+
261
+ | Función | Propósito |
262
+ |--------|-----------|
263
+ | `isString(x)` | Guarda de tipo para `string` |
264
+ | `isNumber(x)` | Guarda de tipo para `number` |
265
+ | `isBoolean(x)` | Guarda de tipo para `boolean` |
266
+ | `isIterable(x)` | Comprueba si un objeto es iterable |
267
+ | `useCompare(a, b)` | Función de comparación universal |
268
+ | `useRandom(x)` | Generador de números aleatorios (divertido) |
269
+
270
+ ---
271
+
272
+ ## 🧩 Avanzado: Generadores personalizados y ventanas
273
+
274
+ Puedes crear **generadores personalizados** para flujos controlados o infinitos:
275
+
276
+ ```typescript
277
+ const gen = (accept: BiConsumer<number, bigint>, interrupt: Predicate<number>) => {
278
+ for (let i = 0; i < 10; i++) {
279
+ accept(i, BigInt(i));
280
+ if (i === 5) interrupt(i);
281
+ }
282
+ };
283
+
284
+ const s = new Semantic(gen);
285
+ ```
286
+
287
+ O usar **ventanas deslizantes (sliding windows)**:
288
+
289
+ ```typescript
290
+ const windowed = ordered.slide(3n, 2n); // Ventanas de tamaño 3, salto de 2
291
+ ```
292
+
293
+ ---
294
+
295
+ ## 📄 Licencia
296
+
297
+ Este proyecto está bajo la licencia **MIT** — libre para uso comercial y personal.
298
+
299
+ ---
300
+
301
+ ## 🙌 Contribuir
302
+
303
+ ¡Pull requests, issues y sugerencias son bienvenidos!
304
+
305
+ ---
306
+
307
+ ## 🚀 Resumen rápido
308
+
309
+ | Tarea | Método |
310
+ |-------|--------|
311
+ | Manejar nulos con seguridad | `Optional<T>` |
312
+ | Crear un flujo | `from([...])`, `range()`, `fill()` |
313
+ | Transformar datos | `map()`, `filter()` |
314
+ | Ordenar datos | `sorted()`, `toOrdered()` |
315
+ | Sin ordenar (más rápido) | `toUnordered()` ✅ |
316
+ | Agrupar / Agregar | `toMap()`, `group()`, `Collector` |
317
+ | Estadísticas | `NumericStatistics`, `mean()`, `median()`, etc. |
318
+
319
+ ---
320
+
321
+ ## 🔗 Enlaces
322
+
323
+ - 📦 npm: https://www.npmjs.com/package/semantic-typescript
324
+ - 🐙 GitHub: https://github.com/eloyhere/semantic-typescript
325
+ - 📘 Documentación: Ver código fuente / definiciones de tipo
326
+
327
+ ---
328
+
329
+ **Disfruta del procesamiento de datos funcional, seguro y compuesto en TypeScript.** 🚀
330
+
331
+ ---
332
+
333
+ ✅ **Recuerda:**
334
+ - `toUnordered()` → **Sin ordenar, más rápido**
335
+ - Los demás (`sorted()`, `toOrdered()`, etc.) → **Ordenan los datos**
package/readme.fr.md ADDED
@@ -0,0 +1,335 @@
1
+ # 📘 semantic-typescript
2
+
3
+ Une bibliothèque TypeScript puissante et typée en toute sécurité, conçue pour le **traitement sémantique de données**.
4
+ Elle fournit des constructions fonctionnelles composites pour travailler avec des collections, des flux et des séquences — avec prise en charge du tri, du filtrage, du regroupement, des statistiques et bien plus encore.
5
+
6
+ Que vous traitiez des **données ordonnées ou non ordonnées**, effectuiez des **analyses statistiques**, ou que vous souhaitiez simplement **chaîner des opérations de manière fluide**, cette bibliothèque est faite pour vous.
7
+
8
+ ---
9
+
10
+ ## 🧩 Caractéristiques
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
25
+
26
+ ```bash
27
+ npm install semantic-typescript
28
+ ```
29
+
30
+ ---
31
+
32
+ ## 🧠 Concepts clés
33
+
34
+ ### 1. `Optional<T>` — Gestion sûre des valeurs nulles
35
+
36
+ Un conteneur monadique pour des valeurs pouvant être `null` ou `undefined`.
37
+
38
+ #### Méthodes :
39
+
40
+ | Méthode | Description | Exemple |
41
+ |--------|-------------|---------|
42
+ | `of(value)` | Envelopper une valeur (peut être nulle) | `Optional.of(null)` |
43
+ | `ofNullable(v)` | Envelopper, autorise les valeurs nulles | `Optional.ofNullable(someVar)` |
44
+ | `ofNonNull(v)` | Envelopper, lève une erreur si null/undefined | `Optional.ofNonNull(5)` |
45
+ | `get()` | Obtenir la valeur (ou lever une exception si vide) | `opt.get()` |
46
+ | `getOrDefault(d)` | Obtenir la valeur ou une valeur par défaut | `opt.getOrDefault(0)` |
47
+ | `ifPresent(fn)` | Exécuter un effet de bord si la valeur existe | `opt.ifPresent(x => console.log(x))` |
48
+ | `map(fn)` | Transformer la valeur si elle existe | `opt.map(x => x + 1)` |
49
+ | `filter(fn)` | Conserver la valeur seulement si le prédicat est vrai | `opt.filter(x => x > 0)` |
50
+ | `isEmpty()` | Vérifie si la valeur est absente | `opt.isEmpty()` |
51
+ | `isPresent()` | Vérifie si une valeur est présente | `opt.isPresent()` |
52
+
53
+ #### Exemple :
54
+
55
+ ```typescript
56
+ import { Optional } from 'semantic-typescript';
57
+
58
+ const value: number | null = Math.random() > 0.5 ? 10 : null;
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
68
+ ```
69
+
70
+ ---
71
+
72
+ ### 2. `Semantic<E>` — Flux de données paresseux
73
+
74
+ Un **flux séquentiel paresseux et composite**. Similaire aux Java Streams ou aux Kotlin Sequences.
75
+
76
+ Créez un `Semantic` à l’aide d’assistants comme `from()`, `range()`, `iterate()` ou `fill()`.
77
+
78
+ #### Créateurs :
79
+
80
+ | Fonction | Description | Exemple |
81
+ |----------|-------------|---------|
82
+ | `from(iterable)` | Créer à partir d’un Array, Set, Iterable | `from([1, 2, 3])` |
83
+ | `range(start, end, step?)` | Générer une plage de nombres | `range(0, 5)` → 0,1,2,3,4 |
84
+ | `fill(element, count)` | Répéter un élément N fois | `fill('a', 3n)` |
85
+ | `iterate(gen)` | Utiliser une fonction générateur personnalisée | `iterate(genFn)` |
86
+
87
+ #### Opérateurs courants :
88
+
89
+ | Méthode | Description | Exemple |
90
+ |--------|-------------|---------|
91
+ | `map(fn)` | Transformer chaque élément | `.map(x => x * 2)` |
92
+ | `filter(fn)` | Conserver les éléments répondant au prédicat | `.filter(x => x > 10)` |
93
+ | `limit(n)` | Limiter aux N premiers éléments | `.limit(5)` |
94
+ | `skip(n)` | Ignorer les N premiers éléments | `.skip(2)` |
95
+ | `distinct()` | Supprimer les doublons (utilise Set par défaut) | `.distinct()` |
96
+ | `sorted()` | Trier les éléments (ordre naturel) | `.sorted()` |
97
+ | `sorted(comparator)` | Trier avec un comparateur personnalisé | `.sorted((a, b) => a - b)` |
98
+ | `toOrdered()` | Trier et retourner un `OrderedCollectable` | `.toOrdered()` |
99
+ | `toUnordered()` | **Pas de tri** — le plus rapide | `.toUnordered()` ✅ |
100
+ | `collect(collector)` | Aggréger avec un `Collector` | `.collect(Collector.full(...))` |
101
+ | `toArray()` | Convertir en tableau | `.toArray()` |
102
+ | `toSet()` | Convertir en Set | `.toSet()` |
103
+ | `toMap(keyFn, valFn)` | Convertir en Map | `.toMap(x => x.id, x => x)` |
104
+
105
+ ---
106
+
107
+ ### 3. `toUnordered()` — 🚀 Le plus rapide, sans tri
108
+
109
+ Si vous **n’avez pas besoin d’ordre** et que vous souhaitez les **meilleures performances possibles**, utilisez :
110
+
111
+ ```typescript
112
+ const fastest = semanticStream.toUnordered();
113
+ ```
114
+
115
+ 🔥 **Aucun algorithme de tri n’est appliqué.**
116
+ Parfait lorsque l’ordre n’a pas d’importance et que la vitesse est cruciale.
117
+
118
+ ---
119
+
120
+ ### 4. `toOrdered()` et `sorted()` — Résultats triés
121
+
122
+ Si vous avez besoin d’un **résultat trié**, utilisez :
123
+
124
+ ```typescript
125
+ const ordered = semanticStream.sorted(); // Tri naturel
126
+ const customSorted = semanticStream.sorted((a, b) => a - b); // Comparateur personnalisé
127
+ const orderedCollectable = semanticStream.toOrdered(); // Aussi trié
128
+ ```
129
+
130
+ ⚠️ Ces méthodes **trient les éléments**, en utilisant l’ordre naturel ou un comparateur fourni.
131
+
132
+ ---
133
+
134
+ ### 5. `Collector<E, A, R>` — Agrégation de données
135
+
136
+ Les collecteurs vous permettent de **réduire un flux en une structure unique ou complexe**.
137
+
138
+ Des factories statiques sont disponibles :
139
+
140
+ ```typescript
141
+ Collector.full(identity, accumulator, finisher)
142
+ Collector.shortable(identity, interruptor, accumulator, finisher)
143
+ ```
144
+
145
+ Mais vous utiliserez surtout les méthodes haut niveau fournies par les classes `Collectable`.
146
+
147
+ ---
148
+
149
+ ### 6. `Collectable<E>` (classe abstraite)
150
+
151
+ Classe de base pour :
152
+
153
+ - `OrderedCollectable<E>` — Résultats triés
154
+ - `UnorderedCollectable<E>` — Pas de tri, le plus rapide
155
+ - `WindowCollectable<E>` — Fenêtres glissantes
156
+ - `Statistics<E, D>` — Statistiques agrégées
157
+
158
+ #### Méthodes communes (via héritage) :
159
+
160
+ | Méthode | Description | Exemple |
161
+ |--------|-------------|---------|
162
+ | `count()` | Compter les éléments | `.count()` |
163
+ | `toArray()` | Convertir en tableau | `.toArray()` |
164
+ | `toSet()` | Convertir en Set | `.toSet()` |
165
+ | `toMap(k, v)` | Convertir en Map | `.toMap(x => x.id, x => x)` |
166
+ | `group(k)` | Regrouper par clé | `.group(x => x.category)` |
167
+ | `findAny()` | Trouver un élément quelconque (Optional) | `.findAny()` |
168
+ | `findFirst()` | Trouver le premier élément (Optional) | `.findFirst()` |
169
+ | `reduce(...)` | Réduction personnalisée | `.reduce((a,b) => a + b, 0)` |
170
+
171
+ ---
172
+
173
+ ### 7. `OrderedCollectable<E>` — Données triées
174
+
175
+ Si vous souhaitez que les éléments soient **triés automatiquement**, utilisez cette classe.
176
+
177
+ Elle accepte un **comparateur personnalisé** ou utilise l’ordre naturel.
178
+
179
+ ```typescript
180
+ const sorted = new OrderedCollectable(stream);
181
+ const customSorted = new OrderedCollectable(stream, (a, b) => b - a);
182
+ ```
183
+
184
+ 🔒 **Le tri est garanti.**
185
+
186
+ ---
187
+
188
+ ### 8. `UnorderedCollectable<E>` — Pas de tri (🚀 Le plus rapide)
189
+
190
+ Si vous **n’avez pas besoin de tri** et que vous voulez les **meilleures performances**, utilisez :
191
+
192
+ ```typescript
193
+ const unordered = new UnorderedCollectable(stream);
194
+ // OU
195
+ const fastest = semanticStream.toUnordered();
196
+ ```
197
+
198
+ ✅ **Aucun algorithme de tri n’est exécuté**
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
231
+
232
+ ```typescript
233
+ import { from, toUnordered, toOrdered, sorted, NumericStatistics } from 'semantic-typescript';
234
+
235
+ // Données d'exemple
236
+ const numbers = from([10, 2, 8, 4, 5, 6]);
237
+
238
+ // 🚀 Le plus rapide : pas de tri
239
+ const fastest = numbers.toUnordered();
240
+ console.log(fastest.toArray()); // ex: [10, 2, 8, 4, 5, 6] (ordre d'origine)
241
+
242
+ // 🔢 Tri naturel
243
+ const ordered = numbers.sorted();
244
+ console.log(ordered.toArray()); // [2, 4, 5, 6, 8, 10]
245
+
246
+ // 📊 Statistiques
247
+ const stats = new NumericStatistics(numbers);
248
+ console.log('Moyenne:', stats.mean());
249
+ console.log('Médiane:', stats.median());
250
+ console.log('Mode:', stats.mode());
251
+ console.log('Écart:', stats.range());
252
+ console.log('Écart-type:', stats.standardDeviation());
253
+ ```
254
+
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
+
276
+ ```typescript
277
+ const gen = (accept: BiConsumer<number, bigint>, interrupt: Predicate<number>) => {
278
+ for (let i = 0; i < 10; i++) {
279
+ accept(i, BigInt(i));
280
+ if (i === 5) interrupt(i);
281
+ }
282
+ };
283
+
284
+ const s = new Semantic(gen);
285
+ ```
286
+
287
+ Ou utiliser des **fenêtres glissantes** :
288
+
289
+ ```typescript
290
+ const windowed = ordered.slide(3n, 2n); // fenêtres de taille 3, pas de 2
291
+ ```
292
+
293
+ ---
294
+
295
+ ## 📄 Licence
296
+
297
+ Ce projet est sous **licence MIT** — libre pour un usage commercial ou personnel.
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
322
+
323
+ - 📦 npm: https://www.npmjs.com/package/semantic-typescript
324
+ - 🐙 GitHub: https://github.com/eloyhere/semantic-typescript
325
+ - 📘 Documentation : voir le code source / définitions de type
326
+
327
+ ---
328
+
329
+ **Profitez d’un traitement de données fonctionnel, typé et composable en TypeScript.** 🚀
330
+
331
+ ---
332
+
333
+ ✅ **À retenir :**
334
+ - `toUnordered()` → **Pas de tri, le plus rapide**
335
+ - Les autres (`sorted()`, `toOrdered()`, etc.) → **Tri des données**