semantic-typescript 0.5.3 → 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,478 +1,213 @@
1
- # Biblioteca de Procesamiento de Secuencias Semantic-TypeScript
1
+ # **Semantic-TypeScript**
2
+ **Flujos, Indexados.** Sus datos, bajo control preciso.
2
3
 
3
- ## Introducción
4
+ ---
4
5
 
5
- Semantic-TypeScript es una biblioteca moderna de procesamiento de secuencias inspirada en la función generadora de JavaScript, Java Stream y el índice de MySQL. Su filosofía de diseño central se basa en construir pipelines eficientes de procesamiento de datos utilizando la indexación de datos, proporcionando una experiencia de operación de secuencia funcional con seguridad de tipos para el desarrollo del frontend.
6
+ ### Descripción general
6
7
 
7
- A diferencia del procesamiento sincrónico tradicional, Semantic emplea un modelo de procesamiento asíncrono. Al crear un flujo de datos, el tiempo en que el terminal recibe los datos depende completamente de cuándo el upstream llama a las funciones de devolución de llamada `accept` y `interrupt`. Este diseño permite que la biblioteca maneje elegantemente flujos de datos en tiempo real, grandes conjuntos de datos y fuentes de datos asíncronas.
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
9
 
9
- ## Instalación
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
11
 
11
- ```bash
12
- npm install semantic-typescript
13
- ```
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.
14
13
 
15
- ## Tipos Básicos
16
-
17
- | Tipo | Descripción |
18
- |------|-------------|
19
- | `Invalid<T>` | Tipo que extiende `null` o `undefined` |
20
- | `Valid<T>` | Tipo que excluye `null` y `undefined` |
21
- | `MaybeInvalid<T>` | Tipo que puede ser `null` o `undefined` |
22
- | `Primitive` | Colección de tipos primitivos |
23
- | `MaybePrimitive<T>` | Tipo que puede ser un tipo primitivo |
24
- | `OptionalSymbol` | Identificador de símbolo de la clase `Optional` |
25
- | `SemanticSymbol` | Identificador de símbolo de la clase `Semantic` |
26
- | `CollectorsSymbol` | Identificador de símbolo de la clase `Collector` |
27
- | `CollectableSymbol` | Identificador de símbolo de la clase `Collectable` |
28
- | `OrderedCollectableSymbol` | Identificador de símbolo de la clase `OrderedCollectable` |
29
- | `WindowCollectableSymbol` | Identificador de símbolo de la clase `WindowCollectable` |
30
- | `StatisticsSymbol` | Identificador de símbolo de la clase `Statistics` |
31
- | `NumericStatisticsSymbol` | Identificador de símbolo de la clase `NumericStatistics` |
32
- | `BigIntStatisticsSymbol` | Identificador de símbolo de la clase `BigIntStatistics` |
33
- | `UnorderedCollectableSymbol` | Identificador de símbolo de la clase `UnorderedCollectable` |
34
-
35
- ## Interfaces Funcionales
36
-
37
- | Interfaz | Descripción |
38
- |-----------|-------------|
39
- | `Runnable` | Función sin parámetros y sin valor de retorno |
40
- | `Supplier<R>` | Función sin parámetros que devuelve `R` |
41
- | `Functional<T, R>` | Función de transformación de un solo parámetro |
42
- | `BiFunctional<T, U, R>` | Función de transformación de dos parámetros |
43
- | `TriFunctional<T, U, V, R>` | Función de transformación de tres parámetros |
44
- | `Predicate<T>` | Función de predicado de un solo parámetro |
45
- | `BiPredicate<T, U>` | Función de predicado de dos parámetros |
46
- | `TriPredicate<T, U, V>` | Función de predicado de tres parámetros |
47
- | `Consumer<T>` | Función de consumidor de un solo parámetro |
48
- | `BiConsumer<T, U>` | Función de consumidor de dos parámetros |
49
- | `TriConsumer<T, U, V>` | Función de consumidor de tres parámetros |
50
- | `Comparator<T>` | Función de comparación de dos parámetros |
51
- | `Generator<T>` | Función generadora (núcleo y base) |
14
+ ---
52
15
 
