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/readme.es.md CHANGED
@@ -1,529 +1,475 @@
1
- # Framework de Procesamiento de Flujos Semantic-TypeScript
1
+ # Biblioteca de Procesamiento de Flujos Semantic-TypeScript
2
2
 
3
3
  ## Introducción
4
4
 
5
- Semantic-TypeScript es una librería moderna de procesamiento de flujos inspirada en GeneratorFunction de JavaScript, Java Stream e Índices de MySQL. La filosofía de diseño central se basa en construir pipelines eficientes de procesamiento de datos mediante indexación de datos, proporcionando una experiencia de operación de streaming en estilo funcional y type-safe para el desarrollo frontend.
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 emplea un modelo de procesamiento asíncrono. Al crear flujos de datos, el momento de recepción de datos terminales depende completamente de cuándo la corriente superior llama a las funciones callback `accept` e `interrupt`. Este diseño permite que la librería maneje elegantemente flujos de datos en tiempo real, grandes conjuntos de datos y fuentes de datos asíncronas.
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
- ## Características Principales
9
+ ## Instalación
10
10
 
11
- | Característica | Descripción | Ventaja |
12
- |------|------|------|
13
- | **Genéricos Type-Safe** | Soporte completo de tipos TypeScript | Detección de errores en tiempo de compilación, mejor experiencia de desarrollo |
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
- | Método | Firma | Descripción | Ejemplo |
40
- |------|------|------|------|
41
- | `blob` | `(blob: Blob, chunk?: bigint) => Semantic<Uint8Array>` | Convertir Blob a flujo de bytes | `blob(fileBlob, 1024n)` |
42
- | `empty` | `<E>() => Semantic<E>` | Crear flujo vacío | `empty<number>()` |
43
- | `fill` | `<E>(element: E, count: bigint) => Semantic<E>` | Llenar con número especificado de elementos | `fill("hello", 5n)` |
44
- | `from` | `<E>(iterable: Iterable<E>) => Semantic<E>` | Crear flujo desde objeto iterable | `from([1, 2, 3])` |
45
- | `range` | `<N extends number\|bigint>(start: N, end: N, step?: N) => Semantic<N>` | Crear flujo de rango numérico | `range(1, 10, 2)` |
46
- | `iterate` | `<E>(generator: Generator<E>) => Semantic<E>` | Crear flujo desde función generadora | `iterate(myGenerator)` |
47
- | `websocket` | `(websocket: WebSocket) => Semantic<MessageEvent>` | Crear flujo de eventos desde WebSocket | `websocket(socket)` |
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
- import { from, range, fill, empty } from 'semantic-typescript';
52
-
53
- // Crear flujo desde array
54
- const numberStream = from([1, 2, 3, 4, 5]);
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
- ### Fábricas de Funciones de Utilidad
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
- import { validate, invalidate, useCompare, useRandom } from 'semantic-typescript';
87
+ // Ejemplos de uso de guardias de tipo
88
+ const value: unknown = "hello";
78
89
 
