semantic-typescript 0.7.0 → 0.8.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.fr.md CHANGED
@@ -1,32 +1,34 @@
1
- # **Semantic-TypeScript**
2
- **Flux, Indexés.** Vos données, sous contrôle précis.
1
+ # **SemanticTypeScript**
2
+ **Flux, indexés.** Vos données, sous contrôle précis.
3
3
 
4
4
  ---
5
5
 
6
- ### Aperçu
6
+ ### Vue d'ensemble
7
7
 
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.
8
+ SemanticTypeScript représente une avancée significative dans le traitement des flux, **synthétisant** avec élégance les paradigmes les plus efficaces des générateurs JavaScript, des Streams Java et de l'indexation de style MySQL. Son postulat fondamental est à la fois puissant et délibéré : construire des pipelines de traitement de données exceptionnellement efficaces grâce à une indexation intelligente, plutôt que par une itération conventionnelle en force brute.
9
9
 
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.
10
+ Là où les bibliothèques typiques imposent des boucles synchrones ou des chaînes de promesses (*Promises*) maladroites, SemanticTypeScript fournit une expérience **entièrement asynchrone**, fonctionnellement pure et rigoureusement sûre au niveau des types, conçue expressément pour les exigences du développement d'applications modernes.
11
11
 
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.
12
+ Ce modèle incarne une forme raffinée de flux de contrôle : les données ne sont transmises au consommateur en aval que lorsque le pipeline en amont invoque explicitement le rappel (*callback*) `accept`. Vous conservez un contrôle complet et granulaire sur le moment du traitement – celui‑ci se produit précisément quand, et seulement quand, c'est nécessaire.
13
13
 
14
14
  ---
15
15
 
16
- ### Pourquoi les développeurs le préfèrent
16
+ ### Pourquoi les développeurs choisissent Semantic‑TypeScript
17
17
 
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.
18
+ - **Indexation sans répétition** Chaque élément possède intrinsèquement son index naturel ou sur mesure, éliminant le suivi manuel.
19
+ - **Purement fonctionnel et sûr pour les types** Bénéficiez d'une inférence de types TypeScript complète et idiomatique avec des opérations immuables.
20
+ - **Flux d'événements étanches aux fuites** Le modèle `useSubscription` est conçu avec la sécurité des ressources comme premier principe. Vous définissez la limite logique – en utilisant `limit(n)`, `sub(start, end)` ou `takeWhile(predicate)` et la bibliothèque gère entièrement le cycle de vie de l'abonnement. Cela garantit l'absence d'écouteurs (*listeners*) résiduels et de fuites de mémoire.
21
+ - **Suite statistique intégrée** Accédez à des analyses exhaustives pour les flux de type `number` et `bigint`, incluant moyennes, médianes, modes, variance, asymétrie (*skewness*) et aplatissement (*kurtosis*), sans dépendances externes.
22
+ - **Performances prévisibles et ajustables** Choisissez entre des collecteurs ordonnés ou non ordonnés pour correspondre exactement à vos besoins en matière de performances et d'ordre.
23
+ - **Inhéremment économe en mémoire** Les flux sont évalués de manière paresseuse (*lazy*), traitant les éléments à la demande pour soulager la pression sur la mémoire.
24
+ - **Aucun comportement indéfini** TypeScript garantit une sécurité des types et une nullabilité complètes. Vos données sources restent immuables, sauf si elles sont modifiées explicitement dans vos fonctions de rappel.
25
25
 
26
26
  ---
27
27
 
28
28
  ### Installation
29
29
 
30
+ Intégrez Semantic‑TypeScript à votre projet en utilisant votre gestionnaire de paquets préféré :
31
+
30
32
  ```bash
31
33
  npm install semantic-typescript
32
34
  ```
@@ -37,177 +39,229 @@ yarn add semantic-typescript
37
39
 
38
40
  ---
39
41
 
40
- ### Démarrage Rapide
42
+ ### Introduction pratique
43
+
44
+ Les exemples suivants démontrent des concepts clés, des transformations fondamentales à la gestion d'événements réels.
41
45
 
