semantic-typescript 0.0.8 → 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 +343 -446
- package/readme.de.md +341 -443
- package/readme.es.md +342 -443
- package/readme.fr.md +345 -446
- package/readme.jp.md +346 -448
- package/readme.kr.md +350 -452
- package/readme.md +345 -448
- package/readme.ru.md +347 -448
- package/readme.tw.md +340 -443
package/readme.es.md
CHANGED
|
@@ -1,529 +1,428 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Biblioteca de Procesamiento de Flujos Semantic-TypeScript
|
|
2
2
|
|
|
3
3
|
## Introducción
|
|
4
4
|
|
|
5
|
-
Semantic-TypeScript es una
|
|
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.
|
|
6
6
|
|
|
7
|
-
A diferencia del procesamiento sincrónico tradicional, Semantic
|
|
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.
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Instalación
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
| **Programación Funcional** | Estructuras de datos inmutables y funciones puras | Código más predecible, más fácil de probar y mantener |
|
|
15
|
-
| **Evaluación Perezosa** | Cálculo bajo demanda, optimización de rendimiento | Alta eficiencia de memoria al procesar grandes conjuntos de datos |
|
|
16
|
-
| **Procesamiento Asíncrono de Flujos** | Flujos de datos asíncronos basados en generadores | Adecuado para datos en tiempo real y escenarios orientados a eventos |
|
|
17
|
-
| **Colectores Multi-Paradigma** | Estrategias de recolección ordenadas, desordenadas y estadísticas | Selección de estrategia óptima basada en diferentes escenarios |
|
|
18
|
-
| **Análisis Estadístico** | Funciones completas integradas de cálculo estadístico | Generación integrada de análisis de datos e informes |
|
|
19
|
-
|
|
20
|
-
## Consideraciones de Rendimiento
|
|
21
|
-
|
|
22
|
-
**Nota Importante**: Los siguientes métodos sacrifican rendimiento para recolectar y ordenar datos, resultando en colecciones de datos ordenadas:
|
|
23
|
-
- `toOrdered()`
|
|
24
|
-
- `toWindow()`
|
|
25
|
-
- `toNumericStatistics()`
|
|
26
|
-
- `toBigIntStatistics()`
|
|
27
|
-
- `sorted()`
|
|
28
|
-
- `sorted(comparator)`
|
|
29
|
-
|
|
30
|
-
Especialmente importante notar: `sorted()` y `sorted(comparator)` anularán los resultados de los siguientes métodos:
|
|
31
|
-
- `redirect(redirector)`
|
|
32
|
-
- `translate(translator)`
|
|
33
|
-
- `shuffle(mapper)`
|
|
34
|
-
|
|
35
|
-
## Métodos de Fábrica
|
|
36
|
-
|
|
37
|
-
### Fábricas de Creación de Flujos
|
|
11
|
+
```bash
|
|
12
|
+
npm install semantic-typescript
|
|
13
|
+
```
|
|
38
14
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
|
42
|
-
|
|
43
|
-
| `
|
|
44
|
-
| `
|
|
45
|
-
| `
|
|
46
|
-
| `
|
|
47
|
-
| `
|
|
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 |
|
|
48
46
|
|
|
49
|
-
**Suplemento de Ejemplo de Código:**
|
|
50
47
|
```typescript
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
// Crear flujo de rango numérico
|
|
57
|
-
const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
58
|
-
|
|
59
|
-
// Llenar con elementos repetidos
|
|
60
|
-
const filledStream = fill("hello", 3n); // "hello", "hello", "hello"
|
|
61
|
-
|
|
62
|
-
// Crear flujo vacío
|
|
63
|
-
const emptyStream = empty<number>();
|
|
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;
|
|
64
52
|
```
|
|
65
53
|
|
|
66
|
-
|
|
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) |
|
|
67
79
|
|
|
68
|
-
| Método | Firma | Descripción | Ejemplo |
|
|
69
|
-
|------|------|------|------|
|
|
70
|
-
| `validate` | `<T>(t: MaybeInvalid<T>) => t is T` | Validar si el valor es válido | `validate(null)` → `false` |
|
|
71
|
-
| `invalidate` | `<T>(t: MaybeInvalid<T>) => t is null\|undefined` | Validar si el valor es inválido | `invalidate(0)` → `false` |
|
|
72
|
-
| `useCompare` | `<T>(t1: T, t2: T) => number` | Función de comparación genérica | `useCompare("a", "b")` → `-1` |
|
|
73
|
-
| `useRandom` | `<T = number\|bigint>(index: T) => T` | Generador de números pseudoaleatorios | `useRandom(5)` → número aleatorio |
|
|
74
|
-
|
|
75
|
-
**Suplemento de Ejemplo de Código:**
|
|
76
80
|
```typescript
|
|
77
|
-
|
|
81
|
+
// Ejemplos de uso de guardias de tipo
|
|
82
|
+
const value: unknown = "hello";
|
|
78
83
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if (validate(data)) {
|
|
82
|
-
console.log(data.toUpperCase()); // Llamada segura porque validate asegura que data no es null
|
|
84
|
+
if (isString(value)) {
|
|
85
|
+
console.log(value.length); // Seguro de tipos, value se infiere como string
|
|
83
86
|
}
|
|
84
87
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
console.log("Datos inválidos"); // Se ejecutará porque invalidate detectó null
|
|
88
|
+
if (isOptional(someValue)) {
|
|
89
|
+
someValue.ifPresent(val => console.log(val));
|
|
88
90
|
}
|
|
89
|
-
|
|
90
|
-
// Comparar valores
|
|
91
|
-
const comparison = useCompare("apple", "banana"); // -1
|
|
92
|
-
|
|
93
|
-
// Generar número aleatorio
|
|
94
|
-
const randomNum = useRandom(42); // Número aleatorio basado en semilla 42
|
|
95
91
|
```
|
|
96
92
|
|
|
97
|
-
##
|
|
98
|
-
|
|
99
|
-
### Optional<T> - Manejo Seguro de Valores Nulos
|
|
93
|
+
## Funciones de Utilidad
|
|
100
94
|
|
|
101
|
-
|
|
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) |
|
|
102
99
|
|
|
103
|
-
| Método | Tipo de Retorno | Descripción | Complejidad Temporal |
|
|
104
|
-
|------|----------|------|------------|
|
|
105
|
-
| `filter(predicate: Predicate<T>)` | `Optional<T>` | Filtrar valores que satisfacen condición | O(1) |
|
|
106
|
-
| `get()` | `T` | Obtener valor, lanza error si está vacío | O(1) |
|
|
107
|
-
| `getOrDefault(defaultValue: T)` | `T` | Obtener valor o valor por defecto | O(1) |
|
|
108
|
-
| `ifPresent(action: Consumer<T>)` | `void` | Ejecutar acción si existe valor | O(1) |
|
|
109
|
-
| `isEmpty()` | `boolean` | Verificar si está vacío | O(1) |
|
|
110
|
-
| `isPresent()` | `boolean` | Verificar si existe valor | O(1) |
|
|
111
|
-
| `map<R>(mapper: Functional<T, R>)` | `Optional<R>` | Mapear y transformar valor | O(1) |
|
|
112
|
-
| `static of<T>(value: MaybeInvalid<T>)` | `Optional<T>` | Crear instancia Optional | O(1) |
|
|
113
|
-
| `static ofNullable<T>(value?)` | `Optional<T>` | Crear Optional nullable | O(1) |
|
|
114
|
-
| `static ofNonNull<T>(value: T)` | `Optional<T>` | Crear Optional no nulo | O(1) |
|
|
115
|
-
|
|
116
|
-
**Suplemento de Ejemplo de Código:**
|
|
117
100
|
```typescript
|
|
118
|
-
|
|
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]
|
|
119
104
|
|
|
120
|
-
//
|
|
121
|
-
const
|
|
105
|
+
const randomNum = useRandom(42); // Número aleatorio basado en semilla
|
|
106
|
+
const randomBigInt = useRandom(1000n); // Número BigInt aleatorio
|
|
107
|
+
```
|
|
122
108
|
|
|
123
|
-
|
|
124
|
-
const result = optionalValue
|
|
125
|
-
.filter(val => val.length > 3) // Filtrar valores más largos que 3
|
|
126
|
-
.map(val => val.toUpperCase()) // Convertir a mayúsculas
|
|
127
|
-
.getOrDefault("default"); // Obtener valor o por defecto
|
|
109
|
+
## Métodos de Fábrica
|
|
128
110
|
|
|
129
|
-
|
|
111
|
+
### Métodos de Fábrica de Optional
|
|
130
112
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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) |
|
|
135
119
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
120
|
+
```typescript
|
|
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
|
|
142
129
|
```
|
|
143
130
|
|
|
144
|
-
###
|
|
145
|
-
|
|
146
|
-
Semantic es la clase principal de procesamiento de flujos, que proporciona operadores ricos de flujos.
|
|
147
|
-
|
|
148
|
-
#### Operaciones de Transformación de Flujos
|
|
149
|
-
|
|
150
|
-
| Método | Tipo de Retorno | Descripción | Impacto en Rendimiento |
|
|
151
|
-
|------|----------|------|----------|
|
|
152
|
-
| `concat(other: Semantic<E>)` | `Semantic<E>` | Concatenar dos flujos | O(n+m) |
|
|
153
|
-
| `distinct()` | `Semantic<E>` | Eliminar duplicados (usando Set) | O(n) |
|
|
154
|
-
| `distinct(comparator)` | `Semantic<E>` | Eliminación de duplicados con comparador personalizado | O(n²) |
|
|
155
|
-
| `dropWhile(predicate)` | `Semantic<E>` | Descartar elementos iniciales que satisfacen condición | O(n) |
|
|
156
|
-
| `filter(predicate)` | `Semantic<E>` | Filtrar elementos | O(n) |
|
|
157
|
-
| `flat(mapper)` | `Semantic<E>` | Aplanar flujos anidados | O(n×m) |
|
|
158
|
-
| `flatMap(mapper)` | `Semantic<R>` | Mapear y aplanar | O(n×m) |
|
|
159
|
-
| `limit(n)` | `Semantic<E>` | Limitar número de elementos | O(n) |
|
|
160
|
-
| `map(mapper)` | `Semantic<R>` | Mapear y transformar elementos | O(n) |
|
|
161
|
-
| `peek(consumer)` | `Semantic<E>` | Ver elementos sin modificación | O(n) |
|
|
162
|
-
| `redirect(redirector)` | `Semantic<E>` | Redirigir índices | O(n) |
|
|
163
|
-
| `reverse()` | `Semantic<E>` | Invertir orden del flujo | O(n) |
|
|
164
|
-
| `shuffle()` | `Semantic<E>` | Barajar orden aleatoriamente | O(n) |
|
|
165
|
-
| `shuffle(mapper)` | `Semantic<E>` | Lógica de barajado personalizada | O(n) |
|
|
166
|
-
| `skip(n)` | `Semantic<E>` | Saltar primeros n elementos | O(n) |
|
|
167
|
-
| `sub(start, end)` | `Semantic<E>` | Obtener subflujo | O(n) |
|
|
168
|
-
| `takeWhile(predicate)` | `Semantic<E>` | Obtener elementos iniciales que satisfacen condición | O(n) |
|
|
169
|
-
| `translate(offset)` | `Semantic<E>` | Traducir índices | O(n) |
|
|
170
|
-
| `translate(translator)` | `Semantic<E>` | Transformación de índices personalizada | O(n) |
|
|
171
|
-
|
|
172
|
-
**Suplemento de Ejemplo de Código:**
|
|
173
|
-
```typescript
|
|
174
|
-
import { from } from 'semantic-typescript';
|
|
131
|
+
### Métodos de Fábrica de Collector
|
|
175
132
|
|
|
176
|
-
|
|
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) |
|
|
177
137
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
138
|
+
```typescript
|
|
139
|
+
// Ejemplos de uso de Collector
|
|
140
|
+
const sumCollector = Collector.full(
|
|
141
|
+
() => 0,
|
|
142
|
+
(sum, num) => sum + num,
|
|
143
|
+
result => result
|
|
144
|
+
);
|
|
185
145
|
|
|
186
|
-
|
|
146
|
+
const numbers = from([1, 2, 3, 4, 5]);
|
|
147
|
+
const total = numbers.toUnoredered().collect(sumCollector); // 15
|
|
187
148
|
```
|
|
188
149
|
|
|
189
|
-
|
|
150
|
+
### Métodos de fábrica de Semantic
|
|
190
151
|
|
|
191
|
-
| Método |
|
|
192
|
-
|
|
193
|
-
| `
|
|
194
|
-
| `
|
|
195
|
-
| `
|
|
196
|
-
| `
|
|
197
|
-
| `
|
|
198
|
-
| `
|
|
199
|
-
| `
|
|
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) |
|
|
200
162
|
|
|
201
|
-
**Suplemento de Ejemplo de Código:**
|
|
202
163
|
```typescript
|
|
203
|
-
|
|
164
|
+
// Ejemplo de uso de métodos de fábrica de Semantic
|
|
204
165
|
|
|
205
|
-
|
|
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
|
|
206
172
|
|
|
207
|
-
//
|
|
208
|
-
|
|
173
|
+
// Crear flujo vacío que no se ejecutará hasta concatenarse con otros flujos
|
|
174
|
+
empty<string>()
|
|
175
|
+
.toUnordered()
|
|
176
|
+
.join(); //[]
|
|
209
177
|
|
|
210
|
-
//
|
|
211
|
-
const
|
|
178
|
+
// Crear flujo lleno
|
|
179
|
+
const filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
212
180
|
|
|
213
|
-
//
|
|
214
|
-
|
|
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);
|
|
215
185
|
|
|
216
|
-
//
|
|
217
|
-
const
|
|
186
|
+
// Crear flujo desde objeto iterable
|
|
187
|
+
const numberStream = from([1, 2, 3, 4, 5]);
|
|
188
|
+
const stringStream = from(new Set(["Alex", "Bob"]));
|
|
218
189
|
|
|
219
|
-
//
|
|
220
|
-
const
|
|
190
|
+
// Crear flujo de rango
|
|
191
|
+
const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
221
192
|
|
|
222
|
-
//
|
|
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
|
|
223
199
|
```
|
|
224
200
|
|
|
225
|
-
|
|
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) |
|
|
226
226
|
|
|
227
|
-
Los colectores se utilizan para agregar datos de flujos en estructuras específicas.
|
|
228
|
-
|
|
229
|
-
| Método | Descripción | Escenario de Uso |
|
|
230
|
-
|------|------|----------|
|
|
231
|
-
| `collect(generator)` | Ejecutar recolección de datos | Operación terminal de flujo |
|
|
232
|
-
| `static full(identity, accumulator, finisher)` | Crear colector completo | Requiere procesamiento completo |
|
|
233
|
-
| `static shortable(identity, interruptor, accumulator, finisher)` | Crear colector interrumpible | Puede terminar temprano |
|
|
234
|
-
|
|
235
|
-
**Suplemento de Ejemplo de Código:**
|
|
236
227
|
```typescript
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
//
|
|
240
|
-
|
|
241
|
-
()
|
|
242
|
-
(
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
//
|
|
247
|
-
const
|
|
248
|
-
|
|
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
|
|
249
245
|
```
|
|
250
246
|
|
|
251
|
-
|
|
247
|
+
## Métodos de Transformación de Colectores
|
|
252
248
|
|
|
253
|
-
|
|
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) |
|
|
254
257
|
|
|
255
|
-
|
|
258
|
+
```typescript
|
|
259
|
+
// Ejemplos de transformación de colectores
|
|
260
|
+
const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
|
|
256
261
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
| `count()` | `bigint` | Estadísticas de conteo de elementos | `count()` → `5n` |
|
|
262
|
-
| `isEmpty()` | `boolean` | Si el flujo está vacío | `isEmpty()` |
|
|
263
|
-
| `findAny()` | `Optional<E>` | Encontrar cualquier elemento | `findAny()` |
|
|
264
|
-
| `findFirst()` | `Optional<E>` | Encontrar primer elemento | `findFirst()` |
|
|
265
|
-
| `findLast()` | `Optional<E>` | Encontrar último elemento | `findLast()` |
|
|
262
|
+
// Prioridad rendimiento: Usar colector no ordenado
|
|
263
|
+
const unordered = numbers
|
|
264
|
+
.filter(n => n > 3)
|
|
265
|
+
.toUnoredered();
|
|
266
266
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
import { from } from 'semantic-typescript';
|
|
267
|
+
// Necesita orden: Usar colector ordenado
|
|
268
|
+
const ordered = numbers.sorted();
|
|
270
269
|
|
|
271
|
-
|
|
270
|
+
// Análisis estadístico: Usar colector estadístico
|
|
271
|
+
const stats = numbers
|
|
272
|
+
.toNumericStatistics();
|
|
273
|
+
|
|
274
|
+
console.log(stats.mean()); // Promedio
|
|
275
|
+
console.log(stats.median()); // Mediana
|
|
276
|
+
console.log(stats.standardDeviation()); // Desviación estándar
|
|
272
277
|
|
|
273
|
-
//
|
|
274
|
-
const
|
|
278
|
+
// Operaciones de ventana
|
|
279
|
+
const windowed = numbers
|
|
280
|
+
.toWindow()
|
|
281
|
+
.tumble(3n); // Ventana de 3 elementos
|
|
275
282
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
const count = collectable.count(); // 5n
|
|
280
|
-
const isEmpty = collectable.isEmpty(); // false
|
|
281
|
-
const firstElement = collectable.findFirst(); // Optional.of(1)
|
|
282
|
-
const anyElement = collectable.findAny(); // Cualquier elemento
|
|
283
|
+
windowed.forEach(window => {
|
|
284
|
+
console.log(window.toArray()); // Contenido de cada ventana
|
|
285
|
+
});
|
|
283
286
|
```
|
|
284
287
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
| Método |
|
|
288
|
-
|
|
289
|
-
| `
|
|
290
|
-
| `
|
|
291
|
-
| `
|
|
292
|
-
| `
|
|
293
|
-
| `
|
|
294
|
-
| `
|
|
295
|
-
| `
|
|
296
|
-
| `
|
|
297
|
-
| `
|
|
298
|
-
| `
|
|
299
|
-
| `
|
|
300
|
-
|
|
301
|
-
|
|
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) |
|
|
313
|
+
|
|
302
314
|
```typescript
|
|
303
|
-
|
|
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();
|
|
304
319
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
{ name: "Charlie", age: 25, city: "New York" }
|
|
309
|
-
]);
|
|
320
|
+
// Verificaciones de coincidencia
|
|
321
|
+
console.log(data.anyMatch(n => n > 5)); // true
|
|
322
|
+
console.log(data.allMatch(n => n < 20)); // true
|
|
310
323
|
|
|
311
|
-
//
|
|
312
|
-
|
|
324
|
+
// Operaciones de búsqueda
|
|
325
|
+
data.findFirst().ifPresent(n => console.log(n)); // 2
|
|
326
|
+
data.findAny().ifPresent(n => console.log(n)); // Elemento cualquiera
|
|
313
327
|
|
|
314
328
|
// Operaciones de agrupación
|
|
315
|
-
const
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
const byAge = collectable.groupBy(
|
|
319
|
-
person => person.age,
|
|
320
|
-
person => person.name
|
|
329
|
+
const grouped = data.groupBy(
|
|
330
|
+
n => n > 5 ? "large" : "small",
|
|
331
|
+
n => n * 2
|
|
321
332
|
);
|
|
322
|
-
//
|
|
323
|
-
|
|
324
|
-
// Convertir a colecciones
|
|
325
|
-
const array = collectable.toArray(); // Array original
|
|
326
|
-
const set = collectable.toSet(); // Colección Set
|
|
327
|
-
const map = collectable.toMap(
|
|
328
|
-
person => person.name,
|
|
329
|
-
person => person.age
|
|
330
|
-
); // Map { "Alice" => 25, "Bob" => 30, "Charlie" => 25 }
|
|
333
|
+
// {small: [4, 8], large: [12, 16, 20]}
|
|
331
334
|
|
|
332
335
|
// Operaciones de reducción
|
|
333
|
-
const
|
|
334
|
-
const oldest = collectable.reduce((a, b) => a.age > b.age ? a : b); // Optional.of({name: "Bob", age: 30, ...})
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
### Implementaciones Específicas de Colectores
|
|
336
|
+
const sum = data.reduce(0, (acc, n) => acc + n); // 30
|
|
338
337
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
- **Métodos**: Hereda todos los métodos de Collectable
|
|
343
|
-
|
|
344
|
-
#### OrderedCollectable<E>
|
|
345
|
-
- **Características**: Garantiza orden de elementos, menor rendimiento
|
|
346
|
-
- **Escenarios de Uso**: Requieren resultados ordenados
|
|
347
|
-
- **Métodos Especiales**: Hereda todos los métodos, mantiene estado de orden interno
|
|
338
|
+
// Operaciones de salida
|
|
339
|
+
data.join(", "); // "2, 4, 6, 8, 10"
|
|
340
|
+
```
|
|
348
341
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
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) |
|
|
355
360
|
|
|
356
|
-
**Suplemento de Ejemplo de Código:**
|
|
357
361
|
```typescript
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
const
|
|
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
|
|
379
|
+
```
|
|
369
380
|
|
|
370
|
-
|
|
371
|
-
const windowed = data.toWindow();
|
|
372
|
-
const slidingWindows = windowed.slide(3n, 2n); // Tamaño de ventana 3, paso 2
|
|
373
|
-
// Ventana 1: [1, 2, 3], Ventana 2: [3, 4, 5], Ventana 3: [5, 6, 7], ...
|
|
381
|
+
## Guía de Selección de Rendimiento
|
|
374
382
|
|
|
375
|
-
|
|
376
|
-
|
|
383
|
+
### Seleccionar Colector No Ordenado (Prioridad Rendimiento)
|
|
384
|
+
```typescript
|
|
385
|
+
// Cuando no se necesita garantía de orden
|
|
386
|
+
const highPerformance = data
|
|
387
|
+
.filter(predicate)
|
|
388
|
+
.map(mapper)
|
|
389
|
+
.toUnoredered(); // Mejor rendimiento
|
|
377
390
|
```
|
|
378
391
|
|
|
379
|
-
###
|
|
380
|
-
|
|
381
|
-
Clase base de análisis estadístico que proporciona métodos ricos de cálculo estadístico. **Nota: Primero debe obtener una instancia Statistics llamando a toNumericStatistics() o toBigIntStatistics() a través de la instancia Semantic antes de usar los siguientes métodos.**
|
|
382
|
-
|
|
383
|
-
#### Operaciones de Cálculo Estadístico
|
|
384
|
-
|
|
385
|
-
| Método | Tipo de Retorno | Descripción | Complejidad de Algoritmo |
|
|
386
|
-
|------|----------|------|------------|
|
|
387
|
-
| `maximum()` | `Optional<E>` | Valor máximo | O(n) |
|
|
388
|
-
| `minimum()` | `Optional<E>` | Valor mínimo | O(n) |
|
|
389
|
-
| `range()` | `D` | Rango (max-min) | O(n) |
|
|
390
|
-
| `variance()` | `D` | Varianza | O(n) |
|
|
391
|
-
| `standardDeviation()` | `D` | Desviación estándar | O(n) |
|
|
392
|
-
| `mean()` | `D` | Valor medio | O(n) |
|
|
393
|
-
| `median()` | `D` | Valor mediano | O(n log n) |
|
|
394
|
-
| `mode()` | `D` | Valor modal | O(n) |
|
|
395
|
-
| `frequency()` | `Map<D, bigint>` | Distribución de frecuencia | O(n) |
|
|
396
|
-
| `summate()` | `D` | Sumatoria | O(n) |
|
|
397
|
-
| `quantile(quantile)` | `D` | Cuantil | O(n log n) |
|
|
398
|
-
| `interquartileRange()` | `D` | Rango intercuartílico | O(n log n) |
|
|
399
|
-
| `skewness()` | `D` | Asimetría | O(n) |
|
|
400
|
-
| `kurtosis()` | `D` | Curtosis | O(n) |
|
|
401
|
-
|
|
402
|
-
**Suplemento de Ejemplo de Código:**
|
|
392
|
+
### Seleccionar Colector Ordenado (Necesita Orden)
|
|
403
393
|
```typescript
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
// Debe convertir a objeto estadístico antes de usar métodos estadísticos
|
|
409
|
-
const stats = numbers.toNumericStatistics();
|
|
410
|
-
|
|
411
|
-
// Estadísticas básicas
|
|
412
|
-
const count = stats.count(); // 10n
|
|
413
|
-
const max = stats.maximum(); // Optional.of(10)
|
|
414
|
-
const min = stats.minimum(); // Optional.of(1)
|
|
415
|
-
const range = stats.range(); // 9
|
|
416
|
-
const mean = stats.mean(); // 5.5
|
|
417
|
-
const median = stats.median(); // 5.5
|
|
418
|
-
const sum = stats.summate(); // 55
|
|
419
|
-
|
|
420
|
-
// Estadísticas avanzadas
|
|
421
|
-
const variance = stats.variance(); // 8.25
|
|
422
|
-
const stdDev = stats.standardDeviation(); // 2.872
|
|
423
|
-
const mode = stats.mode(); // Cualquier valor (ya que todos aparecen una vez)
|
|
424
|
-
const q1 = stats.quantile(0.25); // 3.25
|
|
425
|
-
const q3 = stats.quantile(0.75); // 7.75
|
|
426
|
-
const iqr = stats.interquartileRange(); // 4.5
|
|
427
|
-
|
|
428
|
-
// Distribución de frecuencia
|
|
429
|
-
const freq = stats.frequency(); // Map {1 => 1n, 2 => 1n, ...}
|
|
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
|
|
430
398
|
```
|
|
431
399
|
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
**NumericStatistics<E>**
|
|
435
|
-
- Maneja análisis estadístico de tipo number
|
|
436
|
-
- Todos los cálculos estadísticos retornan tipo number
|
|
437
|
-
|
|
438
|
-
**BigIntStatistics<E>**
|
|
439
|
-
- Maneja análisis estadístico de tipo bigint
|
|
440
|
-
- Todos los cálculos estadísticos retornan tipo bigint
|
|
441
|
-
|
|
442
|
-
**Suplemento de Ejemplo de Código:**
|
|
400
|
+
### Seleccionar Colector de Ventana (Operaciones de Ventana)
|
|
443
401
|
```typescript
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
console.log(numericStats.mean()); // 30
|
|
451
|
-
console.log(numericStats.summate()); // 150
|
|
452
|
-
|
|
453
|
-
// Estadísticas de big integer
|
|
454
|
-
const bigintData = from([100n, 200n, 300n, 400n, 500n]);
|
|
455
|
-
const bigintStats = bigintData.toBigIntStatistics();
|
|
456
|
-
|
|
457
|
-
console.log(bigintStats.mean()); // 300n
|
|
458
|
-
console.log(bigintStats.summate()); // 1500n
|
|
402
|
+
// Cuando se necesitan operaciones de ventana
|
|
403
|
+
const windowed = data
|
|
404
|
+
.toWindow()
|
|
405
|
+
.slide(5n, 2n); // Ventana deslizante
|
|
406
|
+
```
|
|
459
407
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
{ value: 45 }
|
|
466
|
-
]);
|
|
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
|
|
467
413
|
|
|
468
|
-
const
|
|
469
|
-
|
|
470
|
-
const sumWithMapper = objectStats.summate(obj => obj.value); // 120
|
|
414
|
+
const bigIntStats = data
|
|
415
|
+
.toBigintStatistics(); // Estadísticas BigInt
|
|
471
416
|
```
|
|
472
417
|
|
|
473
|
-
|
|
418
|
+
[GitHub](https://github.com/eloyhere/semantic-typescript)
|
|
419
|
+
[NPMJS](https://www.npmjs.com/package/semantic-typescript)
|
|
474
420
|
|
|
475
|
-
|
|
476
|
-
import { from, validate, invalidate } from 'semantic-typescript';
|
|
477
|
-
|
|
478
|
-
// 1. Crear flujo de datos
|
|
479
|
-
const rawData = [5, 2, 8, 1, null, 9, 3, undefined, 7, 4, 6];
|
|
480
|
-
const semanticStream = from(rawData);
|
|
481
|
-
|
|
482
|
-
// 2. Pipeline de procesamiento de flujo
|
|
483
|
-
const processedStream = semanticStream
|
|
484
|
-
.filter(val => validate(val)) // Filtrar null y undefined
|
|
485
|
-
.map(val => val! * 2) // Multiplicar cada valor por 2 (usando ! porque validate asegura no vacío)
|
|
486
|
-
.distinct(); // Eliminar duplicados
|
|
487
|
-
|
|
488
|
-
// 3. Convertir a Collectable y usar operaciones terminales
|
|
489
|
-
const collectable = processedStream.toUnordered();
|
|
490
|
-
|
|
491
|
-
// 4. Validación de datos y uso
|
|
492
|
-
if (!collectable.isEmpty()) {
|
|
493
|
-
const results = collectable
|
|
494
|
-
.filter(x => x > 5) // Filtrar nuevamente
|
|
495
|
-
.toArray(); // Convertir a array
|
|
496
|
-
|
|
497
|
-
console.log("Resultados del procesamiento:", results); // [16, 18, 14, 8, 12]
|
|
498
|
-
|
|
499
|
-
// Información estadística
|
|
500
|
-
const stats = processedStream.toNumericStatistics();
|
|
501
|
-
console.log("Valor medio:", stats.mean()); // 11.2
|
|
502
|
-
console.log("Suma total:", stats.summate()); // 56
|
|
503
|
-
}
|
|
421
|
+
## Consideraciones Importantes
|
|
504
422
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
console.log("Datos válidos:", validData); // [1, 3, 4]
|
|
511
|
-
console.log("Datos inválidos:", invalidData); // [null, null]
|
|
512
|
-
```
|
|
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
|
|
513
427
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
1. **Crear Flujo**: Usar métodos de fábrica `from()`, `range()`, `fill()`, etc. para crear instancias Semantic
|
|
517
|
-
2. **Transformación de Flujo**: Llamar métodos `map()`, `filter()`, `distinct()`, etc. en instancias Semantic
|
|
518
|
-
3. **Convertir a Collectable**: Debe llamar a uno de los siguientes métodos a través de la instancia Semantic:
|
|
519
|
-
- `toOrdered()` - Colector ordenado
|
|
520
|
-
- `toUnordered()` - Colector desordenado (más rápido)
|
|
521
|
-
- `toWindow()` - Colector de ventana
|
|
522
|
-
- `toNumericStatistics()` - Estadísticas numéricas
|
|
523
|
-
- `toBigIntStatistics()` - Estadísticas de big integer
|
|
524
|
-
- `sorted()` - Ordenación natural
|
|
525
|
-
- `sorted(comparator)` - Ordenación personalizada
|
|
526
|
-
4. **Operaciones Terminales**: Llamar métodos terminales `toArray()`, `count()`, `summate()`, etc. en instancias Collectable
|
|
527
|
-
5. **Validación de Datos**: Usar `validate()` para asegurar que los datos no son null/undefined, usar `invalidate()` para verificar datos inválidos
|
|
528
|
-
|
|
529
|
-
Este diseño garantiza seguridad de tipos y optimización de rendimiento mientras proporciona funcionalidad rica de procesamiento de flujos.
|
|
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.
|