semantic-typescript 0.0.7 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/readme.es.md CHANGED
@@ -1,335 +1,428 @@
1
- # 📘 semantic-typescript
1
+ # Biblioteca de Procesamiento de Flujos Semantic-TypeScript
2
2
 
3
- Una poderosa biblioteca de utilidades para **procesamiento semántico de datos** en TypeScript, completamente **segura y tipada**.
4
- Proporciona construcciones funcionales compuestas para trabajar con colecciones, flujos y secuencias — con soporte para ordenar, filtrar, agrupar, realizar análisis estadísticos y más.
3
+ ## Introducción
5
4
 
6
- Ya sea que estés procesando **datos ordenados o no ordenados**, realizando **análisis estadísticos**, o simplemente **encadenando operaciones de forma fluida**, esta biblioteca está diseñada para cubrir todas tus necesidades.
5
+ Semantic-TypeScript es una biblioteca moderna de procesamiento de flujos inspirada en JavaScript GeneratorFunction, Java Stream y MySQL Index. El diseño central de la biblioteca se basa en la construcción de pipelines eficientes de procesamiento de datos utilizando índices de datos, proporcionando a los desarrolladores frontend una experiencia de operación de flujos con seguridad de tipos y estilo funcional.
7
6
 
8
- ---
7
+ A diferencia del procesamiento sincrónico tradicional, Semantic adopta un modo de procesamiento asincrónico. Al crear flujos de datos, el momento en que el terminal recibe los datos depende completamente de cuándo la fuente ascendente llama a las funciones de callback `accept` e `interrupt`. Este diseño permite que la biblioteca maneje elegantemente flujos de datos en tiempo real, conjuntos de datos grandes y fuentes de datos asincrónicas.
9
8
 
10
- ## 🧩 Características
11
-
12
- - ✅ **Genéricos tipados de forma segura** en toda la biblioteca
13
- - ✅ Estilo **funcional** (map, filter, reduce, etc.)
14
- - ✅ **Flujos de datos semánticos** (`Semantic<E>`) para evaluación diferida (lazy)
15
- - ✅ **Coleccionadores (Collectors)** para transformar flujos en estructuras concretas
16
- - ✅ **Collectables ordenados y no ordenados** — `toUnordered()` es **el más rápido (sin ordenar)**
17
- - ✅ **Soporte para ordenar** mediante `sorted()`, `toOrdered()`, y comparadores personalizados
18
- - ✅ **Análisis estadístico** (`Statistics`, `NumericStatistics`, `BigIntStatistics`)
19
- - ✅ **Optional<T>** — monada para manejar valores nulos de forma segura
20
- - ✅ Diseño basado en **iteradores y generadores** — ideal para grandes volúmenes o datos asíncronos
21
-
22
- ---
23
-
24
- ## 📦 Instalación
9
+ ## Instalación
25
10
 
26
11
  ```bash
27
12
  npm install semantic-typescript
28
13
  ```
29
14
 
30
- ---
31
-
32
- ## 🧠 Conceptos clave
33
-
34
- ### 1. `Optional<T>` Manejo seguro de valores nulos
35
-
36
- Un contenedor monádico para valores que pueden ser `null` o `undefined`.
37
-
38
- #### Métodos:
39
-
40
- | Método | Descripción | Ejemplo |
41
- |--------|-------------|---------|
42
- | `of(value)` | Envolver un valor (puede ser nulo) | `Optional.of(null)` |
43
- | `ofNullable(v)` | Envolver, permite valores nulos | `Optional.ofNullable(someVar)` |
44
- | `ofNonNull(v)` | Envolver, lanza excepción si es nulo/undefined | `Optional.ofNonNull(5)` |
45
- | `get()` | Obtener el valor (o lanzar excepción si está vacío) | `opt.get()` |
46
- | `getOrDefault(d)` | Obtener el valor o un valor por defecto | `opt.getOrDefault(0)` |
47
- | `ifPresent(fn)` | Ejecutar un efecto secundario si hay valor | `opt.ifPresent(x => console.log(x))` |
48
- | `map(fn)` | Transformar el valor si existe | `opt.map(x => x + 1)` |
49
- | `filter(fn)` | Conservar el valor solo si cumple el predicado | `opt.filter(x => x > 0)` |
50
- | `isEmpty()` | Verificar si está vacío | `opt.isEmpty()` |
51
- | `isPresent()` | Verificar si tiene un valor | `opt.isPresent()` |
52
-
53
- #### Ejemplo:
15
+ ## Tipos Básicos
16
+
17
+ | Tipo | Descripción |
18
+ |------|-------------|
19
+ | `Invalid<T>` | Tipo que extiende null o undefined |
20
+ | `Valid<T>` | Tipo que excluye null y undefined |
21
+ | `MaybeInvalid<T>` | Tipo que puede ser null o undefined |
22
+ | `Primitive` | Colección de tipos primitivos |
23
+ | `MaybePrimitive<T>` | Tipo que puede ser un primitivo |
24
+ | `OptionalSymbol` | Identificador simbólico para la clase Optional |
25
+ | `SemanticSymbol` | Identificador simbólico para la clase Semantic |
26
+ | `CollectorsSymbol` | Identificador simbólico para la clase Collector |
27
+ | `CollectableSymbol` | Identificador simbólico para la clase Collectable |
28
+ | `OrderedCollectableSymbol` | Identificador simbólico para la clase OrderedCollectable |
29
+ | `WindowCollectableSymbol` | Identificador simbólico para la clase WindowCollectable |
30
+ | `StatisticsSymbol` | Identificador simbólico para la clase Statistics |
31
+ | `NumericStatisticsSymbol` | Identificador simbólico para la clase NumericStatistics |
32
+ | `BigIntStatisticsSymbol` | Identificador simbólico para la clase BigIntStatistics |
33
+ | `UnorderedCollectableSymbol` | Identificador simbólico para la clase UnorderedCollectable |
34
+ | `Runnable` | Función sin parámetros ni valor de retorno |
35
+ | `Supplier<R>` | Función sin parámetros que retorna R |
36
+ | `Functional<T, R>` | Función de transformación de un parámetro |
37
+ | `Predicate<T>` | Función de predicado de un parámetro |
38
+ | `BiFunctional<T, U, R>` | Función de transformación de dos parámetros |
39
+ | `BiPredicate<T, U>` | Función de predicado de dos parámetros |
40
+ | `Comparator<T>` | Función de comparación |
41
+ | `TriFunctional<T, U, V, R>` | Función de transformación de tres parámetros |
42
+ | `Consumer<T>` | Función consumidora de un parámetro |
43
+ | `BiConsumer<T, U>` | Función consumidora de dos parámetros |
44
+ | `TriConsumer<T, U, V>` | Función consumidora de tres parámetros |
45
+ | `Generator<T>` | Función generadora |
54
46
 
