semantic-typescript 0.7.0 → 0.7.1

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,32 +1,34 @@
1
- # **Semantic-TypeScript**
2
- **Flujos, Indexados.** Sus datos, bajo control preciso.
1
+ # **SemanticTypeScript**
2
+ **Flujos, indexados.** Tus datos, bajo control preciso.
3
3
 
4
4
  ---
5
5
 
6
6
  ### Descripción general
7
7
 
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.
8
+ SemanticTypeScript representa un avance significativo en el procesamiento de flujos, **fusionando** elegantemente los paradigmas más efectivos de los generadores de JavaScript, los Streams de Java y la indexación al estilo MySQL. Su premisa fundamental es poderosa y deliberada: construir canalizaciones de procesamiento de datos excepcionalmente eficientes mediante indexación inteligente, en lugar de mediante iteración por fuerza bruta convencional.
9
9
 
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.
10
+ Donde las bibliotecas típicas imponen bucles sincrónicos o cadenas de promesas engorrosas, SemanticTypeScript proporciona una experiencia **completamente asíncrona**, funcionalmente pura y rigurosamente segura en cuanto a tipos, diseñada expresamente para las exigencias del desarrollo moderno de aplicaciones.
11
11
 
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.
12
+ Este modelo encarna una forma refinada de flujo de control: los datos solo avanzan hacia el consumidor aguas abajo cuando la canalización aguas arriba invoca explícitamente la función de retorno `accept`. Conservas un control completo y granular sobre el momento del procesamiento: este ocurre precisamente cuando, y solo cuando, es necesario.
13
13
 
14
14
  ---
15
15
 
16
- ### Por qué los desarrolladores lo prefieren
16
+ ### ¿Por qué los desarrolladores eligen Semantic‑TypeScript?
17
17
 
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.
18
+ - **Indexación sin código repetitivo** Cada elemento posee inherentemente su índice natural o personalizado, eliminando el seguimiento manual.
19
+ - **Puramente funcional y seguro en tipos** Disfruta de inferencia de tipos TypeScript completa e idiomática junto con operaciones inmutables.
20
+ - **Flujos de eventos a prueba de fugas** El patrón `useSubscription` se diseña teniendo la seguridad de recursos como primer principio. Defines el límite lógico (usando `limit(n)`, `sub(start, end)` o `takeWhile(predicate)`) y la biblioteca gestiona completamente el ciclo de vida de la suscripción. Esto garantiza que no haya oyentes residuales ni fugas de memoria.
21
+ - **Suite estadística integrada** Accede a análisis exhaustivos para flujos tanto de `number` como de `bigint`, incluyendo promedios, medianas, modas, varianza, asimetría y curtosis, sin dependencias externas.
22
+ - **Rendimiento predecible y ajustable** Elige entre colectores ordenados o desordenados para adaptarte exactamente a tus requisitos de rendimiento y orden.
23
+ - **Inherentemente eficiente en memoria** Los flujos se evalúan de forma diferida, procesando elementos bajo demanda para aliviar la presión sobre la memoria.
24
+ - **Sin comportamiento indefinido** TypeScript garantiza seguridad de tipos completa y nulabilidad. Tus datos de origen permanecen inmutables a menos que se modifiquen explícitamente dentro de tus funciones de retorno.
25
25
 
26
26
  ---
27
27
 
28
28
  ### Instalación
29
29
 
30
+ Integra Semantic‑TypeScript en tu proyecto usando tu gestor de paquetes preferido:
31
+
30
32
  ```bash
31
33
  npm install semantic-typescript
32
34
  ```
@@ -37,177 +39,229 @@ yarn add semantic-typescript
37
39
 
38
40
  ---
39
41
 
40
- ### Comienzo rápido
42
+ ### Introducción práctica
43
+
44
+ Los siguientes ejemplos demuestran conceptos clave, desde transformaciones básicas hasta manejo de eventos del mundo real.
41
45
 