42
46
  ```typescript
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()
47
+ import { useOf, useFrom, useRange, useSubscription, useText, useStringify } from "semantic-typescript";
48
+
49
+ // ====================================================================
50
+ // EXEMPLE 1 : Opérations fondamentales et statistiques numériques
51
+ // ====================================================================
52
+ // Démontre les opérations de mappage (*map*) et les opérations statistiques terminales. Après transformation, le pipeline doit être converti en un collecteur de statistiques avant de pouvoir appeler des méthodes terminales comme `.summate()`.
53
+
54
+ const numericSum: number = useOf(10, 20, 30, 40)
55
+ .map((n: number): number => n * 2) // Double chaque élément : [20, 40, 60, 80]
56
+ .toNumericStatistics() // Convertit en un collecteur de statistiques
57
+ .summate(); // Opération terminale : 200
58
+
59
+ // Autres méthodes statistiques (disponibles après `.toNumericStatistics()`) :
60
+ // .average(), .median(), .mode(), .variance(), .skewness(), .kurtosis()
61
+
62
+ // ====================================================================
63
+ // EXEMPLE 2 : Statistiques BigInt
64
+ // ====================================================================
65
+ // Fonctionne de manière identique aux statistiques numériques mais est optimisé pour les données BigInt.
66
+
67
+ const bigintSum: bigint = useOf(10n, 20n, 30n, 40n)
68
+ .map((n: bigint): bigint => n * 2n) // Arithmétique BigInt
69
+ .toBigIntStatistics() // Convertit en un collecteur de statistiques BigInt
70
+ .summate(); // Opération terminale : 200n
71
+
72
+ // ====================================================================
73
+ // EXEMPLE 3 : Manipulation d'index pour inverser un flux
74
+ // ====================================================================
75
+ // Illustre le réordonnancement des éléments en réattribuant stratégiquement leurs index à l'aide de la méthode `.redirect()`, permettant des modèles personnalisés comme l'inversion.
76
+
77
+ const reversedArray: number[] = useFrom([1, 2, 3, 4, 5])
78
+ .redirect((_element: number, index: bigint): bigint => -index) // Mappe sur des index négatifs
79
+ .toOrdered() // Essentiel : collecte les éléments triés selon leurs nouveaux index
80
+ .toArray(); // Résultat : [5, 4, 3, 2, 1]
81
+
82
+ // Pour une inversion simple, `.reverse()` est également disponible.
83
+
84
+ // ====================================================================
85
+ // EXEMPLE 4 : Mélange (*Shuffle*) d'un flux
86
+ // ====================================================================
87
+ // Permute aléatoirement les index des éléments à l'aide d'un algorithme de mélange sur place (*in‑place*).
88
+
89
+ const shuffledArray: number[] = useFrom([1, 2, 3, 4, 5])
90
+ .shuffle() // Réattribue aléatoirement les index
91
+ .toOrdered() // Trie selon les nouveaux index aléatoires
92
+ .toArray(); // Par exemple : [2, 5, 1, 4, 3] (varie à chaque exécution)
93
+
94
+ // ====================================================================
95
+ // EXEMPLE 5 : Rotation circulaire d'un flux
96
+ // ====================================================================
97
+ // Décale les éléments de manière cyclique. Les valeurs positives tournent vers la droite ; les valeurs négatives vers la gauche.
98
+
99
+ // Rotation à droite de 2 positions
100
+ const rightRotated: number[] = useFrom([1, 2, 3, 4, 5])
101
+ .translate(2) // Décale les index de 2 vers la droite
66
102
  .toOrdered()
67
- .toArray(); // ex. [2, 5, 1, 4, 3]
103
+ .toArray(); // Résultat : [4, 5, 1, 2, 3]
68
104
 
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]
105
+ // ====================================================================
106
+ // EXEMPLE 6 : Évaluation paresseuse (*Lazy*) avec des plages infinies
107
+ // ====================================================================
108
+ // Traite des flux théoriquement infinis de manière paresseuse, ne calculant les éléments que lorsqu'ils sont nécessaires.
74
109
 
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]
110
+ const firstTenMultiples: bigint[] = useRange(0n, 1_000_000n)
111
+ .filter(n => n % 17n === 0n) // Conserve les multiples de 17
112
+ .limit(10n) // Critique : s'arrête après le 10e élément correspondant
113
+ .toUnordered() // Aucun tri requis
114
+ .toArray(); // Résultat : [0, 17, 34, 51, 68, 85, 102, 119, 136, 153]
79
115
 
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()
116
+ // Sans `.limit(10n)`, le pipeline traiterait le million d'éléments.
117
+
118
+ // ====================================================================
119
+ // EXEMPLE 7 : Composition d'un pipeline complexe
120
+ // ====================================================================
121
+ // Démontre la composition séquentielle de plusieurs opérations.
122
+
123
+ const complexResult: number[] = useRange(1n, 100n)
124
+ .map(n => Number(n) * 2)
125
+ .filter(n => n > 50)
126
+ .shuffle()
127
+ .limit(5n)
128
+ .translate(2)
129
+ .toOrdered()
85
130
  .toArray();
86
131
 
87
- // 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}`));
132
+ // ====================================================================
133
+ // EXEMPLE 8 : Abonnement géré aux événements du DOM
134
+ // ====================================================================
135
+ // Écoute les événements du navigateur avec un nettoyage automatique et étanche aux fuites.
136
+ // L'appel `.limit(n)` définit la limite pour la suppression automatique de l'écouteur.
137
+
138
+ // Définit un abonné pour une cible Window
139
+ const windowSubscriber = {
140
+ mount: (target: Window): void => { /* Logique de configuration */ },
141
+ subscribe: (target: Window, event: keyof WindowEventMap, handler: EventListener): void => {
142
+ target.addEventListener(event, handler);
143
+ },
144
+ unsubscribe: (target: Window, event: keyof WindowEventMap, handler: EventListener): void => {
145
+ target.removeEventListener(event, handler);
146
+ },
147
+ unmount: (): void => { /* Logique de nettoyage */ }
148
+ };
92
149
 