53
- ```typescript
54
- // Ejemplos de uso de tipos
55
- let predicate: Predicate<number> = (n: number): boolean => n > 0;
56
- let mapper: Functional<string, number> = (text: string): number => text.length;
57
- let comparator: Comparator<number> = (a: number, b: number): number => a - b;
58
- ```
59
-
60
- ## Guardias de Tipo
61
-
62
- | Función | Descripción | Complejidad Temporal | Complejidad Espacial |
63
- |------|------|------------|------------|
64
- | `validate<T>(t: MaybeInvalid<T>): t is T` | Valida que el valor no sea null ni undefined | O(1) | O(1) |
65
- | `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | Valida que el valor sea null o undefined | O(1) | O(1) |
66
- | `isBoolean(t: unknown): t is boolean` | Comprueba si es un booleano | O(1) | O(1) |
67
- | `isString(t: unknown): t is string` | Comprueba si es una cadena | O(1) | O(1) |
68
- | `isNumber(t: unknown): t is number` | Comprueba si es un número | O(1) | O(1) |
69
- | `isFunction(t: unknown): t is Function` | Comprueba si es una función | O(1) | O(1) |
70
- | `isObject(t: unknown): t is object` | Comprueba si es un objeto | O(1) | O(1) |
71
- | `isSymbol(t: unknown): t is symbol` | Comprueba si es un símbolo | O(1) | O(1) |
72
- | `isBigint(t: unknown): t is bigint` | Comprueba si es un BigInt | O(1) | O(1) |
73
- | `isPrimitive(t: unknown): t is Primitive` | Comprueba si es un tipo primitivo | O(1) | O(1) |
74
- | `isIterable(t: unknown): t is Iterable<unknown>` | Comprueba si es un objeto iterable | O(1) | O(1) |
75
- | `isOptional(t: unknown): t is Optional<unknown>` | Comprueba si es una instancia de Optional | O(1) | O(1) |
76
- | `isSemantic(t: unknown): t is Semantic<unknown>` | Comprueba si es una instancia de Semantic | O(1) | O(1) |
77
- | `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Comprueba si es una instancia de Collector | O(1) | O(1) |
78
- | `isCollectable(t: unknown): t is Collectable<unknown>` | Comprueba si es una instancia de Collectable | O(1) | O(1) |
79
- | `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | Comprueba si es una instancia de OrderedCollectable | O(1) | O(1) |
80
- | `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | Comprueba si es una instancia de WindowCollectable | O(1) | O(1) |
81
- | `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | Comprueba si es una instancia de UnorderedCollectable | O(1) | O(1) |
82
- | `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Comprueba si es una instancia de Statistics | O(1) | O(1) |
83
- | `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | Comprueba si es una instancia de NumericStatistics | O(1) | O(1) |
84
- | `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | Comprueba si es una instancia de BigIntStatistics | O(1) | O(1) |
85
- | `isPromise(t: unknown): t is Promise<unknown>` | Comprueba si es un objeto Promise | O(1) | O(1) |
86
- | `isAsync(t: unknown): t is AsyncFunction` | Comprueba si es una AsyncFunction | O(1) | O(1) |
87
-
88
- ```typescript
89
- // Ejemplos de uso de guardias de tipo
90
- let value: unknown = "hello";
91
-
92
- if (isString(value)) {
93
- console.log(value.length); // Seguro para tipos, value inferido como string
94
- }
95
-
96
- if (isOptional(someValue)) {
97
- someValue.ifPresent((value): void => console.log(val));
98
- }
99
-
100
- if(isIterable(value)){
101
- // Seguro para tipos, ahora es un objeto iterable.
102
- for(let item of value){
103
- console.log(item);
104
- }
105
- }
106
- ```
16
+ ### Por qué los desarrolladores lo prefieren
107
17
 
108
- ## Funciones Utilitarias
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.
109
25
 
110
- | Función | Descripción | Complejidad Temporal | Complejidad Espacial |
111
- |------|------|------------|------------|
112
- | `useCompare<T>(t1: T, t2: T): number` | Función de comparación genérica | O(1) | O(1) |
113
- | `useRandom<T = number \| bigint>(index: T): T` | Generador de números pseudoaleatorios | O(log n) | O(1) |
26
+ ---
114
27
 