55
47
  ```typescript
56
- import { Optional } from 'semantic-typescript';
57
-
58
- const value: number | null = Math.random() > 0.5 ? 10 : null;
59
-
60
- const opt = Optional.ofNullable(value);
61
-
62
- const result = opt
63
- .filter(v => v > 5)
64
- .map(v => v * 2)
65
- .getOrDefault(0);
66
-
67
- console.log(result); // 20 o 0
48
+ // Ejemplos de uso de tipos
49
+ const predicate: Predicate<number> = (n) => n > 0;
50
+ const mapper: Functional<string, number> = (str) => str.length;
51
+ const comparator: Comparator<number> = (a, b) => a - b;
68
52
  ```
69
53
 
70
- ---
54
+ ## Guardias de Tipo
55
+
56
+ | Función | Descripción | Complejidad Temporal | Complejidad Espacial |
57
+ |---------|-------------|---------------------|---------------------|
58
+ | `validate<T>(t: MaybeInvalid<T>): t is T` | Valida que el valor no sea null o undefined | O(1) | O(1) |
59
+ | `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | Valida que el valor sea null o undefined | O(1) | O(1) |
60
+ | `isBoolean(t: unknown): t is boolean` | Verifica si es booleano | O(1) | O(1) |
61
+ | `isString(t: unknown): t is string` | Verifica si es string | O(1) | O(1) |
62
+ | `isNumber(t: unknown): t is number` | Verifica si es número | O(1) | O(1) |
63
+ | `isFunction(t: unknown): t is Function` | Verifica si es función | O(1) | O(1) |
64
+ | `isObject(t: unknown): t is object` | Verifica si es objeto | O(1) | O(1) |
65
+ | `isSymbol(t: unknown): t is symbol` | Verifica si es símbolo | O(1) | O(1) |
66
+ | `isBigint(t: unknown): t is bigint` | Verifica si es BigInt | O(1) | O(1) |
67
+ | `isPrimitive(t: unknown): t is Primitive` | Verifica si es tipo primitivo | O(1) | O(1) |
68
+ | `isIterable(t: unknown): t is Iterable<unknown>` | Verifica si es iterable | O(1) | O(1) |
69
+ | `isOptional(t: unknown): t is Optional<unknown>` | Verifica si es instancia de Optional | O(1) | O(1) |
70
+ | `isSemantic(t: unknown): t is Semantic<unknown>` | Verifica si es instancia de Semantic | O(1) | O(1) |
71
+ | `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Verifica si es instancia de Collector | O(1) | O(1) |
72
+ | `isCollectable(t: unknown): t is Collectable<unknown>` | Verifica si es instancia de Collectable | O(1) | O(1) |
73
+ | `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | Verifica si es instancia de OrderedCollectable | O(1) | O(1) |
74
+ | `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | Verifica si es instancia de WindowCollectable | O(1) | O(1) |
75
+ | `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | Verifica si es instancia de UnorderedCollectable | O(1) | O(1) |
76
+ | `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Verifica si es instancia de Statistics | O(1) | O(1) |
77
+ | `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | Verifica si es instancia de NumericStatistics | O(1) | O(1) |
78
+ | `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | Verifica si es instancia de BigIntStatistics | O(1) | O(1) |
71
79
 
