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/dist/asynchronous/collector.d.ts +235 -0
- package/dist/asynchronous/collector.js +811 -0
- package/dist/asynchronous/semantic.d.ts +257 -0
- package/dist/asynchronous/semantic.js +1863 -0
- package/dist/factory.d.ts +79 -37
- package/dist/factory.js +534 -277
- package/dist/guard.d.ts +24 -14
- package/dist/guard.js +73 -19
- package/dist/hook.d.ts +11 -6
- package/dist/hook.js +22 -5
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/main.js +6 -4
- package/dist/optional.d.ts +2 -2
- package/dist/symbol.d.ts +19 -10
- package/dist/symbol.js +19 -10
- package/dist/synchronous/collector.d.ts +236 -0
- package/dist/{collector.js → synchronous/collector.js} +217 -193
- package/dist/{semantic.d.ts → synchronous/semantic.d.ts} +125 -130
- package/dist/{semantic.js → synchronous/semantic.js} +465 -574
- package/dist/utility.d.ts +7 -1
- package/dist/utility.js +1 -0
- package/package.json +3 -2
- package/readme.cn.md +213 -753
- package/readme.de.md +171 -441
- package/readme.es.md +171 -436
- package/readme.fr.md +170 -443
- package/readme.jp.md +177 -439
- package/readme.kr.md +177 -433
- package/readme.md +213 -1066
- package/readme.ru.md +174 -420
- package/readme.tw.md +175 -441
- package/dist/collector.d.ts +0 -236
- package/dist/map.d.ts +0 -76
- package/dist/map.js +0 -245
- package/dist/node.d.ts +0 -182
- package/dist/node.js +0 -918
- package/dist/set.d.ts +0 -19
- package/dist/set.js +0 -65
- package/dist/tree.d.ts +0 -82
- package/dist/tree.js +0 -257
package/readme.es.md
CHANGED
|
@@ -1,478 +1,213 @@
|
|
|
1
|
-
#
|
|
1
|
+
# **Semantic-TypeScript**
|
|
2
|
+
**Flujos, Indexados.** Sus datos, bajo control preciso.
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
---
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
### Descripción general
|
|
6
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
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
11
|
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
30
|
+
```bash
|
|
31
|
+
npm install semantic-typescript
|
|
32
|
+
```
|
|
33
|
+
o
|
|
34
|
+
```bash
|
|
35
|
+
yarn add semantic-typescript
|
|
121
36
|
```
|
|
122
37
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
### Métodos de Fábrica de Optional
|
|
38
|
+
---
|
|
126
39
|
|
|
127
|
-
|
|
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
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
let
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
|
|
131
|
+
---
|
|
146
132
|
|
|
147
|
-
|
|
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
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
145
|
+
---
|
|
184
146
|
|
|
185
|
-
|
|
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
|
-
|
|
198
|
-
|
|
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
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
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
|
-
|
|
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
|
-
|
|
161
|
+
### Características de rendimiento
|
|
281
162
|
|
|
282
|
-
|
|
|
283
|
-
|
|
284
|
-
| `
|
|
285
|
-
| `
|
|
286
|
-
| `
|
|
287
|
-
| `
|
|
288
|
-
| `
|
|
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) | Sí | Operaciones estadísticas para bigint. |
|
|
169
|
+
| `toWindow()` | O(2n) | O(n) | Sí | Operaciones de ventana basadas en tiempo. |
|
|
292
170
|
|
|
293
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
|
400
|
-
|
|
401
|
-
| `
|
|
402
|
-
|
|
|
403
|
-
|
|
|
404
|
-
| `
|
|
405
|
-
|
|
|
406
|
-
|
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
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
|
-
|
|
465
|
-
.toBigintStatistics(); // Estadísticas de enteros grandes
|
|
466
|
-
```
|
|
204
|
+
**Próximos pasos:**
|
|
467
205
|
|
|
468
|
-
|
|
469
|
-
|
|
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
|
-
|
|
209
|
+
**Semantic-TypeScript** — donde los flujos se encuentran con la estructura.
|
|
472
210
|
|
|
473
|
-
|
|
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
|
-
|
|
213
|
+
**Construya con claridad, proceda con confianza y transforme los datos con intención.**
|