115
- ```typescript
116
- // Ejemplos de uso de funciones utilitarias
117
- let numbers: Array<number> = [3, 1, 4, 1, 5];
118
- numbers.sort(useCompare); // [1, 1, 3, 4, 5]
28
+ ### Instalación
119
29
 
120
- let randomNum = useRandom(42); // Número aleatorio basado en semilla
30
+ ```bash
31
+ npm install semantic-typescript
32
+ ```
33
+ o
34
+ ```bash
35
+ yarn add semantic-typescript
121
36
  ```
122
37
 
123
- ## Métodos de Fábrica
124
-
125
- ### Métodos de Fábrica de Optional
38
+ ---
126
39
 
127
- | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
128
- |------|------|------------|------------|
129
- | `Optional.empty<T>()` | Crea un Optional vacío | O(1) | O(1) |
130
- | `Optional.of<T>(value)` | Crea un Optional que contiene un valor | O(1) | O(1) |
131
- | `Optional.ofNullable<T>(value)` | Crea un Optional que podría estar vacío | O(1) | O(1) |
132
- | `Optional.ofNonNull<T>(value)` | Crea un Optional que no está vacío | O(1) | O(1) |
40
+ ### Comienzo rápido
133
41
 
134
42
  ```typescript
135
- // Ejemplos de uso de Optional
136
- let empty: Optional<number> = Optional.empty();
137
- let present: Optional<number> = Optional.of(42);
138
- let nullable: Optional<string> = Optional.ofNullable<string>(null);
139
- let nonNull: Optional<string> = Optional.ofNonNull("hello");
140
-
141
- present.ifPresent((val: number): void => console.log(val)); // Salida: 42
142
- console.log(emptyOpt.get(100)); // Salida: 100
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();
86
+
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}`));
92
+
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));
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));
115
+
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: []}`
143
129
  ```
144
130
 
145
- ### Métodos de Fábrica de Collector
131
+ ---
146
132
 
147
- | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
148
- |------|------|------------|------------|
149
- | `Collector.full(identity, accumulator, finisher)` | Crea un Collector completo | O(1) | O(1) |
150
- | `Collector.shortable(identity, interruptor, accumulator, finisher)` | Crea un Collector interrumpible | O(1) | O(1) |
133
+ ### Conceptos centrales
151
134
 
152
- ```typescript
153
- // Ejemplos de conversión de Collector
154
- let numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
155
-
156
- // Prioridad de rendimiento: usa un Collector no ordenado para obtener el mejor rendimiento
157
- let unordered = numbers
158
- .filter((n: number): boolean => n > 3)
159
- .toUnordered(); // Mejor rendimiento
160
-
161
- // Necesita ordenación: usa un Collector ordenado
162
- let ordered = numbers.sorted();
163
-
164
- // Operaciones de recuento de elementos
165
- let count = Collector.full(
166
- (): number => 0, // Valor inicial
167
- (accumulator: number, element: number): number => accumulator + element, // Acumular
168
- (accumulator: number): number => accumulator // Finalizar
169
- );
170
- count.collect(from([1, 2, 3, 4, 5])); // Recuento desde un flujo
171
- count.collect([1, 2, 3, 4, 5]); // Recuento desde un objeto iterable
172
-
173
- let find = Collector.shortable(
174
- (): Optional<number> => Optional.empty(), // Valor inicial
175
- (element: number, index: bigint, accumulator: Optional<number>): Optional<number> => accumulator.isPresent(), // Interrumpir
176
- (accumulator: Optional<number>, element: number, index: bigint): Optional<number> => Optional.of(element), // Acumular
177
- (accumulator: Optional<number>): Optional<number> => accumulator // Finalizar
178
- );
179
- find.collect(from([1, 2, 3, 4, 5])); // Encuentra el primer elemento
180
- find.collect([1, 2, 3, 4, 5]); // Encuentra el primer elemento
181
- ```
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. |
182
144
 
183
- ### Métodos de Fábrica de Semantic
145
+ ---
184
146
 
185
- | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
186
- |------|------|------------|------------|
187
- | `animationFrame(period: number, delay: number = 0)` | Crea un flujo de fotogramas de animación basado en tiempo | O(1)* | O(1) |
188
- | `blob(blob, chunkSize)` | Crea un flujo a partir de un Blob | O(n) | O(chunkSize) |
189
- | `empty<E>()` | Crea un flujo vacío | O(1) | O(1) |
190
- | `fill<E>(element, count)` | Crea un flujo lleno | O(n) | O(1) |
191
- | `from<E>(iterable)` | Crea un flujo a partir de un objeto iterable | O(1) | O(1) |
192
- | `interval(period, delay?)` | Crea un flujo de intervalo de tiempo | O(1)* | O(1) |
193
- | `iterate<E>(generator)` | Crea un flujo a partir de un generador | O(1) | O(1) |
194
- | `range(start, end, step)` | Crea un flujo de rango numérico | O(n) | O(1) |
195
- | `websocket(websocket)` | Crea un flujo a partir de un WebSocket | O(1) | O(1) |
147
+ **Reglas de uso importantes**
196
148
 
197
- ```typescript
198
- // Ejemplos de métodos de fábrica de Semantic
199
-
200
- // Crea un flujo a partir de un Blob (lectura por partes)
201
- blob(someBlob, 1024n)
202
- .toUnordered()
203
- .write(WritableStream)
204
- .then(callback) // Escritura del flujo exitosa
205
- .catch(callback); // Escritura del flujo fallida
206
-
207
- // Crea un flujo vacío, no se ejecutará hasta concatenarse con otros flujos
208
- empty<string>()
209
- .toUnordered()
210
- .join(); // []
211
-
212
- // Crea un flujo lleno
213
- const filledStream = fill("hello", 3); // "hello", "hello", "hello"
214
-
215
- // Crea un flujo de intervalo con un retraso inicial de 2 segundos y un período de ejecución de 5 segundos, implementado sobre un mecanismo de temporizador; puede experimentar deriva temporal debido a las limitaciones de precisión de la programación del sistema.
216
- const intervalStream = interval(5000, 2000);
217
-
218
- // Crea un flujo a partir de un objeto iterable
219
- const numberStream = from([1, 2, 3, 4, 5]);
220
- const stringStream = from(new Set(["Alex", "Bob"]));
221
-
222
- // Crea un flujo de rango
223
- const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
224
-
225
- // Flujo de eventos WebSocket
226
- const ws = new WebSocket("ws://localhost:8080");
227
- websocket(ws)
228
- .filter((event): boolean => event.type === "message") // Solo escucha eventos de mensaje
229
- .toUnordered() // Los eventos generalmente no están ordenados
230
- .forEach((event): void => receive(event)); // Recibe mensajes
231
- ```
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.
232
151
 
233
- ## Métodos de Clase Semantic
234
-
235
- | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
236
- |------|------|------------|------------|
237
- | `concat(other)` | Concatena dos flujos | O(n) | O(1) |
238
- | `distinct()` | Elimina duplicados | O(n) | O(n) |
239
- | `distinct(comparator)` | Elimina duplicados usando un comparador | O(n²) | O(n) |
240
- | `dropWhile(predicate)` | Descarta elementos que satisfacen la condición | O(n) | O(1) |
241
- | `filter(predicate)` | Filtra elementos | O(n) | O(1) |
242
- | `flat(mapper)` | Aplicación plana de mapa | O(n × m) | O(1) |
243
- | `flatMap(mapper)` | Aplicación plana de mapa a un nuevo tipo | O(n × m) | O(1) |
244
- | `limit(n)` | Limita el número de elementos | O(n) | O(1) |
245
- | `map(mapper)` | Transformación de asignación | O(n) | O(1) |
246
- | `peek(consumer)` | Mirar elementos | O(n) | O(1) |
247
- | `redirect(redirector)` | Redirigir índice | O(n) | O(1) |
248
- | `reverse()` | Invierte el flujo | O(n) | O(1) |
249
- | `shuffle()` | Mezcla al azar | O(n) | O(1) |
250
- | `shuffle(mapper)` | Mezcla usando un mapeador | O(n) | O(1) |
251
- | `skip(n)` | Omite los primeros n elementos | O(n) | O(1) |
252
- | `sorted()` | Ordena | O(n log n) | O(n) |
253
- | `sorted(comparator)` | Ordena usando un comparador | O(n log n) | O(n) |
254
- | `sub(start, end)` | Obtiene un subflujo | O(n) | O(1) |
255
- | `takeWhile(predicate)` | Obtiene elementos que satisfacen la condición | O(n) | O(1) |
256
- | `translate(offset)` | Traduce índice | O(n) | O(1) |
257
- | `translate(translator)` | Traduce índice usando un traductor | O(n) | O(1) |
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
+ ```
258
158
 
