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.es.md
CHANGED
|
@@ -1,335 +1,428 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Biblioteca de Procesamiento de Flujos Semantic-TypeScript
|
|
2
2
|
|
|
3
|
-
|
|
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.
|
|
3
|
+
## Introducción
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
Semantic-TypeScript es una biblioteca moderna de procesamiento de flujos inspirada en JavaScript GeneratorFunction, Java Stream y MySQL Index. El diseño central de la biblioteca se basa en la construcción de pipelines eficientes de procesamiento de datos utilizando índices de datos, proporcionando a los desarrolladores frontend una experiencia de operación de flujos con seguridad de tipos y estilo funcional.
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
A diferencia del procesamiento sincrónico tradicional, Semantic adopta un modo de procesamiento asincrónico. Al crear flujos de datos, el momento en que el terminal recibe los datos depende completamente de cuándo la fuente ascendente llama a las funciones de callback `accept` e `interrupt`. Este diseño permite que la biblioteca maneje elegantemente flujos de datos en tiempo real, conjuntos de datos grandes y fuentes de datos asincrónicas.
|
|
9
8
|
|
|
10
|
-
##
|
|
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
|
|
9
|
+
## Instalación
|
|
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
|
+
## Tipos Básicos
|
|
16
|
+
|
|
17
|
+
| Tipo | Descripción |
|
|
18
|
+
|------|-------------|
|
|
19
|
+
| `Invalid<T>` | Tipo que extiende null o undefined |
|
|
20
|
+
| `Valid<T>` | Tipo que excluye null y undefined |
|
|
21
|
+
| `MaybeInvalid<T>` | Tipo que puede ser null o undefined |
|
|
22
|
+
| `Primitive` | Colección de tipos primitivos |
|
|
23
|
+
| `MaybePrimitive<T>` | Tipo que puede ser un primitivo |
|
|
24
|
+
| `OptionalSymbol` | Identificador simbólico para la clase Optional |
|
|
25
|
+
| `SemanticSymbol` | Identificador simbólico para la clase Semantic |
|
|
26
|
+
| `CollectorsSymbol` | Identificador simbólico para la clase Collector |
|
|
27
|
+
| `CollectableSymbol` | Identificador simbólico para la clase Collectable |
|
|
28
|
+
| `OrderedCollectableSymbol` | Identificador simbólico para la clase OrderedCollectable |
|
|
29
|
+
| `WindowCollectableSymbol` | Identificador simbólico para la clase WindowCollectable |
|
|
30
|
+
| `StatisticsSymbol` | Identificador simbólico para la clase Statistics |
|
|
31
|
+
| `NumericStatisticsSymbol` | Identificador simbólico para la clase NumericStatistics |
|
|
32
|
+
| `BigIntStatisticsSymbol` | Identificador simbólico para la clase BigIntStatistics |
|
|
33
|
+
| `UnorderedCollectableSymbol` | Identificador simbólico para la clase UnorderedCollectable |
|
|
34
|
+
| `Runnable` | Función sin parámetros ni valor de retorno |
|
|
35
|
+
| `Supplier<R>` | Función sin parámetros que retorna R |
|
|
36
|
+
| `Functional<T, R>` | Función de transformación de un parámetro |
|
|
37
|
+
| `Predicate<T>` | Función de predicado de un parámetro |
|
|
38
|
+
| `BiFunctional<T, U, R>` | Función de transformación de dos parámetros |
|
|
39
|
+
| `BiPredicate<T, U>` | Función de predicado de dos parámetros |
|
|
40
|
+
| `Comparator<T>` | Función de comparación |
|
|
41
|
+
| `TriFunctional<T, U, V, R>` | Función de transformación de tres parámetros |
|
|
42
|
+
| `Consumer<T>` | Función consumidora de un parámetro |
|
|
43
|
+
| `BiConsumer<T, U>` | Función consumidora de dos parámetros |
|
|
44
|
+
| `TriConsumer<T, U, V>` | Función consumidora de tres parámetros |
|
|
45
|
+
| `Generator<T>` | Función generadora |
|
|
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 o 0
|
|
48
|
+
// Ejemplos de uso de tipos
|
|
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
|
+
## Guardias de Tipo
|
|
55
|
+
|
|
56
|
+
| Función | Descripción | Complejidad Temporal | Complejidad Espacial |
|
|
57
|
+
|---------|-------------|---------------------|---------------------|
|
|
58
|
+
| `validate<T>(t: MaybeInvalid<T>): t is T` | Valida que el valor no sea null o undefined | O(1) | O(1) |
|
|
59
|
+
| `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | Valida que el valor sea null o undefined | O(1) | O(1) |
|
|
60
|
+
| `isBoolean(t: unknown): t is boolean` | Verifica si es booleano | O(1) | O(1) |
|
|
61
|
+
| `isString(t: unknown): t is string` | Verifica si es string | O(1) | O(1) |
|
|
62
|
+
| `isNumber(t: unknown): t is number` | Verifica si es número | O(1) | O(1) |
|
|
63
|
+
| `isFunction(t: unknown): t is Function` | Verifica si es función | O(1) | O(1) |
|
|
64
|
+
| `isObject(t: unknown): t is object` | Verifica si es objeto | O(1) | O(1) |
|
|
65
|
+
| `isSymbol(t: unknown): t is symbol` | Verifica si es símbolo | O(1) | O(1) |
|
|
66
|
+
| `isBigint(t: unknown): t is bigint` | Verifica si es BigInt | O(1) | O(1) |
|
|
67
|
+
| `isPrimitive(t: unknown): t is Primitive` | Verifica si es tipo primitivo | O(1) | O(1) |
|
|
68
|
+
| `isIterable(t: unknown): t is Iterable<unknown>` | Verifica si es iterable | O(1) | O(1) |
|
|
69
|
+
| `isOptional(t: unknown): t is Optional<unknown>` | Verifica si es instancia de Optional | O(1) | O(1) |
|
|
70
|
+
| `isSemantic(t: unknown): t is Semantic<unknown>` | Verifica si es instancia de Semantic | O(1) | O(1) |
|
|
71
|
+
| `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Verifica si es instancia de Collector | O(1) | O(1) |
|
|
72
|
+
| `isCollectable(t: unknown): t is Collectable<unknown>` | Verifica si es instancia de Collectable | O(1) | O(1) |
|
|
73
|
+
| `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | Verifica si es instancia de OrderedCollectable | O(1) | O(1) |
|
|
74
|
+
| `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | Verifica si es instancia de WindowCollectable | O(1) | O(1) |
|
|
75
|
+
| `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | Verifica si es instancia de UnorderedCollectable | O(1) | O(1) |
|
|
76
|
+
| `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Verifica si es instancia de Statistics | O(1) | O(1) |
|
|
77
|
+
| `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | Verifica si es instancia de NumericStatistics | O(1) | O(1) |
|
|
78
|
+
| `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | Verifica si es instancia de BigIntStatistics | O(1) | O(1) |
|
|
71
79
|
|
|
72
|
-
|
|
80
|
+
```typescript
|
|
81
|
+
// Ejemplos de uso de guardias de tipo
|
|
82
|
+
const value: unknown = "hello";
|
|
73
83
|
|
|
74
|
-
|
|
84
|
+
if (isString(value)) {
|
|
85
|
+
console.log(value.length); // Seguro de tipos, value se infiere como string
|
|
86
|
+
}
|
|
75
87
|
|
|
76
|
-
|
|
88
|
+
if (isOptional(someValue)) {
|
|
89
|
+
someValue.ifPresent(val => console.log(val));
|
|
90
|
+
}
|
|
91
|
+
```
|
|
77
92
|
|
|
78
|
-
|
|
93
|
+
## Funciones de Utilidad
|
|
79
94
|
|
|
80
|
-
| Función | Descripción |
|
|
81
|
-
|
|
82
|
-
| `
|
|
83
|
-
| `
|
|
84
|
-
| `fill(element, count)` | Repetir un elemento N veces | `fill('a', 3n)` |
|
|
85
|
-
| `iterate(gen)` | Usar una función generadora personalizada | `iterate(genFn)` |
|
|
95
|
+
| Función | Descripción | Complejidad Temporal | Complejidad Espacial |
|
|
96
|
+
|---------|-------------|---------------------|---------------------|
|
|
97
|
+
| `useCompare<T>(t1: T, t2: T): number` | Función de comparación universal | O(1) | O(1) |
|
|
98
|
+
| `useRandom<T = number \| bigint>(index: T): T` | Generador de números pseudoaleatorios | O(log n) | O(1) |
|
|
86
99
|
|
|
87
|
-
|
|
100
|
+
```typescript
|
|
101
|
+
// Ejemplos de uso de funciones de utilidad
|
|
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)` | 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)` |
|
|
105
|
+
const randomNum = useRandom(42); // Número aleatorio basado en semilla
|
|
106
|
+
const randomBigInt = useRandom(1000n); // Número BigInt aleatorio
|
|
107
|
+
```
|
|
104
108
|
|
|
105
|
-
|
|
109
|
+
## Métodos de Fábrica
|
|
106
110
|
|
|
107
|
-
###
|
|
111
|
+
### Métodos de Fábrica de Optional
|
|
108
112
|
|
|
109
|
-
|
|
113
|
+
| Método | Descripción | Complejidad Temporal | Complejidad Espacial |
|
|
114
|
+
|--------|-------------|---------------------|---------------------|
|
|
115
|
+
| `Optional.empty<T>()` | Crea un Optional vacío | O(1) | O(1) |
|
|
116
|
+
| `Optional.of<T>(value)` | Crea un Optional con valor | O(1) | O(1) |
|
|
117
|
+
| `Optional.ofNullable<T>(value)` | Crea un Optional que puede ser nulo | O(1) | O(1) |
|
|
118
|
+
| `Optional.ofNonNull<T>(value)` | Crea un Optional no nulo | O(1) | O(1) |
|
|
110
119
|
|
|
111
120
|
```typescript
|
|
112
|
-
|
|
121
|
+
// Ejemplos de uso de 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)); // Output 42
|
|
128
|
+
console.log(emptyOpt.orElse(100)); // Output 100
|
|
113
129
|
```
|
|
114
130
|
|
|
115
|
-
|
|
116
|
-
Ideal cuando el orden no importa y la velocidad es prioritaria.
|
|
117
|
-
|
|
118
|
-
---
|
|
131
|
+
### Métodos de Fábrica de Collector
|
|
119
132
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
133
|
+
| Método | Descripción | Complejidad Temporal | Complejidad Espacial |
|
|
134
|
+
|--------|-------------|---------------------|---------------------|
|
|
135
|
+
| `Collector.full(identity, accumulator, finisher)` | Crea un colector completo | O(1) | O(1) |
|
|
136
|
+
| `Collector.shortable(identity, interruptor, accumulator, finisher)` | Crea un colector interrumpible | O(1) | O(1) |
|
|
123
137
|
|
|
124
138
|
```typescript
|
|
125
|
-
|
|
126
|
-
const
|
|
127
|
-
|
|
139
|
+
// Ejemplos de uso 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étodos de fábrica de Semantic
|
|
133
151
|
|
|
134
|
-
|
|
152
|
+
| Método | Descripción | Complejidad temporal | Complejidad espacial |
|
|
153
|
+
|--------|-------------|----------------------|----------------------|
|
|
154
|
+
| `blob(blob, chunkSize)` | Crea flujo desde Blob | O(n) | O(chunkSize) |
|
|
155
|
+
| `empty<E>()` | Crea flujo vacío | O(1) | O(1) |
|
|
156
|
+
| `fill<E>(element, count)` | Crea flujo lleno | O(n) | O(1) |
|
|
157
|
+
| `from<E>(iterable)` | Crea flujo desde objeto iterable | O(1) | O(1) |
|
|
158
|
+
| `interval(period, delay?)` | Crea flujo de intervalo regular | O(1)* | O(1) |
|
|
159
|
+
| `iterate<E>(generator)` | Crea flujo desde generador | O(1) | O(1) |
|
|
160
|
+
| `range(start, end, step)` | Crea flujo de rango numérico | O(n) | O(1) |
|
|
161
|
+
| `websocket(websocket)` | Crea flujo desde WebSocket | O(1) | O(1) |
|
|
135
162
|
|
|
136
|
-
|
|
163
|
+
```typescript
|
|
164
|
+
// Ejemplo de uso de métodos de fábrica de Semantic
|
|
165
|
+
|
|
166
|
+
// Crear flujo desde Blob (lectura por fragmentos)
|
|
167
|
+
blob(someBlob, 1024n)
|
|
168
|
+
.toUnordered()
|
|
169
|
+
.write(WritableStream)
|
|
170
|
+
.then(callback) // Escritura de flujo exitosa
|
|
171
|
+
.catch(writeFi); // Escritura de flujo fallida
|
|
172
|
+
|
|
173
|
+
// Crear flujo vacío que no se ejecutará hasta concatenarse con otros flujos
|
|
174
|
+
empty<string>()
|
|
175
|
+
.toUnordered()
|
|
176
|
+
.join(); //[]
|
|
177
|
+
|
|
178
|
+
// Crear flujo lleno
|
|
179
|
+
const filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
180
|
+
|
|
181
|
+
// Crear flujo temporal con retraso inicial de 2 segundos y ciclo de 5 segundos,
|
|
182
|
+
// implementado mediante mecanismo de temporizador, posibles desviaciones de tiempo
|
|
183
|
+
// debido a limitaciones de programación del sistema.
|
|
184
|
+
const intervalStream = interval(5000, 2000);
|
|
185
|
+
|
|
186
|
+
// Crear flujo desde objeto iterable
|
|
187
|
+
const numberStream = from([1, 2, 3, 4, 5]);
|
|
188
|
+
const stringStream = from(new Set(["Alex", "Bob"]));
|
|
189
|
+
|
|
190
|
+
// Crear flujo de rango
|
|
191
|
+
const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
192
|
+
|
|
193
|
+
// Flujo de eventos WebSocket
|
|
194
|
+
const ws = new WebSocket("ws://localhost:8080");
|
|
195
|
+
websocket(ws)
|
|
196
|
+
.filter((event)=> event.type === "message") // Solo monitorear eventos de mensaje
|
|
197
|
+
.toUnordered() // Para eventos normalmente sin ordenar
|
|
198
|
+
.forEach((event)=> receive(event)); // Recibir mensajes
|
|
199
|
+
```
|
|
137
200
|
|
|
138
|
-
|
|
201
|
+
## Métodos de Clase Semantic
|
|
202
|
+
|
|
203
|
+
| Método | Descripción | Complejidad Temporal | Complejidad Espacial |
|
|
204
|
+
|--------|-------------|---------------------|---------------------|
|
|
205
|
+
| `concat(other)` | Concatena dos flujos | O(n) | O(1) |
|
|
206
|
+
| `distinct()` | Elimina duplicados | O(n) | O(n) |
|
|
207
|
+
| `distinct(comparator)` | Elimina duplicados con comparador | O(n²) | O(n) |
|
|
208
|
+
| `dropWhile(predicate)` | Descarta elementos que cumplen condición | O(n) | O(1) |
|
|
209
|
+
| `filter(predicate)` | Filtra elementos | O(n) | O(1) |
|
|
210
|
+
| `flat(mapper)` | Aplanamiento de mapeo | O(n × m) | O(1) |
|
|
211
|
+
| `flatMap(mapper)` | Aplanamiento a nuevo tipo | O(n × m) | O(1) |
|
|
212
|
+
| `limit(n)` | Limita cantidad de elementos | O(n) | O(1) |
|
|
213
|
+
| `map(mapper)` | Transformación de mapeo | O(n) | O(1) |
|
|
214
|
+
| `peek(consumer)` | Inspecciona elementos | O(n) | O(1) |
|
|
215
|
+
| `redirect(redirector)` | Redirección de índices | O(n) | O(1) |
|
|
216
|
+
| `reverse()` | Revierte flujo | O(n) | O(1) |
|
|
217
|
+
| `shuffle()` | Mezcla aleatoria | O(n) | O(1) |
|
|
218
|
+
| `shuffle(mapper)` | Mezcla con mapeador | O(n) | O(1) |
|
|
219
|
+
| `skip(n)` | Salta primeros n elementos | O(n) | O(1) |
|
|
220
|
+
| `sorted()` | Ordena | O(n log n) | O(n) |
|
|
221
|
+
| `sorted(comparator)` | Ordena con comparador | O(n log n) | O(n) |
|
|
222
|
+
| `sub(start, end)` | Obtiene subflujo | O(n) | O(1) |
|
|
223
|
+
| `takeWhile(predicate)` | Toma elementos que cumplen condición | O(n) | O(1) |
|
|
224
|
+
| `translate(offset)` | Traslación de índices | O(n) | O(1) |
|
|
225
|
+
| `translate(translator)` | Traslación con traductor | O(n) | O(1) |
|
|
139
226
|
|
|
140
227
|
```typescript
|
|
141
|
-
|
|
142
|
-
|
|
228
|
+
// Ejemplos de operaciones Semantic
|
|
229
|
+
const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
230
|
+
.filter(n => n % 2 === 0) // Filtra números pares
|
|
231
|
+
.map(n => n * 2) // Multiplica por 2
|
|
232
|
+
.skip(1) // Salta el primero
|
|
233
|
+
.limit(3) // Limita a 3 elementos
|
|
234
|
+
.toArray(); // Convierte a array
|
|
235
|
+
// Resultado: [8, 12, 20]
|
|
236
|
+
|
|
237
|
+
// Ejemplo de operación compleja
|
|
238
|
+
const complexResult = range(1, 100, 1)
|
|
239
|
+
.flatMap(n => from([n, n * 2])) // Mapea cada elemento a dos elementos
|
|
240
|
+
.distinct() // Elimina duplicados
|
|
241
|
+
.shuffle() // Mezcla aleatoriamente
|
|
242
|
+
.takeWhile(n => n < 50) // Toma elementos < 50
|
|
243
|
+
.toOrdered() // Convierte a colector ordenado
|
|
244
|
+
.toArray(); // Convierte a array
|
|
143
245
|
```
|
|
144
246
|
|
|
145
|
-
|
|
247
|
+
## Métodos de Transformación de Colectores
|
|
146
248
|
|
|
147
|
-
|
|
249
|
+
| Método | Descripción | Complejidad Temporal | Complejidad Espacial |
|
|
250
|
+
|--------|-------------|---------------------|---------------------|
|
|
251
|
+
| `toUnoredered()` | Convierte a colector no ordenado (prioridad rendimiento) | O(1) | O(1) |
|
|
252
|
+
| `toOrdered()` | Convierte a colector ordenado | O(1) | O(1) |
|
|
253
|
+
| `sorted()` | Ordena y convierte a colector ordenado | O(n log n) | O(n) |
|
|
254
|
+
| `toWindow()` | Convierte a colector de ventana | O(1) | O(1) |
|
|
255
|
+
| `toNumericStatistics()` | Convierte a estadísticas numéricas | O(1) | O(1) |
|
|
256
|
+
| `toBigintStatistics()` | Convierte a estadísticas BigInt | O(1) | O(1) |
|
|
148
257
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
258
|
+
```typescript
|
|
259
|
+
// Ejemplos de transformación de colectores
|
|
260
|
+
const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
|
|
152
261
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
262
|
+
// Prioridad rendimiento: Usar colector no ordenado
|
|
263
|
+
const unordered = numbers
|
|
264
|
+
.filter(n => n > 3)
|
|
265
|
+
.toUnoredered();
|
|
157
266
|
|
|
158
|
-
|
|
267
|
+
// Necesita orden: Usar colector ordenado
|
|
268
|
+
const ordered = numbers.sorted();
|
|
159
269
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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)` |
|
|
270
|
+
// Análisis estadístico: Usar colector estadístico
|
|
271
|
+
const stats = numbers
|
|
272
|
+
.toNumericStatistics();
|
|
170
273
|
|
|
171
|
-
|
|
274
|
+
console.log(stats.mean()); // Promedio
|
|
275
|
+
console.log(stats.median()); // Mediana
|
|
276
|
+
console.log(stats.standardDeviation()); // Desviación estándar
|
|
172
277
|
|
|
173
|
-
|
|
278
|
+
// Operaciones de ventana
|
|
279
|
+
const windowed = numbers
|
|
280
|
+
.toWindow()
|
|
281
|
+
.tumble(3n); // Ventana de 3 elementos
|
|
174
282
|
|
|
175
|
-
|
|
283
|
+
windowed.forEach(window => {
|
|
284
|
+
console.log(window.toArray()); // Contenido de cada ventana
|
|
285
|
+
});
|
|
286
|
+
```
|
|
176
287
|
|
|
177
|
-
|
|
288
|
+
## Métodos de Recolección de Collectable
|
|
289
|
+
|
|
290
|
+
| Método | Descripción | Complejidad Temporal | Complejidad Espacial |
|
|
291
|
+
|--------|-------------|---------------------|---------------------|
|
|
292
|
+
| `anyMatch(predicate)` | Verifica si existe coincidencia | O(n) | O(1) |
|
|
293
|
+
| `allMatch(predicate)` | Verifica si todos coinciden | O(n) | O(1) |
|
|
294
|
+
| `count()` | Cuenta elementos | O(n) | O(1) |
|
|
295
|
+
| `isEmpty()` | Verifica si está vacío | O(1) | O(1) |
|
|
296
|
+
| `findAny()` | Encuentra cualquier elemento | O(n) | O(1) |
|
|
297
|
+
| `findFirst()` | Encuentra primer elemento | O(n) | O(1) |
|
|
298
|
+
| `findLast()` | Encuentra último elemento | O(n) | O(1) |
|
|
299
|
+
| `forEach(action)` | Itera sobre todos los elementos | O(n) | O(1) |
|
|
300
|
+
| `group(classifier)` | Agrupa por clasificador | O(n) | O(n) |
|
|
301
|
+
| `groupBy(keyExtractor, valueExtractor)` | Agrupa por extractores de clave-valor | O(n) | O(n) |
|
|
302
|
+
| `join()` | Concatena a string | O(n) | O(n) |
|
|
303
|
+
| `join(delimiter)` | Concatena con separador | O(n) | O(n) |
|
|
304
|
+
| `nonMatch(predicate)` | Verifica si no hay coincidencias | O(n) | O(1) |
|
|
305
|
+
| `partition(count)` | Particiona por cantidad | O(n) | O(n) |
|
|
306
|
+
| `partitionBy(classifier)` | Particiona por clasificador | O(n) | O(n) |
|
|
307
|
+
| `reduce(accumulator)` | Operación de reducción | O(n) | O(1) |
|
|
308
|
+
| `reduce(identity, accumulator)` | Reducción con valor inicial | O(n) | O(1) |
|
|
309
|
+
| `toArray()` | Convierte a array | O(n) | O(n) |
|
|
310
|
+
| `toMap(keyExtractor, valueExtractor)` | Convierte a Map | O(n) | O(n) |
|
|
311
|
+
| `toSet()` | Convierte a Set | O(n) | O(n) |
|
|
312
|
+
| `write(stream)` | Escribe a stream | O(n) | O(1) |
|
|
178
313
|
|
|
179
314
|
```typescript
|
|
180
|
-
|
|
181
|
-
const
|
|
315
|
+
// Ejemplos de operaciones 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
|
+
// Verificaciones de coincidencia
|
|
321
|
+
console.log(data.anyMatch(n => n > 5)); // true
|
|
322
|
+
console.log(data.allMatch(n => n < 20)); // true
|
|
323
|
+
|
|
324
|
+
// Operaciones de búsqueda
|
|
325
|
+
data.findFirst().ifPresent(n => console.log(n)); // 2
|
|
326
|
+
data.findAny().ifPresent(n => console.log(n)); // Elemento cualquiera
|
|
327
|
+
|
|
328
|
+
// Operaciones de agrupación
|
|
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
|
+
// Operaciones de reducción
|
|
336
|
+
const sum = data.reduce(0, (acc, n) => acc + n); // 30
|
|
337
|
+
|
|
338
|
+
// Operaciones de salida
|
|
339
|
+
data.join(", "); // "2, 4, 6, 8, 10"
|
|
182
340
|
```
|
|
183
341
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
342
|
+
## Métodos de Análisis Estadístico
|
|
343
|
+
|
|
344
|
+
### Métodos de NumericStatistics
|
|
345
|
+
|
|
346
|
+
| Método | Descripción | Complejidad Temporal | Complejidad Espacial |
|
|
347
|
+
|--------|-------------|---------------------|---------------------|
|
|
348
|
+
| `range()` | Rango | O(n) | O(1) |
|
|
349
|
+
| `variance()` | Varianza | O(n) | O(1) |
|
|
350
|
+
| `standardDeviation()` | Desviación estándar | O(n) | O(1) |
|
|
351
|
+
| `mean()` | Media | O(n) | O(1) |
|
|
352
|
+
| `median()` | Mediana | O(n log n) | O(n) |
|
|
353
|
+
| `mode()` | Moda | O(n) | O(n) |
|
|
354
|
+
| `frequency()` | Distribución de frecuencia | O(n) | O(n) |
|
|
355
|
+
| `summate()` | Sumatoria | O(n) | O(1) |
|
|
356
|
+
| `quantile(quantile)` | Cuantil | O(n log n) | O(n) |
|
|
357
|
+
| `interquartileRange()` | Rango intercuartílico | O(n log n) | O(n) |
|
|
358
|
+
| `skewness()` | Sesgo | O(n) | O(1) |
|
|
359
|
+
| `kurtosis()` | Curtosis | O(n) | O(1) |
|
|
191
360
|
|
|
192
361
|
```typescript
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
362
|
+
// Ejemplos de análisis estadístico
|
|
363
|
+
const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
364
|
+
.toNumericStatistics();
|
|
365
|
+
|
|
366
|
+
console.log("Media:", numbers.mean()); // 5.5
|
|
367
|
+
console.log("Mediana:", numbers.median()); // 5.5
|
|
368
|
+
console.log("Desviación estándar:", numbers.standardDeviation()); // ~2.87
|
|
369
|
+
console.log("Suma:", numbers.summate()); // 55
|
|
370
|
+
|
|
371
|
+
// Análisis estadístico con mapeador
|
|
372
|
+
const objects = from([
|
|
373
|
+
{ value: 10 },
|
|
374
|
+
{ value: 20 },
|
|
375
|
+
{ value: 30 }
|
|
376
|
+
]).toNumericStatistics();
|
|
377
|
+
|
|
378
|
+
console.log("Media mapeada:", objects.mean(obj => obj.value)); // 20
|
|
196
379
|
```
|
|
197
380
|
|
|
198
|
-
|
|
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
|
|
381
|
+
## Guía de Selección de Rendimiento
|
|
231
382
|
|
|
383
|
+
### Seleccionar Colector No Ordenado (Prioridad Rendimiento)
|
|
232
384
|
```typescript
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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());
|
|
385
|
+
// Cuando no se necesita garantía de orden
|
|
386
|
+
const highPerformance = data
|
|
387
|
+
.filter(predicate)
|
|
388
|
+
.map(mapper)
|
|
389
|
+
.toUnoredered(); // Mejor rendimiento
|
|
253
390
|
```
|
|
254
391
|
|
|
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
|
-
|
|
392
|
+
### Seleccionar Colector Ordenado (Necesita Orden)
|
|
276
393
|
```typescript
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
}
|
|
282
|
-
};
|
|
283
|
-
|
|
284
|
-
const s = new Semantic(gen);
|
|
394
|
+
// Cuando se debe mantener el orden de elementos
|
|
395
|
+
const ordered = data
|
|
396
|
+
.sorted(comparator) // La ordenación sobrescribe efectos de redirección
|
|
397
|
+
.toOrdered(); // Mantiene orden
|
|
285
398
|
```
|
|
286
399
|
|
|
287
|
-
|
|
288
|
-
|
|
400
|
+
### Seleccionar Colector de Ventana (Operaciones de Ventana)
|
|
289
401
|
```typescript
|
|
290
|
-
|
|
402
|
+
// Cuando se necesitan operaciones de ventana
|
|
403
|
+
const windowed = data
|
|
404
|
+
.toWindow()
|
|
405
|
+
.slide(5n, 2n); // Ventana deslizante
|
|
291
406
|
```
|
|
292
407
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
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
|
|
408
|
+
### Seleccionar Análisis Estadístico (Cálculos Numéricos)
|
|
409
|
+
```typescript
|
|
410
|
+
// Cuando se necesita análisis estadístico
|
|
411
|
+
const stats = data
|
|
412
|
+
.toNumericStatistics(); // Estadísticas numéricas
|
|
322
413
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
414
|
+
const bigIntStats = data
|
|
415
|
+
.toBigintStatistics(); // Estadísticas 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
|
+
## Consideraciones Importantes
|
|
330
422
|
|
|
331
|
-
|
|
423
|
+
1. **Impacto de operaciones de ordenación**: En colectores ordenados, `sorted()` sobrescribe los efectos de `redirect`, `translate`, `shuffle`, `reverse`
|
|
424
|
+
2. **Consideraciones de rendimiento**: Si no se necesita garantía de orden, priorizar `toUnoredered()` para mejor rendimiento
|
|
425
|
+
3. **Uso de memoria**: Las operaciones de ordenación requieren espacio adicional O(n)
|
|
426
|
+
4. **Datos en tiempo real**: Los flujos Semantic son ideales para datos en tiempo real y admiten fuentes de datos asincrónicas
|
|
332
427
|
|
|
333
|
-
|
|
334
|
-
- `toUnordered()` → **Sin ordenar, más rápido**
|
|
335
|
-
- Los demás (`sorted()`, `toOrdered()`, etc.) → **Ordenan los datos**
|
|
428
|
+
Esta biblioteca proporciona a los desarrolladores de TypeScript capacidades potentes y flexibles de procesamiento de flujos, combinando las ventajas de la programación funcional con la seguridad de tipos.
|