42
46
  ```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()
47
+ import { useOf, useFrom, useRange, useSubscription, useText, useStringify } from "semantic-typescript";
48
+
49
+ // ====================================================================
50
+ // EJEMPLO 1: Operaciones básicas y estadísticas numéricas
51
+ // ====================================================================
52
+ // Demuestra operaciones de mapeo y estadísticas terminales. Después de la transformación, la canalización debe convertirse en un colector de estadísticas antes de poder llamar a métodos terminales como `.summate()`.
53
+
54
+ const numericSum: number = useOf(10, 20, 30, 40)
55
+ .map((n: number): number => n * 2) // Duplica cada elemento: [20, 40, 60, 80]
56
+ .toNumericStatistics() // Convierte a un colector de estadísticas
57
+ .summate(); // Operación terminal: 200
58
+
59
+ // Otros métodos estadísticos (disponibles después de `.toNumericStatistics()`):
60
+ // .average(), .median(), .mode(), .variance(), .skewness(), .kurtosis()
61
+
62
+ // ====================================================================
63
+ // EJEMPLO 2: Estadísticas de BigInt
64
+ // ====================================================================
65
+ // Funciona de manera idéntica a las estadísticas numéricas pero está optimizado para datos BigInt.
66
+
67
+ const bigintSum: bigint = useOf(10n, 20n, 30n, 40n)
68
+ .map((n: bigint): bigint => n * 2n) // Aritmética BigInt
69
+ .toBigIntStatistics() // Convierte a un colector de estadísticas BigInt
70
+ .summate(); // Operación terminal: 200n
71
+
72
+ // ====================================================================
73
+ // EJEMPLO 3: Manipulación de índices para invertir un flujo
74
+ // ====================================================================
75
+ // Ilustra cómo reordenar elementos reasignando estratégicamente sus índices utilizando el método `.redirect()`, permitiendo patrones personalizados como la inversión.
76
+
77
+ const reversedArray: number[] = useFrom([1, 2, 3, 4, 5])
78
+ .redirect((_element: number, index: bigint): bigint => -index) // Mapea a índices negativos
79
+ .toOrdered() // Esencial: recoge elementos ordenados por sus nuevos índices
80
+ .toArray(); // Resultado: [5, 4, 3, 2, 1]
81
+
82
+ // Para una inversión simple, también está disponible `.reverse()`.
83
+
84
+ // ====================================================================
85
+ // EJEMPLO 4: Mezcla (Shuffle) de un flujo
86
+ // ====================================================================
87
+ // Permuta aleatoriamente los índices de los elementos usando un algoritmo de mezcla in situ.
88
+
89
+ const shuffledArray: number[] = useFrom([1, 2, 3, 4, 5])
90
+ .shuffle() // Reasigna índices aleatoriamente
91
+ .toOrdered() // Ordena según los nuevos índices aleatorios
92
+ .toArray(); // Ejemplo: [2, 5, 1, 4, 3] (varía en cada ejecución)
93
+
94
+ // ====================================================================
95
+ // EJEMPLO 5: Rotación circular de un flujo
96
+ // ====================================================================
97
+ // Desplaza elementos cíclicamente. Los valores positivos rotan a la derecha; los negativos a la izquierda.
98
+
99
+ // Rotación a la derecha 2 posiciones
100
+ const rightRotated: number[] = useFrom([1, 2, 3, 4, 5])
101
+ .translate(2) // Desplaza índices 2 posiciones a la derecha
66
102
  .toOrdered()
67
- .toArray(); // ej., [2, 5, 1, 4, 3]
103
+ .toArray(); // Resultado: [4, 5, 1, 2, 3]
68
104
 
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]
105
+ // ====================================================================
106
+ // EJEMPLO 6: Evaluación diferida con rangos infinitos
107
+ // ====================================================================
108
+ // Procesa flujos teóricamente infinitos de forma diferida, calculando elementos solo cuando se necesitan.
74
109
 
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]
110
+ const firstTenMultiples: bigint[] = useRange(0n, 1_000_000n)
111
+ .filter(n => n % 17n === 0n) // Conserva múltiplos de 17
112
+ .limit(10n) // Crítico: se detiene después de la décima coincidencia
113
+ .toUnordered() // No se requiere ordenación
114
+ .toArray(); // Resultado: [0, 17, 34, 51, 68, 85, 102, 119, 136, 153]
79
115
 
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()
116
+ // Sin `.limit(10n)`, la canalización procesaría el millón de elementos.
117
+
118
+ // ====================================================================
119
+ // EJEMPLO 7: Composición de una canalización compleja
120
+ // ====================================================================
121
+ // Demuestra la composición secuencial de múltiples operaciones.
122
+
123
+ const complexResult: number[] = useRange(1n, 100n)
124
+ .map(n => Number(n) * 2)
125
+ .filter(n => n > 50)
126
+ .shuffle()
127
+ .limit(5n)
128
+ .translate(2)
129
+ .toOrdered()
85
130
  .toArray();
86
131
 
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}`));
132
+ // ====================================================================
133
+ // EJEMPLO 8: Suscripción gestionada a eventos del DOM
134
+ // ====================================================================
135
+ // Escucha eventos del navegador con limpieza automática y a prueba de fugas.
136
+ // La llamada `.limit(n)` define el límite para la eliminación automática del oyente.
137
+
138
+ // Define un suscriptor para un objetivo Window
139
+ const windowSubscriber = {
140
+ mount: (target: Window): void => { /* Lógica de configuración */ },
141
+ subscribe: (target: Window, event: keyof WindowEventMap, handler: EventListener): void => {
142
+ target.addEventListener(event, handler);
143
+ },
144
+ unsubscribe: (target: Window, event: keyof WindowEventMap, handler: EventListener): void => {
145
+ target.removeEventListener(event, handler);
146
+ },
147
+ unmount: (): void => { /* Lógica de limpieza */ }
148
+ };
92
149
 
