semantic-typescript 0.0.1 → 0.0.2

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 ADDED
@@ -0,0 +1,335 @@
1
+ # 📘 semantic-typescript
2
+
3
+ Une bibliothèque TypeScript puissante et typée en toute sécurité, conçue pour le **traitement sémantique de données**.
4
+ Elle fournit des constructions fonctionnelles composites pour travailler avec des collections, des flux et des séquences — avec prise en charge du tri, du filtrage, du regroupement, des statistiques et bien plus encore.
5
+
6
+ Que vous traitiez des **données ordonnées ou non ordonnées**, effectuiez des **analyses statistiques**, ou que vous souhaitiez simplement **chaîner des opérations de manière fluide**, cette bibliothèque est faite pour vous.
7
+
8
+ ---
9
+
10
+ ## 🧩 Caractéristiques
11
+
12
+ - ✅ **Génériques typés en toute sécurité** dans toute la bibliothèque
13
+ - ✅ Style **programmation fonctionnelle** (map, filter, reduce, etc.)
14
+ - ✅ **Flux de données sémantiques** (`Semantic<E>`) pour une **évaluation paresseuse**
15
+ - ✅ **Collecteurs** pour transformer des flux en structures concrètes
16
+ - ✅ **Collectables ordonnés et non ordonnés** — `toUnordered()` est **le plus rapide (pas de tri)**
17
+ - ✅ **Tri** via `sorted()`, `toOrdered()`, comparateurs personnalisés
18
+ - ✅ **Analyse statistique** (`Statistics`, `NumericStatistics`, `BigIntStatistics`)
19
+ - ✅ **Optional<T>** — monade pour manipuler en toute sécurité les valeurs nulles
20
+ - ✅ Conception basée sur les **itérateurs et générateurs** — adaptée aux gros volumes ou données asynchrones
21
+
22
+ ---
23
+
24
+ ## 📦 Installation
25
+
26
+ ```bash
27
+ npm install semantic-typescript
28
+ ```
29
+
30
+ ---
31
+
32
+ ## 🧠 Concepts clés
33
+
34
+ ### 1. `Optional<T>` — Gestion sûre des valeurs nulles
35
+
36
+ Un conteneur monadique pour des valeurs pouvant être `null` ou `undefined`.
37
+
38
+ #### Méthodes :
39
+
40
+ | Méthode | Description | Exemple |
41
+ |--------|-------------|---------|
42
+ | `of(value)` | Envelopper une valeur (peut être nulle) | `Optional.of(null)` |
43
+ | `ofNullable(v)` | Envelopper, autorise les valeurs nulles | `Optional.ofNullable(someVar)` |
44
+ | `ofNonNull(v)` | Envelopper, lève une erreur si null/undefined | `Optional.ofNonNull(5)` |
45
+ | `get()` | Obtenir la valeur (ou lever une exception si vide) | `opt.get()` |
46
+ | `getOrDefault(d)` | Obtenir la valeur ou une valeur par défaut | `opt.getOrDefault(0)` |
47
+ | `ifPresent(fn)` | Exécuter un effet de bord si la valeur existe | `opt.ifPresent(x => console.log(x))` |
48
+ | `map(fn)` | Transformer la valeur si elle existe | `opt.map(x => x + 1)` |
49
+ | `filter(fn)` | Conserver la valeur seulement si le prédicat est vrai | `opt.filter(x => x > 0)` |
50
+ | `isEmpty()` | Vérifie si la valeur est absente | `opt.isEmpty()` |
51
+ | `isPresent()` | Vérifie si une valeur est présente | `opt.isPresent()` |
52
+
53
+ #### Exemple :
54
+
55
+ ```typescript
56
+ import { Optional } from 'semantic-typescript';
57
+
58
+ const value: number | null = Math.random() > 0.5 ? 10 : null;
59
+
60
+ const opt = Optional.ofNullable(value);
61
+
62
+ const result = opt
63
+ .filter(v => v > 5)
64
+ .map(v => v * 2)
65
+ .getOrDefault(0);
66
+
67
+ console.log(result); // 20 ou 0
68
+ ```
69
+
70
+ ---
71
+
72
+ ### 2. `Semantic<E>` — Flux de données paresseux
73
+
74
+ Un **flux séquentiel paresseux et composite**. Similaire aux Java Streams ou aux Kotlin Sequences.
75
+
76
+ Créez un `Semantic` à l’aide d’assistants comme `from()`, `range()`, `iterate()` ou `fill()`.
77
+
78
+ #### Créateurs :
79
+
80
+ | Fonction | Description | Exemple |
81
+ |----------|-------------|---------|
82
+ | `from(iterable)` | Créer à partir d’un Array, Set, Iterable | `from([1, 2, 3])` |
83
+ | `range(start, end, step?)` | Générer une plage de nombres | `range(0, 5)` → 0,1,2,3,4 |
84
+ | `fill(element, count)` | Répéter un élément N fois | `fill('a', 3n)` |
85
+ | `iterate(gen)` | Utiliser une fonction générateur personnalisée | `iterate(genFn)` |
86
+
87
+ #### Opérateurs courants :
88
+
89
+ | Méthode | Description | Exemple |
90
+ |--------|-------------|---------|
91
+ | `map(fn)` | Transformer chaque élément | `.map(x => x * 2)` |
92
+ | `filter(fn)` | Conserver les éléments répondant au prédicat | `.filter(x => x > 10)` |
93
+ | `limit(n)` | Limiter aux N premiers éléments | `.limit(5)` |
94
+ | `skip(n)` | Ignorer les N premiers éléments | `.skip(2)` |
95
+ | `distinct()` | Supprimer les doublons (utilise Set par défaut) | `.distinct()` |
96
+ | `sorted()` | Trier les éléments (ordre naturel) | `.sorted()` |
97
+ | `sorted(comparator)` | Trier avec un comparateur personnalisé | `.sorted((a, b) => a - b)` |
98
+ | `toOrdered()` | Trier et retourner un `OrderedCollectable` | `.toOrdered()` |
99
+ | `toUnordered()` | **Pas de tri** — le plus rapide | `.toUnordered()` ✅ |
100
+ | `collect(collector)` | Aggréger avec un `Collector` | `.collect(Collector.full(...))` |
101
+ | `toArray()` | Convertir en tableau | `.toArray()` |
102
+ | `toSet()` | Convertir en Set | `.toSet()` |
103
+ | `toMap(keyFn, valFn)` | Convertir en Map | `.toMap(x => x.id, x => x)` |
104
+
105
+ ---
106
+
107
+ ### 3. `toUnordered()` — 🚀 Le plus rapide, sans tri
108
+
109
+ Si vous **n’avez pas besoin d’ordre** et que vous souhaitez les **meilleures performances possibles**, utilisez :
110
+
111
+ ```typescript
112
+ const fastest = semanticStream.toUnordered();
113
+ ```
114
+
115
+ 🔥 **Aucun algorithme de tri n’est appliqué.**
116
+ Parfait lorsque l’ordre n’a pas d’importance et que la vitesse est cruciale.
117
+
118
+ ---
119
+
120
+ ### 4. `toOrdered()` et `sorted()` — Résultats triés
121
+
122
+ Si vous avez besoin d’un **résultat trié**, utilisez :
123
+
124
+ ```typescript
125
+ const ordered = semanticStream.sorted(); // Tri naturel
126
+ const customSorted = semanticStream.sorted((a, b) => a - b); // Comparateur personnalisé
127
+ const orderedCollectable = semanticStream.toOrdered(); // Aussi trié
128
+ ```
129
+
130
+ ⚠️ Ces méthodes **trient les éléments**, en utilisant l’ordre naturel ou un comparateur fourni.
131
+
132
+ ---
133
+
134
+ ### 5. `Collector<E, A, R>` — Agrégation de données
135
+
136
+ Les collecteurs vous permettent de **réduire un flux en une structure unique ou complexe**.
137
+
138
+ Des factories statiques sont disponibles :
139
+
140
+ ```typescript
141
+ Collector.full(identity, accumulator, finisher)
142
+ Collector.shortable(identity, interruptor, accumulator, finisher)
143
+ ```
144
+
145
+ Mais vous utiliserez surtout les méthodes haut niveau fournies par les classes `Collectable`.
146
+
147
+ ---
148
+
149
+ ### 6. `Collectable<E>` (classe abstraite)
150
+
151
+ Classe de base pour :
152
+
153
+ - `OrderedCollectable<E>` — Résultats triés
154
+ - `UnorderedCollectable<E>` — Pas de tri, le plus rapide
155
+ - `WindowCollectable<E>` — Fenêtres glissantes
156
+ - `Statistics<E, D>` — Statistiques agrégées
157
+
158
+ #### Méthodes communes (via héritage) :
159
+
160
+ | Méthode | Description | Exemple |
161
+ |--------|-------------|---------|
162
+ | `count()` | Compter les éléments | `.count()` |
163
+ | `toArray()` | Convertir en tableau | `.toArray()` |
164
+ | `toSet()` | Convertir en Set | `.toSet()` |
165
+ | `toMap(k, v)` | Convertir en Map | `.toMap(x => x.id, x => x)` |
166
+ | `group(k)` | Regrouper par clé | `.group(x => x.category)` |
167
+ | `findAny()` | Trouver un élément quelconque (Optional) | `.findAny()` |
168
+ | `findFirst()` | Trouver le premier élément (Optional) | `.findFirst()` |
169
+ | `reduce(...)` | Réduction personnalisée | `.reduce((a,b) => a + b, 0)` |
170
+
171
+ ---
172
+
173
+ ### 7. `OrderedCollectable<E>` — Données triées
174
+
175
+ Si vous souhaitez que les éléments soient **triés automatiquement**, utilisez cette classe.
176
+
177
+ Elle accepte un **comparateur personnalisé** ou utilise l’ordre naturel.
178
+
179
+ ```typescript
180
+ const sorted = new OrderedCollectable(stream);
181
+ const customSorted = new OrderedCollectable(stream, (a, b) => b - a);
182
+ ```
183
+
184
+ 🔒 **Le tri est garanti.**
185
+
186
+ ---
187
+
188
+ ### 8. `UnorderedCollectable<E>` — Pas de tri (🚀 Le plus rapide)
189
+
190
+ Si vous **n’avez pas besoin de tri** et que vous voulez les **meilleures performances**, utilisez :
191
+
192
+ ```typescript
193
+ const unordered = new UnorderedCollectable(stream);
194
+ // OU
195
+ const fastest = semanticStream.toUnordered();
196
+ ```
197
+
198
+ ✅ **Aucun algorithme de tri n’est exécuté**
199
+ ✅ **Meilleure performance lorsque l’ordre n’a pas d’importance**
200
+
201
+ ---
202
+
203
+ ### 9. `Statistics<E, D>` — Analyse statistique
204
+
205
+ Classe abstraite pour analyser des données numériques.
206
+
207
+ #### Sous-classes :
208
+
209
+ - `NumericStatistics<E>` — Pour des valeurs de type `number`
210
+ - `BigIntStatistics<E>` — Pour des valeurs de type `bigint`
211
+
212
+ ##### Méthodes statistiques courantes :
213
+
214
+ | Méthode | Description | Exemple |
215
+ |--------|-------------|---------|
216
+ | `mean()` | Moyenne | `.mean()` |
217
+ | `median()` | Médiane | `.median()` |
218
+ | `mode()` | Mode (valeur la plus fréquente) | `.mode()` |
219
+ | `minimum()` | Minimum | `.minimum()` |
220
+ | `maximum()` | Maximum | `.maximum()` |
221
+ | `range()` | Écart (max - min) | `.range()` |
222
+ | `variance()` | Variance | `.variance()` |
223
+ | `standardDeviation()` | Écart-type | `.standardDeviation()` |
224
+ | `summate()` | Somme | `.summate()` |
225
+ | `quantile(q)` | Valeur au quantile q (0–1) | `.quantile(0.5)` → médiane |
226
+ | `frequency()` | Fréquence sous forme de Map | `.frequency()` |
227
+
228
+ ---
229
+
230
+ ## 🧪 Exemple complet
231
+
232
+ ```typescript
233
+ import { from, toUnordered, toOrdered, sorted, NumericStatistics } from 'semantic-typescript';
234
+
235
+ // Données d'exemple
236
+ const numbers = from([10, 2, 8, 4, 5, 6]);
237
+
238
+ // 🚀 Le plus rapide : pas de tri
239
+ const fastest = numbers.toUnordered();
240
+ console.log(fastest.toArray()); // ex: [10, 2, 8, 4, 5, 6] (ordre d'origine)
241
+
242
+ // 🔢 Tri naturel
243
+ const ordered = numbers.sorted();
244
+ console.log(ordered.toArray()); // [2, 4, 5, 6, 8, 10]
245
+
246
+ // 📊 Statistiques
247
+ const stats = new NumericStatistics(numbers);
248
+ console.log('Moyenne:', stats.mean());
249
+ console.log('Médiane:', stats.median());
250
+ console.log('Mode:', stats.mode());
251
+ console.log('Écart:', stats.range());
252
+ console.log('Écart-type:', stats.standardDeviation());
253
+ ```
254
+
255
+ ---
256
+
257
+ ## 🛠️ Fonctions utilitaires
258
+
259
+ La bibliothèque exporte aussi plusieurs **tests de type (type guards)** et **outils de comparaison** :
260
+
261
+ | Fonction | But |
262
+ |----------|-----|
263
+ | `isString(x)` | Test de type pour `string` |
264
+ | `isNumber(x)` | Test de type pour `number` |
265
+ | `isBoolean(x)` | Test de type pour `boolean` |
266
+ | `isIterable(x)` | Vérifie si un objet est itérable |
267
+ | `useCompare(a, b)` | Fonction de comparaison universelle |
268
+ | `useRandom(x)` | Générateur de nombre aléatoire (divertissant) |
269
+
270
+ ---
271
+
272
+ ## 🧩 Avancé : Générateurs personnalisés et fenêtres
273
+
274
+ Vous pouvez créer des **générateurs personnalisés** pour des flux de données contrôlés ou infinis :
275
+
276
+ ```typescript
277
+ const gen = (accept: BiConsumer<number, bigint>, interrupt: Predicate<number>) => {
278
+ for (let i = 0; i < 10; i++) {
279
+ accept(i, BigInt(i));
280
+ if (i === 5) interrupt(i);
281
+ }
282
+ };
283
+
284
+ const s = new Semantic(gen);
285
+ ```
286
+
287
+ Ou utiliser des **fenêtres glissantes** :
288
+
289
+ ```typescript
290
+ const windowed = ordered.slide(3n, 2n); // fenêtres de taille 3, pas de 2
291
+ ```
292
+
293
+ ---
294
+
295
+ ## 📄 Licence
296
+
297
+ Ce projet est sous **licence MIT** — libre pour un usage commercial ou personnel.
298
+
299
+ ---
300
+
301
+ ## 🙌 Contribution
302
+
303
+ Les pull requests, problèmes (issues) et idées sont les bienvenus !
304
+
305
+ ---
306
+
307
+ ## 🚀 Résumé du démarrage rapide
308
+
309
+ | Tâche | Méthode |
310
+ |-------|---------|
311
+ | Gérer les valeurs nulles | `Optional<T>` |
312
+ | Créer un flux | `from([...])`, `range()`, `fill()` |
313
+ | Transformer des données | `map()`, `filter()` |
314
+ | Trier des données | `sorted()`, `toOrdered()` |
315
+ | Pas de tri (le plus rapide) | `toUnordered()` ✅ |
316
+ | Regrouper / Aggréger | `toMap()`, `group()`, `Collector` |
317
+ | Statistiques | `NumericStatistics`, `mean()`, `median()`, etc. |
318
+
319
+ ---
320
+
321
+ ## 🔗 Liens
322
+
323
+ - 📦 npm: https://www.npmjs.com/package/semantic-typescript
324
+ - 🐙 GitHub: https://github.com/eloyhere/semantic-typescript
325
+ - 📘 Documentation : voir le code source / définitions de type
326
+
327
+ ---
328
+
329
+ **Profitez d’un traitement de données fonctionnel, typé et composable en TypeScript.** 🚀
330
+
331
+ ---
332
+
333
+ ✅ **À retenir :**
334
+ - `toUnordered()` → **Pas de tri, le plus rapide**
335
+ - Les autres (`sorted()`, `toOrdered()`, etc.) → **Tri des données**
package/readme.jp.md ADDED
@@ -0,0 +1,335 @@
1
+ # 📘 semantic-typescript
2
+
3
+ TypeScript における**意味論的なデータ処理**のための、強力で型安全なユーティリティライブラリです。
4
+ コレクション、ストリーム、シーケンスを扱うための関数的スタイルの構成要素を提供し、ソート、フィルタリング、グループ化、統計分析などをサポートします。
5
+
6
+ **順序付きまたは順序なしのデータ**を処理する場合でも、**統計分析**を行う場合でも、単に**演算を流れるようにチェーンしたい**場合でも、本ライブラリが対応します。
7
+
8
+ ---
9
+
10
+ ## 🧩 特徴
11
+
12
+ - ✅ 全面的に**型安全なジェネリクス**
13
+ - ✅ **関数型プログラミング**スタイル(map、filter、reduce など)
14
+ - ✅ **意味論的データストリーム**(`Semantic<E>`)による遅延評価
15
+ - ✅ ストリームを具体的な構造に変換するための**コレクター**
16
+ - ✅ **順序付き&順序なしコレクション** — `toUnordered()` は**最速**(ソートなし)
17
+ - ✅ `sorted()`、`toOrdered()`、比較器による**ソート機能**
18
+ - ✅ **統計分析**(`Statistics`、`NumericStatistics`、`BigIntStatistics`)
19
+ - ✅ 安全な null 値処理のための **`Optional<T>` モナド**
20
+ - ✅ **イテレータとジェネレーター**ベースの設計 — 大規模・非同期データにも適応
21
+
22
+ ---
23
+
24
+ ## 📦 インストール
25
+
26
+ ```bash
27
+ npm install semantic-typescript
28
+ ```
29
+
30
+ ---
31
+
32
+ ## 🧠 コア概念
33
+
34
+ ### 1. `Optional<T>` – 安全な null 値処理
35
+
36
+ `null` または `undefined` になり得る値を格納するモナディックコンテナです。
37
+
38
+ #### メソッド:
39
+
40
+ | メソッド | 説明 | 例 |
41
+ |----------|------|-----|
42
+ | `of(value)` | 値をラップ(nullish も可) | `Optional.of(null)` |
43
+ | `ofNullable(v)` | ラップ(nullish を許容) | `Optional.ofNullable(someVar)` |
44
+ | `ofNonNull(v)` | ラップ(null/undefined なら例外) | `Optional.ofNonNull(5)` |
45
+ | `get()` | 値を取得(空なら例外) | `opt.get()` |
46
+ | `getOrDefault(d)` | 値を取得、空ならデフォルト値 | `opt.getOrDefault(0)` |
47
+ | `ifPresent(fn)` | 値があれば副作用を実行 | `opt.ifPresent(x => console.log(x))` |
48
+ | `map(fn)` | 値があれば変換 | `opt.map(x => x + 1)` |
49
+ | `filter(fn)` | 述語を満たす場合のみ値を保持 | `opt.filter(x => x > 0)` |
50
+ | `isEmpty()` | 空かどうかを確認 | `opt.isEmpty()` |
51
+ | `isPresent()` | 値を持つかどうかを確認 | `opt.isPresent()` |
52
+
53
+ #### 例:
54
+
55
+ ```typescript
56
+ import { Optional } from 'semantic-typescript';
57
+
58
+ const value: number | null = Math.random() > 0.5 ? 10 : null;
59
+
60
+ const opt = Optional.ofNullable(value);
61
+
62
+ const result = opt
63
+ .filter(v => v > 5)
64
+ .map(v => v * 2)
65
+ .getOrDefault(0);
66
+
67
+ console.log(result); // 20 または 0
68
+ ```
69
+
70
+ ---
71
+
72
+ ### 2. `Semantic<E>` – 遅延データストリーム
73
+
74
+ 要素の**遅延評価可能な合成可能シーケンス**です。Java Streams や Kotlin Sequences のような関数的ストリームに似ています。
75
+
76
+ `from()`、`range()`、`iterate()`、`fill()` などのヘルパーで `Semantic` を作成できます。
77
+
78
+ #### 作成メソッド:
79
+
80
+ | 関数 | 説明 | 例 |
81
+ |------|------|-----|
82
+ | `from(iterable)` | Array/Set/Iterable から作成 | `from([1, 2, 3])` |
83
+ | `range(start, end, step?)` | 数値範囲を生成 | `range(0, 5)` → 0,1,2,3,4 |
84
+ | `fill(element, count)` | 要素を N 回繰り返す | `fill('a', 3n)` |
85
+ | `iterate(gen)` | カスタムジェネレーター関数を使用 | `iterate(genFn)` |
86
+
87
+ #### 主な演算子:
88
+
89
+ | メソッド | 説明 | 例 |
90
+ |----------|------|-----|
91
+ | `map(fn)` | 各要素を変換 | `.map(x => x * 2)` |
92
+ | `filter(fn)` | 述語を満たす要素を保持 | `.filter(x => x > 10)` |
93
+ | `limit(n)` | 最初の N 要素に制限 | `.limit(5)` |
94
+ | `skip(n)` | 最初の N 要素をスキップ | `.skip(2)` |
95
+ | `distinct()` | 重複を除去(デフォルトで Set を使用) | `.distinct()` |
96
+ | `sorted()` | 要素をソート(自然順) | `.sorted()` |
97
+ | `sorted(comparator)` | カスタムソート | `.sorted((a, b) => a - b)` |
98
+ | `toOrdered()` | ソートして `OrderedCollectable` を返す | `.toOrdered()` |
99
+ | `toUnordered()` | **ソートなし** – 最速のコレクション | `.toUnordered()` ✅ |
100
+ | `collect(collector)` | コレクターで集約 | `.collect(Collector.full(...))` |
101
+ | `toArray()` | 配列に変換 | `.toArray()` |
102
+ | `toSet()` | Set に変換 | `.toSet()` |
103
+ | `toMap(keyFn, valFn)` | Map に変換 | `.toMap(x => x.id, x => x)` |
104
+
105
+ ---
106
+
107
+ ### 3. `toUnordered()` – 🚀 最速、ソートなし
108
+
109
+ **順序を必要とせず**、**最高のパフォーマンス**を求める場合は、以下を使用してください:
110
+
111
+ ```typescript
112
+ const fastest = semanticStream.toUnordered();
113
+ ```
114
+
115
+ 🔥 **ソートアルゴリズムは適用されません。**
116
+ 順序が関係なく、最大の速度が必要な場合に理想的です。
117
+
118
+ ---
119
+
120
+ ### 4. `toOrdered()` および `sorted()` – ソート済み出力
121
+
122
+ **ソート済み出力**が必要な場合は、以下を使用してください:
123
+
124
+ ```typescript
125
+ const ordered = semanticStream.sorted(); // 自然順
126
+ const customSorted = semanticStream.sorted((a, b) => a - b); // カスタム比較器
127
+ const orderedCollectable = semanticStream.toOrdered(); // こちらもソート
128
+ ```
129
+
130
+ ⚠️ これらのメソッドは、自然順または指定された比較器を使用して要素を**ソートします**。
131
+
132
+ ---
133
+
134
+ ### 5. `Collector<E, A, R>` – データ集約
135
+
136
+ コレクターにより、ストリームを**単一または複雑な構造に縮約**できます。
137
+
138
+ 組み込みの静的ファクトリー:
139
+
140
+ ```typescript
141
+ Collector.full(identity, accumulator, finisher)
142
+ Collector.shortable(identity, interruptor, accumulator, finisher)
143
+ ```
144
+
145
+ 通常、`Collectable` クラスの高水準ヘルパーを通じて使用されます。
146
+
147
+ ---
148
+
149
+ ### 6. `Collectable<E>`(抽象クラス)
150
+
151
+ 以下のクラスの基底クラスです:
152
+
153
+ - `OrderedCollectable<E>` – ソート済み出力
154
+ - `UnorderedCollectable<E>` – ソートなし、最速
155
+ - `WindowCollectable<E>` – スライディングウィンドウ
156
+ - `Statistics<E, D>` – 統計集約
157
+
158
+ #### 共通メソッド(継承経由):
159
+
160
+ | メソッド | 説明 | 例 |
161
+ |----------|------|-----|
162
+ | `count()` | 要素をカウント | `.count()` |
163
+ | `toArray()` | 配列に変換 | `.toArray()` |
164
+ | `toSet()` | Set に変換 | `.toSet()` |
165
+ | `toMap(k, v)` | Map に変換 | `.toMap(x => x.id, x => x)` |
166
+ | `group(k)` | キーでグループ化 | `.group(x => x.category)` |
167
+ | `findAny()` | 任意の一致要素(Optional) | `.findAny()` |
168
+ | `findFirst()` | 最初の要素(Optional) | `.findFirst()` |
169
+ | `reduce(...)` | カスタム縮約 | `.reduce((a,b) => a + b, 0)` |
170
+
171
+ ---
172
+
173
+ ### 7. `OrderedCollectable<E>` – ソート済みデータ
174
+
175
+ 要素を**自動的にソート**したい場合は、このクラスを使用してください。
176
+
177
+ **カスタム比較器**を受け入れるか、自然順を使用します。
178
+
179
+ ```typescript
180
+ const sorted = new OrderedCollectable(stream);
181
+ const customSorted = new OrderedCollectable(stream, (a, b) => b - a);
182
+ ```
183
+
184
+ 🔒 **ソート済み出力が保証されます。**
185
+
186
+ ---
187
+
188
+ ### 8. `UnorderedCollectable<E>` – ソートなし(🚀 最速)
189
+
190
+ **順序を必要とせず**、**最高のパフォーマンス**を求める場合は、以下を使用してください:
191
+
192
+ ```typescript
193
+ const unordered = new UnorderedCollectable(stream);
194
+ // または
195
+ const fastest = semanticStream.toUnordered();
196
+ ```
197
+
198
+ ✅ **ソートアルゴリズムは実行されません**
199
+ ✅ **順序が無関係な場合の最高パフォーマンス**
200
+
201
+ ---
202
+
203
+ ### 9. `Statistics<E, D>` – 統計分析
204
+
205
+ 数値データを分析するための抽象基底クラスです。
206
+
207
+ #### サブクラス:
208
+
209
+ - `NumericStatistics<E>` – `number` 型用
210
+ - `BigIntStatistics<E>` – `bigint` 型用
211
+
212
+ ##### 主な統計メソッド:
213
+
214
+ | メソッド | 説明 | 例 |
215
+ |----------|------|-----|
216
+ | `mean()` | 算術平均 | `.mean()` |
217
+ | `median()` | 中央値 | `.median()` |
218
+ | `mode()` | 最頻値 | `.mode()` |
219
+ | `minimum()` | 最小要素 | `.minimum()` |
220
+ | `maximum()` | 最大要素 | `.maximum()` |
221
+ | `range()` | 最大 − 最小 | `.range()` |
222
+ | `variance()` | 分散 | `.variance()` |
223
+ | `standardDeviation()` | 標準偏差 | `.standardDeviation()` |
224
+ | `summate()` | 要素の合計 | `.summate()` |
225
+ | `quantile(q)` | q パーセンタイル(0–1)の値 | `.quantile(0.5)` → 中央値 |
226
+ | `frequency()` | 頻度マップ | `.frequency()` |
227
+
228
+ ---
229
+
230
+ ## 🧪 完全な例
231
+
232
+ ```typescript
233
+ import { from, toUnordered, toOrdered, sorted, NumericStatistics } from 'semantic-typescript';
234
+
235
+ // サンプルデータ
236
+ const numbers = from([10, 2, 8, 4, 5, 6]);
237
+
238
+ // 🚀 最速:ソートなし
239
+ const fastest = numbers.toUnordered();
240
+ console.log(fastest.toArray()); // 例: [10, 2, 8, 4, 5, 6](元の順序)
241
+
242
+ // 🔢 自然順でソート
243
+ const ordered = numbers.sorted();
244
+ console.log(ordered.toArray()); // [2, 4, 5, 6, 8, 10]
245
+
246
+ // 📊 統計分析を実行
247
+ const stats = new NumericStatistics(numbers);
248
+ console.log('平均:', stats.mean());
249
+ console.log('中央値:', stats.median());
250
+ console.log('最頻値:', stats.mode());
251
+ console.log('範囲:', stats.range());
252
+ console.log('標準偏差:', stats.standardDeviation());
253
+ ```
254
+
255
+ ---
256
+
257
+ ## 🛠️ ユーティリティ関数
258
+
259
+ 本ライブラリは多数の**型ガード**と**比較ユーティリティ**もエクスポートしています:
260
+
261
+ | 関数 | 用途 |
262
+ |------|------|
263
+ | `isString(x)` | `string` の型ガード |
264
+ | `isNumber(x)` | `number` の型ガード |
265
+ | `isBoolean(x)` | `boolean` の型ガード |
266
+ | `isIterable(x)` | オブジェクトがイテラブルか確認 |
267
+ | `useCompare(a, b)` | 汎用比較関数 |
268
+ | `useRandom(x)` | 疑似乱数ジェネレーター(楽しい) |
269
+
270
+ ---
271
+
272
+ ## 🧩 発展:カスタムジェネレーターとウィンドウ
273
+
274
+ 無限または制御されたデータストリーム用のカスタム**ジェネレーター**を作成できます:
275
+
276
+ ```typescript
277
+ const gen = (accept: BiConsumer<number, bigint>, interrupt: Predicate<number>) => {
278
+ for (let i = 0; i < 10; i++) {
279
+ accept(i, BigInt(i));
280
+ if (i === 5) interrupt(i);
281
+ }
282
+ };
283
+
284
+ const s = new Semantic(gen);
285
+ ```
286
+
287
+ または**スライディングウィンドウ**を使用:
288
+
289
+ ```typescript
290
+ const windowed = ordered.slide(3n, 2n); // サイズ 3、ステップ 2 のウィンドウ
291
+ ```
292
+
293
+ ---
294
+
295
+ ## 📄 ライセンス
296
+
297
+ 本プロジェクトは **MIT ライセンス**の下で公開されており、商用および個人的利用が自由です。
298
+
299
+ ---
300
+
301
+ ## 🙌 貢献
302
+
303
+ プルリクエスト、イシュー、提案を歓迎します!
304
+
305
+ ---
306
+
307
+ ## 🚀 クイックスタート概要
308
+
309
+ | タスク | メソッド |
310
+ |-------|----------|
311
+ | null を安全に処理 | `Optional<T>` |
312
+ | ストリームを作成 | `from([...])`、`range()`、`fill()` |
313
+ | データを変換 | `map()`、`filter()` |
314
+ | データをソート | `sorted()`、`toOrdered()` |
315
+ | ソートなし(最速) | `toUnordered()` ✅ |
316
+ | グループ化/集約 | `toMap()`、`group()`、`Collector` |
317
+ | 統計 | `NumericStatistics`、`mean()`、`median()` など |
318
+
319
+ ---
320
+
321
+ ## 🔗 リンク
322
+
323
+ - 📦 npm: https://www.npmjs.com/package/semantic-typescript
324
+ - 🐙 GitHub: https://github.com/eloyhere/semantic-typescript
325
+ - 📘 ドキュメント: ソースコード/型定義を参照
326
+
327
+ ---
328
+
329
+ **TypeScript での合成可能で型安全、関数的なデータ処理をお楽しみください。** 🚀
330
+
331
+ ---
332
+
333
+ ✅ **覚えておいてください:**
334
+ - `toUnordered()` → **ソートなし、最速**
335
+ - その他すべて(例: `sorted()`、`toOrdered()`)→ **データをソート**