semantic-typescript 0.6.0 → 0.7.0

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,208 +1,213 @@
1
- # Semantic-TypeScript: Una biblioteca de procesamiento de flujo que cambia paradigmas
1
+ # **Semantic-TypeScript**
2
+ **Flujos, Indexados.** Sus datos, bajo control preciso.
2
3
 
3
- ## Introducción
4
- Semantic-TypeScript representa un avance significativo en la tecnología de procesamiento de flujos, sintetizando los conceptos más efectivos de JavaScript GeneratorFunctions, Java Streams y los paradigmas de indexación de bases de datos. Su principio de diseño fundamental se centra en la construcción de pipelines de procesamiento de datos excepcionalmente eficientes mediante evaluación diferida (lazy) sofisticada e indexación inteligente. La biblioteca ofrece una experiencia de operación de flujos rigurosamente segura en tipos y funcionalmente pura, específicamente diseñada para el desarrollo moderno en TypeScript y JavaScript.
4
+ ---
5
5
 
6
- En contraste con las arquitecturas de procesamiento sincrónico convencionales, Semantic-TypeScript implementa un modelo unificado que maneja con gracia tanto fuentes de datos sincrónicas (Iterable) como asincrónicas (AsyncIterable). Durante la generación del flujo, el flujo y la terminación de los datos se controlan con precisión mediante mecanismos de callback, lo que permite a la biblioteca manejar con excepcional gracia:
7
- - Flujos de datos en tiempo real (eventos DOM, WebSockets, intervalos) con control determinista
8
- - Conjuntos de datos a gran escala mediante pipelines diferidos y eficientes en memoria
9
- - Transformaciones de datos complejas con una API fluida y declarativa
6
+ ### Descripción general
10
7
 
11
- El enfoque innovador de la biblioteca reinterpreta fundamentalmente cómo los desarrolladores interactúan con secuencias de datos, ofreciendo tanto características de rendimiento sin precedentes como ergonomía para el desarrollador en un paquete único y cohesivo.
8
+ Semantic-TypeScript marca un avance significativo en la tecnología de procesamiento de flujos, **sintetizando** los conceptos más efectivos de `GeneratorFunction` de JavaScript, Java Streams e indexación de estilo MySQL. Su filosofía central es a la vez simple y poderosa: construir pipelines de procesamiento de datos excepcionalmente eficientes mediante indexación inteligente, no a través de iteración de fuerza bruta.
12
9
 
13
- ## Filosofía Central: Separación de Definición y Ejecución
14
- Una idea arquitectónica clave de Semantic-TypeScript es la clara separación entre la definición de un flujo y su ejecución:
15
- - **Semantic<E>**: Un plano inmutable y diferido de un pipeline de transformación de datos. Define qué operaciones (filter, map, etc.) se realizarán
16
- - **Collectable<E>**: Una vista materializada y ejecutable del flujo. Se obtiene a partir de un Semantic y proporciona todas las operaciones terminales (collect, forEach, etc.) para ejecutar el pipeline y producir un resultado
10
+ Donde las librerías convencionales imponen bucles síncronos o cadenas de promesas incómodas, Semantic-TypeScript ofrece una experiencia **completamente asíncrona**, funcionalmente pura y rigurosamente segura en tipos, diseñada para las demandas del desarrollo front-end moderno.
17
11
 
18
- Esta separación impone un modelo mental limpio y desbloquea optimizaciones potentes, como elegir un UnorderedCollectable para omitir ordenaciones innecesarias y obtener la máxima velocidad.
12
+ En su modelo elegante, los datos solo llegan al consumidor cuando el pipeline ascendente invoca explícitamente las devoluciones de llamada `accept` (y, opcionalmente, `interrupt`). Usted tiene control total sobre el momento exacto en que se necesita.
19
13
 
20
- ## ¿Por qué elegir Semantic-TypeScript?
21
- Seleccionar la biblioteca adecuada para el procesamiento de flujos de datos implica equilibrar rendimiento, seguridad de tipos y expresividad. Semantic-TypeScript está diseñada para sobresalir en todas estas dimensiones.
14
+ ---
22
15
 
