semantic-typescript 0.0.8 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/readme.es.md CHANGED
@@ -1,529 +1,428 @@
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` | Colección de tipos primitivos |
23
+ | `MaybePrimitive<T>` | Tipo que puede ser un primitivo |
24
+ | `OptionalSymbol` | Identificador simbólico para la clase Optional |
25
+ | `SemanticSymbol` | Identificador simbólico para la clase Semantic |
26
+ | `CollectorsSymbol` | Identificador simbólico para la clase Collector |
27
+ | `CollectableSymbol` | Identificador simbólico para la clase Collectable |
28
+ | `OrderedCollectableSymbol` | Identificador simbólico para la clase OrderedCollectable |
29
+ | `WindowCollectableSymbol` | Identificador simbólico para la clase WindowCollectable |
30
+ | `StatisticsSymbol` | Identificador simbólico para la clase Statistics |
31
+ | `NumericStatisticsSymbol` | Identificador simbólico para la clase NumericStatistics |
32
+ | `BigIntStatisticsSymbol` | Identificador simbólico para la clase BigIntStatistics |
33
+ | `UnorderedCollectableSymbol` | Identificador simbólico para la clase UnorderedCollectable |
34
+ | `Runnable` | Función sin parámetros ni valor de retorno |
35
+ | `Supplier<R>` | Función sin parámetros que retorna R |
36
+ | `Functional<T, R>` | Función de transformación de un parámetro |
37
+ | `Predicate<T>` | Función de predicado de un parámetro |
38
+ | `BiFunctional<T, U, R>` | Función de transformación de dos parámetros |
39
+ | `BiPredicate<T, U>` | Función de predicado de dos parámetros |
40
+ | `Comparator<T>` | Función de comparación |
41
+ | `TriFunctional<T, U, V, R>` | Función de transformación de tres parámetros |
42
+ | `Consumer<T>` | Función consumidora de un parámetro |
43
+ | `BiConsumer<T, U>` | Función consumidora de dos parámetros |
44
+ | `TriConsumer<T, U, V>` | Función consumidora de tres parámetros |
45
+ | `Generator<T>` | Función generadora |
48
46
 
49
- **Suplemento de Ejemplo de Código:**
50
47
  ```typescript
51
- 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>();
48
+ // Ejemplos de uso de tipos
49
+ const predicate: Predicate<number> = (n) => n > 0;
50
+ const mapper: Functional<string, number> = (str) => str.length;
51
+ const comparator: Comparator<number> = (a, b) => a - b;
64
52
  ```
65
53
 
66
- ### Fábricas de Funciones de Utilidad
54
+ ## Guardias de Tipo
55
+
56
+ | Función | Descripción | Complejidad Temporal | Complejidad Espacial |
57
+ |---------|-------------|---------------------|---------------------|
58
+ | `validate<T>(t: MaybeInvalid<T>): t is T` | Valida que el valor no sea null o undefined | O(1) | O(1) |
59
+ | `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | Valida que el valor sea null o undefined | O(1) | O(1) |
60
+ | `isBoolean(t: unknown): t is boolean` | Verifica si es booleano | O(1) | O(1) |
61
+ | `isString(t: unknown): t is string` | Verifica si es string | O(1) | O(1) |
62
+ | `isNumber(t: unknown): t is number` | Verifica si es número | O(1) | O(1) |
63
+ | `isFunction(t: unknown): t is Function` | Verifica si es función | O(1) | O(1) |
64
+ | `isObject(t: unknown): t is object` | Verifica si es objeto | O(1) | O(1) |
65
+ | `isSymbol(t: unknown): t is symbol` | Verifica si es símbolo | O(1) | O(1) |
66
+ | `isBigint(t: unknown): t is bigint` | Verifica si es BigInt | O(1) | O(1) |
67
+ | `isPrimitive(t: unknown): t is Primitive` | Verifica si es tipo primitivo | O(1) | O(1) |
68
+ | `isIterable(t: unknown): t is Iterable<unknown>` | Verifica si es iterable | O(1) | O(1) |
69
+ | `isOptional(t: unknown): t is Optional<unknown>` | Verifica si es instancia de Optional | O(1) | O(1) |
70
+ | `isSemantic(t: unknown): t is Semantic<unknown>` | Verifica si es instancia de Semantic | O(1) | O(1) |
71
+ | `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Verifica si es instancia de Collector | O(1) | O(1) |
72
+ | `isCollectable(t: unknown): t is Collectable<unknown>` | Verifica si es instancia de Collectable | O(1) | O(1) |
73
+ | `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | Verifica si es instancia de OrderedCollectable | O(1) | O(1) |
74
+ | `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | Verifica si es instancia de WindowCollectable | O(1) | O(1) |
75
+ | `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | Verifica si es instancia de UnorderedCollectable | O(1) | O(1) |
76
+ | `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Verifica si es instancia de Statistics | O(1) | O(1) |
77
+ | `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | Verifica si es instancia de NumericStatistics | O(1) | O(1) |
78
+ | `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | Verifica si es instancia de BigIntStatistics | O(1) | O(1) |
67
79
 
68
- | Método | Firma | Descripción | Ejemplo |
69
- |------|------|------|------|
70
- | `validate` | `<T>(t: MaybeInvalid<T>) => t is T` | Validar si el valor es válido | `validate(null)` → `false` |
71
- | `invalidate` | `<T>(t: MaybeInvalid<T>) => t is null\|undefined` | Validar si el valor es inválido | `invalidate(0)` → `false` |
72
- | `useCompare` | `<T>(t1: T, t2: T) => number` | Función de comparación genérica | `useCompare("a", "b")` → `-1` |
73
- | `useRandom` | `<T = number\|bigint>(index: T) => T` | Generador de números pseudoaleatorios | `useRandom(5)` → número aleatorio |
74
-
75
- **Suplemento de Ejemplo de Código:**
76
80
  ```typescript