259
- ```typescript
260
- // Ejemplos de operaciones Semantic
261
- const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
262
- .filter((n: number): boolean => n % 2 === 0) // Filtra números pares
263
- .map((n: number): number => n * 2) // Multiplica por 2
264
- .skip(1) // Omite el primero
265
- .limit(3) // Limita a 3 elementos
266
- .toUnordered() // Convierte a un colector no ordenado
267
- .toArray(); // Convierte a arreglo
268
- // Resultado: [8, 12, 20]
269
-
270
- // Ejemplo de operación compleja
271
- const complexResult = range(1, 100, 1)
272
- .flatMap((n: number): Semantics<number> => from([n, n * 2])) // Asigna cada elemento a dos
273
- .distinct() // Elimina duplicados
274
- .shuffle() // Mezcla el orden
275
- .takeWhile((n: number): boolean => n < 50) // Toma elementos menores que 50
276
- .toOrdered() // Convierte a un colector ordenado
277
- .toArray(); // Convierte a arreglo
278
- ```
159
+ ---
279
160
 
280
- ## Métodos de Conversión Semantic
161
+ ### Características de rendimiento
281
162
 
282
- | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
283
- |------------|------------|------------|------------|
284
- | `sorted()` | Convierte a un colector ordenado | O(n log n) | O(n) |
285
- | `toUnordered()` | Convierte a un colector no ordenado | O(1) | O(1) |
286
- | `toOrdered()` | Convierte a un colector ordenado | O(1) | O(1) |
287
- | `toNumericStatistics()` | Convierte a estadísticas numéricas | O(n) | O(1) |
288
- | `toBigintStatistics()` | Convierte a estadísticas BigInt | O(n) | O(1) |
289
- | `toWindow()` | Convierte a un colector de ventana | O(1) | O(1) |
290
- | `toCollectable()` | Convierte a `UnorderdCollectable` | O(n) | O(1) |
291
- | `toCollectable(mapper)` | Convierte a un colector personalizado | O(n) | O(1) |
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) | | Operaciones estadísticas para bigint. |
169
+ | `toWindow()` | O(2n) | O(n) | | Operaciones de ventana basadas en tiempo. |
292
170
 