23
- ### 1. Un paradigma unificado y seguro en tipos para todas las secuencias de datos
24
- Proporciona una API declarativa y consistente para procesar cualquier secuencia de datos, ya sean arreglos estáticos, eventos en tiempo real o fragmentos asincrónicos, al tiempo que aprovecha todo el poder de TypeScript para garantizar seguridad de tipos de extremo a extremo. Esto elimina toda una clase de errores en tiempo de ejecución y transforma la manipulación de flujos en una actividad predecible y verificada por el compilador.
16
+ ### Por qué los desarrolladores lo prefieren
25
17
 
26
- ### 2. Rendimiento sin concesiones con evaluación diferida inteligente
27
- En su núcleo, la biblioteca está construida sobre evaluación diferida. Operaciones como filter, map y flatMap simplemente componen un pipeline de procesamiento; no se realiza ningún trabajo hasta que se invoca una operación terminal. Esto se combina con capacidades de cortocircuito (a través de limit, anyMatch o callbacks de interrupción personalizados), que permiten detener el procesamiento anticipadamente, mejorando drásticamente la eficiencia para flujos grandes o infinitos.
18
+ - **Indexación Cero-Boilerplate** cada elemento lleva su índice natural o personalizado.
19
+ - **Estilo Puramente Funcional** con inferencia completa de TypeScript.
20
+ - **Flujos de Eventos a Prueba de Fugas** — `useWindow`, `useDocument`, `useHTMLElement` y `useWebSocket` están construidos con la seguridad en mente. Usted define el límite (usando `limit(n)`, `sub(start, end)` o `takeWhile(predicate)`) y la librería gestiona la limpieza. Sin oyentes persistentes, sin fugas de memoria.
21
+ - **Estadísticas Integradas** — análisis numérico y de bigint integral que incluye promedios, medianas, modas, varianza, asimetría y curtosis.
22
+ - **Rendimiento Predecible** — elija entre recolectores ordenados o desordenados según sus requisitos.
23
+ - **Eficiencia de Memoria** — los flujos se evalúan de forma perezosa, aliviando las preocupaciones de memoria.
24
+ - **Sin Comportamiento Indefinido** — TypeScript garantiza seguridad de tipos y nulabilidad. Los datos de entrada permanecen sin modificar a menos que se alteren explícitamente dentro de sus funciones de devolución de llamada.
28
25
 
29
- ### 3. El poder del patrón `Collector<E, A, R>`
30
- Inspirado en Java, el patrón Collector es el motor de la flexibilidad. Desacopla la especificación de cómo acumular elementos del flujo de la ejecución del flujo en sí. La biblioteca proporciona un rico conjunto de coleccionadores integrados (toArray, groupBy, summate, etc.) para tareas cotidianas, al tiempo que hace que sea trivial implementar tu propia lógica de reducción compleja y reutilizable. Esto es mucho más potente y componible que un conjunto fijo de métodos terminales.
26
+ ---
31
27
 
32
- ### 4. Soporte de primera clase para datos web modernos y asincrónicos
33
- Semantic-TypeScript está diseñada para el desarrollo contemporáneo. Ofrece métodos de fábrica nativos para fuentes web modernas:
34
- - `useFrom(iterable)`, `useRange()` para datos estáticos
35
- - `useInterval()`, `useAnimationFrame()` para flujos basados en tiempo
36
- - `useBlob()` para procesamiento de datos binarios fragmentados
37
- - `useWebSocket()`, `useDocument()`, `useWindow()` para flujos de eventos en tiempo real
28
+ ### Instalación
38
29
 
39
- ### 5. Más allá de la agregación básica: análisis estadístico integrado
40
- Ve más allá de simples sumas y promedios. La biblioteca proporciona interfaces dedicadas NumericStatistics y BigIntStatistics, ofreciendo acceso inmediato a medidas estadísticas avanzadas directamente desde tus flujos: varianza, desviación estándar, mediana, asimetría y curtosis. Esto convierte el análisis de datos complejos en una sola línea de código.
41
-
42
- ### 6. Diseñada para la ergonomía del desarrollador
43
- - **API fluida y encadenable**: Escribe pipelines de datos complejos como cadenas secuenciales y legibles
44
- - **Suite integral de utilidades**: Protecciones esenciales (isFunction, isIterable), utilidades (useCompare, useTraverse) e interfaces funcionales incluidas
45
- - **Integración Optional<T>**: Modela de forma segura la ausencia de un valor, eliminando preocupaciones de punteros nulos
46
- - **Guía de rendimiento**: Orientación clara sobre cuándo usar recolección no ordenada (unordered) para velocidad versus ordenada (ordered) para secuencia
47
-
48
- ## Instalación
49
30
  ```bash
50
31
  npm install semantic-typescript
51
32
  ```
