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/package.json +1 -1
- package/readme.cn.md +335 -0
- package/readme.de.md +335 -0
- package/readme.es.md +335 -0
- package/readme.fr.md +335 -0
- package/readme.jp.md +335 -0
- package/readme.kr.md +335 -0
- package/readme.md +335 -0
- package/readme.tw.md +335 -0
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**
|