semantic-typescript 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/asynchronous/collector.d.ts +62 -58
- package/dist/asynchronous/collector.js +16 -5
- package/dist/asynchronous/semantic.d.ts +2 -2
- package/dist/asynchronous/semantic.js +16 -6
- package/dist/factory.d.ts +8 -0
- package/dist/factory.js +112 -36
- package/dist/hook.d.ts +6 -1
- package/dist/hook.js +20 -3
- package/dist/main.d.ts +1 -0
- package/dist/main.js +6 -0
- package/dist/synchronous/collector.d.ts +8 -4
- package/dist/synchronous/collector.js +74 -59
- package/dist/synchronous/semantic.d.ts +27 -23
- package/dist/synchronous/semantic.js +215 -286
- package/package.json +3 -2
- package/readme.cn.md +213 -214
- package/readme.de.md +172 -173
- package/readme.es.md +177 -172
- package/readme.fr.md +181 -172
- package/readme.jp.md +187 -169
- package/readme.kr.md +182 -169
- package/readme.md +213 -214
- package/readme.ru.md +188 -169
- package/readme.tw.md +178 -169
package/readme.fr.md
CHANGED
|
@@ -1,204 +1,213 @@
|
|
|
1
|
-
# Semantic-TypeScript
|
|
1
|
+
# **Semantic-TypeScript**
|
|
2
|
+
**Flux, Indexés.** Vos données, sous contrôle précis.
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
Semantic-TypeScript représente une avancée significative dans la technologie de traitement de flux, synthétisant les concepts les plus efficaces des JavaScript GeneratorFunctions, des Java Streams et des paradigmes d'indexation de bases de données. Son principe de conception fondamental est centré sur la construction de pipelines de traitement de données exceptionnellement efficaces grâce à une évaluation paresseuse sophistiquée et une indexation intelligente. La bibliothèque offre une expérience d'opération de streaming rigoureusement type-safe et fonctionnellement pure, spécialement conçue pour le développement TypeScript et JavaScript contemporain.
|
|
4
|
+
---
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
- Les flux de données en temps réel (événements DOM, WebSockets, intervalles) avec un contrôle déterministe
|
|
8
|
-
- Les jeux de données à grande échelle grâce à des pipelines paresseux et économes en mémoire
|
|
9
|
-
- Les transformations de données complexes avec une API fluide et déclarative
|
|
6
|
+
### Aperçu
|
|
10
7
|
|
|
11
|
-
|
|
8
|
+
Semantic-TypeScript marque un bond en avant significatif dans la technologie de traitement des flux, **synthétisant** les concepts les plus efficaces de `GeneratorFunction` JavaScript, Java Streams et de l'indexation de style MySQL. Sa philosophie centrale est à la fois simple et puissante : construire des pipelines de traitement de données exceptionnellement efficaces grâce à une indexation intelligente, et non par itération de force brute.
|
|
12
9
|
|
|
13
|
-
|
|
14
|
-
Une idée architecturale clé de Semantic-TypeScript est la séparation claire entre la définition d'un flux et son exécution :
|
|
15
|
-
- **`Semantic<E>`** : Un modèle immuable et paresseux d'un pipeline de transformation de données. Il définit quelles opérations (filter, map, etc.) seront effectuées.
|
|
16
|
-
- **`Collectable<E>`** : Une vue exécutable et matérialisée du flux. Elle est obtenue à partir d'un Semantic et fournit toutes les opérations terminales (collect, forEach, etc.) pour exécuter le pipeline et produire un résultat.
|
|
10
|
+
Là où les bibliothèques conventionnelles imposent des boucles synchrones ou des chaînes de promesses maladroites, Semantic-TypeScript offre une expérience **entièrement asynchrone**, fonctionnellement pure et rigoureusement sûre au niveau des types, conçue pour répondre aux exigences du développement front-end moderne.
|
|
17
11
|
|
|
18
|
-
|
|
12
|
+
Dans son modèle élégant, les données n'atteignent le consommateur que lorsque le pipeline en amont invoque explicitement les callbacks `accept` (et optionnellement `interrupt`). Vous avez un contrôle total sur le timing - exactement quand c'est nécessaire.
|
|
19
13
|
|
|
20
|
-
|
|
21
|
-
Choisir la bonne bibliothèque pour le traitement de flux de données implique d'équilibrer performance, sûreté des types (type safety) et expressivité. Semantic-TypeScript est conçu pour exceller dans toutes ces dimensions.
|
|
14
|
+
---
|
|
22
15
|
|
|
23
|
-
###
|
|
24
|
-
Il fournit une API déclarative cohérente pour traiter n'importe quelle séquence de données – qu'il s'agisse de tableaux statiques, d'événements en temps réel ou de morceaux de données asynchrones – tout en exploitant toute la puissance de TypeScript pour garantir une sûreté des types de bout en bout. Cela élimine toute une classe d'erreurs d'exécution et transforme la manipulation de flux en une activité prévisible et vérifiée par le compilateur.
|
|
16
|
+
### Pourquoi les développeurs le préfèrent
|
|
25
17
|
|
|
26
|
-
|
|
27
|
-
|
|
18
|
+
- **Indexation Zéro-Boilerplate** — chaque élément porte son index naturel ou sur mesure.
|
|
19
|
+
- **Style Purement Fonctionnel** — avec une inférence TypeScript complète.
|
|
20
|
+
- **Flux d'Événements Étanches** — `useWindow`, `useDocument`, `useHTMLElement` et `useWebSocket` sont conçus avec la sécurité à l'esprit. Vous définissez la limite (en utilisant `limit(n)`, `sub(start, end)` ou `takeWhile(predicate)`) et la bibliothèque gère le nettoyage. Aucun écouteur résiduel, aucune fuite de mémoire.
|
|
21
|
+
- **Statistiques Intégrées** — analyses numériques et bigint complètes incluant moyennes, médianes, modes, variance, asymétrie et kurtosis.
|
|
22
|
+
- **Performances Prédictibles** — choisissez entre des collecteurs ordonnés ou non ordonnés selon vos besoins.
|
|
23
|
+
- **Efficacité Mémoire** — les flux sont évalués paresseusement, atténuant les préoccupations de mémoire.
|
|
24
|
+
- **Pas de Comportement Indéfini** — TypeScript garantit la sûreté des types et la nullabilité. Les données d'entrée restent inchangées sauf si elles sont explicitement modifiées dans vos fonctions de callback.
|
|
28
25
|
|
|
29
|
-
|
|
30
|
-
Inspiré de Java, le motif Collector est le moteur de la flexibilité. Il découple la spécification de la manière d'accumuler les éléments du flux de l'exécution du flux lui-même. La bibliothèque fournit un riche ensemble de collecteurs intégrés (`toArray`, `groupBy`, `summate`, etc.) pour les tâches courantes, tout en facilitant l'implémentation de votre propre logique de réduction complexe et réutilisable. C'est bien plus puissant et composable qu'un ensemble fixe de méthodes terminales.
|
|
26
|
+
---
|
|
31
27
|
|
|
32
|
-
###
|
|
33
|
-
Semantic-TypeScript est conçu pour le développement contemporain. Il offre des méthodes d'usine natives pour les sources web modernes :
|
|
34
|
-
- `useFrom(iterable)`, `useRange()` pour les données statiques
|
|
35
|
-
- `useInterval()`, `useAnimationFrame()` pour les flux basés sur le temps
|
|
36
|
-
- `useBlob()` pour le traitement de données binaires par morceaux (chunked)
|
|
37
|
-
- `useWebSocket()`, `useDocument()`, `useWindow()` pour les flux d'événements en temps réel
|
|
28
|
+
### Installation
|
|
38
29
|
|
|
39
|
-
### 5. Au-delà de l'agrégation basique : Analyse statistique intégrée
|
|
40
|
-
Allez au-delà des simples sommes et moyennes. La bibliothèque fournit les interfaces dédiées `NumericStatistics` et `BigIntStatistics`, offrant un accès immédiat à des mesures statistiques avancées directement depuis vos flux – variance, écart-type, médiane, asymétrie (skewness) et aplatissement (kurtosis). Cela transforme l'analyse de données complexes en une simple ligne de code.
|
|
41
|
-
|
|
42
|
-
### 6. Conçu pour l'ergonomie du développeur
|
|
43
|
-
- **API fluide et chaînable** : Écrivez des pipelines de données complexes sous forme de chaînes séquentielles lisibles.
|
|
44
|
-
- **Suite utilitaire complète** : Gardes essentiels (`isFunction`, `isIterable`), utilitaires (`useCompare`, `useTraverse`) et interfaces fonctionnelles inclus.
|
|
45
|
-
- **Intégration `Optional<T>`** : Modélise en toute sécurité l'absence d'une valeur, éliminant les problèmes de pointeur nul.
|
|
46
|
-
- **Conseils de performance** : Guide clair sur quand utiliser la collection non ordonnée (`unordered`) pour la vitesse contre la collection ordonnée (`ordered`) pour la séquence.
|
|
47
|
-
|
|
48
|
-
## Installation
|
|
49
30
|
```bash
|
|
50
31
|
npm install semantic-typescript
|
|
51
32
|
```
|
|
33
|
+
ou
|
|
34
|
+
```bash
|
|
35
|
+
yarn add semantic-typescript
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
52
39
|
|
|
53
|
-
|
|
40
|
+
### Démarrage Rapide
|
|
54
41
|
|
|
55
|
-
### 1. Création de flux (Semantic)
|
|
56
|
-
Les flux peuvent être créés à partir de diverses sources en utilisant des fonctions d'usine.
|
|
57
42
|
```typescript
|
|
58
|
-
import { useFrom,
|
|
43
|
+
import { useOf, useFrom, useRange, useWindow, useHTMLElement, useWebSocket, useText, useStringify } from "semantic-typescript";
|
|
44
|
+
|
|
45
|
+
// Statistiques numériques
|
|
46
|
+
let summate: number = useOf(10, 20, 30, 40)
|
|
47
|
+
.map((n: number): number => n * 2)
|
|
48
|
+
.toNumericStatistics() // Requis avant l'opération terminale
|
|
49
|
+
.summate(); // 200
|
|
50
|
+
|
|
51
|
+
// Statistiques BigInt
|
|
52
|
+
let summate: bigint = useOf(10n, 20n, 30n, 40n)
|
|
53
|
+
.map((n: bigint): bigint => n * 2)
|
|
54
|
+
.toBigIntStatistics() // Requis avant l'opération terminale
|
|
55
|
+
.summate(); // 200n
|
|
56
|
+
|
|
57
|
+
// Inverser un flux par index
|
|
58
|
+
useFrom([1, 2, 3, 4, 5])
|
|
59
|
+
.redirect((element: E, index: bigint): bigint => -index) // Index négatif pour inversion
|
|
60
|
+
.toOrdered() // Appeler toOrdered() pour préserver l'ordre des index
|
|
61
|
+
.toArray(); // [5, 4, 3, 2, 1]
|
|
62
|
+
|
|
63
|
+
// Mélanger un flux
|
|
64
|
+
useFrom([1, 2, 3, 4, 5])
|
|
65
|
+
.shuffle()
|
|
66
|
+
.toOrdered()
|
|
67
|
+
.toArray(); // ex. [2, 5, 1, 4, 3]
|
|
68
|
+
|
|
69
|
+
// Translater des éléments dans un flux
|
|
70
|
+
useFrom([1, 2, 3, 4, 5])
|
|
71
|
+
.translate(2) // Décaler les éléments de 2 positions vers la droite
|
|
72
|
+
.toOrdered()
|
|
73
|
+
.toArray(); // [4, 5, 1, 2, 3]
|
|
74
|
+
|
|
75
|
+
useFrom([1, 2, 3, 4, 5])
|
|
76
|
+
.translate(-2) // Décaler les éléments de 2 positions vers la gauche
|
|
77
|
+
.toOrdered()
|
|
78
|
+
.toArray(); // [3, 4, 5, 1, 2]
|
|
79
|
+
|
|
80
|
+
// Plage infinie avec terminaison anticipée
|
|
81
|
+
useRange(0n, 1_000_000n)
|
|
82
|
+
.filter(n => n % 17n === 0n)
|
|
83
|
+
.limit(10n) // S'arrêter après 10 éléments
|
|
84
|
+
.toUnordered()
|
|
85
|
+
.toArray();
|
|
59
86
|
|
|
60
|
-
//
|
|
61
|
-
|
|
87
|
+
// Redimensionnement de fenêtre en temps réel (s'arrête automatiquement après 5 événements)
|
|
88
|
+
useWindow("resize")
|
|
89
|
+
.limit(5n) // Crucial pour les flux d'événements
|
|
90
|
+
.toUnordered()
|
|
91
|
+
.forEach((ev, idx) => console.log(`Redimensionnement #${idx}`));
|
|
62
92
|
|
|
63
|
-
//
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
93
|
+
// Écouter un élément HTML
|
|
94
|
+
// <input id="input" type="text"/>
|
|
95
|
+
useHTMLElement("#input", "change")
|
|
96
|
+
.limit(1)
|
|
97
|
+
.toUnordered()
|
|
98
|
+
.forEach((event: Event) => submit(event));
|
|
68
99
|
|
|
69
|
-
//
|
|
70
|
-
|
|
100
|
+
// Écouter plusieurs éléments et événements
|
|
101
|
+
useHTMLElement("input", ["change", "keyup"])
|
|
102
|
+
.takeWhile((event: Event): boolean => validate(event))
|
|
103
|
+
.toUnordered()
|
|
104
|
+
.forEach((event: Event) => submit(event));
|
|
71
105
|
|
|
72
|
-
//
|
|
73
|
-
|
|
74
|
-
|
|
106
|
+
// Écouter un WebSocket
|
|
107
|
+
let webSocket = new WebSocket("ws://localhost:8080");
|
|
108
|
+
webSocket.addEventListener("close", (): void => {
|
|
109
|
+
webSocket.close(); // Gérer le cycle de vie du WebSocket manuellement
|
|
110
|
+
});
|
|
111
|
+
useWebSocket(webSocket, "message")
|
|
112
|
+
.limit(1)
|
|
113
|
+
.toUnordered()
|
|
114
|
+
.forEach((message: MessageEvent) => console.log(message.data));
|
|
75
115
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
116
|
+
// Itérer sur une chaîne par point de code
|
|
117
|
+
useText("My emotion now is: 😊, and semantic is 👍")
|
|
118
|
+
.toUnordered()
|
|
119
|
+
.log(); // Affiche la chaîne
|
|
120
|
+
|
|
121
|
+
// Sérialiser en toute sécurité un objet avec références circulaires
|
|
122
|
+
let o = {
|
|
123
|
+
a: 1,
|
|
124
|
+
b: "text",
|
|
125
|
+
c: [o.a, o.b, o.c] // Référence circulaire
|
|
126
|
+
};
|
|
127
|
+
// let text: string = JSON.stringify(o); // Lance une erreur
|
|
128
|
+
let text: string = useStringify(o); // Produit en toute sécurité `{a: 1, b: "text", c: []}`
|
|
85
129
|
```
|
|
86
130
|
|
|
87
|
-
|
|
88
|
-
Pour obtenir un résultat, vous devez obtenir un `Collectable` et invoquer une opération terminale.
|
|
89
|
-
```typescript
|
|
90
|
-
// Obtenir un collectable non ordonné pour la performance
|
|
91
|
-
const resultArray = await processedStream.toUnordered().toArray();
|
|
92
|
-
console.log(resultArray); // ex: [20, 21, 40, 41]
|
|
93
|
-
|
|
94
|
-
// Utiliser un collecteur intégré
|
|
95
|
-
const sum = await processedStream.toUnordered().collect(useSummate());
|
|
96
|
-
console.log(sum);
|
|
97
|
-
|
|
98
|
-
// Ou utiliser la méthode générique collect
|
|
99
|
-
const customResult = await processedStream.toOrdered().collect(
|
|
100
|
-
() => new Map<number, number>(),
|
|
101
|
-
(map, element, index) => map.set(index, element),
|
|
102
|
-
map => map
|
|
103
|
-
);
|
|
104
|
-
```
|
|
131
|
+
---
|
|
105
132
|
|
|
106
|
-
###
|
|
107
|
-
Les flux d'événements (`useDocument`, `useWindow`, `useHTMLElement`, `useWebSocket`) sont par nature infinis. Vous devez utiliser des opérations comme `sub`, `takeWhile`, ou `limit` pour définir quand arrêter de collecter les événements et terminer le flux. Sinon, l'opération terminale attendra indéfiniment.
|
|
108
|
-
```typescript
|
|
109
|
-
import { useDocument } from 'semantic-typescript';
|
|
133
|
+
### Concepts Fondamentaux
|
|
110
134
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
135
|
+
| Concept | Objectif | Quand l'utiliser |
|
|
136
|
+
| :--- | :--- | :--- |
|
|
137
|
+
| `AsynchronousSemantic` | Constructeur principal pour les flux asynchrones, événements et pipelines paresseux. | Événements temps réel, WebSockets, écouteurs DOM, flux de longue durée ou infinis. |
|
|
138
|
+
| `SynchronousSemantic` | Constructeur pour les flux synchrones, en mémoire ou basés sur des boucles. | Données statiques, plages, itération immédiate. |
|
|
139
|
+
| `toUnordered()` | Collecteur terminal le plus rapide (indexation basée sur Map). | Chemins critiques en performance (temps et espace O(n), pas de tri). |
|
|
140
|
+
| `toOrdered()` | Collecteur trié, stable en index. | Lorsqu'un ordre stable ou un accès indexé est requis. |
|
|
141
|
+
| `toNumericStatistics()` | Analyse statistique numérique riche (moyenne, médiane, variance, asymétrie, kurtosis, etc.). | Analyse de données et calculs statistiques. |
|
|
142
|
+
| `toBigIntStatistics()` | Analyse statistique bigint riche. | Analyse de données et calculs statistiques pour grands entiers. |
|
|
143
|
+
| `toWindow()` | Prise en charge des fenêtres glissantes et fixes. | Traitement de séries temporelles, traitement par lots et opérations avec fenêtres. |
|
|
116
144
|
|
|
117
|
-
|
|
118
|
-
const clicksIn10s = await useDocument('click')
|
|
119
|
-
.takeWhile((_, index, startTime = Date.now()) => Date.now() - startTime < 10000)
|
|
120
|
-
.toUnordered()
|
|
121
|
-
.toArray();
|
|
145
|
+
---
|
|
122
146
|
|
|
123
|
-
|
|
124
|
-
const specificClicks = await useDocument('click')
|
|
125
|
-
.sub(2n, 6n) // <- Prend les éléments avec les index 2, 3, 4, 5
|
|
126
|
-
.toUnordered()
|
|
127
|
-
.toArray();
|
|
128
|
-
```
|
|
129
|
-
**Idée clé** : L'événement (par exemple, un `MouseEvent`) et son index d'émission séquentiel (sous forme de `bigint`) sont passés ensemble à travers le pipeline via le rappel `accept(event, index)`.
|
|
147
|
+
**Règles d'Utilisation Importantes**
|
|
130
148
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
const numericStream = useFrom([10, 20, 30, 40, 50]).toNumeric();
|
|
134
|
-
const average = await numericStream.average();
|
|
135
|
-
const median = await numericStream.median();
|
|
136
|
-
const standardDeviation = await numericStream.standardDeviation();
|
|
137
|
-
const skewness = await numericStream.skewness();
|
|
138
|
-
console.log(`Moyenne: ${average}, Médiane: ${median}, Écart-type: ${standardDeviation}`);
|
|
139
|
-
```
|
|
149
|
+
1. **Flux d'événements** (`useWindow`, `useDocument`, `useHTMLElement`, `useWebSocket`, …) renvoient un `AsynchronousSemantic`.
|
|
150
|
+
→ Vous **devez** appeler `.limit(n)`, `.sub(start, end)` ou `.takeWhile()` pour cesser l'écoute. Sinon, l'écouteur reste actif.
|
|
140
151
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
console.log(totalsByCategory); // Map { 'Food' => 150, 'Electronics' => 500 }
|
|
200
|
-
```
|
|
152
|
+
2. **Opérations terminales** (`.toArray()`, `.count()`, `.average()`, `.reduce()`, `.findFirst()`, etc.) sont **uniquement disponibles après** conversion en collecteur :
|
|
153
|
+
```typescript
|
|
154
|
+
.toUnordered() // Temps et espace O(n), pas de tri
|
|
155
|
+
// ou
|
|
156
|
+
.toOrdered() // Trié, maintient l'ordre
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
### Caractéristiques de Performance
|
|
162
|
+
|
|
163
|
+
| Collecteur | Complexité Temporelle | Complexité Spatiale | Trié ? | Le meilleur pour |
|
|
164
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
165
|
+
| `toUnordered()` | O(n) | O(n) | Non | Vitesse brute, ordre non requis. |
|
|
166
|
+
| `toOrdered()` | O(2n) | O(n) | Oui | Ordre stable, accès indexé, analyses. |
|
|
167
|
+
| `toNumericStatistics()` | O(2n) | O(n) | Oui | Opérations statistiques nécessitant des données triées. |
|
|
168
|
+
| `toBigIntStatistics()` | O(2n) | O(n) | Oui | Opérations statistiques pour bigint. |
|
|
169
|
+
| `toWindow()` | O(2n) | O(n) | Oui | Opérations de fenêtrage basées sur le temps. |
|
|
170
|
+
|
|
171
|
+
Optez pour `toUnordered()` lorsque la vitesse est primordiale. Utilisez `toOrdered()` uniquement lorsque vous avez besoin d'un ordre stable ou de méthodes statistiques dépendant de données triées.
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
**Comparaison avec d'autres Processeurs de Flux Front-End**
|
|
176
|
+
|
|
177
|
+
| Fonctionnalité | Semantic-TypeScript | RxJS | Itérateurs/Générateurs Async Natifs | Most.js |
|
|
178
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
179
|
+
| **Intégration TypeScript** | De première classe, fortement typé avec conscience native de l'index. | Excellente, mais implique des génériques complexes. | Bonne, nécessite un typage manuel. | Style fonctionnel fort. |
|
|
180
|
+
| **Analyse Statistique Intégrée** | Prise en charge native complète pour `number` et `bigint`. | Non disponible nativement (nécessite des opérateurs personnalisés). | Aucune. | Aucune. |
|
|
181
|
+
| **Indexation et Conscience de Position** | Indexation bigint native et puissante sur chaque élément. | Nécessite des opérateurs personnalisés (`scan`, `withLatestFrom`). | Compteur manuel requis. | Basique, pas d'index intégré. |
|
|
182
|
+
| **Gestion des Flux d'Événements** | Usines dédiées et sûres au niveau des types avec contrôle explicite d'arrêt anticipé. | Puissante mais nécessite une gestion manuelle des abonnements. | Écouteur d'événements manuel + annulation. | Bonne `fromEvent`, léger. |
|
|
183
|
+
| **Performance et Efficacité Mémoire** | Exceptionnelle – collecteurs optimisés `toUnordered()` et `toOrdered()`. | Très bonne, mais les chaînes d'opérateurs ajoutent de la surcharge. | Excellente (surcharge nulle). | Excellente. |
|
|
184
|
+
| **Taille du Bundle** | Très léger. | Grand (même avec tree-shaking). | Zéro (natif). | Petit. |
|
|
185
|
+
| **Philosophie de Conception d'API** | Modèle de collecteur fonctionnel avec indexation explicite. | Modèle Observable Réactif. | Modèle Itérateur / Générateur. | Fonctionnel, point-free. |
|
|
186
|
+
| **Terminaison Anticipée et Contrôle** | Explicite (`interrupt`, `.limit()`, `.takeWhile()`, `.sub()`). | Bon (`take`, `takeUntil`, `first`). | Manuel (`break` dans `for await…of`). | Bon (`take`, `until`). |
|
|
187
|
+
| **Support Synchrone et Asynchrone** | API unifiée – support de première classe pour les deux. | Principalement asynchrone. | Les deux, mais manuel. | Principalement asynchrone. |
|
|
188
|
+
| **Courbe d'Apprentissage** | Douce pour les développeurs familiarisés avec les pipelines fonctionnels et indexés. | Plus raide (nombreux opérateurs, observables chauds/froids). | Faible. | Modérée. |
|
|
189
|
+
|
|
190
|
+
**Avantages Clés de Semantic-TypeScript**
|
|
191
|
+
|
|
192
|
+
* Capacités statistiques et d'indexation intégrées uniques, éliminant le besoin d'un `reduce` manuel ou de bibliothèques externes.
|
|
193
|
+
* Contrôle explicite des flux d'événements prévient les fuites de mémoire courantes avec RxJS.
|
|
194
|
+
* Une conception synchrone/asynchrone unifiée fournit une API unique et cohérente pour divers cas d'usage.
|
|
195
|
+
|
|
196
|
+
Cette comparaison illustre pourquoi Semantic-TypeScript est particulièrement bien adapté aux applications front-end TypeScript modernes qui exigent performance, sûreté des types et analyses riches sans le cérémonial des bibliothèques réactives traditionnelles.
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
### Prêt à Explorer ?
|
|
201
|
+
|
|
202
|
+
Semantic-TypeScript transforme les flux de données complexes en pipelines lisibles, composables et haute performance. Que vous manipuliez des événements UI en temps réel, traitiez de grands ensembles de données ou construisiez des tableaux de bord analytiques, il fournit la puissance de l'indexation de niveau base de données avec l'élégance de la programmation fonctionnelle.
|
|
203
|
+
|
|
204
|
+
**Prochaines Étapes :**
|
|
205
|
+
|
|
206
|
+
* Parcourez l'API entièrement typée dans votre IDE (toutes les exportations proviennent du package principal).
|
|
207
|
+
* Rejoignez la communauté grandissante de développeurs qui ont remplacé des itérateurs async alambiqués par des pipelines Semantic propres.
|
|
208
|
+
|
|
209
|
+
**Semantic-TypeScript** — où les flux rencontrent la structure.
|
|
201
210
|
|
|
202
|
-
|
|
211
|
+
Commencez à construire dès aujourd'hui et expérimentez la différence qu'apporte une indexation bien pensée.
|
|
203
212
|
|
|
204
|
-
|
|
213
|
+
**Construisez avec clarté, agissez avec confiance, et transformez les données avec intention.**
|