33
+ o
34
+ ```bash
35
+ yarn add semantic-typescript
36
+ ```
37
+
38
+ ---
52
39
 
53
- ## Conceptos centrales en la práctica
40
+ ### Comienzo rápido
54
41
 
55
- ### 1. Creación de flujos (Semantic)
56
- Los flujos se pueden crear desde varias fuentes usando funciones de fábrica.
57
42
  ```typescript
58
- import { useFrom, useInterval, useDocument } from 'semantic-typescript';
43
+ import { useOf, useFrom, useRange, useWindow, useHTMLElement, useWebSocket, useText, useStringify } from "semantic-typescript";
44
+
45
+ // Estadísticas numéricas
46
+ let summate: number = useOf(10, 20, 30, 40)
47
+ .map((n: number): number => n * 2)
48
+ .toNumericStatistics() // Requerido antes de la operación terminal
49
+ .summate(); // 200
50
+
51
+ // Estadísticas de BigInt
52
+ let summate: bigint = useOf(10n, 20n, 30n, 40n)
53
+ .map((n: bigint): bigint => n * 2)
54
+ .toBigIntStatistics() // Requerido antes de la operación terminal
55
+ .summate(); // 200n
56
+
57
+ // Invertir un flujo por índice
58
+ useFrom([1, 2, 3, 4, 5])
59
+ .redirect((element: E, index: bigint): bigint => -index) // Índice negativo para inversión
60
+ .toOrdered() // Llamar a toOrdered() para preservar el orden del índice
61
+ .toArray(); // [5, 4, 3, 2, 1]
62
+
63
+ // Mezclar un flujo
64
+ useFrom([1, 2, 3, 4, 5])
65
+ .shuffle()
66
+ .toOrdered()
67
+ .toArray(); // ej., [2, 5, 1, 4, 3]
68
+
69
+ // Trasladar elementos dentro de un flujo
70
+ useFrom([1, 2, 3, 4, 5])
71
+ .translate(2) // Desplazar elementos 2 posiciones a la derecha
72
+ .toOrdered()
73
+ .toArray(); // [4, 5, 1, 2, 3]
74
+
75
+ useFrom([1, 2, 3, 4, 5])
76
+ .translate(-2) // Desplazar elementos 2 posiciones a la izquierda
77
+ .toOrdered()
78
+ .toArray(); // [3, 4, 5, 1, 2]
79
+
80
+ // Rango infinito con terminación temprana
81
+ useRange(0n, 1_000_000n)
82
+ .filter(n => n % 17n === 0n)
83
+ .limit(10n) // Detenerse después de 10 elementos
84
+ .toUnordered()
85
+ .toArray();
59
86
 
60
- // Desde un arreglo estático
61
- const staticStream = useFrom([1, 2, 3, 4, 5]);
87
+ // Redimensión de ventana en tiempo real (se detiene automáticamente tras 5 eventos)
88
+ useWindow("resize")
89
+ .limit(5n) // Crucial para flujos de eventos
90
+ .toUnordered()
91
+ .forEach((ev, idx) => console.log(`Redimensión #${idx}`));
62
92
 
63
- // Desde un generador asincrónico
64
- const asyncStream = useFrom(async function*() {
65
- yield 1;
66
- yield 2;
67
- });
93
+ // Escuchar un elemento HTML
94
+ // <input id="input" type="text"/>
95
+ useHTMLElement("#input", "change")
96
+ .limit(1)
97
+ .toUnordered()
98
+ .forEach((event: Event) => submit(event));
99
+
100
+ // Escuchar múltiples elementos y eventos
101
+ useHTMLElement("input", ["change", "keyup"])
102
+ .takeWhile((event: Event): boolean => validate(event))
103
+ .toUnordered()
104
+ .forEach((event: Event) => submit(event));
68
105
 