93
- // Écouter un élément HTML
94
- // <input id="input" type="text"/>
95
- useHTMLElement("#input", "change")
96
- .limit(1)
150
+ useSubscription(window, windowSubscriber, "resize")
151
+ .limit(5n) // Se désabonne automatiquement après 5 événements
97
152
  .toUnordered()
98
- .forEach((event: Event) => submit(event));
153
+ .forEach((ev: Event, idx) =>
154
+ console.log(`Redimensionnement #${idx} : ${(ev.target as Window).innerWidth}x${(ev.target as Window).innerHeight}`)
155
+ );
99
156
 
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));
105
-
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));
157
+ // ====================================================================
158
+ // EXEMPLE 9 : Traitement de chaînes par points de code Unicode
159
+ // ====================================================================
160
+ // Parcourt correctement une chaîne, gérant les caractères Unicode multi‑octets.
115
161
 
116
- // Itérer sur une chaîne par point de code
117
162
  useText("My emotion now is: 😊, and semantic is 👍")
118
163
  .toUnordered()
119
- .log(); // Affiche la chaîne
164
+ .log(); // Affiche chaque caractère (y compris les émojis) sur une nouvelle ligne.
120
165
 
121
- // Sérialiser en toute sécurité un objet avec références circulaires
122
- let o = {
166
+ // ====================================================================
167
+ // EXEMPLE 10 : Transformation sécurisée en chaîne pour références circulaires
168
+ // ====================================================================
169
+ // Sérialise de manière sûre des objets contenant des références circulaires.
170
+
171
+ const obj = {
123
172
  a: 1,
124
- b: "text",
125
- c: [o.a, o.b, o.c] // Référence circulaire
173
+ b: "texte"
126
174
  };
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: []}`
175
+ (obj as any).c = [obj.a, obj.b, (obj as any).c]; // Introduit une référence circulaire
176
+
177
+ // const text: string = JSON.stringify(obj); // Lance une erreur
178
+ const text: string = useStringify(obj); // Produit de manière sûre `{a: 1, b: "texte", c: []}`
129
179
  ```
130
180
 
131
181
  ---
132
182
 
133
- ### Concepts Fondamentaux
183
+ ### Concepts principaux
134
184
 
135
- | Concept | Objectif | Quand l'utiliser |
185
+ | Concept | Objectif | Cas d'utilisation principal |
136
186
  | :--- | :--- | :--- |
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. |
187
+ | `AsynchronousSemantic` | Le constructeur principal pour les flux asynchrones, les événements et les pipelines paresseux basés sur une poussée (*push*). | Événements en temps réel, WebSockets, écouteurs DOM ou tout flux de longue durée/infini. |
188
+ | `SynchronousSemantic` | Le constructeur pour les flux synchrones, en mémoire ou basés sur une traction (*pull*) immédiate (*eager*). | Données statiques, plages finies ou tâches d'itération immédiate. |
189
+ | `toUnordered()` | Le collecteur terminal le plus rapide, utilise une Map pour stocker les index. | Chemins critiques pour les performances où l'ordre stable n'est pas requis (temps et espace O(n)). |
190
+ | `toOrdered()` | Un collecteur terminal trié, stable en termes d'index. | Lorsque l'ordre des éléments doit être préservé ou qu'un accès indexé est nécessaire. |
191
+ | `toNumericStatistics()` | Un collecteur permettant des analyses statistiques riches sur les flux de type `number`. | Analyse de données, métriques et calculs statistiques. |
192
+ | `toBigIntStatistics()` | Un collecteur permettant des analyses statistiques riches sur les flux de type `bigint`. | Analyse et statistiques pour des jeux de données d'entiers de grande taille. |
193
+ | `toWindow()` | Fournit des opérations de fenêtre glissante (*sliding*) et fixe (*tumbling*) sur un flux. | Analyse de séries temporelles, traitement par lots et agrégations par fenêtres. |
144
194
 
