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/dist/asynchronous/collector.d.ts +62 -58
- package/dist/asynchronous/collector.js +16 -5
- package/dist/asynchronous/semantic.d.ts +2 -2
- package/dist/asynchronous/semantic.js +16 -6
- package/dist/factory.d.ts +8 -0
- package/dist/factory.js +112 -36
- package/dist/hook.d.ts +6 -1
- package/dist/hook.js +20 -3
- package/dist/main.d.ts +1 -0
- package/dist/main.js +6 -0
- package/dist/synchronous/collector.d.ts +8 -4
- package/dist/synchronous/collector.js +74 -59
- package/dist/synchronous/semantic.d.ts +27 -23
- package/dist/synchronous/semantic.js +215 -286
- package/package.json +3 -2
- package/readme.cn.md +213 -214
- package/readme.de.md +172 -173
- package/readme.es.md +177 -172
- package/readme.fr.md +181 -172
- package/readme.jp.md +187 -169
- package/readme.kr.md +182 -169
- package/readme.md +213 -214
- package/readme.ru.md +188 -169
- package/readme.tw.md +178 -169
package/readme.es.md
CHANGED
|
@@ -1,208 +1,213 @@
|
|
|
1
|
-
# Semantic-TypeScript
|
|
1
|
+
# **Semantic-TypeScript**
|
|
2
|
+
**Flujos, Indexados.** Sus datos, bajo control preciso.
|
|
2
3
|
|
|
3
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
27
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
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,
|
|
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
|
-
//
|
|
61
|
-
|
|
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
|
-
//
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
//
|
|
70
|
-
|
|
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
|
-
//
|
|
73
|
-
|
|
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
|
-
|
|
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
|
-
|
|
86
|
-
```
|
|
133
|
+
### Conceptos centrales
|
|
87
134
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
119
|
-
|
|
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
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
|
|
159
|
+
---
|
|
132
160
|
|
|
133
|
-
###
|
|
134
|
-
```typescript
|
|
135
|
-
const numericStream = useFrom([10, 20, 30, 40, 50]).toNumeric();
|
|
161
|
+
### Características de rendimiento
|
|
136
162
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
211
|
+
Comience a construir hoy y experimente la diferencia que proporciona una indexación bien pensada.
|
|
207
212
|
|
|
208
|
-
|
|
213
|
+
**Construya con claridad, proceda con confianza y transforme los datos con intención.**
|