69
- // Un flujo basado en tiempo
70
- const tickStream = useInterval(1000); // emite cada segundo
106
+ // Escuchar un WebSocket
107
+ let webSocket = new WebSocket("ws://localhost:8080");
108
+ webSocket.addEventListener("close", (): void => {
109
+ webSocket.close(); // Gestionar el ciclo de vida del WebSocket manualmente
110
+ });
111
+ useWebSocket(webSocket, "message")
112
+ .limit(1)
113
+ .toUnordered()
114
+ .forEach((message: MessageEvent) => console.log(message.data));
71
115
 
72
- // Un flujo de eventos DOM (ver nota crucial a continuación)
73
- const clickStream = useDocument('click');
116
+ // Iterar sobre una cadena por punto de código
117
+ useText("My emotion now is: 😊, and semantic is 👍")
118
+ .toUnordered()
119
+ .log(); // Imprime la cadena
120
+
121
+ // Convertir a cadena de forma segura un objeto con referencias circulares
122
+ let o = {
123
+ a: 1,
124
+ b: "text",
125
+ c: [o.a, o.b, o.c] // Referencia circular
126
+ };
127
+ // let text: string = JSON.stringify(o); // Lanza un error
128
+ let text: string = useStringify(o); // Produce de forma segura `{a: 1, b: "text", c: []}`
74
129
  ```
75
130
 
76
- ### 2. Transformación de flujos (Operaciones intermedias)
77
- Las operaciones se encadenan de forma diferida para definir el pipeline.
78
- ```typescript
79
- const processedStream = staticStream
80
- .filter(x => x % 2 === 0) // Mantener solo números pares
81
- .map(x => x * 10) // Multiplicar por 10
82
- .flatMap(x => [x, x + 1]) // Transformar cada elemento en dos
83
- .distinct(); // Eliminar duplicados
131
+ ---
84
132
 
85
- // Nada se ha ejecutado todavía
86
- ```
133
+ ### Conceptos centrales
87
134
 
88
- ### 3. Ejecución de flujos (Operaciones terminales)
89
- Para obtener un resultado, debes obtener un Collectable e invocar una operación terminal.
90
- ```typescript
91
- // Obtener un collectable no ordenado para rendimiento
92
- const resultArray = await processedStream.toUnordered().toArray();
93
- console.log(resultArray); // ej., [20, 21, 40, 41]
94
-
95
- // Usar un coleccionador incorporado
96
- const sum = await processedStream.toUnordered().collect(useSummate());
97
- console.log(sum);
98
-
99
- // O usar el método collect genérico
100
- const customResult = await processedStream.toOrdered().collect(
101
- () => new Map<number, number>(),
102
- (map, element, index) => map.set(index, element),
103
- map => map
104
- );
105
- ```
135
+ | Concepto | Propósito | Cuándo usarlo |
136
+ | :--- | :--- | :--- |
137
+ | `AsynchronousSemantic` | Constructor central para flujos asíncronos, eventos y pipelines perezosos. | Eventos en tiempo real, WebSockets, oyentes DOM, flujos de larga duración o infinitos. |
138
+ | `SynchronousSemantic` | Constructor para flujos síncronos, en memoria o basados en bucle. | Datos estáticos, rangos, iteración inmediata. |
139
+ | `toUnordered()` | Recolector terminal más rápido (indexación basada en Map). | Rutas críticas de rendimiento (tiempo y espacio O(n), sin ordenación). |
140
+ | `toOrdered()` | Recolector ordenado, estable en índices. | Cuando se requiere orden estable o acceso indexado. |
141
+ | `toNumericStatistics()` | Análisis estadístico numérico rico (media, mediana, varianza, asimetría, curtosis, etc.). | Análisis de datos y cálculos estadísticos. |
142
+ | `toBigIntStatistics()` | Análisis estadístico de bigint. | Análisis de datos y cálculos estadísticos para enteros grandes. |
143
+ | `toWindow()` | Soporte para ventanas deslizantes y fijas. | Procesamiento de series temporales, procesamiento por lotes y operaciones con ventanas. |
106
144
 
107
- ### 4. Crucial: Trabajar con flujos de eventos
108
- Los flujos de eventos (useDocument, useWindow, useHTMLElement, useWebSocket) son infinitos por naturaleza. Debes usar operaciones como sub, takeWhile o limit para definir cuándo dejar de recolectar eventos y completar el flujo. De lo contrario, la operación terminal esperará indefinidamente.
109
- ```typescript
110
- import { useDocument } from 'semantic-typescript';
145
+ ---
111
146
 