72
- ### 2. `Semantic<E>` — Flujo de datos diferido
80
+ ```typescript
81
+ // Ejemplos de uso de guardias de tipo
82
+ const value: unknown = "hello";
73
83
 
74
- Un **flujo secuencial diferido y compuesto**. Similar a Java Streams o Kotlin Sequences.
84
+ if (isString(value)) {
85
+ console.log(value.length); // Seguro de tipos, value se infiere como string
86
+ }
75
87
 
76
- Puedes crear un `Semantic` usando funciones como `from()`, `range()`, `iterate()` o `fill()`.
88
+ if (isOptional(someValue)) {
89
+ someValue.ifPresent(val => console.log(val));
90
+ }
91
+ ```
77
92
 
78
- #### Creadores:
93
+ ## Funciones de Utilidad
79
94
 
80
- | Función | Descripción | Ejemplo |
81
- |--------|-------------|---------|
82
- | `from(iterable)` | Crear desde un Array, Set, Iterable | `from([1, 2, 3])` |
83
- | `range(start, end, step?)` | Generar una secuencia de números | `range(0, 5)` 0,1,2,3,4 |
84
- | `fill(element, count)` | Repetir un elemento N veces | `fill('a', 3n)` |
85
- | `iterate(gen)` | Usar una función generadora personalizada | `iterate(genFn)` |
95
+ | Función | Descripción | Complejidad Temporal | Complejidad Espacial |
96
+ |---------|-------------|---------------------|---------------------|
97
+ | `useCompare<T>(t1: T, t2: T): number` | Función de comparación universal | O(1) | O(1) |
98
+ | `useRandom<T = number \| bigint>(index: T): T` | Generador de números pseudoaleatorios | O(log n) | O(1) |
86
99
 
87
- #### Operadores comunes:
100
+ ```typescript
101
+ // Ejemplos de uso de funciones de utilidad
102
+ const numbers = [3, 1, 4, 1, 5];
103
+ numbers.sort(useCompare); // [1, 1, 3, 4, 5]
88
104
 
89
- | Método | Descripción | Ejemplo |
90
- |--------|-------------|---------|
91
- | `map(fn)` | Transformar cada elemento | `.map(x => x * 2)` |
92
- | `filter(fn)` | Conservar elementos que cumplen el predicado | `.filter(x => x > 10)` |
93
- | `limit(n)` | Limitar a los primeros N elementos | `.limit(5)` |
94
- | `skip(n)` | Saltar los primeros N elementos | `.skip(2)` |
95
- | `distinct()` | Eliminar duplicados (usa Set por defecto) | `.distinct()` |
96
- | `sorted()` | Ordenar elementos (orden natural) | `.sorted()` |
97
- | `sorted(comparator)` | Ordenar con un comparador personalizado | `.sorted((a, b) => a - b)` |
98
- | `toOrdered()` | Ordenar y devolver un `OrderedCollectable` | `.toOrdered()` |
99
- | `toUnordered()` | **Sin ordenar** — el más rápido | `.toUnordered()` ✅ |
100
- | `collect(collector)` | Agregar usando un `Collector` | `.collect(Collector.full(...))` |
101
- | `toArray()` | Convertir a Array | `.toArray()` |
102
- | `toSet()` | Convertir a Set | `.toSet()` |
103
- | `toMap(keyFn, valFn)` | Convertir a Map | `.toMap(x => x.id, x => x)` |
105
+ const randomNum = useRandom(42); // Número aleatorio basado en semilla
106
+ const randomBigInt = useRandom(1000n); // Número BigInt aleatorio
107
+ ```
104
108
 
105
- ---
109
+ ## Métodos de Fábrica
106
110
 
107
- ### 3. `toUnordered()` 🚀 El más rápido, sin ordenar
111
+ ### Métodos de Fábrica de Optional
108
112
 
109
- Si **no necesitas orden** y quieres el **máximo rendimiento**, utiliza:
113
+ | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
114
+ |--------|-------------|---------------------|---------------------|
115
+ | `Optional.empty<T>()` | Crea un Optional vacío | O(1) | O(1) |
116
+ | `Optional.of<T>(value)` | Crea un Optional con valor | O(1) | O(1) |
117
+ | `Optional.ofNullable<T>(value)` | Crea un Optional que puede ser nulo | O(1) | O(1) |
118
+ | `Optional.ofNonNull<T>(value)` | Crea un Optional no nulo | O(1) | O(1) |
110
119
 
111
120
  ```typescript
112
- const fastest = semanticStream.toUnordered();
121
+ // Ejemplos de uso de Optional
122
+ const emptyOpt = Optional.empty<number>();
123
+ const presentOpt = Optional.of(42);
124
+ const nullableOpt = Optional.ofNullable<string>(null);
125
+ const nonNullOpt = Optional.ofNonNull("hello");
126
+
127
+ presentOpt.ifPresent(val => console.log(val)); // Output 42
128
+ console.log(emptyOpt.orElse(100)); // Output 100
113
129
  ```