293
- ```typescript
294
- // Convierte a un arreglo ordenado ascendente
295
- from([6, 4, 3, 5, 2]) // Crea un flujo
296
- .sorted() // Ordena el flujo en orden ascendente
297
- .toArray(); // [2, 3, 4, 5, 6]
298
-
299
- // Convierte a un arreglo ordenado descendente
300
- from([6, 4, 3, 5, 2]) // Crea un flujo
301
- .soted((a: number, b: number): number => b - a) // Ordena el flujo en orden descendente
302
- .toArray(); // [6, 5, 4, 3, 2]
303
-
304
- // Redirige a un arreglo invertido
305
- from([6, 4, 3, 5, 2])
306
- .redirect((element, index): bigint => -index) // Redirige a orden inverso
307
- .toOrderd() // Mantiene el orden redirigido
308
- .toArray(); // [2, 5, 3, 4, 6]
309
-
310
- // Ignora las redirecciones para invertir el arreglo
311
- from([6, 4, 3, 5, 2])
312
- .redirect((element, index): bigint => -index) // Redirige a orden inverso
313
- .toUnorderd() // Descarta el orden redirigido. Esta operación ignorará `redirect`, `reverse`, `shuffle` y `translate`
314
- .toArray(); // [2, 5, 3, 4, 6]
315
-
316
- // Invierte el flujo en un arreglo
317
- from([6, 4, 3, 5, 2])
318
- .reverse() // Invierte el flujo
319
- .toOrdered() // Garantiza el orden invertido
320
- .toArray(); // [2, 5, 3, 4, 6]
321
-
322
- // Sobrescribe el flujo mezclado en un arreglo
323
- from([6, 4, 3, 5, 2])
324
- .shuffle() // Mezcla el flujo
325
- .sorted() // Sobrescribe el orden mezclado. Esta operación sobrescribirá `redirect`, `reverse`, `shuffle` y `translate`
326
- .toArray(); // [2, 5, 3, 4, 6]
327
-
328
- // Convierte a un colector de ventana
329
- from([6, 4, 3, 5, 2])
330
- .toWindow(); // Convierte a estadísticas numéricas
331
-
332
- from([6, 4, 3, 5, 2])
333
- .toNumericStatistics(); // Convierte a estadísticas BigInt
334
-
335
- from([6n, 4n, 3n, 5n, 2n])
336
- .toBigintStatistics(); // Define un colector personalizado para recopilar datos
337
-
338
- let customizedCollector = from([1, 2, 3, 4, 5])
339
- .toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
340
- ```
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.
341
172
 