112
- // Recolectar solo los primeros 5 clics
113
- const first5Clicks = await useDocument('click')
114
- .limit(5) // <- Esencial: limita el flujo a 5 eventos
115
- .toUnordered()
116
- .toArray();
147
+ **Reglas de uso importantes**
117
148
 
118
- // Recolectar clics durante una ventana de 10 segundos
119
- const clicksIn10s = await useDocument('click')
120
- .takeWhile((_, index, startTime = Date.now()) => Date.now() - startTime < 10000)
121
- .toUnordered()
122
- .toArray();
149
+ 1. **Flujos de eventos** (`useWindow`, `useDocument`, `useHTMLElement`, `useWebSocket`, …) devuelven un `AsynchronousSemantic`.
150
+ **Debe** llamar a `.limit(n)`, `.sub(start, end)` o `.takeWhile()` para dejar de escuchar. De lo contrario, el oyente permanece activo.
123
151
 
124
- // Recolectar clics desde el índice 2 al 5 (base 0)
125
- const specificClicks = await useDocument('click')
126
- .sub(2n, 6n) // <- Toma elementos con índice 2, 3, 4, 5
127
- .toUnordered()
128
- .toArray();
129
- ```
152
+ 2. **Operaciones terminales** (`.toArray()`, `.count()`, `.average()`, `.reduce()`, `.findFirst()`, etc.) **solo están disponibles después** de la conversión a un recolector:
153
+ ```typescript
154
+ .toUnordered() // Tiempo y espacio O(n), sin ordenación
155
+ // o
156
+ .toOrdered() // Ordenado, mantiene el orden
157
+ ```
130
158
 
131
- **Perspicacia clave**: El evento (por ejemplo, un MouseEvent) y su índice de disparo secuencial (como un bigint) se pasan juntos a través del pipeline mediante el callback `accept(event, index)`.
159
+ ---
132
160
 
133
- ### 5. Aprovechando las estadísticas
134
- ```typescript
135
- const numericStream = useFrom([10, 20, 30, 40, 50]).toNumeric();
161
+ ### Características de rendimiento
136
162
 
137
- const average = await numericStream.average();
138
- const median = await numericStream.median();
139
- const standardDeviation = await numericStream.standardDeviation();
140
- const skewness = await numericStream.skewness();
163
+ | Recolector | Complejidad Temporal | Complejidad Espacial | ¿Ordenado? | Mejor para |
164
+ | :--- | :--- | :--- | :--- | :--- |
165
+ | `toUnordered()` | O(n) | O(n) | No | Velocidad bruta, orden no requerido. |
166
+ | `toOrdered()` | O(2n) | O(n) | Sí | Orden estable, acceso indexado, análisis. |
167
+ | `toNumericStatistics()` | O(2n) | O(n) | Sí | Operaciones estadísticas que requieren datos ordenados. |
168
+ | `toBigIntStatistics()` | O(2n) | O(n) | Sí | Operaciones estadísticas para bigint. |
169
+ | `toWindow()` | O(2n) | O(n) | Sí | Operaciones de ventana basadas en tiempo. |
141
170
 