145
195
  ---
146
196
 
147
- **Règles d'Utilisation Importantes**
197
+ **Règles d'utilisation essentielles**
148
198
 
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.
199
+ 1. **Les flux d'événements** (créés via des fabriques comme `useSubscription`) retournent un `AsynchronousSemantic`.
200
+ → Vous **devez** appeler une méthode définissant une limite, comme `.limit(n)`, `.sub(start, end)` ou `.takeWhile(predicate)` pour mettre fin à l'écoute. Sinon, l'abonnement restera actif.
151
201
 
152
- 2. **Opérations terminales** (`.toArray()`, `.count()`, `.average()`, `.reduce()`, `.findFirst()`, etc.) sont **uniquement disponibles après** conversion en collecteur :
202
+ 2. **Les opérations terminales** (`.toArray()`, `.count()`, `.forEach()`, `.findFirst()`, etc.) ne sont **disponibles qu'après** avoir converti le pipeline en un collecteur :
153
203
  ```typescript
154
- .toUnordered() // Temps et espace O(n), pas de tri
204
+ .toUnordered() // Pour une vitesse maximale, sans garantie d'ordre.
155
205
  // ou
156
- .toOrdered() // Trié, maintient l'ordre
206
+ .toOrdered() // Pour une sortie stable et triée.
207
+ // ou
208
+ .toNumericStatistics() // Pour les méthodes statistiques.
157
209
  ```
158
210
 
159
211
  ---
160
212
 
161
- ### Caractéristiques de Performance
213
+ ### Caractéristiques de performance
162
214
 
163
- | Collecteur | Complexité Temporelle | Complexité Spatiale | Trié ? | Le meilleur pour |
215
+ | Collecteur | Complexité temporelle | Complexité spatiale | Ordre garanti ? | Scénario idéal |
164
216
  | :--- | :--- | :--- | :--- | :--- |
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. |
217
+ | `toUnordered()` | O(n) | O(n) | Non | Le débit brut est primordial ; l'ordre final est sans importance. |
218
+ | `toOrdered()` | O(n log n) | O(n) | Oui (trié) | Ordre stable, accès indexé ou pré‑tri pour les statistiques. |
219
+ | `toNumericStatistics()` | O(n log n) | O(n) | Oui (tri interne) | Exécution d'opérations statistiques nécessitant des données triées. |
220
+ | `toBigIntStatistics()` | O(n log n) | O(n) | Oui (tri interne) | Opérations statistiques sur des données BigInt. |
221
+ | `toWindow()` | O(n log n) | O(n) | Oui (tri interne) | Opérations de fenêtre bénéficiant d'index triés. |
170
222
 
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.
223
+ Choisissez `toUnordered()` lorsque la vitesse absolue est primordiale. Optez pour `toOrdered()` ou un collecteur de statistiques uniquement lorsque votre logique dépend de l'ordre des éléments.
172
224
 
173
225
  ---
174
226
 
175
- **Comparaison avec d'autres Processeurs de Flux Front-End**
227
+ **Analyse comparative avec les bibliothèques de flux modernes**
176
228
 