93
- // Escuchar un elemento HTML
94
- // <input id="input" type="text"/>
95
- useHTMLElement("#input", "change")
96
- .limit(1)
150
+ useSubscription(window, windowSubscriber, "resize")
151
+ .limit(5n) // Se da de baja automáticamente después de 5 eventos
97
152
  .toUnordered()
98
- .forEach((event: Event) => submit(event));
153
+ .forEach((ev: Event, idx) =>
154
+ console.log(`Redimensión #${idx}: ${(ev.target as Window).innerWidth}x${(ev.target as Window).innerHeight}`)
155
+ );
99
156
 
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));
105
-
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));
157
+ // ====================================================================
158
+ // EJEMPLO 9: Procesamiento de cadenas por puntos de código Unicode
159
+ // ====================================================================
160
+ // Itera correctamente sobre una cadena, manejando caracteres Unicode de múltiples bytes.
115
161
 
116
- // Iterar sobre una cadena por punto de código
117
162
  useText("My emotion now is: 😊, and semantic is 👍")
118
163
  .toUnordered()
119
- .log(); // Imprime la cadena
164
+ .log(); // Registra cada carácter (incluyendo emojis) en una nueva línea.
120
165
 
121
- // Convertir a cadena de forma segura un objeto con referencias circulares
122
- let o = {
166
+ // ====================================================================
167
+ // EJEMPLO 10: Transformación a cadena segura de referencias circulares
168
+ // ====================================================================
169
+ // Serializa de forma segura objetos que contienen referencias circulares.
170
+
171
+ const obj = {
123
172
  a: 1,
124
- b: "text",
125
- c: [o.a, o.b, o.c] // Referencia circular
173
+ b: "texto"
126
174
  };
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: []}`
175
+ (obj as any).c = [obj.a, obj.b, (obj as any).c]; // Introduce una referencia circular
176
+
177
+ // const text: string = JSON.stringify(obj); // Lanza un error
178
+ const text: string = useStringify(obj); // Produce de forma segura `{a: 1, b: "texto", c: []}`
129
179
  ```
130
180
 
131
181
  ---
132
182
 
133
- ### Conceptos centrales
183
+ ### Conceptos principales
134
184
 
135
- | Concepto | Propósito | Cuándo usarlo |
185
+ | Concepto | Propósito | Caso de uso principal |
136
186
  | :--- | :--- | :--- |
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. |
187
+ | `AsynchronousSemantic` | El constructor principal para flujos asíncronos, eventos y canalizaciones diferidas basadas en *push*. | Eventos en tiempo real, WebSockets, oyentes del DOM o cualquier flujo de larga duración/infinito. |
188
+ | `SynchronousSemantic` | El constructor para flujos síncronos, en memoria o basados en *pull* inmediatos (*eager*). | Datos estáticos, rangos finitos o tareas de iteración inmediata. |
189
+ | `toUnordered()` | El colector terminal más rápido, utiliza un Map para almacenar índices. | Rutas críticas de rendimiento donde el orden estable no es requerido (tiempo y espacio O(n)). |
190
+ | `toOrdered()` | Un colector terminal ordenado, estable en índices. | Cuando se debe preservar el orden de los elementos o se necesita acceso indexado. |
191
+ | `toNumericStatistics()` | Un colector que habilita análisis estadísticos completos en flujos de `number`. | Análisis de datos, métricas y cálculos estadísticos. |
192
+ | `toBigIntStatistics()` | Un colector que habilita análisis estadísticos completos en flujos de `bigint`. | Análisis y estadísticas para conjuntos de datos de enteros grandes. |
193
+ | `toWindow()` | Proporciona operaciones de ventana deslizante (*sliding*) y fija (*tumbling*) sobre un flujo. | Análisis de series temporales, procesamiento por lotes y agregaciones por ventanas. |
144
194
 