114
130
 
115
- 🔥 **No se aplica ningún algoritmo de ordenamiento.**
116
- Ideal cuando el orden no importa y la velocidad es prioritaria.
117
-
118
- ---
131
+ ### Métodos de Fábrica de Collector
119
132
 
120
- ### 4. `toOrdered()` y `sorted()` Resultados ordenados
121
-
122
- Si necesitas un **resultado ordenado**, puedes usar:
133
+ | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
134
+ |--------|-------------|---------------------|---------------------|
135
+ | `Collector.full(identity, accumulator, finisher)` | Crea un colector completo | O(1) | O(1) |
136
+ | `Collector.shortable(identity, interruptor, accumulator, finisher)` | Crea un colector interrumpible | O(1) | O(1) |
123
137
 
124
138
  ```typescript
125
- const ordered = semanticStream.sorted(); // Orden natural
126
- const customSorted = semanticStream.sorted((a, b) => a - b); // Comparador personalizado
127
- const orderedCollectable = semanticStream.toOrdered(); // También ordenado
139
+ // Ejemplos de uso de Collector
140
+ const sumCollector = Collector.full(
141
+ () => 0,
142
+ (sum, num) => sum + num,
143
+ result => result
144
+ );
145
+
146
+ const numbers = from([1, 2, 3, 4, 5]);
147
+ const total = numbers.toUnoredered().collect(sumCollector); // 15
128
148
  ```
129
149
 
130
- ⚠️ Estos métodos **ordenarán los elementos**, usando orden natural o el comparador dado.
131
-
132
- ---
150
+ ### Métodos de fábrica de Semantic
133
151
 
134
- ### 5. `Collector<E, A, R>` Agregación de datos
152
+ | Método | Descripción | Complejidad temporal | Complejidad espacial |
153
+ |--------|-------------|----------------------|----------------------|
154
+ | `blob(blob, chunkSize)` | Crea flujo desde Blob | O(n) | O(chunkSize) |
155
+ | `empty<E>()` | Crea flujo vacío | O(1) | O(1) |
156
+ | `fill<E>(element, count)` | Crea flujo lleno | O(n) | O(1) |
157
+ | `from<E>(iterable)` | Crea flujo desde objeto iterable | O(1) | O(1) |
158
+ | `interval(period, delay?)` | Crea flujo de intervalo regular | O(1)* | O(1) |
159
+ | `iterate<E>(generator)` | Crea flujo desde generador | O(1) | O(1) |
160
+ | `range(start, end, step)` | Crea flujo de rango numérico | O(n) | O(1) |
161
+ | `websocket(websocket)` | Crea flujo desde WebSocket | O(1) | O(1) |
135
162
 
136
- Los **colectores** te permiten **reducir un flujo a una estructura única o compleja**.
163
+ ```typescript
164
+ // Ejemplo de uso de métodos de fábrica de Semantic
165
+
166
+ // Crear flujo desde Blob (lectura por fragmentos)
167
+ blob(someBlob, 1024n)
168
+ .toUnordered()
169
+ .write(WritableStream)
170
+ .then(callback) // Escritura de flujo exitosa
171
+ .catch(writeFi); // Escritura de flujo fallida
172
+
173
+ // Crear flujo vacío que no se ejecutará hasta concatenarse con otros flujos
174
+ empty<string>()
175
+ .toUnordered()
176
+ .join(); //[]
177
+
178
+ // Crear flujo lleno
179
+ const filledStream = fill("hello", 3); // "hello", "hello", "hello"
180
+
181
+ // Crear flujo temporal con retraso inicial de 2 segundos y ciclo de 5 segundos,
182
+ // implementado mediante mecanismo de temporizador, posibles desviaciones de tiempo
183
+ // debido a limitaciones de programación del sistema.
184
+ const intervalStream = interval(5000, 2000);
185
+
186
+ // Crear flujo desde objeto iterable
187
+ const numberStream = from([1, 2, 3, 4, 5]);
188
+ const stringStream = from(new Set(["Alex", "Bob"]));
189
+
190
+ // Crear flujo de rango
191
+ const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
192
+
193
+ // Flujo de eventos WebSocket
194
+ const ws = new WebSocket("ws://localhost:8080");
195
+ websocket(ws)
196
+ .filter((event)=> event.type === "message") // Solo monitorear eventos de mensaje
197
+ .toUnordered() // Para eventos normalmente sin ordenar
198
+ .forEach((event)=> receive(event)); // Recibir mensajes
199
+ ```
137
200
 