342
- ## Métodos de Recolección Collectable
343
-
344
- | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
345
- |------|------|------------|------------|
346
- | `anyMatch(predicate)` | Si algún elemento coincide | O(n) | O(1) |
347
- | `allMatch(predicate)` | Si todos los elementos coinciden | O(n) | O(1) |
348
- | `count()` | Recuento de elementos | O(n) | O(1) |
349
- | `isEmpty()` | Si está vacío | O(1) | O(1) |
350
- | `findAny()` | Encuentra cualquier elemento | O(n) | O(1) |
351
- | `findFirst()` | Encuentra el primer elemento | O(n) | O(1) |
352
- | `findLast()` | Encuentra el último elemento | O(n) | O(1) |
353
- | `forEach(action)` | Itera sobre todos los elementos | O(n) | O(1) |
354
- | `group(classifier)` | Agrupa por clasificador | O(n) | O(n) |
355
- | `groupBy(keyExtractor, valueExtractor)` | Agrupa por extracción de clave-valor | O(n) | O(n) |
356
- | `join()` | Únete como cadena | O(n) | O(n) |
357
- | `join(delimiter)` | Únete usando un delimitador | O(n) | O(n) |
358
- | `nonMatch(predicate)` | Si ningún elemento coincide | O(n) | O(1) |
359
- | `partition(count)` | Particionar por recuento | O(n) | O(n) |
360
- | `partitionBy(classifier)` | Particionar por clasificador | O(n) | O(n) |
361
- | `reduce(accumulator)` | Operación de reducción | O(n) | O(1) |
362
- | `reduce(identity, accumulator)` | Reducción con valor inicial | O(n) | O(1) |
363
- | `toArray()` | Convierte a arreglo | O(n) | O(n) |
364
- | `toMap(keyExtractor, valueExtractor)` | Convierte a Map | O(n) | O(n) |
365
- | `toSet()` | Convierte a Set | O(n) | O(n) |
366
- | `write(stream)` | Escribe en el flujo | O(n) | O(1) |
173
+ ---
367
174
 
368
- ```typescript
369
- // Ejemplos de operaciones Collectable
370
- const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
371
- .filter((n: number): boolean => n % 2 === 0)
372
- .toOrdered();
373
-
374
- // Comprobaciones de coincidencia
375
- console.log(data.anyMatch((n: number): boolean => n > 5)); // true
376
- console.log(data.allMatch((n: number): boolean => n < 20)); // true
377
-
378
- // Operaciones de búsqueda
379
- data.findFirst().ifPresent((n: number): void => console.log(n)); // 2
380
- data.findAny().ifPresent((n: number): void => console.log(n)); // Cualquier elemento
381
-
382
- // Operaciones de agrupación
383
- const grouped = data.groupBy(
384
- (n: number): string => (n > 5 ? "grande" : "pequeño"),
385
- (n: number): number => n * 2
386
- ); // {pequeño: [4, 8], grande: [12, 16, 20]}
387
-
388
- // Operaciones de reducción
389
- const sum = data.reduce(0, (acc, n) => acc + n); // 30
390
-
391
- // Operaciones de salida
392
- data.join(", "); // "[2, 4, 6, 8, 10]"
393
- ```
175
+ **Comparación con otros procesadores de flujo para Front-End**
394
176
 