145
195
  ---
146
196
 
147
- **Reglas de uso importantes**
197
+ **Reglas de uso esenciales**
148
198
 
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.
199
+ 1. **Los flujos de eventos** (creados a través de fábricas como `useSubscription`) devuelven un `AsynchronousSemantic`.
200
+ Debes llamar a un método que defina un límite, como `.limit(n)`, `.sub(start, end)` o `.takeWhile(predicate)` para terminar el oyente. De lo contrario, la suscripción permanecerá activa.
151
201
 
152
- 2. **Operaciones terminales** (`.toArray()`, `.count()`, `.average()`, `.reduce()`, `.findFirst()`, etc.) **solo están disponibles después** de la conversión a un recolector:
202
+ 2. **Las operaciones terminales** (`.toArray()`, `.count()`, `.forEach()`, `.findFirst()`, etc.) solo están disponibles después de convertir la canalización en un colector:
153
203
  ```typescript
154
- .toUnordered() // Tiempo y espacio O(n), sin ordenación
204
+ .toUnordered() // Para máxima velocidad, sin garantía de orden.
155
205
  // o
156
- .toOrdered() // Ordenado, mantiene el orden
206
+ .toOrdered() // Para salida estable y ordenada.
207
+ // o
208
+ .toNumericStatistics() // Para métodos estadísticos.
157
209
  ```
158
210
 
159
211
  ---
160
212
 
161
213
  ### Características de rendimiento
162
214
 
163
- | Recolector | Complejidad Temporal | Complejidad Espacial | ¿Ordenado? | Mejor para |
215
+ | Colector | Complejidad temporal | Complejidad espacial | ¿Orden garantizado? | Escenario ideal |
164
216
  | :--- | :--- | :--- | :--- | :--- |
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. |
217
+ | `toUnordered()` | O(n) | O(n) | No | El rendimiento bruto es clave; el orden final es irrelevante. |
218
+ | `toOrdered()` | O(n log n) | O(n) | Sí (ordenado) | Orden estable, acceso indexado o pre-ordenación para estadísticas. |
219
+ | `toNumericStatistics()` | O(n log n) | O(n) | Sí (orden interno) | Realizar operaciones estadísticas que requieren datos ordenados. |
220
+ | `toBigIntStatistics()` | O(n log n) | O(n) | Sí (orden interno) | Operaciones estadísticas en datos BigInt. |
221
+ | `toWindow()` | O(n log n) | O(n) | Sí (orden interno) | Operaciones de ventana que se benefician de índices ordenados. |
170
222
 
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.
223
+ Elige `toUnordered()` cuando la velocidad absoluta es primordial. Opta por `toOrdered()` o un colector de estadísticas solo cuando tu lógica dependa del orden de los elementos.
172
224
 
173
225
  ---
174
226
 
175
- **Comparación con otros procesadores de flujo para Front-End**
227
+ **Análisis comparativo con bibliotecas modernas de flujos**
176
228
 
