semantic-typescript 0.0.8 → 0.2.5
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/collectable.d.ts +84 -0
- package/dist/collectable.js +476 -0
- package/dist/collector.d.ts +24 -0
- package/dist/collector.js +63 -0
- package/dist/factory.d.ts +11 -0
- package/dist/factory.js +248 -0
- package/dist/guard.d.ts +23 -0
- package/dist/guard.js +85 -0
- package/dist/hook.d.ts +2 -0
- package/dist/hook.js +64 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -0
- package/dist/optional.d.ts +18 -0
- package/dist/optional.js +65 -0
- package/dist/semantic.d.ts +9 -272
- package/dist/semantic.js +38 -1679
- package/dist/statistics.d.ts +101 -0
- package/dist/statistics.js +765 -0
- package/dist/symbol.d.ts +10 -0
- package/dist/symbol.js +10 -0
- package/dist/utility.d.ts +49 -0
- package/dist/utility.js +17 -0
- package/package.json +54 -8
- package/readme.cn.md +387 -445
- package/readme.de.md +393 -448
- package/readme.es.md +392 -446
- package/readme.fr.md +396 -450
- package/readme.jp.md +390 -447
- package/readme.kr.md +396 -453
- package/readme.md +389 -445
- package/readme.ru.md +391 -447
- package/readme.tw.md +403 -444
package/readme.es.md
CHANGED
|
@@ -1,529 +1,475 @@
|
|
|
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` | Conjunto de tipos primitivos |
|
|
23
|
+
| `MaybePrimitive<T>` | Tipo que puede ser de tipo primitivo |
|
|
24
|
+
| `OptionalSymbol` | Símbolo identificador de la clase Optional |
|
|
25
|
+
| `SemanticSymbol` | Símbolo identificador de la clase Semantic |
|
|
26
|
+
| `CollectorsSymbol` | Símbolo identificador de la clase Collector |
|
|
27
|
+
| `CollectableSymbol` | Símbolo identificador de la clase Collectable |
|
|
28
|
+
| `OrderedCollectableSymbol` | Símbolo identificador de la clase OrderedCollectable |
|
|
29
|
+
| `WindowCollectableSymbol` | Símbolo identificador de la clase WindowCollectable |
|
|
30
|
+
| `StatisticsSymbol` | Símbolo identificador de la clase Statistics |
|
|
31
|
+
| `NumericStatisticsSymbol` | Símbolo identificador de la clase NumericStatistics |
|
|
32
|
+
| `BigIntStatisticsSymbol` | Símbolo identificador de la clase BigIntStatistics |
|
|
33
|
+
| `UnorderedCollectableSymbol` | Símbolo identificador de la clase UnorderedCollectable |
|
|
34
|
+
|
|
35
|
+
## Interfaces funcionales
|
|
36
|
+
|
|
37
|
+
| Interfaz | Descripción |
|
|
38
|
+
|----------|-------------|
|
|
39
|
+
| `Runnable` | Función sin parámetros y sin valor de retorno |
|
|
40
|
+
| `Supplier<R>` | Función sin parámetros que devuelve R |
|
|
41
|
+
| `Functional<T, R>` | Función de transformación de un solo parámetro |
|
|
42
|
+
| `BiFunctional<T, U, R>` | Función de transformación de dos parámetros |
|
|
43
|
+
| `TriFunctional<T, U, V, R>` | Función de transformación de tres parámetros |
|
|
44
|
+
| `Predicate<T>` | Función de predicado de un solo parámetro |
|
|
45
|
+
| `BiPredicate<T, U>` | Función de predicado de dos parámetros |
|
|
46
|
+
| `TriPredicate<T, U, V>` | Función de predicado de tres parámetros |
|
|
47
|
+
| `Consumer<T>` | Función de consumo de un solo parámetro |
|
|
48
|
+
| `BiConsumer<T, U>` | Función de consumo de dos parámetros |
|
|
49
|
+
| `TriConsumer<T, U, V>` | Función de consumo de tres parámetros |
|
|
50
|
+
| `Comparator<T>` | Función de comparación de dos parámetros |
|
|
51
|
+
| `Generator<T>` | Función generadora (núcleo y base) |
|
|
48
52
|
|
|
49
|
-
**Suplemento de Ejemplo de Código:**
|
|
50
53
|
```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>();
|
|
54
|
+
// Ejemplos de uso de tipos
|
|
55
|
+
const predicate: Predicate<number> = (n) => n > 0;
|
|
56
|
+
const mapper: Functional<string, number> = (str) => str.length;
|
|
57
|
+
const comparator: Comparator<number> = (a, b) => a - b;
|
|
64
58
|
```
|
|
65
59
|
|
|
66
|
-
|
|
60
|
+
## Guardias de Tipo
|
|
61
|
+
|
|
62
|
+
| Función | Descripción | Complejidad Temporal | Complejidad Espacial |
|
|
63
|
+
|---------|-------------|---------------------|---------------------|
|
|
64
|
+
| `validate<T>(t: MaybeInvalid<T>): t is T` | Valida que el valor no sea null o undefined | O(1) | O(1) |
|
|
65
|
+
| `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | Valida que el valor sea null o undefined | O(1) | O(1) |
|
|
66
|
+
| `isBoolean(t: unknown): t is boolean` | Verifica si es booleano | O(1) | O(1) |
|
|
67
|
+
| `isString(t: unknown): t is string` | Verifica si es string | O(1) | O(1) |
|
|
68
|
+
| `isNumber(t: unknown): t is number` | Verifica si es número | O(1) | O(1) |
|
|
69
|
+
| `isFunction(t: unknown): t is Function` | Verifica si es función | O(1) | O(1) |
|
|
70
|
+
| `isObject(t: unknown): t is object` | Verifica si es objeto | O(1) | O(1) |
|
|
71
|
+
| `isSymbol(t: unknown): t is symbol` | Verifica si es símbolo | O(1) | O(1) |
|
|
72
|
+
| `isBigint(t: unknown): t is bigint` | Verifica si es BigInt | O(1) | O(1) |
|
|
73
|
+
| `isPrimitive(t: unknown): t is Primitive` | Verifica si es tipo primitivo | O(1) | O(1) |
|
|
74
|
+
| `isIterable(t: unknown): t is Iterable<unknown>` | Verifica si es iterable | O(1) | O(1) |
|
|
75
|
+
| `isOptional(t: unknown): t is Optional<unknown>` | Verifica si es instancia de Optional | O(1) | O(1) |
|
|
76
|
+
| `isSemantic(t: unknown): t is Semantic<unknown>` | Verifica si es instancia de Semantic | O(1) | O(1) |
|
|
77
|
+
| `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Verifica si es instancia de Collector | O(1) | O(1) |
|
|
78
|
+
| `isCollectable(t: unknown): t is Collectable<unknown>` | Verifica si es instancia de Collectable | O(1) | O(1) |
|
|
79
|
+
| `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | Verifica si es instancia de OrderedCollectable | O(1) | O(1) |
|
|
80
|
+
| `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | Verifica si es instancia de WindowCollectable | O(1) | O(1) |
|
|
81
|
+
| `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | Verifica si es instancia de UnorderedCollectable | O(1) | O(1) |
|
|
82
|
+
| `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Verifica si es instancia de Statistics | O(1) | O(1) |
|
|
83
|
+
| `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | Verifica si es instancia de NumericStatistics | O(1) | O(1) |
|
|
84
|
+
| `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | Verifica si es instancia de BigIntStatistics | O(1) | O(1) |
|
|
67
85
|
|
|
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
86
|
```typescript
|
|
77
|
-
|
|
87
|
+
// Ejemplos de uso de guardias de tipo
|
|
88
|
+
const value: unknown = "hello";
|
|
78
89
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if (validate(data)) {
|
|
82
|
-
console.log(data.toUpperCase()); // Llamada segura porque validate asegura que data no es null
|
|
90
|
+
if (isString(value)) {
|
|
91
|
+
console.log(value.length); // Seguro de tipos, value se infiere como string
|
|
83
92
|
}
|
|
84
93
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
console.log("Datos inválidos"); // Se ejecutará porque invalidate detectó null
|
|
94
|
+
if (isOptional(someValue)) {
|
|
95
|
+
someValue.ifPresent(val => console.log(val));
|
|
88
96
|
}
|
|
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
97
|
```
|
|
96
98
|
|
|
97
|
-
##
|
|
98
|
-
|
|
99
|
-
### Optional<T> - Manejo Seguro de Valores Nulos
|
|
99
|
+
## Funciones de Utilidad
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
| Función | Descripción | Complejidad Temporal | Complejidad Espacial |
|
|
102
|
+
|---------|-------------|---------------------|---------------------|
|
|
103
|
+
| `useCompare<T>(t1: T, t2: T): number` | Función de comparación universal | O(1) | O(1) |
|
|
104
|
+
| `useRandom<T = number \| bigint>(index: T): T` | Generador de números pseudoaleatorios | O(log n) | O(1) |
|
|
102
105
|
|
|
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
106
|
```typescript
|
|
118
|
-
|
|
107
|
+
// Ejemplos de uso de funciones de utilidad
|
|
108
|
+
const numbers = [3, 1, 4, 1, 5];
|
|
109
|
+
numbers.sort(useCompare); // [1, 1, 3, 4, 5]
|
|
119
110
|
|
|
120
|
-
//
|
|
121
|
-
const
|
|
111
|
+
const randomNum = useRandom(42); // Número aleatorio basado en semilla
|
|
112
|
+
const randomBigInt = useRandom(1000n); // Número BigInt aleatorio
|
|
113
|
+
```
|
|
122
114
|
|
|
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
|
|
115
|
+
## Métodos de Fábrica
|
|
128
116
|
|
|
129
|
-
|
|
117
|
+
### Métodos de Fábrica de Optional
|
|
130
118
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
119
|
+
| Método | Descripción | Complejidad Temporal | Complejidad Espacial |
|
|
120
|
+
|--------|-------------|---------------------|---------------------|
|
|
121
|
+
| `Optional.empty<T>()` | Crea un Optional vacío | O(1) | O(1) |
|
|
122
|
+
| `Optional.of<T>(value)` | Crea un Optional con valor | O(1) | O(1) |
|
|
123
|
+
| `Optional.ofNullable<T>(value)` | Crea un Optional que puede ser nulo | O(1) | O(1) |
|
|
124
|
+
| `Optional.ofNonNull<T>(value)` | Crea un Optional no nulo | O(1) | O(1) |
|
|
135
125
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
126
|
+
```typescript
|
|
127
|
+
// Ejemplos de uso de Optional
|
|
128
|
+
const emptyOpt = Optional.empty<number>();
|
|
129
|
+
const presentOpt = Optional.of(42);
|
|
130
|
+
const nullableOpt = Optional.ofNullable<string>(null);
|
|
131
|
+
const nonNullOpt = Optional.ofNonNull("hello");
|
|
132
|
+
|
|
133
|
+
presentOpt.ifPresent(val => console.log(val)); // Output 42
|
|
134
|
+
console.log(emptyOpt.orElse(100)); // Output 100
|
|
142
135
|
```
|
|
143
136
|
|
|
144
|
-
###
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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:**
|
|
137
|
+
### Métodos de Fábrica de Collector
|
|
138
|
+
|
|
139
|
+
| Método | Descripción | Complejidad Temporal | Complejidad Espacial |
|
|
140
|
+
|--------|-------------|---------------------|---------------------|
|
|
141
|
+
| `Collector.full(identity, accumulator, finisher)` | Crea un colector completo | O(1) | O(1) |
|
|
142
|
+
| `Collector.shortable(identity, interruptor, accumulator, finisher)` | Crea un colector interrumpible | O(1) | O(1) |
|
|
143
|
+
|
|
173
144
|
```typescript
|
|
174
|
-
|
|
145
|
+
// Ejemplos de conversión de colectores
|
|
146
|
+
const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
|
|
175
147
|
|
|
176
|
-
|
|
148
|
+
// Prioridad al rendimiento: usar colector no ordenado
|
|
149
|
+
const unordered = numbers
|
|
150
|
+
.filter(n => n > 3)
|
|
151
|
+
.toUnoredered();
|
|
177
152
|
|
|
178
|
-
//
|
|
179
|
-
const
|
|
180
|
-
.filter(x => x % 2 === 0) // Filtrar números pares
|
|
181
|
-
.map(x => x * 2) // Multiplicar cada elemento por 2
|
|
182
|
-
.distinct() // Eliminar duplicados
|
|
183
|
-
.limit(3) // Limitar a primeros 3 elementos
|
|
184
|
-
.peek((val, index) => console.log(`Elemento ${val} en índice ${index}`)); // Ver elementos
|
|
153
|
+
// Se necesita ordenación: usar colector ordenado
|
|
154
|
+
const ordered = numbers.sorted();
|
|
185
155
|
|
|
186
|
-
//
|
|
156
|
+
// Cuenta la cantidad de elementos
|
|
157
|
+
let count = Collector.full(
|
|
158
|
+
() => 0, // Valor inicial
|
|
159
|
+
(accumulator, element) => accumulator + element, // Acumular
|
|
160
|
+
(accumulator) => accumulator // Finalizar
|
|
161
|
+
);
|
|
162
|
+
count.collect(from([1,2,3,4,5])); // Cuenta desde un flujo
|
|
163
|
+
count.collect([1,2,3,4,5]); // Cuenta desde un objeto iterable
|
|
164
|
+
|
|
165
|
+
let find = Collector.shortable(
|
|
166
|
+
() => Optional.empty(), // Valor inicial
|
|
167
|
+
(element, index, accumulator) => accumulator.isPresent(), // Interrumpir
|
|
168
|
+
(accumulator, element, index) => Optional.of(element), // Acumular
|
|
169
|
+
(accumulator) => accumulator // Finalizar
|
|
170
|
+
);
|
|
171
|
+
find.collect(from([1,2,3,4,5])); // Encuentra el primer elemento
|
|
172
|
+
find.collect([1,2,3,4,5]); // Encuentra el primer elemento
|
|
187
173
|
```
|
|
188
174
|
|
|
189
|
-
|
|
175
|
+
### Métodos de fábrica de Semantic
|
|
190
176
|
|
|
191
|
-
| Método |
|
|
192
|
-
|
|
193
|
-
| `
|
|
194
|
-
| `
|
|
195
|
-
| `
|
|
196
|
-
| `
|
|
197
|
-
| `
|
|
198
|
-
| `
|
|
199
|
-
| `
|
|
177
|
+
| Método | Descripción | Complejidad temporal | Complejidad espacial |
|
|
178
|
+
|--------|-------------|----------------------|----------------------|
|
|
179
|
+
| `blob(blob, chunkSize)` | Crea flujo desde Blob | O(n) | O(chunkSize) |
|
|
180
|
+
| `empty<E>()` | Crea flujo vacío | O(1) | O(1) |
|
|
181
|
+
| `fill<E>(element, count)` | Crea flujo lleno | O(n) | O(1) |
|
|
182
|
+
| `from<E>(iterable)` | Crea flujo desde objeto iterable | O(1) | O(1) |
|
|
183
|
+
| `generate<E>(element, interrupt)` | Crea flujo generado | O(1) | O(1) |
|
|
184
|
+
| `interval(period, delay?)` | Crea flujo de intervalo regular | O(1)* | O(1) |
|
|
185
|
+
| `iterate<E>(generator)` | Crea flujo desde generador | O(1) | O(1) |
|
|
186
|
+
| `range(start, end, step)` | Crea flujo de rango numérico | O(n) | O(1) |
|
|
187
|
+
| `websocket(websocket)` | Crea flujo desde WebSocket | O(1) | O(1) |
|
|
200
188
|
|
|
201
|
-
**Suplemento de Ejemplo de Código:**
|
|
202
189
|
```typescript
|
|
203
|
-
|
|
190
|
+
// Ejemplo de uso de métodos de fábrica de Semantic
|
|
204
191
|
|
|
205
|
-
|
|
192
|
+
// Crear flujo desde Blob (lectura por fragmentos)
|
|
193
|
+
blob(someBlob, 1024n)
|
|
194
|
+
.toUnordered()
|
|
195
|
+
.write(WritableStream)
|
|
196
|
+
.then(callback) // Escritura de flujo exitosa
|
|
197
|
+
.catch(writeFi); // Escritura de flujo fallida
|
|
206
198
|
|
|
207
|
-
//
|
|
208
|
-
|
|
199
|
+
// Crear flujo vacío que no se ejecutará hasta concatenarse con otros flujos
|
|
200
|
+
empty<string>()
|
|
201
|
+
.toUnordered()
|
|
202
|
+
.join(); //[]
|
|
209
203
|
|
|
210
|
-
//
|
|
211
|
-
const
|
|
204
|
+
// Crear flujo lleno
|
|
205
|
+
const filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
212
206
|
|
|
213
|
-
//
|
|
214
|
-
|
|
207
|
+
// Crear flujo temporal con retraso inicial de 2 segundos y ciclo de 5 segundos,
|
|
208
|
+
// implementado mediante mecanismo de temporizador, posibles desviaciones de tiempo
|
|
209
|
+
// debido a limitaciones de programación del sistema.
|
|
210
|
+
const intervalStream = interval(5000, 2000);
|
|
215
211
|
|
|
216
|
-
//
|
|
217
|
-
const
|
|
212
|
+
// Crear flujo desde objeto iterable
|
|
213
|
+
const numberStream = from([1, 2, 3, 4, 5]);
|
|
214
|
+
const stringStream = from(new Set(["Alex", "Bob"]));
|
|
218
215
|
|
|
219
|
-
//
|
|
220
|
-
const
|
|
216
|
+
// Crear flujo de rango
|
|
217
|
+
const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
221
218
|
|
|
222
|
-
//
|
|
219
|
+
// Flujo de eventos WebSocket
|
|
220
|
+
const ws = new WebSocket("ws://localhost:8080");
|
|
221
|
+
websocket(ws)
|
|
222
|
+
.filter((event)=> event.type === "message") // Solo monitorear eventos de mensaje
|
|
223
|
+
.toUnordered() // Para eventos normalmente sin ordenar
|
|
224
|
+
.forEach((event)=> receive(event)); // Recibir mensajes
|
|
223
225
|
```
|
|
224
226
|
|
|
225
|
-
|
|
227
|
+
## Métodos de Clase Semantic
|
|
228
|
+
|
|
229
|
+
| Método | Descripción | Complejidad Temporal | Complejidad Espacial |
|
|
230
|
+
|--------|-------------|---------------------|---------------------|
|
|
231
|
+
| `concat(other)` | Concatena dos flujos | O(n) | O(1) |
|
|
232
|
+
| `distinct()` | Elimina duplicados | O(n) | O(n) |
|
|
233
|
+
| `distinct(comparator)` | Elimina duplicados con comparador | O(n²) | O(n) |
|
|
234
|
+
| `dropWhile(predicate)` | Descarta elementos que cumplen condición | O(n) | O(1) |
|
|
235
|
+
| `filter(predicate)` | Filtra elementos | O(n) | O(1) |
|
|
236
|
+
| `flat(mapper)` | Aplanamiento de mapeo | O(n × m) | O(1) |
|
|
237
|
+
| `flatMap(mapper)` | Aplanamiento a nuevo tipo | O(n × m) | O(1) |
|
|
238
|
+
| `limit(n)` | Limita cantidad de elementos | O(n) | O(1) |
|
|
239
|
+
| `map(mapper)` | Transformación de mapeo | O(n) | O(1) |
|
|
240
|
+
| `peek(consumer)` | Inspecciona elementos | O(n) | O(1) |
|
|
241
|
+
| `redirect(redirector)` | Redirección de índices | O(n) | O(1) |
|
|
242
|
+
| `reverse()` | Revierte flujo | O(n) | O(1) |
|
|
243
|
+
| `shuffle()` | Mezcla aleatoria | O(n) | O(1) |
|
|
244
|
+
| `shuffle(mapper)` | Mezcla con mapeador | O(n) | O(1) |
|
|
245
|
+
| `skip(n)` | Salta primeros n elementos | O(n) | O(1) |
|
|
246
|
+
| `sorted()` | Ordena | O(n log n) | O(n) |
|
|
247
|
+
| `sorted(comparator)` | Ordena con comparador | O(n log n) | O(n) |
|
|
248
|
+
| `sub(start, end)` | Obtiene subflujo | O(n) | O(1) |
|
|
249
|
+
| `takeWhile(predicate)` | Toma elementos que cumplen condición | O(n) | O(1) |
|
|
250
|
+
| `translate(offset)` | Traslación de índices | O(n) | O(1) |
|
|
251
|
+
| `translate(translator)` | Traslación con traductor | O(n) | O(1) |
|
|
226
252
|
|
|
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
253
|
```typescript
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
//
|
|
240
|
-
|
|
241
|
-
()
|
|
242
|
-
(
|
|
243
|
-
|
|
244
|
-
);
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
const
|
|
254
|
+
// Ejemplos de operaciones Semantic
|
|
255
|
+
const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
256
|
+
.filter(n => n % 2 === 0) // Filtra números pares
|
|
257
|
+
.map(n => n * 2) // Multiplica por 2
|
|
258
|
+
.skip(1) // Salta el primero
|
|
259
|
+
.limit(3) // Limita a 3 elementos
|
|
260
|
+
.toUnordered() // Prioridad rendimiento
|
|
261
|
+
.toArray(); // Convierte a array
|
|
262
|
+
// Resultado: [8, 12, 20]
|
|
263
|
+
|
|
264
|
+
// Ejemplo de operación compleja
|
|
265
|
+
const complexResult = range(1, 100, 1)
|
|
266
|
+
.flatMap(n => from([n, n * 2])) // Mapea cada elemento a dos elementos
|
|
267
|
+
.distinct() // Elimina duplicados
|
|
268
|
+
.shuffle() // Mezcla aleatoriamente
|
|
269
|
+
.takeWhile(n => n < 50) // Toma elementos < 50
|
|
270
|
+
.toOrdered() // Convierte a colector ordenado
|
|
271
|
+
.toArray(); // Convierte a array
|
|
249
272
|
```
|
|
250
273
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
Proporciona métodos ricos de agregación y transformación de datos. **Nota: Primero debe obtener una instancia Collectable llamando a sorted(), toOrdered(), etc. a través de la instancia Semantic antes de usar los siguientes métodos.**
|
|
254
|
-
|
|
255
|
-
#### Operaciones de Consulta de Datos
|
|
274
|
+
## Métodos de conversión semántica
|
|
256
275
|
|
|
257
|
-
| Método |
|
|
258
|
-
|
|
259
|
-
| `
|
|
260
|
-
| `
|
|
261
|
-
| `
|
|
262
|
-
| `
|
|
263
|
-
| `
|
|
264
|
-
| `
|
|
265
|
-
| `
|
|
276
|
+
| Método | Descripción | Complejidad temporal | Complejidad espacial |
|
|
277
|
+
|------------|------------|------------|------------|
|
|
278
|
+
| `sorted()` | Convertir a colector ordenado | O(n log n) | O(n) |
|
|
279
|
+
| `toUnordered()` | Convertir a colector no ordenado | O(1) | O(1) |
|
|
280
|
+
| `toOrdered()` | Convertir a colector ordenado | O(1) | O(1) |
|
|
281
|
+
| `toNumericStatistics()` | Convertir a estadísticas numéricas | O(n) | O(1) |
|
|
282
|
+
| `toBigintStatistics()` | Convertir a estadísticas bigint | O(n) | O(1) |
|
|
283
|
+
| `toWindow()` | Convertir a colector de ventanas | O(1) | O(1) |
|
|
284
|
+
| `toCollectable()` | Convertir a `UnorderdCollectable` | O(n) | O(1) |
|
|
285
|
+
| `toCollectable(mapper)` | Convertir a collectable personalizado | O(n) | O(1) |
|
|
266
286
|
|
|
267
|
-
**Suplemento de Ejemplo de Código:**
|
|
268
287
|
```typescript
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
//
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
288
|
+
// Convertir a array ordenado ascendente
|
|
289
|
+
from([6,4,3,5,2]) // Crea un flujo
|
|
290
|
+
.sorted() // Ordena el flujo en orden ascendente
|
|
291
|
+
.toArray(); // [2, 3, 4, 5, 6]
|
|
292
|
+
|
|
293
|
+
// Convertir a array ordenado descendente
|
|
294
|
+
from([6,4,3,5,2]) // Crea un flujo
|
|
295
|
+
.soted((a, b) => b - a) // Ordena el flujo en orden descendente
|
|
296
|
+
.toArray(); // [6, 5, 4, 3, 2]
|
|
297
|
+
|
|
298
|
+
// Redirigir a un array invertido
|
|
299
|
+
from([6,4,3,5,2])
|
|
300
|
+
.redirect((element, index) => -index) // Redirige a orden invertido
|
|
301
|
+
.toOrderd() // Mantiene el orden redirigido
|
|
302
|
+
.toArray(); // [2, 5, 3, 4, 6]
|
|
303
|
+
|
|
304
|
+
// Ignorar redirecciones para invertir el array
|
|
305
|
+
from([6,4,3,5,2])
|
|
306
|
+
.redirect((element, index) => -index) // Redirige a orden invertido
|
|
307
|
+
.toUnorderd() // Descarta el orden redirigido. Esta operación ignora las operaciones `redirect`, `reverse`, `shuffle` y `translate`
|
|
308
|
+
.toArray(); // [2, 5, 3, 4, 6]
|
|
309
|
+
|
|
310
|
+
// Invertir el flujo en un array
|
|
311
|
+
from([6, 4, 3, 5, 2])
|
|
312
|
+
.reverse() // Invierte el flujo
|
|
313
|
+
.toOrdered() // Garantiza el orden invertido
|
|
314
|
+
.toArray(); // [2, 5, 3, 4, 6]
|
|
315
|
+
|
|
316
|
+
// Sobrescribir el flujo barajado en un array
|
|
317
|
+
from([6, 4, 3, 5, 2])
|
|
318
|
+
.shuffle() // Baraja el flujo
|
|
319
|
+
.sorted() // Sobrescribe el orden barajado. Esta operación sobrescribe las operaciones `redirect`, `reverse`, `shuffle` y `translate`
|
|
320
|
+
.toArray(); // [2, 5, 3, 4, 6]
|
|
321
|
+
|
|
322
|
+
// Convertir a colector de ventanas
|
|
323
|
+
from([6, 4, 3, 5, 2]).toWindow();
|
|
324
|
+
|
|
325
|
+
// Convertir a estadísticas numéricas
|
|
326
|
+
from([6, 4, 3, 5, 2]).toNumericStatistics();
|
|
327
|
+
|
|
328
|
+
// Convertir a estadísticas bigint
|
|
329
|
+
from([6n, 4n, 3n, 5n, 2n]).toBigintStatistics();
|
|
330
|
+
|
|
331
|
+
// Define un colector personalizado para recolectar datos
|
|
332
|
+
let customizedCollector = from([1, 2, 3, 4, 5]).toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
|
|
283
333
|
```
|
|
284
334
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
| Método |
|
|
288
|
-
|
|
289
|
-
| `
|
|
290
|
-
| `
|
|
291
|
-
| `
|
|
292
|
-
| `
|
|
293
|
-
| `
|
|
294
|
-
| `
|
|
295
|
-
| `
|
|
296
|
-
| `
|
|
297
|
-
| `
|
|
298
|
-
| `
|
|
299
|
-
| `
|
|
300
|
-
|
|
301
|
-
|
|
335
|
+
## Métodos de Recolección de Collectable
|
|
336
|
+
|
|
337
|
+
| Método | Descripción | Complejidad Temporal | Complejidad Espacial |
|
|
338
|
+
|--------|-------------|---------------------|---------------------|
|
|
339
|
+
| `anyMatch(predicate)` | Verifica si existe coincidencia | O(n) | O(1) |
|
|
340
|
+
| `allMatch(predicate)` | Verifica si todos coinciden | O(n) | O(1) |
|
|
341
|
+
| `count()` | Cuenta elementos | O(n) | O(1) |
|
|
342
|
+
| `isEmpty()` | Verifica si está vacío | O(1) | O(1) |
|
|
343
|
+
| `findAny()` | Encuentra cualquier elemento | O(n) | O(1) |
|
|
344
|
+
| `findFirst()` | Encuentra primer elemento | O(n) | O(1) |
|
|
345
|
+
| `findLast()` | Encuentra último elemento | O(n) | O(1) |
|
|
346
|
+
| `forEach(action)` | Itera sobre todos los elementos | O(n) | O(1) |
|
|
347
|
+
| `group(classifier)` | Agrupa por clasificador | O(n) | O(n) |
|
|
348
|
+
| `groupBy(keyExtractor, valueExtractor)` | Agrupa por extractores de clave-valor | O(n) | O(n) |
|
|
349
|
+
| `join()` | Concatena a string | O(n) | O(n) |
|
|
350
|
+
| `join(delimiter)` | Concatena con separador | O(n) | O(n) |
|
|
351
|
+
| `nonMatch(predicate)` | Verifica si no hay coincidencias | O(n) | O(1) |
|
|
352
|
+
| `partition(count)` | Particiona por cantidad | O(n) | O(n) |
|
|
353
|
+
| `partitionBy(classifier)` | Particiona por clasificador | O(n) | O(n) |
|
|
354
|
+
| `reduce(accumulator)` | Operación de reducción | O(n) | O(1) |
|
|
355
|
+
| `reduce(identity, accumulator)` | Reducción con valor inicial | O(n) | O(1) |
|
|
356
|
+
| `toArray()` | Convierte a array | O(n) | O(n) |
|
|
357
|
+
| `toMap(keyExtractor, valueExtractor)` | Convierte a Map | O(n) | O(n) |
|
|
358
|
+
| `toSet()` | Convierte a Set | O(n) | O(n) |
|
|
359
|
+
| `write(stream)` | Escribe a stream | O(n) | O(1) |
|
|
360
|
+
|
|
302
361
|
```typescript
|
|
303
|
-
|
|
362
|
+
// Ejemplos de operaciones Collectable
|
|
363
|
+
const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
364
|
+
.filter(n => n % 2 === 0)
|
|
365
|
+
.toOrdered();
|
|
304
366
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
{ name: "Charlie", age: 25, city: "New York" }
|
|
309
|
-
]);
|
|
367
|
+
// Verificaciones de coincidencia
|
|
368
|
+
console.log(data.anyMatch(n => n > 5)); // true
|
|
369
|
+
console.log(data.allMatch(n => n < 20)); // true
|
|
310
370
|
|
|
311
|
-
//
|
|
312
|
-
|
|
371
|
+
// Operaciones de búsqueda
|
|
372
|
+
data.findFirst().ifPresent(n => console.log(n)); // 2
|
|
373
|
+
data.findAny().ifPresent(n => console.log(n)); // Elemento cualquiera
|
|
313
374
|
|
|
314
375
|
// Operaciones de agrupación
|
|
315
|
-
const
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
const byAge = collectable.groupBy(
|
|
319
|
-
person => person.age,
|
|
320
|
-
person => person.name
|
|
376
|
+
const grouped = data.groupBy(
|
|
377
|
+
n => n > 5 ? "large" : "small",
|
|
378
|
+
n => n * 2
|
|
321
379
|
);
|
|
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 }
|
|
380
|
+
// {small: [4, 8], large: [12, 16, 20]}
|
|
331
381
|
|
|
332
382
|
// 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
|
|
383
|
+
const sum = data.reduce(0, (acc, n) => acc + n); // 30
|
|
338
384
|
|
|
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
|
|
385
|
+
// Operaciones de salida
|
|
386
|
+
data.join(", "); // "2, 4, 6, 8, 10"
|
|
387
|
+
```
|
|
348
388
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
389
|
+
## Métodos de Análisis Estadístico
|
|
390
|
+
|
|
391
|
+
### Métodos de NumericStatistics
|
|
392
|
+
|
|
393
|
+
| Método | Descripción | Complejidad Temporal | Complejidad Espacial |
|
|
394
|
+
|--------|-------------|---------------------|---------------------|
|
|
395
|
+
| `range()` | Rango | O(n) | O(1) |
|
|
396
|
+
| `variance()` | Varianza | O(n) | O(1) |
|
|
397
|
+
| `standardDeviation()` | Desviación estándar | O(n) | O(1) |
|
|
398
|
+
| `mean()` | Media | O(n) | O(1) |
|
|
399
|
+
| `median()` | Mediana | O(n log n) | O(n) |
|
|
400
|
+
| `mode()` | Moda | O(n) | O(n) |
|
|
401
|
+
| `frequency()` | Distribución de frecuencia | O(n) | O(n) |
|
|
402
|
+
| `summate()` | Sumatoria | O(n) | O(1) |
|
|
403
|
+
| `quantile(quantile)` | Cuantil | O(n log n) | O(n) |
|
|
404
|
+
| `interquartileRange()` | Rango intercuartílico | O(n log n) | O(n) |
|
|
405
|
+
| `skewness()` | Sesgo | O(n) | O(1) |
|
|
406
|
+
| `kurtosis()` | Curtosis | O(n) | O(1) |
|
|
355
407
|
|
|
356
|
-
**Suplemento de Ejemplo de Código:**
|
|
357
408
|
```typescript
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
const
|
|
409
|
+
// Ejemplos de análisis estadístico
|
|
410
|
+
const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
411
|
+
.toNumericStatistics();
|
|
412
|
+
|
|
413
|
+
console.log("Media:", numbers.mean()); // 5.5
|
|
414
|
+
console.log("Mediana:", numbers.median()); // 5.5
|
|
415
|
+
console.log("Desviación estándar:", numbers.standardDeviation()); // ~2.87
|
|
416
|
+
console.log("Suma:", numbers.summate()); // 55
|
|
417
|
+
|
|
418
|
+
// Análisis estadístico con mapeador
|
|
419
|
+
const objects = from([
|
|
420
|
+
{ value: 10 },
|
|
421
|
+
{ value: 20 },
|
|
422
|
+
{ value: 30 }
|
|
423
|
+
]).toNumericStatistics();
|
|
424
|
+
|
|
425
|
+
console.log("Media mapeada:", objects.mean(obj => obj.value)); // 20
|
|
426
|
+
```
|
|
369
427
|
|
|
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], ...
|
|
428
|
+
## Guía de Selección de Rendimiento
|
|
374
429
|
|
|
375
|
-
|
|
376
|
-
|
|
430
|
+
### Seleccionar Colector No Ordenado (Prioridad Rendimiento)
|
|
431
|
+
```typescript
|
|
432
|
+
// Cuando no se necesita garantía de orden
|
|
433
|
+
const highPerformance = data
|
|
434
|
+
.filter(predicate)
|
|
435
|
+
.map(mapper)
|
|
436
|
+
.toUnoredered(); // Mejor rendimiento
|
|
377
437
|
```
|
|
378
438
|
|
|
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:**
|
|
439
|
+
### Seleccionar Colector Ordenado (Necesita Orden)
|
|
403
440
|
```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, ...}
|
|
441
|
+
// Cuando se debe mantener el orden de elementos
|
|
442
|
+
const ordered = data
|
|
443
|
+
.sorted(comparator) // La ordenación sobrescribe efectos de redirección
|
|
444
|
+
.toOrdered(); // Mantiene orden
|
|
430
445
|
```
|
|
431
446
|
|
|
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:**
|
|
447
|
+
### Seleccionar Colector de Ventana (Operaciones de Ventana)
|
|
443
448
|
```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
|
|
449
|
+
// Cuando se necesitan operaciones de ventana
|
|
450
|
+
const windowed = data
|
|
451
|
+
.toWindow()
|
|
452
|
+
.slide(5n, 2n); // Ventana deslizante
|
|
453
|
+
```
|
|
459
454
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
{ value: 45 }
|
|
466
|
-
]);
|
|
455
|
+
### Seleccionar Análisis Estadístico (Cálculos Numéricos)
|
|
456
|
+
```typescript
|
|
457
|
+
// Cuando se necesita análisis estadístico
|
|
458
|
+
const stats = data
|
|
459
|
+
.toNumericStatistics(); // Estadísticas numéricas
|
|
467
460
|
|
|
468
|
-
const
|
|
469
|
-
|
|
470
|
-
const sumWithMapper = objectStats.summate(obj => obj.value); // 120
|
|
461
|
+
const bigIntStats = data
|
|
462
|
+
.toBigintStatistics(); // Estadísticas BigInt
|
|
471
463
|
```
|
|
472
464
|
|
|
473
|
-
|
|
465
|
+
[GitHub](https://github.com/eloyhere/semantic-typescript)
|
|
466
|
+
[NPMJS](https://www.npmjs.com/package/semantic-typescript)
|
|
474
467
|
|
|
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
|
-
}
|
|
468
|
+
## Consideraciones Importantes
|
|
504
469
|
|
|
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
|
-
```
|
|
470
|
+
1. **Impacto de operaciones de ordenación**: En colectores ordenados, `sorted()` sobrescribe los efectos de `redirect`, `translate`, `shuffle`, `reverse`
|
|
471
|
+
2. **Consideraciones de rendimiento**: Si no se necesita garantía de orden, priorizar `toUnoredered()` para mejor rendimiento
|
|
472
|
+
3. **Uso de memoria**: Las operaciones de ordenación requieren espacio adicional O(n)
|
|
473
|
+
4. **Datos en tiempo real**: Los flujos Semantic son ideales para datos en tiempo real y admiten fuentes de datos asincrónicas
|
|
513
474
|
|
|
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.
|
|
475
|
+
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.
|