177
- | Fonctionnalité | Semantic-TypeScript | RxJS | Itérateurs/Générateurs Async Natifs | Most.js |
229
+ | Caractéristique | SemanticTypeScript | RxJS | Async Iterators / Generators natifs | Most.js |
178
230
  | :--- | :--- | :--- | :--- | :--- |
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. |
231
+ | **Intégration TypeScript** | De première classe, fortement typée avec une conscience d'index inhérente. | Excellente, mais implique souvent des chaînes génériques complexes. | Bonne, mais nécessite des annotations de type manuelles. | Solide, avec un style de typage fonctionnel‑*first*. |
232
+ | **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 ou d'autres bibliothèques). | Aucune. | Aucune. |
233
+ | **Indexation et conscience de position** | Indexation BigInt native et puissante sur chaque élément. | Nécessite des opérateurs personnalisés (ex. `scan`, `withLatestFrom`). | Gestion manuelle de compteur nécessaire. | Basique, aucune propriété d'index intégrée. |
234
+ | **Gestion des flux d'événements** | Fabriques dédiées, sûres pour les types, avec contrôle de cycle de vie explicite et déclaratif. | Puissante mais nécessite une gestion manuelle minutieuse des abonnements pour éviter les fuites. | Attachement manuel des écouteurs d'événements et gestion de jetons d'annulation. | Bon `fromEvent`, généralement léger. |
235
+ | **Performances et mémoire** | Exceptionneloffre des collecteurs optimisés `toUnordered()` et `toOrdered()`. | Très bonne, bien que les chaînes profondes d'opérateurs puissent introduire une surcharge. | Excellente (surcharge native minimale). | Excellente. |
236
+ | **Taille du bundle** | Très léger. | Substantielle (même avec l'élagage d'arbre – *treeshaking*). | Zéro (fonctionnalité native du langage). | Petit. |
237
+ | **Philosophie de conception d'API** | Modèle de collecteur fonctionnel avec sémantique d'index explicite. | Modèle Observable réactif. | Modèle Iterator impératif / Generator déclaratif. | Fonctionnel, composition *pointfree*. |
238
+ | **Contrôle de flux** | Explicite (`interrupt`, `.limit()`, `.takeWhile()`, `.sub()`). | Bon (`take`, `takeUntil`, `first`). | Manuel (`break` dans les boucles). | Bon (`take`, `until`). |
239
+ | **Support synchrone et asynchrone** | API unifiée – support de première classe pour les deux paradigmes. | Principalement asynchrone. | Les deux pris en charge, mais avec un pont manuel. | Principalement asynchrone. |
240
+ | **Courbe d'apprentissage** | Douce pour les développeurs familiers avec les pipelines de collections fonctionnelles et indexées. | Plus raide (lexique étendu d'opérateurs, concepts Observable chaud/froid – *hot/cold*). | Faible à moyenne. | Moyenne. |
189
241
 
190
- **Avantages Clés de Semantic-TypeScript**
242
+ **L'avantage de SemanticTypeScript**
191
243
 
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.
244
+ * **Capacités uniques :** Les fonctionnalités de statistique et d'indexation intégrées éliminent le besoin d'opérations manuelles de `reduce` ou de bibliothèques d'analyse de données supplémentaires.
245
+ * **Gestion prévisible des ressources :** Le contrôle explicite des flux d'événements prévient les fuites de mémoire qui peuvent être subtiles dans les applications RxJS.
246
+ * **Conception unifiée :** Une API cohérente pour les flux de travail synchrones et asynchrones réduit la charge cognitive et la duplication de code.
195
247
 
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.
248
+ Cette comparaison met en lumière pourquoi SemanticTypeScript est particulièrement adapté aux applications TypeScript modernes qui exigent des performances élevées, une robustesse en matière de sécurité des types et des fonctionnalités de traitement de données riches sans la complexité des frameworks réactifs traditionnels.
197
249
 
198
250
  ---
199
251
 
200
- ### Prêt à Explorer ?
252
+ ### Commencez votre exploration
253
+
254
+ Semantic‑TypeScript transforme des flux de données complexes en pipelines lisibles, composables et performants. Que vous manipuliez des événements d'interface utilisateur en temps réel, traitiez de grands ensembles de données ou construisiez des tableaux de bord analytiques, il offre la puissance de l'indexation au niveau base de données avec l'élégance de la programmation fonctionnelle.
201
255
 
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.
256
+ **Vos prochaines étapes :**
203
257
 
204
- **Prochaines Étapes :**
258
+ * Explorez l'API entièrement typée directement dans votre IDE (toutes les exportations sont disponibles depuis le point d'entrée principal du paquet).
259
+ * Rejoignez la communauté grandissante de développeurs qui ont remplacé des itérateurs asynchrones complexes et des chaînes réactives par des pipelines Semantic clairs et intentionnels.
205
260
 
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.
261
+ **Semantic‑TypeScript** les flux rencontrent la structure.
208
262
 
209
- **Semantic-TypeScript** les flux rencontrent la structure.
263
+ Commencez à construire dès aujourd'hui et expérimentez la différence tangible qu'apporte une conception d'indexation réfléchie.
210
264
 
211
- Commencez à construire dès aujourd'hui et expérimentez la différence qu'apporte une indexation bien pensée.
265
+ **Construisez avec clarté, avancez avec confiance et transformez les données avec intention.**
212
266
 
213
- **Construisez avec clarté, agissez avec confiance, et transformez les données avec intention.**
267
+ MIT © Eloy Kim