142
- console.log(`Promedio: ${average}, Mediana: ${median}, DesvEst: ${standardDeviation}`);
143
- ```
171
+ Opte por `toUnordered()` cuando la velocidad sea primordial. Use `toOrdered()` solo cuando necesite un orden estable o métodos estadísticos que dependan de datos ordenados.
144
172
 
145
- ## Características principales
146
- - **Tipos de flujo dual**: Soporte completo para ambos SynchronousSemantic (para Iterable) y AsynchronousSemantic (para AsyncIterable y eventos)
147
- - **Conjunto de operaciones rico**: filter, map, flatMap, concat, distinct, sorted, limit, skip, peek, reverse, shuffle
148
- - **Operaciones terminales flexibles**: collect (con coleccionadores personalizados), toArray, toSet, toMap, forEach, reduce, findFirst, anyMatch, allMatch, count
149
- - **Coleccionadores avanzados**: Coleccionadores integrados para joining, groupingBy, partitioningBy, summing, averaging, maxBy, minBy
150
- - **Módulo estadístico**: Métodos listos para usar para media, mediana, moda, varianza, desviaciónEstándar, rango, cuantiles, asimetría, curtosis en flujos numéricos/de bigint
151
- - **Funciones de utilidad**: Protecciones de tipo (isPromise, isAsyncIterable), comparadores (useCompare), recorrido (useTraverse) y ganchos de conversión
152
- - **Optional<T>**: Un contenedor monádico para valores anulables, integrado con operaciones de búsqueda
153
-
154
- ## Resumen de la API
155
-
156
- ### Clases e interfaces centrales
157
- - `Semantic<E>` / `AsynchronousSemantic<E>`: La definición abstracta del flujo
158
- - `Collectable<E>` / `AsynchronousCollectable<E>`: El flujo ejecutable con operaciones terminales
159
- - `OrderedCollectable<E>` / `UnorderedCollectable<E>`: Versiones materializadas optimizadas para operaciones sensibles o no sensibles al orden
160
- - `Collector<E, A, R>`: La abstracción para operaciones de reducción mutables
161
-
162
- ### Funciones de fábrica (use*)
163
- - **Desde fuentes**: useFrom, useRange, useFill, useEmpty
164
- - **Desde tiempo**: useInterval, useAnimationFrame
165
- - **Desde APIs web**: useBlob, useDocument, useWindow, useHTMLElement, useWebSocket
166
- - **Coleccionadores**: useToArray, useGroupBy, useSummate, useJoin, etc.
167
-
168
- ## Notas de rendimiento
169
- - **Evaluación diferida**: Los pipelines se componen sin ejecución hasta que se llama a una operación terminal
170
- - **Cortocircuito**: Operaciones como limit, anyMatch y findFirst detendrán el procesamiento de elementos tan pronto como se determine el resultado
171
- - **Ordenado vs No ordenado**:
172
- - Usa `.toUnordered()` para operaciones terminales cuando el orden de los elementos fuente no importa para tu resultado (por ejemplo, para suma, máximo o toSet). Esto puede permitir optimizaciones internas que omiten costosos pasos de ordenación
173
- - Usa `.toOrdered()` cuando la secuencia es importante (por ejemplo, para toArray donde se debe preservar el orden)
174
-
175
- ## Ejemplo de inicio
176
- ```typescript
177
- import { useFrom, useSummate, useGroupBy } from 'semantic-typescript';
178
-
179
- interface Transaction {
180
- id: number;
181
- amount: number;
182
- category: string;
183
- }
184
-
185
- const transactions: Transaction[] = [
186
- { id: 1, amount: 100, category: 'Food' },
187
- { id: 2, amount: 200, category: 'Electronics' },
188
- { id: 3, amount: 50, category: 'Food' },
189
- { id: 4, amount: 300, category: 'Electronics' },
190
- ];
191
-
192
- // Calcular el monto total por categoría
193
- const totalsByCategory = await useFrom(transactions)
194
- .toUnordered()
195
- .collect(
196
- useGroupBy(
197
- t => t.category,
198
- t => t.amount,
199
- useSummate() // Coleccionador para los valores
200
- )
201
- );
202
-
203
- console.log(totalsByCategory); // Map { 'Food' => 150, 'Electronics' => 500 }
204
- ```
173
+ ---
174
+
175
+ **Comparación con otros procesadores de flujo para Front-End**
176
+
177
+ | Característica | Semantic-TypeScript | RxJS | Iteradores/Generadores Asíncronos Nativos | Most.js |
178
+ | :--- | :--- | :--- | :--- | :--- |
179
+ | **Integración con TypeScript** | De primer nivel, profundamente tipado con consciencia nativa de índices. | Excelente, pero involucra genéricos complejos. | Buena, requiere tipado manual. | Estilo funcional fuerte. |
180
+ | **Análisis Estadístico Integrado** | Soporte nativo integral para `number` y `bigint`. | No disponible de forma nativa (requiere operadores personalizados). | Ninguno. | Ninguno. |
181
+ | **Indexación y Conciencia de Posición** | Indexación nativa y potente de bigint en cada elemento. | Requiere operadores personalizados (`scan`, `withLatestFrom`). | Se requiere contador manual. | Básica, sin índice incorporado. |
182
+ | **Gestión de Flujos de Eventos** | Fábricas dedicadas y seguras en tipos con control explícito de parada temprana. | Potente pero requiere gestión manual de suscripciones. | Oyente de eventos manual + cancelación. | Buena `fromEvent`, ligero. |
183
+ | **Rendimiento y Eficiencia de Memoria** | Excepcional – recolectores optimizados `toUnordered()` y `toOrdered()`. | Muy buena, pero las cadenas de operadores añaden sobrecarga. | Excelente (sobrecarga cero). | Excelente. |
184
+ | **Tamaño del Paquete** | Muy ligero. | Grande (incluso con tree-shaking). | Cero (nativo). | Pequeño. |
185
+ | **Filosofía de Diseño de API** | Patrón de recolector funcional con indexación explícita. | Patrón Observable Reactivo. | Patrón Iterador / Generador. | Funcional, point-free. |
186
+ | **Terminación Temprana y Control** | Explícito (`interrupt`, `.limit()`, `.takeWhile()`, `.sub()`). | Bueno (`take`, `takeUntil`, `first`). | Manual (`break` en `for await…of`). | Bueno (`take`, `until`). |
187
+ | **Soporte Síncrono y Asíncrono** | API unificada – soporte de primer nivel para ambos. | Principalmente asíncrono. | Ambos, pero manual. | Principalmente asíncrono. |
188
+ | **Curva de Aprendizaje** | Suave para desarrolladores familiarizados con pipelines funcionales e indexados. | Más pronunciada (muchos operadores, observables fríos/calientes). | Baja. | Moderada. |
189
+
190
+ **Ventajas clave de Semantic-TypeScript**
191
+
192
+ * Capacidades únicas de estadística e indexación integradas, eliminando la necesidad de `reduce` manual o librerías externas.
193
+ * Control explícito sobre los flujos de eventos previene las fugas de memoria comunes en RxJS.
194
+ * Un diseño síncrono/asíncrono unificado proporciona una única API consistente para diversos casos de uso.
195
+
196
+ Esta comparación ilustra por qué Semantic-TypeScript es particularmente adecuado para aplicaciones front-end modernas con TypeScript que exigen rendimiento, seguridad de tipos y análisis ricos sin la ceremonia de las librerías reactivas tradicionales.
197
+
198
+ ---
199
+
200
+ ### ¿Listo para explorar?
201
+
202
+ Semantic-TypeScript transforma flujos de datos complejos en pipelines legibles, componibles y de alto rendimiento. Ya sea que esté manejando eventos de UI en tiempo real, procesando grandes conjuntos de datos o construyendo paneles de análisis, proporciona el poder de la indexación a nivel de base de datos con la elegancia de la programación funcional.
203
+
204
+ **Próximos pasos:**
205
+
206
+ * Explore la API completamente tipada en su IDE (todas las exportaciones son del paquete principal).
207
+ * Únase a la creciente comunidad de desarrolladores que han reemplazado iteradores asíncronos complejos con pipelines Semantic limpios.
208
+
209
+ **Semantic-TypeScript** — donde los flujos se encuentran con la estructura.
205
210
 
206
- Semantic-TypeScript está construida para desarrolladores que buscan una biblioteca de procesamiento de flujos rigurosamente diseñada, segura en tipos y de alto rendimiento. Lleva el poder de los patrones de transformación de datos a nivel empresarial al ecosistema TypeScript, perfectamente adecuada para aplicaciones front-end intensivas en datos, procesamiento de datos en Node.js y cualquier escenario donde se requiera un manejo elegante y eficiente de secuencias.
211
+ Comience a construir hoy y experimente la diferencia que proporciona una indexación bien pensada.
207
212
 
208
- [![GitHub](./GitHub.png)](https://github.com/eloyhere/semantic-typescript) [![NPM](./NPM.png)](https://www.npmjs.com/package/semantic-typescript)
213
+ **Construya con claridad, proceda con confianza y transforme los datos con intención.**