138
- Existen fábricas estáticas como:
201
+ ## Métodos de Clase Semantic
202
+
203
+ | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
204
+ |--------|-------------|---------------------|---------------------|
205
+ | `concat(other)` | Concatena dos flujos | O(n) | O(1) |
206
+ | `distinct()` | Elimina duplicados | O(n) | O(n) |
207
+ | `distinct(comparator)` | Elimina duplicados con comparador | O(n²) | O(n) |
208
+ | `dropWhile(predicate)` | Descarta elementos que cumplen condición | O(n) | O(1) |
209
+ | `filter(predicate)` | Filtra elementos | O(n) | O(1) |
210
+ | `flat(mapper)` | Aplanamiento de mapeo | O(n × m) | O(1) |
211
+ | `flatMap(mapper)` | Aplanamiento a nuevo tipo | O(n × m) | O(1) |
212
+ | `limit(n)` | Limita cantidad de elementos | O(n) | O(1) |
213
+ | `map(mapper)` | Transformación de mapeo | O(n) | O(1) |
214
+ | `peek(consumer)` | Inspecciona elementos | O(n) | O(1) |
215
+ | `redirect(redirector)` | Redirección de índices | O(n) | O(1) |
216
+ | `reverse()` | Revierte flujo | O(n) | O(1) |
217
+ | `shuffle()` | Mezcla aleatoria | O(n) | O(1) |
218
+ | `shuffle(mapper)` | Mezcla con mapeador | O(n) | O(1) |
219
+ | `skip(n)` | Salta primeros n elementos | O(n) | O(1) |
220
+ | `sorted()` | Ordena | O(n log n) | O(n) |
221
+ | `sorted(comparator)` | Ordena con comparador | O(n log n) | O(n) |
222
+ | `sub(start, end)` | Obtiene subflujo | O(n) | O(1) |
223
+ | `takeWhile(predicate)` | Toma elementos que cumplen condición | O(n) | O(1) |
224
+ | `translate(offset)` | Traslación de índices | O(n) | O(1) |
225
+ | `translate(translator)` | Traslación con traductor | O(n) | O(1) |
139
226
 
140
227
  ```typescript
141
- Collector.full(identity, accumulator, finisher)
142
- Collector.shortable(identity, interruptor, accumulator, finisher)
228
+ // Ejemplos de operaciones Semantic
229
+ const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
230
+ .filter(n => n % 2 === 0) // Filtra números pares
231
+ .map(n => n * 2) // Multiplica por 2
232
+ .skip(1) // Salta el primero
233
+ .limit(3) // Limita a 3 elementos
234
+ .toArray(); // Convierte a array
235
+ // Resultado: [8, 12, 20]
236
+
237
+ // Ejemplo de operación compleja
238
+ const complexResult = range(1, 100, 1)
239
+ .flatMap(n => from([n, n * 2])) // Mapea cada elemento a dos elementos
240
+ .distinct() // Elimina duplicados
241
+ .shuffle() // Mezcla aleatoriamente
242
+ .takeWhile(n => n < 50) // Toma elementos < 50
243
+ .toOrdered() // Convierte a colector ordenado
244
+ .toArray(); // Convierte a array
143
245
  ```
144
246
 
145
- Pero normalmente los usarás a través de métodos de alto nivel en las clases `Collectable`.
247
+ ## Métodos de Transformación de Colectores
146
248
 
147
- ---
249
+ | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
250
+ |--------|-------------|---------------------|---------------------|
251
+ | `toUnoredered()` | Convierte a colector no ordenado (prioridad rendimiento) | O(1) | O(1) |
252
+ | `toOrdered()` | Convierte a colector ordenado | O(1) | O(1) |
253
+ | `sorted()` | Ordena y convierte a colector ordenado | O(n log n) | O(n) |
254
+ | `toWindow()` | Convierte a colector de ventana | O(1) | O(1) |
255
+ | `toNumericStatistics()` | Convierte a estadísticas numéricas | O(1) | O(1) |
256
+ | `toBigintStatistics()` | Convierte a estadísticas BigInt | O(1) | O(1) |
148
257
 
149
- ### 6. `Collectable<E>` (clase abstracta)
150
-
151
- Clase base para:
258
+ ```typescript
259
+ // Ejemplos de transformación de colectores
260
+ const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
152
261
 
153
- - `OrderedCollectable<E>` Resultados ordenados
154
- - `UnorderedCollectable<E>` Sin ordenar, el más rápido
155
- - `WindowCollectable<E>` Ventanas deslizantes
156
- - `Statistics<E, D>` — Estadísticas agregadas
262
+ // Prioridad rendimiento: Usar colector no ordenado
263
+ const unordered = numbers
264
+ .filter(n => n > 3)
265
+ .toUnoredered();
157
266
 
158
- #### Métodos comunes (heredados):
267
+ // Necesita orden: Usar colector ordenado
268
+ const ordered = numbers.sorted();
159
269
 
160
- | Método | Descripción | Ejemplo |
161
- |--------|-------------|---------|
162
- | `count()` | Contar elementos | `.count()` |
163
- | `toArray()` | Convertir a Array | `.toArray()` |
164
- | `toSet()` | Convertir a Set | `.toSet()` |
165
- | `toMap(k, v)` | Convertir a Map | `.toMap(x => x.id, x => x)` |
166
- | `group(k)` | Agrupar por clave | `.group(x => x.category)` |
167
- | `findAny()` | Encontrar cualquier elemento (Optional) | `.findAny()` |
168
- | `findFirst()` | Encontrar el primer elemento (Optional) | `.findFirst()` |
169
- | `reduce(...)` | Reducción personalizada | `.reduce((a,b) => a + b, 0)` |
270
+ // Análisis estadístico: Usar colector estadístico
271
+ const stats = numbers
272
+ .toNumericStatistics();
170
273
 
171
- ---
274
+ console.log(stats.mean()); // Promedio
275
+ console.log(stats.median()); // Mediana
276
+ console.log(stats.standardDeviation()); // Desviación estándar
172
277
 
173
- ### 7. `OrderedCollectable<E>` — Datos ordenados
278
+ // Operaciones de ventana
279
+ const windowed = numbers
280
+ .toWindow()
281
+ .tumble(3n); // Ventana de 3 elementos
174
282
 
175
- Si deseas que los elementos estén **ordenados automáticamente**, usa esta clase.
283
+ windowed.forEach(window => {
284
+ console.log(window.toArray()); // Contenido de cada ventana
285
+ });
286
+ ```
176
287
 
