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/dist/asynchronous/semantic.d.ts +4 -0
- package/dist/asynchronous/semantic.js +3 -0
- package/dist/factory.d.ts +24 -71
- package/dist/factory.js +161 -648
- package/dist/guard.d.ts +0 -3
- package/dist/guard.js +0 -19
- package/dist/hash.js +3 -0
- package/dist/synchronous/semantic.d.ts +4 -0
- package/dist/synchronous/semantic.js +4 -1
- package/package.json +1 -1
- package/readme.cn.md +185 -131
- package/readme.de.md +186 -132
- package/readme.es.md +186 -132
- package/readme.fr.md +188 -134
- package/readme.jp.md +185 -140
- package/readme.kr.md +184 -139
- package/readme.md +187 -130
- package/readme.ru.md +186 -143
- package/readme.tw.md +190 -146
- package/dist/main.d.ts +0 -1
- package/dist/main.js +0 -6
package/readme.es.md
CHANGED
|
@@ -1,32 +1,34 @@
|
|
|
1
|
-
# **Semantic
|
|
2
|
-
**Flujos,
|
|
1
|
+
# **Semantic‑TypeScript**
|
|
2
|
+
**Flujos, indexados.** Tus datos, bajo control preciso.
|
|
3
3
|
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
### Descripción general
|
|
7
7
|
|
|
8
|
-
Semantic
|
|
8
|
+
Semantic‑TypeScript 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
|
|
10
|
+
Donde las bibliotecas típicas imponen bucles sincrónicos o cadenas de promesas engorrosas, Semantic‑TypeScript 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
|
-
|
|
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
|
|
16
|
+
### ¿Por qué los desarrolladores eligen Semantic‑TypeScript?
|
|
17
17
|
|
|
18
|
-
- **Indexación
|
|
19
|
-
- **
|
|
20
|
-
- **Flujos de
|
|
21
|
-
- **
|
|
22
|
-
- **Rendimiento
|
|
23
|
-
- **
|
|
24
|
-
- **Sin
|
|
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
|
-
###
|
|
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,
|
|
44
|
-
|
|
45
|
-
//
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
//
|
|
52
|
-
|
|
53
|
-
.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
.
|
|
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();
|
|
103
|
+
.toArray(); // Resultado: [4, 5, 1, 2, 3]
|
|
68
104
|
|
|
69
|
-
//
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
76
|
-
.
|
|
77
|
-
.
|
|
78
|
-
.
|
|
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
|
-
//
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
//
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
94
|
-
//
|
|
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((
|
|
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
|
-
//
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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(); //
|
|
164
|
+
.log(); // Registra cada carácter (incluyendo emojis) en una nueva línea.
|
|
120
165
|
|
|
121
|
-
//
|
|
122
|
-
|
|
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: "
|
|
125
|
-
c: [o.a, o.b, o.c] // Referencia circular
|
|
173
|
+
b: "texto"
|
|
126
174
|
};
|
|
127
|
-
|
|
128
|
-
|
|
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
|
|
183
|
+
### Conceptos principales
|
|
134
184
|
|
|
135
|
-
| Concepto | Propósito |
|
|
185
|
+
| Concepto | Propósito | Caso de uso principal |
|
|
136
186
|
| :--- | :--- | :--- |
|
|
137
|
-
| `AsynchronousSemantic` |
|
|
138
|
-
| `SynchronousSemantic` |
|
|
139
|
-
| `toUnordered()` |
|
|
140
|
-
| `toOrdered()` |
|
|
141
|
-
| `toNumericStatistics()` |
|
|
142
|
-
| `toBigIntStatistics()` |
|
|
143
|
-
| `toWindow()` |
|
|
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
|
|
197
|
+
**Reglas de uso esenciales**
|
|
148
198
|
|
|
149
|
-
1. **
|
|
150
|
-
→
|
|
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. **
|
|
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() //
|
|
204
|
+
.toUnordered() // Para máxima velocidad, sin garantía de orden.
|
|
155
205
|
// o
|
|
156
|
-
.toOrdered() //
|
|
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
|
-
|
|
|
215
|
+
| Colector | Complejidad temporal | Complejidad espacial | ¿Orden garantizado? | Escenario ideal |
|
|
164
216
|
| :--- | :--- | :--- | :--- | :--- |
|
|
165
|
-
| `toUnordered()` | O(n) | O(n) | No |
|
|
166
|
-
| `toOrdered()` | O(
|
|
167
|
-
| `toNumericStatistics()` | O(
|
|
168
|
-
| `toBigIntStatistics()` | O(
|
|
169
|
-
| `toWindow()` | O(
|
|
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
|
-
|
|
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
|
-
**
|
|
227
|
+
**Análisis comparativo con bibliotecas modernas de flujos**
|
|
176
228
|
|
|
177
|
-
| Característica | Semantic
|
|
229
|
+
| Característica | Semantic‑TypeScript | RxJS | Async Iterators / Generators nativos | Most.js |
|
|
178
230
|
| :--- | :--- | :--- | :--- | :--- |
|
|
179
|
-
| **Integración
|
|
180
|
-
| **Análisis
|
|
181
|
-
| **Indexación y
|
|
182
|
-
| **Gestión de
|
|
183
|
-
| **Rendimiento y
|
|
184
|
-
| **Tamaño del
|
|
185
|
-
| **Filosofía de
|
|
186
|
-
| **
|
|
187
|
-
| **Soporte
|
|
188
|
-
| **Curva de
|
|
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
|
-
**
|
|
242
|
+
**La ventaja de Semantic‑TypeScript**
|
|
191
243
|
|
|
192
|
-
* Capacidades únicas de estadística e indexación integradas
|
|
193
|
-
*
|
|
194
|
-
*
|
|
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
|
|
248
|
+
Esta comparación destaca por qué Semantic‑TypeScript 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
|
-
###
|
|
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
|
-
|
|
256
|
+
**Tus próximos pasos:**
|
|
203
257
|
|
|
204
|
-
|
|
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
|
-
|
|
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
|
-
|
|
263
|
+
Comienza a construir hoy y experimenta la diferencia tangible que aporta un diseño de indexación reflexivo.
|
|
210
264
|
|
|
211
|
-
|
|
265
|
+
**Construye con claridad, avanza con confianza y transforma datos con intención.**
|
|
212
266
|
|
|
213
|
-
|
|
267
|
+
MIT © Eloy Kim
|