77
- import { validate, invalidate, useCompare, useRandom } from 'semantic-typescript';
81
+ // Ejemplos de uso de guardias de tipo
82
+ const value: unknown = "hello";
78
83
 
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
84
+ if (isString(value)) {
85
+ console.log(value.length); // Seguro de tipos, value se infiere como string
83
86
  }
84
87
 
85
- const nullData: string | null = null;
86
- if (invalidate(nullData)) {
87
- console.log("Datos inválidos"); // Se ejecutará porque invalidate detectó null
88
+ if (isOptional(someValue)) {
89
+ someValue.ifPresent(val => console.log(val));
88
90
  }
89
-
90
- // Comparar valores
91
- const comparison = useCompare("apple", "banana"); // -1
92
-
93
- // Generar número aleatorio
94
- const randomNum = useRandom(42); // Número aleatorio basado en semilla 42
95
91
  ```
96
92
 
97
- ## Detalles de la Clase Principal
98
-
99
- ### Optional<T> - Manejo Seguro de Valores Nulos
93
+ ## Funciones de Utilidad
100
94
 
101
- La clase Optional proporciona un enfoque funcional para manejar seguramente valores que pueden ser null o undefined.
95
+ | Función | Descripción | Complejidad Temporal | Complejidad Espacial |
96
+ |---------|-------------|---------------------|---------------------|
97
+ | `useCompare<T>(t1: T, t2: T): number` | Función de comparación universal | O(1) | O(1) |
98
+ | `useRandom<T = number \| bigint>(index: T): T` | Generador de números pseudoaleatorios | O(log n) | O(1) |
102
99
 
103
- | Método | Tipo de Retorno | Descripción | Complejidad Temporal |
104
- |------|----------|------|------------|
105
- | `filter(predicate: Predicate<T>)` | `Optional<T>` | Filtrar valores que satisfacen condición | O(1) |
106
- | `get()` | `T` | Obtener valor, lanza error si está vacío | O(1) |
107
- | `getOrDefault(defaultValue: T)` | `T` | Obtener valor o valor por defecto | O(1) |
108
- | `ifPresent(action: Consumer<T>)` | `void` | Ejecutar acción si existe valor | O(1) |
109
- | `isEmpty()` | `boolean` | Verificar si está vacío | O(1) |
110
- | `isPresent()` | `boolean` | Verificar si existe valor | O(1) |
111
- | `map<R>(mapper: Functional<T, R>)` | `Optional<R>` | Mapear y transformar valor | O(1) |
112
- | `static of<T>(value: MaybeInvalid<T>)` | `Optional<T>` | Crear instancia Optional | O(1) |
113
- | `static ofNullable<T>(value?)` | `Optional<T>` | Crear Optional nullable | O(1) |
114
- | `static ofNonNull<T>(value: T)` | `Optional<T>` | Crear Optional no nulo | O(1) |
115
-
116
- **Suplemento de Ejemplo de Código:**
117
100
  ```typescript
118
- import { Optional } from 'semantic-typescript';
101
+ // Ejemplos de uso de funciones de utilidad
102
+ const numbers = [3, 1, 4, 1, 5];
103
+ numbers.sort(useCompare); // [1, 1, 3, 4, 5]
119
104
 
120
- // Crear instancia Optional
121
- const optionalValue = Optional.ofNullable<string>(Math.random() > 0.5 ? "hello" : null);
105
+ const randomNum = useRandom(42); // Número aleatorio basado en semilla
106
+ const randomBigInt = useRandom(1000n); // Número BigInt aleatorio
107
+ ```
122
108
 
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
109
+ ## Métodos de Fábrica
128
110
 
129
- console.log(result); // "HELLO" o "default"
111
+ ### Métodos de Fábrica de Optional
130
112
 
131
- // Operaciones seguras
132
- optionalValue.ifPresent(val => {
133
- console.log(`Valor existe: ${val}`);
134
- });
113
+ | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
114
+ |--------|-------------|---------------------|---------------------|
115
+ | `Optional.empty<T>()` | Crea un Optional vacío | O(1) | O(1) |
116
+ | `Optional.of<T>(value)` | Crea un Optional con valor | O(1) | O(1) |
117
+ | `Optional.ofNullable<T>(value)` | Crea un Optional que puede ser nulo | O(1) | O(1) |
118
+ | `Optional.ofNonNull<T>(value)` | Crea un Optional no nulo | O(1) | O(1) |
135
119
 
136
- // Verificar estado
137
- if (optionalValue.isPresent()) {
138
- console.log("Tiene valor");
139
- } else if (optionalValue.isEmpty()) {
140
- console.log("Está vacío");
141
- }
120
+ ```typescript
121
+ // Ejemplos de uso de Optional
122
+ const emptyOpt = Optional.empty<number>();
123
+ const presentOpt = Optional.of(42);
124
+ const nullableOpt = Optional.ofNullable<string>(null);
125
+ const nonNullOpt = Optional.ofNonNull("hello");
126
+
127
+ presentOpt.ifPresent(val => console.log(val)); // Output 42
128
+ console.log(emptyOpt.orElse(100)); // Output 100
142
129
  ```
143
130
 
144
- ### 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:**
173
- ```typescript
174
- import { from } from 'semantic-typescript';
131
+ ### Métodos de Fábrica de Collector
175
132
 
176
- const stream = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
133
+ | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
134
+ |--------|-------------|---------------------|---------------------|
135
+ | `Collector.full(identity, accumulator, finisher)` | Crea un colector completo | O(1) | O(1) |
136
+ | `Collector.shortable(identity, interruptor, accumulator, finisher)` | Crea un colector interrumpible | O(1) | O(1) |
177
137
 
178
- // 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
138
+ ```typescript
139
+ // Ejemplos de uso de Collector
140
+ const sumCollector = Collector.full(
141
+ () => 0,
142
+ (sum, num) => sum + num,
143
+ result => result
144
+ );
185
145
 
186
- // Nota: El flujo aún no se ha ejecutado, necesita conversión a Collectable para operaciones terminales
146
+ const numbers = from([1, 2, 3, 4, 5]);
147
+ const total = numbers.toUnoredered().collect(sumCollector); // 15
187
148
  ```
188
149
 
189
- #### Operaciones Terminales de Flujos
150
+ ### Métodos de fábrica de Semantic
190
151
 
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 |
152
+ | Método | Descripción | Complejidad temporal | Complejidad espacial |
153
+ |--------|-------------|----------------------|----------------------|
154
+ | `blob(blob, chunkSize)` | Crea flujo desde Blob | O(n) | O(chunkSize) |
155
+ | `empty<E>()` | Crea flujo vacío | O(1) | O(1) |
156
+ | `fill<E>(element, count)` | Crea flujo lleno | O(n) | O(1) |
157
+ | `from<E>(iterable)` | Crea flujo desde objeto iterable | O(1) | O(1) |
158
+ | `interval(period, delay?)` | Crea flujo de intervalo regular | O(1)* | O(1) |
159
+ | `iterate<E>(generator)` | Crea flujo desde generador | O(1) | O(1) |
160
+ | `range(start, end, step)` | Crea flujo de rango numérico | O(n) | O(1) |
161
+ | `websocket(websocket)` | Crea flujo desde WebSocket | O(1) | O(1) |
200
162
 
201
- **Suplemento de Ejemplo de Código:**
202
163
  ```typescript
203
- import { from } from 'semantic-typescript';
164
+ // Ejemplo de uso de métodos de fábrica de Semantic
204
165
 
205
- const semanticStream = from([5, 2, 8, 1, 9, 3, 7, 4, 6]);
166
+ // Crear flujo desde Blob (lectura por fragmentos)
167
+ blob(someBlob, 1024n)
168
+ .toUnordered()
169
+ .write(WritableStream)
170
+ .then(callback) // Escritura de flujo exitosa
171
+ .catch(writeFi); // Escritura de flujo fallida
206
172
 
207
- // Convertir a colección ordenada (menor rendimiento)
208
- const ordered = semanticStream.toOrdered();
173
+ // Crear flujo vacío que no se ejecutará hasta concatenarse con otros flujos
174
+ empty<string>()
175
+ .toUnordered()
176
+ .join(); //[]
209
177
 
210
- // Convertir a colección desordenada (más rápido)
211
- const unordered = semanticStream.toUnordered();
178
+ // Crear flujo lleno
179
+ const filledStream = fill("hello", 3); // "hello", "hello", "hello"
212
180
 
213
- // Ordenación natural
214
- const sortedNatural = semanticStream.sorted();
181
+ // Crear flujo temporal con retraso inicial de 2 segundos y ciclo de 5 segundos,
182
+ // implementado mediante mecanismo de temporizador, posibles desviaciones de tiempo
183
+ // debido a limitaciones de programación del sistema.
184
+ const intervalStream = interval(5000, 2000);
215
185
 
216
- // Ordenación personalizada
217
- const sortedCustom = semanticStream.sorted((a, b) => b - a); // Orden descendente
186
+ // Crear flujo desde objeto iterable
187
+ const numberStream = from([1, 2, 3, 4, 5]);
188
+ const stringStream = from(new Set(["Alex", "Bob"]));
218
189
 
219
- // Convertir a objeto estadístico
220
- const stats = semanticStream.toNumericStatistics();
190
+ // Crear flujo de rango
191
+ const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
221
192
 
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
193
+ // Flujo de eventos WebSocket
194
+ const ws = new WebSocket("ws://localhost:8080");
195
+ websocket(ws)
196
+ .filter((event)=> event.type === "message") // Solo monitorear eventos de mensaje
197
+ .toUnordered() // Para eventos normalmente sin ordenar
198
+ .forEach((event)=> receive(event)); // Recibir mensajes
223
199
  ```
224
200
 
225
- ### Collector<E, A, R> - Colector de Datos
201
+ ## Métodos de Clase Semantic
202
+
203
+ | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
204
+ |--------|-------------|---------------------|---------------------|
205
+ | `concat(other)` | Concatena dos flujos | O(n) | O(1) |
206
+ | `distinct()` | Elimina duplicados | O(n) | O(n) |
207
+ | `distinct(comparator)` | Elimina duplicados con comparador | O(n²) | O(n) |
208
+ | `dropWhile(predicate)` | Descarta elementos que cumplen condición | O(n) | O(1) |
209
+ | `filter(predicate)` | Filtra elementos | O(n) | O(1) |
210
+ | `flat(mapper)` | Aplanamiento de mapeo | O(n × m) | O(1) |
211
+ | `flatMap(mapper)` | Aplanamiento a nuevo tipo | O(n × m) | O(1) |
212
+ | `limit(n)` | Limita cantidad de elementos | O(n) | O(1) |
213
+ | `map(mapper)` | Transformación de mapeo | O(n) | O(1) |
214
+ | `peek(consumer)` | Inspecciona elementos | O(n) | O(1) |
215
+ | `redirect(redirector)` | Redirección de índices | O(n) | O(1) |
216
+ | `reverse()` | Revierte flujo | O(n) | O(1) |
217
+ | `shuffle()` | Mezcla aleatoria | O(n) | O(1) |
218
+ | `shuffle(mapper)` | Mezcla con mapeador | O(n) | O(1) |
219
+ | `skip(n)` | Salta primeros n elementos | O(n) | O(1) |
220
+ | `sorted()` | Ordena | O(n log n) | O(n) |
221
+ | `sorted(comparator)` | Ordena con comparador | O(n log n) | O(n) |
222
+ | `sub(start, end)` | Obtiene subflujo | O(n) | O(1) |
223
+ | `takeWhile(predicate)` | Toma elementos que cumplen condición | O(n) | O(1) |
224
+ | `translate(offset)` | Traslación de índices | O(n) | O(1) |
225
+ | `translate(translator)` | Traslación con traductor | O(n) | O(1) |
226
226
 
227
- Los colectores se utilizan para agregar datos de flujos en estructuras específicas.
228
-
229
- | Método | Descripción | Escenario de Uso |
230
- |------|------|----------|
231
- | `collect(generator)` | Ejecutar recolección de datos | Operación terminal de flujo |
232
- | `static full(identity, accumulator, finisher)` | Crear colector completo | Requiere procesamiento completo |
233
- | `static shortable(identity, interruptor, accumulator, finisher)` | Crear colector interrumpible | Puede terminar temprano |
234
-
235
- **Suplemento de Ejemplo de Código:**
236
227
  ```typescript
237
- 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
228
+ // Ejemplos de operaciones Semantic
229
+ const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
230
+ .filter(n => n % 2 === 0) // Filtra números pares
231
+ .map(n => n * 2) // Multiplica por 2
232
+ .skip(1) // Salta el primero
233
+ .limit(3) // Limita a 3 elementos
234
+ .toArray(); // Convierte a array
235
+ // Resultado: [8, 12, 20]
236
+
237
+ // Ejemplo de operación compleja
238
+ const complexResult = range(1, 100, 1)
239
+ .flatMap(n => from([n, n * 2])) // Mapea cada elemento a dos elementos
240
+ .distinct() // Elimina duplicados
241
+ .shuffle() // Mezcla aleatoriamente
242
+ .takeWhile(n => n < 50) // Toma elementos < 50
243
+ .toOrdered() // Convierte a colector ordenado
244
+ .toArray(); // Convierte a array
249
245
  ```
250
246
 
251
- ### Collectable<E> - Clase Abstracta de Datos Colectables
247
+ ## Métodos de Transformación de Colectores
252
248
 
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.**
249
+ | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
250
+ |--------|-------------|---------------------|---------------------|
251
+ | `toUnoredered()` | Convierte a colector no ordenado (prioridad rendimiento) | O(1) | O(1) |
252
+ | `toOrdered()` | Convierte a colector ordenado | O(1) | O(1) |
253
+ | `sorted()` | Ordena y convierte a colector ordenado | O(n log n) | O(n) |
254
+ | `toWindow()` | Convierte a colector de ventana | O(1) | O(1) |
255
+ | `toNumericStatistics()` | Convierte a estadísticas numéricas | O(1) | O(1) |
256
+ | `toBigintStatistics()` | Convierte a estadísticas BigInt | O(1) | O(1) |
254
257
 
255
- #### Operaciones de Consulta de Datos
258
+ ```typescript
259
+ // Ejemplos de transformación de colectores
260
+ const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
256
261
 
257
- | 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()` |
262
+ // Prioridad rendimiento: Usar colector no ordenado
263
+ const unordered = numbers
264
+ .filter(n => n > 3)
265
+ .toUnoredered();
266
266
 
267
- **Suplemento de Ejemplo de Código:**
268
- ```typescript
269
- import { from } from 'semantic-typescript';
267
+ // Necesita orden: Usar colector ordenado
268
+ const ordered = numbers.sorted();
270
269
 
271
- const numbers = from([1, 2, 3, 4, 5]);
270
+ // Análisis estadístico: Usar colector estadístico
271
+ const stats = numbers
272
+ .toNumericStatistics();
273
+
274
+ console.log(stats.mean()); // Promedio
275
+ console.log(stats.median()); // Mediana
276
+ console.log(stats.standardDeviation()); // Desviación estándar
272
277
 
273
- // Debe convertir a Collectable antes de usar métodos terminales
274
- const collectable = numbers.toUnordered();
278
+ // Operaciones de ventana
279
+ const windowed = numbers
280
+ .toWindow()
281
+ .tumble(3n); // Ventana de 3 elementos
275
282
 
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
283
+ windowed.forEach(window => {
284
+ console.log(window.toArray()); // Contenido de cada ventana
285
+ });
283
286
  ```
284
287
 
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:**
288
+ ## Métodos de Recolección de Collectable
289
+
290
+ | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
291
+ |--------|-------------|---------------------|---------------------|
292
+ | `anyMatch(predicate)` | Verifica si existe coincidencia | O(n) | O(1) |
293
+ | `allMatch(predicate)` | Verifica si todos coinciden | O(n) | O(1) |
294
+ | `count()` | Cuenta elementos | O(n) | O(1) |
295
+ | `isEmpty()` | Verifica si está vacío | O(1) | O(1) |
296
+ | `findAny()` | Encuentra cualquier elemento | O(n) | O(1) |
297
+ | `findFirst()` | Encuentra primer elemento | O(n) | O(1) |
298
+ | `findLast()` | Encuentra último elemento | O(n) | O(1) |
299
+ | `forEach(action)` | Itera sobre todos los elementos | O(n) | O(1) |
300
+ | `group(classifier)` | Agrupa por clasificador | O(n) | O(n) |
301
+ | `groupBy(keyExtractor, valueExtractor)` | Agrupa por extractores de clave-valor | O(n) | O(n) |
302
+ | `join()` | Concatena a string | O(n) | O(n) |
303
+ | `join(delimiter)` | Concatena con separador | O(n) | O(n) |
304
+ | `nonMatch(predicate)` | Verifica si no hay coincidencias | O(n) | O(1) |
305
+ | `partition(count)` | Particiona por cantidad | O(n) | O(n) |
306
+ | `partitionBy(classifier)` | Particiona por clasificador | O(n) | O(n) |
307
+ | `reduce(accumulator)` | Operación de reducción | O(n) | O(1) |
308
+ | `reduce(identity, accumulator)` | Reducción con valor inicial | O(n) | O(1) |
309
+ | `toArray()` | Convierte a array | O(n) | O(n) |
310
+ | `toMap(keyExtractor, valueExtractor)` | Convierte a Map | O(n) | O(n) |
311
+ | `toSet()` | Convierte a Set | O(n) | O(n) |
312
+ | `write(stream)` | Escribe a stream | O(n) | O(1) |
313
+
302
314
  ```typescript
303
- import { from } from 'semantic-typescript';
315
+ // Ejemplos de operaciones Collectable
316
+ const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
317
+ .filter(n => n % 2 === 0)
318
+ .toOrdered();
304
319
 
305
- 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
- ]);
320
+ // Verificaciones de coincidencia
321
+ console.log(data.anyMatch(n => n > 5)); // true
322
+ console.log(data.allMatch(n => n < 20)); // true
310
323
 
311
- // Debe convertir a Collectable antes de usar operaciones de agregación
312
- const collectable = people.toUnordered();
324
+ // Operaciones de búsqueda
325
+ data.findFirst().ifPresent(n => console.log(n)); // 2
326
+ data.findAny().ifPresent(n => console.log(n)); // Elemento cualquiera
313
327
 
314
328
  // Operaciones de agrupación
315
- const 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
329
+ const grouped = data.groupBy(
330
+ n => n > 5 ? "large" : "small",
331
+ n => n * 2
321
332
  );
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 }
333
+ // {small: [4, 8], large: [12, 16, 20]}
331
334
 
332
335
  // 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
336
+ const sum = data.reduce(0, (acc, n) => acc + n); // 30
338
337
 
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
338
+ // Operaciones de salida
339
+ data.join(", "); // "2, 4, 6, 8, 10"
340
+ ```
348
341
 
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
342
+ ## Métodos de Análisis Estadístico
343
+
344
+ ### Métodos de NumericStatistics
345
+
346
+ | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
347
+ |--------|-------------|---------------------|---------------------|
348
+ | `range()` | Rango | O(n) | O(1) |
349
+ | `variance()` | Varianza | O(n) | O(1) |
350
+ | `standardDeviation()` | Desviación estándar | O(n) | O(1) |
351
+ | `mean()` | Media | O(n) | O(1) |
352
+ | `median()` | Mediana | O(n log n) | O(n) |
353
+ | `mode()` | Moda | O(n) | O(n) |
354
+ | `frequency()` | Distribución de frecuencia | O(n) | O(n) |
355
+ | `summate()` | Sumatoria | O(n) | O(1) |
356
+ | `quantile(quantile)` | Cuantil | O(n log n) | O(n) |
357
+ | `interquartileRange()` | Rango intercuartílico | O(n log n) | O(n) |
358
+ | `skewness()` | Sesgo | O(n) | O(1) |
359
+ | `kurtosis()` | Curtosis | O(n) | O(1) |
355
360
 
356
- **Suplemento de Ejemplo de Código:**
357
361
  ```typescript
358
- 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, ...]
362
+ // Ejemplos de análisis estadístico
363
+ const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
364
+ .toNumericStatistics();
365
+
366
+ console.log("Media:", numbers.mean()); // 5.5
367
+ console.log("Mediana:", numbers.median()); // 5.5
368
+ console.log("Desviación estándar:", numbers.standardDeviation()); // ~2.87
369
+ console.log("Suma:", numbers.summate()); // 55
370
+
371
+ // Análisis estadístico con mapeador
372
+ const objects = from([
373
+ { value: 10 },
374
+ { value: 20 },
375
+ { value: 30 }
376
+ ]).toNumericStatistics();
377
+
378
+ console.log("Media mapeada:", objects.mean(obj => obj.value)); // 20
379
+ ```
369
380
 
370
- // 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], ...
381
+ ## Guía de Selección de Rendimiento
374
382
 
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], ...
383
+ ### Seleccionar Colector No Ordenado (Prioridad Rendimiento)
384
+ ```typescript
385
+ // Cuando no se necesita garantía de orden
386
+ const highPerformance = data
387
+ .filter(predicate)
388
+ .map(mapper)
389
+ .toUnoredered(); // Mejor rendimiento
377
390
  ```