177
- Acepta un **comparador personalizado** o el orden natural.
288
+ ## Métodos de Recolección de Collectable
289
+
290
+ | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
291
+ |--------|-------------|---------------------|---------------------|
292
+ | `anyMatch(predicate)` | Verifica si existe coincidencia | O(n) | O(1) |
293
+ | `allMatch(predicate)` | Verifica si todos coinciden | O(n) | O(1) |
294
+ | `count()` | Cuenta elementos | O(n) | O(1) |
295
+ | `isEmpty()` | Verifica si está vacío | O(1) | O(1) |
296
+ | `findAny()` | Encuentra cualquier elemento | O(n) | O(1) |
297
+ | `findFirst()` | Encuentra primer elemento | O(n) | O(1) |
298
+ | `findLast()` | Encuentra último elemento | O(n) | O(1) |
299
+ | `forEach(action)` | Itera sobre todos los elementos | O(n) | O(1) |
300
+ | `group(classifier)` | Agrupa por clasificador | O(n) | O(n) |
301
+ | `groupBy(keyExtractor, valueExtractor)` | Agrupa por extractores de clave-valor | O(n) | O(n) |
302
+ | `join()` | Concatena a string | O(n) | O(n) |
303
+ | `join(delimiter)` | Concatena con separador | O(n) | O(n) |
304
+ | `nonMatch(predicate)` | Verifica si no hay coincidencias | O(n) | O(1) |
305
+ | `partition(count)` | Particiona por cantidad | O(n) | O(n) |
306
+ | `partitionBy(classifier)` | Particiona por clasificador | O(n) | O(n) |
307
+ | `reduce(accumulator)` | Operación de reducción | O(n) | O(1) |
308
+ | `reduce(identity, accumulator)` | Reducción con valor inicial | O(n) | O(1) |
309
+ | `toArray()` | Convierte a array | O(n) | O(n) |
310
+ | `toMap(keyExtractor, valueExtractor)` | Convierte a Map | O(n) | O(n) |
311
+ | `toSet()` | Convierte a Set | O(n) | O(n) |
312
+ | `write(stream)` | Escribe a stream | O(n) | O(1) |
178
313
 
179
314
  ```typescript
180
- const sorted = new OrderedCollectable(stream);
181
- const customSorted = new OrderedCollectable(stream, (a, b) => b - a);
315
+ // Ejemplos de operaciones Collectable
316
+ const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
317
+ .filter(n => n % 2 === 0)
318
+ .toOrdered();
319
+
320
+ // Verificaciones de coincidencia
321
+ console.log(data.anyMatch(n => n > 5)); // true
322
+ console.log(data.allMatch(n => n < 20)); // true
323
+
324
+ // Operaciones de búsqueda
325
+ data.findFirst().ifPresent(n => console.log(n)); // 2
326
+ data.findAny().ifPresent(n => console.log(n)); // Elemento cualquiera
327
+
328
+ // Operaciones de agrupación
329
+ const grouped = data.groupBy(
330
+ n => n > 5 ? "large" : "small",
331
+ n => n * 2
332
+ );
333
+ // {small: [4, 8], large: [12, 16, 20]}
334
+
335
+ // Operaciones de reducción
336
+ const sum = data.reduce(0, (acc, n) => acc + n); // 30
337
+
338
+ // Operaciones de salida
339
+ data.join(", "); // "2, 4, 6, 8, 10"
182
340
  ```
183
341
 