79
- // Validar validez de datos
80
- const data: string | null = "hello";
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
- const nullData: string | null = null;
86
- if (invalidate(nullData)) {
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
- ## Detalles de la Clase Principal
98
-
99
- ### Optional<T> - Manejo Seguro de Valores Nulos
99
+ ## Funciones de Utilidad
100
100
 
101
- La clase Optional proporciona un enfoque funcional para manejar seguramente valores que pueden ser null o undefined.
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
- import { Optional } from 'semantic-typescript';
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
- // Crear instancia Optional
121
- const optionalValue = Optional.ofNullable<string>(Math.random() > 0.5 ? "hello" : null);
111
+ const randomNum = useRandom(42); // Número aleatorio basado en semilla
112
+ const randomBigInt = useRandom(1000n); // Número BigInt aleatorio
113
+ ```
122
114
 
123
- // Operaciones en cadena
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
- console.log(result); // "HELLO" o "default"
117
+ ### Métodos de Fábrica de Optional
130
118
 
131
- // Operaciones seguras
132
- optionalValue.ifPresent(val => {
133
- console.log(`Valor existe: ${val}`);
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
- // Verificar estado
137
- if (optionalValue.isPresent()) {
138
- console.log("Tiene valor");
139
- } else if (optionalValue.isEmpty()) {
140
- console.log("Está vacío");
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
- ### Semantic<E> - Flujo de Datos Perezoso
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:**
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
- import { from } from 'semantic-typescript';
145
+ // Ejemplos de conversión de colectores
146
+ const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
175
147
 
176
- const stream = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
148
+ // Prioridad al rendimiento: usar colector no ordenado
149
+ const unordered = numbers
150
+ .filter(n => n > 3)
151
+ .toUnoredered();
177
152
 
178
- // Ejemplos de operaciones de transformación de flujos
179
- const processedStream = stream
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
- // Nota: El flujo aún no se ha ejecutado, necesita conversión a Collectable para operaciones terminales
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
- #### Operaciones Terminales de Flujos
175
+ ### Métodos de fábrica de Semantic
190
176
 
191
- | Método | Tipo de Retorno | Descripción | Características de Rendimiento |
192
- |------|----------|------|----------|
193
- | `toOrdered()` | `OrderedCollectable<E>` | Convertir a colección ordenada | Operación de ordenación, menor rendimiento |
194
- | `toUnordered()` | `UnorderedCollectable<E>` | Convertir a colección desordenada | Más rápido, sin ordenación |
195
- | `toWindow()` | `WindowCollectable<E>` | Convertir a colección de ventana | Operación de ordenación, menor rendimiento |
196
- | `toNumericStatistics()` | `Statistics<E, number>` | Análisis estadístico numérico | Operación de ordenación, menor rendimiento |
197
- | `toBigintStatistics()` | `Statistics<E, bigint>` | Análisis estadístico de big integer | Operación de ordenación, menor rendimiento |
198
- | `sorted()` | `OrderedCollectable<E>` | Ordenación natural | Anula resultados de redirección |
199
- | `sorted(comparator)` | `OrderedCollectable<E>` | Ordenación personalizada | Anula resultados de redirección |
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
- import { from } from 'semantic-typescript';
190
+ // Ejemplo de uso de métodos de fábrica de Semantic
204
191
 
205
- const semanticStream = from([5, 2, 8, 1, 9, 3, 7, 4, 6]);
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
- // Convertir a colección ordenada (menor rendimiento)
208
- const ordered = semanticStream.toOrdered();
199
+ // Crear flujo vacío que no se ejecutará hasta concatenarse con otros flujos
200
+ empty<string>()
201
+ .toUnordered()
202
+ .join(); //[]
209
203
 
210
- // Convertir a colección desordenada (más rápido)
211
- const unordered = semanticStream.toUnordered();
204
+ // Crear flujo lleno
205
+ const filledStream = fill("hello", 3); // "hello", "hello", "hello"
212
206
 
213
- // Ordenación natural
214
- const sortedNatural = semanticStream.sorted();
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
- // Ordenación personalizada
217
- const sortedCustom = semanticStream.sorted((a, b) => b - a); // Orden descendente
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
- // Convertir a objeto estadístico
220
- const stats = semanticStream.toNumericStatistics();
216
+ // Crear flujo de rango
217
+ const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
221
218
 
222
- // Nota: Debe llamar a los métodos anteriores a través de la instancia Semantic para obtener Collectable antes de usar métodos terminales
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
- ### Collector<E, A, R> - Colector de Datos
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
- import { Collector } from 'semantic-typescript';
238
-
239
- // Crear colector personalizado
240
- const sumCollector = Collector.full(
241
- () => 0, // Valor inicial
242
- (acc, value) => acc + value, // Acumulador
243
- result => result // Función finalizadora
244
- );
245
-
246
- // Usar colector (requiere conversión de Semantic a Collectable primero)
247
- const numbers = from([1, 2, 3, 4, 5]);
248
- const sum = numbers.toUnordered().collect(sumCollector); // 15
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
- ### Collectable<E> - Clase Abstracta de Datos Colectables
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 | Tipo de Retorno | Descripción | Ejemplo |
258
- |------|----------|------|------|
259
- | `anyMatch(predicate)` | `boolean` | Si algún elemento coincide | `anyMatch(x => x > 0)` |
260
- | `allMatch(predicate)` | `boolean` | Si todos los elementos coinciden | `allMatch(x => x > 0)` |
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()` |
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
- import { from } from 'semantic-typescript';
270
-
271
- const numbers = from([1, 2, 3, 4, 5]);
272
-
273
- // Debe convertir a Collectable antes de usar métodos terminales
274
- const collectable = numbers.toUnordered();
275
-
276
- // Operaciones de consulta de datos
277
- const hasEven = collectable.anyMatch(x => x % 2 === 0); // true
278
- const allPositive = collectable.allMatch(x => x > 0); // true
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
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
- #### Operaciones de Agregación de Datos
286
-
287
- | Método | Tipo de Retorno | Descripción | Complejidad |
288
- |------|----------|------|--------|
289
- | `group(classifier)` | `Map<K, E[]>` | Agrupar por clasificador | O(n) |
290
- | `groupBy(keyExtractor, valueExtractor)` | `Map<K, V[]>` | Agrupar por extractores de clave-valor | O(n) |
291
- | `join()` | `string` | Unir como cadena | O(n) |
292
- | `join(delimiter)` | `string` | Unir con delimitador | O(n) |
293
- | `partition(count)` | `E[][]` | Particionar por conteo | O(n) |
294
- | `partitionBy(classifier)` | `E[][]` | Particionar por clasificador | O(n) |
295
- | `reduce(accumulator)` | `Optional<E>` | Operación de reducción | O(n) |
296
- | `reduce(identity, accumulator)` | `E` | Reducción con identidad | O(n) |
297
- | `toArray()` | `E[]` | Convertir a array | O(n) |
298
- | `toMap(keyExtractor, valueExtractor)` | `Map<K, V>` | Convertir a Map | O(n) |
299
- | `toSet()` | `Set<E>` | Convertir a Set | O(n) |
300
-
301
- **Suplemento de Ejemplo de Código:**
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
- import { from } from 'semantic-typescript';
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
- const people = from([
306
- { name: "Alice", age: 25, city: "New York" },
307
- { name: "Bob", age: 30, city: "London" },
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
- // Debe convertir a Collectable antes de usar operaciones de agregación
312
- const collectable = people.toUnordered();
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 byCity = collectable.group(person => person.city);
316
- // Map { "New York" => [{name: "Alice", ...}, {name: "Charlie", ...}], "London" => [{name: "Bob", ...}] }
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
- // Map { 25 => ["Alice", "Charlie"], 30 => ["Bob"] }
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 totalAge = collectable.reduce(0, (acc, person) => acc + person.age); // 80
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
- #### UnorderedCollectable<E>
340
- - **Características**: Colector más rápido, sin ordenación
341
- - **Escenarios de Uso**: Orden no importante, máximo rendimiento deseado
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
- #### WindowCollectable<E>
350
- - **Características**: Soporta operaciones de ventana deslizante
351
- - **Escenarios de Uso**: Análisis de datos de series temporales
352
- - **Métodos Especiales**:
353
- - `slide(size, step)` - Ventana deslizante
354
- - `tumble(size)` - Ventana de tumble
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
- import { from } from 'semantic-typescript';
359
-
360
- const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
361
-
362
- // Colector desordenado (más rápido)
363
- const unordered = data.toUnordered();
364
- const unorderedArray = unordered.toArray(); // Puede mantener orden original [1, 2, 3, ...]
365
-
366
- // Colector ordenado
367
- const ordered = data.toOrdered();
368
- const orderedArray = ordered.toArray(); // Orden garantizado [1, 2, 3, ...]
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
- // Colector de ventana
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
- const tumblingWindows = windowed.tumble(4n); // Ventana de tumble tamaño 4
376
- // Ventana 1: [1, 2, 3, 4], Ventana 2: [5, 6, 7, 8], ...
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
- ### Statistics<E, D> - Análisis Estadístico
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
- import { from } from 'semantic-typescript';
405
-
406
- const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
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
- #### Clases Específicas de Implementación Estadística
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
- import { from } from 'semantic-typescript';
445
-
446
- // Estadísticas numéricas
447
- const numberData = from([10, 20, 30, 40, 50]);
448
- const numericStats = numberData.toNumericStatistics();
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
- // Estadísticas usando funciones mapeadoras
461
- const objectData = from([
462
- { value: 15 },
463
- { value: 25 },
464
- { value: 35 },
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 objectStats = objectData.toNumericStatistics();
469
- const meanWithMapper = objectStats.mean(obj => obj.value); // 30
470
- const sumWithMapper = objectStats.summate(obj => obj.value); // 120
461
+ const bigIntStats = data
462
+ .toBigintStatistics(); // Estadísticas BigInt
471
463
  ```
472
464
 
473
- ## Ejemplo Completo de Uso
465
+ [GitHub](https://github.com/eloyhere/semantic-typescript)
466
+ [NPMJS](https://www.npmjs.com/package/semantic-typescript)
474
467
 
475
- ```typescript
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
- // 5. Manejar datos potencialmente inválidos
506
- const potentiallyInvalidData: Array<number | null> = [1, null, 3, 4, null];
507
- const validData = potentiallyInvalidData.filter(validate);
508
- const invalidData = potentiallyInvalidData.filter(invalidate);
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
- ## Resumen de Reglas Importantes de Uso
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.