395
- ## Métodos de Análisis Estadístico
396
-
397
- ### Métodos de NumericStatistics
398
-
399
- | Método | Descripción | Complejidad Temporal | Complejidad Espacial |
400
- |------|------|------------|------------|
401
- | `range()` | Rango | O(n) | O(1) |
402
- | `variance()` | Varianza | O(n) | O(1) |
403
- | `standardDeviation()` | Desviación estándar | O(n) | O(1) |
404
- | `mean()` | Media | O(n) | O(1) |
405
- | `median()` | Mediana | O(n log n) | O(n) |
406
- | `mode()` | Moda | O(n) | O(n) |
407
- | `frequency()` | Distribución de frecuencia | O(n) | O(n) |
408
- | `summate()` | Suma | O(n) | O(1) |
409
- | `quantile(quantile)` | Cuantil | O(n log n) | O(n) |
410
- | `interquartileRange()` | Rango intercuartílico | O(n log n) | O(n) |
411
- | `skewness()` | Sesgo | O(n) | O(1) |
412
- | `kurtosis()` | Curtosis | O(n) | O(1) |
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. |
413
189
 
414
- ```typescript
415
- // Ejemplos de análisis estadístico
416
- const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
417
- .toNumericStatistics();
418
-
419
- console.log("Media:", numbers.mean()); // 5.5
420
- console.log("Mediana:", numbers.median()); // 5.5
421
- console.log("Desviación estándar:", numbers.standardDeviation()); // ~2.87
422
- console.log("Suma:", numbers.summate()); // 55
423
-
424
- // Análisis estadístico utilizando mappers
425
- const objects = from([
426
- { value: 10 },
427
- { value: 20 },
428
- { value: 30 }
429
- ]).toNumericStatistics();
430
- console.log("Media mapeada:", objects.mean(obj => obj.value)); // 20
431
- ```
190
+ **Ventajas clave de Semantic-TypeScript**
432
191
 
433
- ## Guía de Selección de Rendimiento
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.
434
195
 
435
- ### Elija un Colector No Ordenado (Rendimiento Primero)
436
- ```typescript
437
- // Cuando no se necesita garantizar el orden, use un colector no ordenado para obtener el mejor rendimiento
438
- let highPerformance = data
439
- .filter(predicate)
440
- .map(mapper)
441
- .toUnordered(); // Mejor rendimiento
442
- ```
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.
443
197
 
444
- ### Elija un Colector Ordenado (Se Requiere Orden)
445
- ```typescript
446
- // Cuando se necesita mantener el orden de los elementos, use un colector ordenado
447
- let ordered = data.sorted(comparator);
448
- ```
198
+ ---
449
199
 
450
- ### Elija un Colector de Ventana (Operaciones de Ventana)
451
- ```typescript
452
- // Cuando se necesitan operaciones de ventana
453
- let windowed: WindowCollectable<number> = data
454
- .toWindow()
455
- .slide(5n, 2n); // Ventana deslizante
456
- ```
200
+ ### ¿Listo para explorar?
457
201
 
458
- ### Elija un Análisis Estadístico (Cálculos Numéricos)
459
- ```typescript
460
- // Cuando se necesita un análisis estadístico
461
- let statistics: NumericStatistics<number> = data
462
- .toNumericStatistics(); // Estadísticas numéricas
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.
463
203
 
464
- let bigIntStatistics: BigintStatistics<bigint> = data
465
- .toBigintStatistics(); // Estadísticas de enteros grandes
466
- ```
204
+ **Próximos pasos:**
467
205
 
468
- [GitHub](https://github.com/eloyhere/semantic-typescript)
469
- [NPMJS](https://www.npmjs.com/package/semantic-typescript)
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.
470
208
 
471
- ## Notas Importantes
209
+ **Semantic-TypeScript** donde los flujos se encuentran con la estructura.
472
210
 
473
- 1. **Impacto de las Operaciones de Ordenación**: En colectores ordenados, la operación `sorted()` invalida los efectos de `redirect`, `translate`, `shuffle`, `reverse`.
474
- 2. **Consideraciones de Rendimiento**: Si no se necesita garantizar el orden, priorice el uso de `toUnordered()` para un mejor rendimiento.
475
- 3. **Uso de Memoria**: Las operaciones de ordenación requieren espacio adicional de O(n).
476
- 4. **Datos en Tiempo Real**: Los flujos Semantic son adecuados para procesar datos en tiempo real y admiten fuentes de datos asíncronas.
211
+ Comience a construir hoy y experimente la diferencia que proporciona una indexación bien pensada.
477
212
 
478
- Esta biblioteca proporciona a los desarrolladores de TypeScript capacidades de streaming poderosas y flexibles, combinando los beneficios de la programación funcional con garantías de seguridad de tipos.
213
+ **Construya con claridad, proceda con confianza y transforme los datos con intención.**