184
- 🔒 **El orden está garantizado.**
185
-
186
- ---
187
-
188
- ### 8. `UnorderedCollectable<E>` Sin ordenar (🚀 Más rápido)
189
-
190
- Si **no te importa el orden** y buscas el **mejor rendimiento**, usa:
342
+ ## Métodos de Análisis Estadístico
343
+
344
+ ### Métodos de NumericStatistics
345
+
346
+ | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
347
+ |--------|-------------|---------------------|---------------------|
348
+ | `range()` | Rango | O(n) | O(1) |
349
+ | `variance()` | Varianza | O(n) | O(1) |
350
+ | `standardDeviation()` | Desviación estándar | O(n) | O(1) |
351
+ | `mean()` | Media | O(n) | O(1) |
352
+ | `median()` | Mediana | O(n log n) | O(n) |
353
+ | `mode()` | Moda | O(n) | O(n) |
354
+ | `frequency()` | Distribución de frecuencia | O(n) | O(n) |
355
+ | `summate()` | Sumatoria | O(n) | O(1) |
356
+ | `quantile(quantile)` | Cuantil | O(n log n) | O(n) |
357
+ | `interquartileRange()` | Rango intercuartílico | O(n log n) | O(n) |
358
+ | `skewness()` | Sesgo | O(n) | O(1) |
359
+ | `kurtosis()` | Curtosis | O(n) | O(1) |
191
360
 
192
361
  ```typescript
193
- const unordered = new UnorderedCollectable(stream);
194
- // O
195
- const fastest = semanticStream.toUnordered();
362
+ // Ejemplos de análisis estadístico
363
+ const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
364
+ .toNumericStatistics();
365
+
366
+ console.log("Media:", numbers.mean()); // 5.5
367
+ console.log("Mediana:", numbers.median()); // 5.5
368
+ console.log("Desviación estándar:", numbers.standardDeviation()); // ~2.87
369
+ console.log("Suma:", numbers.summate()); // 55
370
+
371
+ // Análisis estadístico con mapeador
372
+ const objects = from([
373
+ { value: 10 },
374
+ { value: 20 },
375
+ { value: 30 }
376
+ ]).toNumericStatistics();
377
+
378
+ console.log("Media mapeada:", objects.mean(obj => obj.value)); // 20
196
379
  ```
197
380
 
198
- **No se ejecuta ningún algoritmo de ordenamiento**
199
- ✅ **Mejor rendimiento cuando el orden no importa**
200
-
201
- ---
202
-
203
- ### 9. `Statistics<E, D>` — Análisis estadístico
204
-
205
- Clase abstracta para analizar datos numéricos.
206
-
207
- #### Subclases:
208
-
209
- - `NumericStatistics<E>` — Para valores `number`
210
- - `BigIntStatistics<E>` — Para valores `bigint`
211
-
212
- ##### Métodos estadísticos comunes:
213
-
214
- | Método | Descripción | Ejemplo |
215
- |--------|-------------|---------|
216
- | `mean()` | Media | `.mean()` |
217
- | `median()` | Mediana | `.median()` |
218
- | `mode()` | Moda (valor más frecuente) | `.mode()` |
219
- | `minimum()` | Mínimo | `.minimum()` |
220
- | `maximum()` | Máximo | `.maximum()` |
221
- | `range()` | Rango (máximo - mínimo) | `.range()` |
222
- | `variance()` | Varianza | `.variance()` |
223
- | `standardDeviation()` | Desviación estándar | `.standardDeviation()` |
224
- | `summate()` | Suma total | `.summate()` |
225
- | `quantile(q)` | Valor en el percentil q (0–1) | `.quantile(0.5)` → mediana |
226
- | `frequency()` | Frecuencia como Map | `.frequency()` |
227
-
228
- ---
229
-
230
- ## 🧪 Ejemplo completo
381
+ ## Guía de Selección de Rendimiento
231
382
 
383
+ ### Seleccionar Colector No Ordenado (Prioridad Rendimiento)
232
384
  ```typescript
233
- import { from, toUnordered, toOrdered, sorted, NumericStatistics } from 'semantic-typescript';
234
-
235
- // Datos de ejemplo
236
- const numbers = from([10, 2, 8, 4, 5, 6]);
237
-
238
- // 🚀 Más rápido: sin ordenar
239
- const fastest = numbers.toUnordered();
240
- console.log(fastest.toArray()); // Ej: [10, 2, 8, 4, 5, 6] (orden original)
241
-
242
- // 🔢 Orden natural
243
- const ordered = numbers.sorted();
244
- console.log(ordered.toArray()); // [2, 4, 5, 6, 8, 10]
245
-
246
- // 📊 Estadísticas
247
- const stats = new NumericStatistics(numbers);
248
- console.log('Media:', stats.mean());
249
- console.log('Mediana:', stats.median());
250
- console.log('Moda:', stats.mode());
251
- console.log('Rango:', stats.range());
252
- console.log('Desviación estándar:', stats.standardDeviation());
385
+ // Cuando no se necesita garantía de orden
386
+ const highPerformance = data
387
+ .filter(predicate)
388
+ .map(mapper)
389
+ .toUnoredered(); // Mejor rendimiento
253
390
  ```
254
391
 