378
391
 
379
- ### 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:**
392
+ ### Seleccionar Colector Ordenado (Necesita Orden)
403
393
  ```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, ...}
394
+ // Cuando se debe mantener el orden de elementos
395
+ const ordered = data
396
+ .sorted(comparator) // La ordenación sobrescribe efectos de redirección
397
+ .toOrdered(); // Mantiene orden
430
398
  ```
431
399
 
432
- #### 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:**
400
+ ### Seleccionar Colector de Ventana (Operaciones de Ventana)
443
401
  ```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
402
+ // Cuando se necesitan operaciones de ventana
403
+ const windowed = data
404
+ .toWindow()
405
+ .slide(5n, 2n); // Ventana deslizante
406
+ ```
459
407
 
460
- // Estadísticas usando funciones mapeadoras
461
- const objectData = from([
462
- { value: 15 },
463
- { value: 25 },
464
- { value: 35 },
465
- { value: 45 }
466
- ]);
408
+ ### Seleccionar Análisis Estadístico (Cálculos Numéricos)
409
+ ```typescript
410
+ // Cuando se necesita análisis estadístico
411
+ const stats = data
412
+ .toNumericStatistics(); // Estadísticas numéricas
467
413
 
468
- const objectStats = objectData.toNumericStatistics();
469
- const meanWithMapper = objectStats.mean(obj => obj.value); // 30
470
- const sumWithMapper = objectStats.summate(obj => obj.value); // 120
414
+ const bigIntStats = data
415
+ .toBigintStatistics(); // Estadísticas BigInt
471
416
  ```
472
417
 
473
- ## Ejemplo Completo de Uso
418
+ [GitHub](https://github.com/eloyhere/semantic-typescript)
419
+ [NPMJS](https://www.npmjs.com/package/semantic-typescript)
474
420
 
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
- }
421
+ ## Consideraciones Importantes
504
422
 
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
- ```
423
+ 1. **Impacto de operaciones de ordenación**: En colectores ordenados, `sorted()` sobrescribe los efectos de `redirect`, `translate`, `shuffle`, `reverse`
424
+ 2. **Consideraciones de rendimiento**: Si no se necesita garantía de orden, priorizar `toUnoredered()` para mejor rendimiento
425
+ 3. **Uso de memoria**: Las operaciones de ordenación requieren espacio adicional O(n)
426
+ 4. **Datos en tiempo real**: Los flujos Semantic son ideales para datos en tiempo real y admiten fuentes de datos asincrónicas
513
427
 
514
- ## 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.
428
+ Esta biblioteca proporciona a los desarrolladores de TypeScript capacidades potentes y flexibles de procesamiento de flujos, combinando las ventajas de la programación funcional con la seguridad de tipos.