177
- | Característica | Semantic-TypeScript | RxJS | Iteradores/Generadores Asíncronos Nativos | Most.js |
229
+ | Característica | SemanticTypeScript | RxJS | Async Iterators / Generators nativos | Most.js |
178
230
  | :--- | :--- | :--- | :--- | :--- |
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. |
231
+ | **Integración TypeScript** | De primera clase, fuertemente tipado con conciencia de índice inherente. | Excelente, pero a menudo implica cadenas genéricas complejas. | Buena, pero requiere anotaciones de tipo manuales. | Fuerte, con un estilo de tipado funcional-*first*. |
232
+ | **Análisis estadístico integrado** | Soporte nativo completo para `number` y `bigint`. | No disponible de forma nativa (requiere operadores personalizados u otras bibliotecas). | Ninguno. | Ninguno. |
233
+ | **Indexación y conciencia de posición** | Indexación BigInt nativa y poderosa en cada elemento. | Requiere operadores personalizados (ej. `scan`, `withLatestFrom`). | Se requiere gestión manual de contadores. | Básica, sin propiedad de índice incorporada. |
234
+ | **Gestión de flujos de eventos** | Fábricas dedicadas, seguras en tipos, con control de ciclo de vida explícito y declarativo. | Poderosa pero requiere una gestión manual cuidadosa de las suscripciones para evitar fugas. | Adjuntar oyentes de eventos manualmente y gestionar tokens de cancelación. | Buen `fromEvent`, generalmente liviano. |
235
+ | **Rendimiento y memoria** | Excepcional: ofrece colectores optimizados `toUnordered()` y `toOrdered()`. | Muy buena, aunque las cadenas profundas de operadores pueden introducir sobrecarga. | Excelente (sobrecarga nativa mínima). | Excelente. |
236
+ | **Tamaño del paquete** | Muy liviano. | Sustancial (incluso con *tree-shaking*). | Cero (característica nativa del lenguaje). | Pequeño. |
237
+ | **Filosofía de diseño de API** | Patrón de colector funcional con semántica de índice explícita. | Patrón Observable reactivo. | Patrón Iterator imperativo / Generator declarativo. | Funcional, composición *point-free*. |
238
+ | **Control de flujo** | Explícito (`interrupt`, `.limit()`, `.takeWhile()`, `.sub()`). | Bueno (`take`, `takeUntil`, `first`). | Manual (`break` en bucles). | Bueno (`take`, `until`). |
239
+ | **Soporte síncrono y asíncrono** | API unificada: soporte de primera clase para ambos paradigmas. | Principalmente asíncrono. | Ambos soportados, pero con puente manual. | Principalmente asíncrono. |
240
+ | **Curva de aprendizaje** | Suave para desarrolladores familiarizados con canalizaciones de colecciones funcionales e indexadas. | Más pronunciada (amplio léxico de operadores, conceptos de Observable *hot/cold*). | Baja a media. | Media. |
189
241
 
190
- **Ventajas clave de Semantic-TypeScript**
242
+ **La ventaja de SemanticTypeScript**
191
243
 
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.
244
+ * **Capacidades únicas:** Las características de estadística e indexación integradas eliminan la necesidad de operaciones manuales de `reduce` o bibliotecas de análisis de datos suplementarias.
245
+ * **Gestión de recursos predecible:** El control explícito sobre los flujos de eventos previene las fugas de memoria que pueden ser sutiles en las aplicaciones RxJS.
246
+ * **Diseño unificado:** Una API consistente para flujos de trabajo tanto síncronos como asíncronos reduce la carga cognitiva y la duplicación de código.
195
247
 
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.
248
+ Esta comparación destaca por qué SemanticTypeScript es especialmente adecuado para aplicaciones TypeScript modernas que exigen alto rendimiento, solidez en la seguridad de tipos y amplias funciones de procesamiento de datos sin la complejidad de los marcos reactivos tradicionales.
197
249
 
198
250
  ---
199
251
 
200
- ### ¿Listo para explorar?
252
+ ### Comienza tu exploración
253
+
254
+ Semantic‑TypeScript transforma flujos de datos complejos en canalizaciones legibles, componibles y de alto rendimiento. Ya sea que estés manejando eventos de UI en tiempo real, procesando grandes conjuntos de datos o construyendo paneles de análisis, ofrece el poder de la indexación a nivel de base de datos con la elegancia de la programación funcional.
201
255
 
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.
256
+ **Tus próximos pasos:**
203
257
 
204
- **Próximos pasos:**
258
+ * Explora la API completamente tipificada directamente en tu IDE (todas las exportaciones están disponibles desde el punto de entrada principal del paquete).
259
+ * Únete a la creciente comunidad de desarrolladores que han reemplazado iteradores asíncronos complejos y cadenas reactivas con canalizaciones Semantic claras e intencionales.
205
260
 
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.
261
+ **Semantic‑TypeScript** donde los flujos se encuentran con la estructura.
208
262
 
209
- **Semantic-TypeScript** donde los flujos se encuentran con la estructura.
263
+ Comienza a construir hoy y experimenta la diferencia tangible que aporta un diseño de indexación reflexivo.
210
264
 
211
- Comience a construir hoy y experimente la diferencia que proporciona una indexación bien pensada.
265
+ **Construye con claridad, avanza con confianza y transforma datos con intención.**
212
266
 
213
- **Construya con claridad, proceda con confianza y transforme los datos con intención.**
267
+ MIT © Eloy Kim