255
- ---
256
-
257
- ## 🛠️ Funciones útiles
258
-
259
- La librería también exporta varias **guardas de tipo (type guards)** y **herramientas de comparación**:
260
-
261
- | Función | Propósito |
262
- |--------|-----------|
263
- | `isString(x)` | Guarda de tipo para `string` |
264
- | `isNumber(x)` | Guarda de tipo para `number` |
265
- | `isBoolean(x)` | Guarda de tipo para `boolean` |
266
- | `isIterable(x)` | Comprueba si un objeto es iterable |
267
- | `useCompare(a, b)` | Función de comparación universal |
268
- | `useRandom(x)` | Generador de números aleatorios (divertido) |
269
-
270
- ---
271
-
272
- ## 🧩 Avanzado: Generadores personalizados y ventanas
273
-
274
- Puedes crear **generadores personalizados** para flujos controlados o infinitos:
275
-
392
+ ### Seleccionar Colector Ordenado (Necesita Orden)
276
393
  ```typescript
277
- const gen = (accept: BiConsumer<number, bigint>, interrupt: Predicate<number>) => {
278
- for (let i = 0; i < 10; i++) {
279
- accept(i, BigInt(i));
280
- if (i === 5) interrupt(i);
281
- }
282
- };
283
-
284
- const s = new Semantic(gen);
394
+ // Cuando se debe mantener el orden de elementos
395
+ const ordered = data
396
+ .sorted(comparator) // La ordenación sobrescribe efectos de redirección
397
+ .toOrdered(); // Mantiene orden
285
398
  ```
286
399
 
287
- O usar **ventanas deslizantes (sliding windows)**:
288
-
400
+ ### Seleccionar Colector de Ventana (Operaciones de Ventana)
289
401
  ```typescript
290
- const windowed = ordered.slide(3n, 2n); // Ventanas de tamaño 3, salto de 2
402
+ // Cuando se necesitan operaciones de ventana
403
+ const windowed = data
404
+ .toWindow()
405
+ .slide(5n, 2n); // Ventana deslizante
291
406
  ```
292
407
 
293
- ---
294
-
295
- ## 📄 Licencia
296
-
297
- Este proyecto está bajo la licencia **MIT** — libre para uso comercial y personal.
298
-
299
- ---
300
-
301
- ## 🙌 Contribuir
302
-
303
- ¡Pull requests, issues y sugerencias son bienvenidos!
304
-
305
- ---
306
-
307
- ## 🚀 Resumen rápido
308
-
309
- | Tarea | Método |
310
- |-------|--------|
311
- | Manejar nulos con seguridad | `Optional<T>` |
312
- | Crear un flujo | `from([...])`, `range()`, `fill()` |
313
- | Transformar datos | `map()`, `filter()` |
314
- | Ordenar datos | `sorted()`, `toOrdered()` |
315
- | Sin ordenar (más rápido) | `toUnordered()` ✅ |
316
- | Agrupar / Agregar | `toMap()`, `group()`, `Collector` |
317
- | Estadísticas | `NumericStatistics`, `mean()`, `median()`, etc. |
318
-
319
- ---
320
-
321
- ## 🔗 Enlaces
408
+ ### Seleccionar Análisis Estadístico (Cálculos Numéricos)
409
+ ```typescript
410
+ // Cuando se necesita análisis estadístico
411
+ const stats = data
412
+ .toNumericStatistics(); // Estadísticas numéricas
322
413
 
323
- - 📦 npm: https://www.npmjs.com/package/semantic-typescript
324
- - 🐙 GitHub: https://github.com/eloyhere/semantic-typescript
325
- - 📘 Documentación: Ver código fuente / definiciones de tipo
414
+ const bigIntStats = data
415
+ .toBigintStatistics(); // Estadísticas BigInt
416
+ ```
326
417
 
327
- ---
418
+ [GitHub](https://github.com/eloyhere/semantic-typescript)
419
+ [NPMJS](https://www.npmjs.com/package/semantic-typescript)
328
420
 
329
- **Disfruta del procesamiento de datos funcional, seguro y compuesto en TypeScript.** 🚀
421
+ ## Consideraciones Importantes
330
422
 
331
- ---
423
+ 1. **Impacto de operaciones de ordenación**: En colectores ordenados, `sorted()` sobrescribe los efectos de `redirect`, `translate`, `shuffle`, `reverse`
424
+ 2. **Consideraciones de rendimiento**: Si no se necesita garantía de orden, priorizar `toUnoredered()` para mejor rendimiento
425
+ 3. **Uso de memoria**: Las operaciones de ordenación requieren espacio adicional O(n)
426
+ 4. **Datos en tiempo real**: Los flujos Semantic son ideales para datos en tiempo real y admiten fuentes de datos asincrónicas
332
427
 
333
- **Recuerda:**
334
- - `toUnordered()` → **Sin ordenar, más rápido**
335
- - Los demás (`sorted()`, `toOrdered()`, etc.) → **Ordenan los datos**
428
+ Esta biblioteca proporciona a los desarrolladores de TypeScript capacidades potentes y flexibles de procesamiento de flujos, combinando las ventajas de la programación funcional con la seguridad de tipos.