semantic-typescript 0.6.0 → 0.7.1

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.jp.md CHANGED
@@ -1,204 +1,267 @@
1
- # Semantic-TypeScript: パラダイムを転換するストリーム処理ライブラリ
1
+ # **SemanticTypeScript**
2
+ **ストリーム処理、インデックス化。** あなたのデータを精密に制御。
2
3
 
3
- ## はじめに
4
- Semantic-TypeScriptは、ストリーム処理技術における大きな進歩を表しており、JavaScriptのジェネレーター関数、Javaストリーム、およびデータベースのインデックス作成パラダイムから最も効果的な概念を統合しています。その基本的な設計原則は、洗練された遅延評価とインテリジェントなインデックス作成を通じて、非常に効率的なデータ処理パイプラインを構築することに焦点を当てています。このライブラリは、現代のTypeScriptおよびJavaScript開発向けに特別に設計された、厳密に型安全で関数型的に純粋なストリーミング操作体験を提供します。
4
+ ---
5
5
 
6
- 従来の同期処理アーキテクチャとは対照的に、Semantic-TypeScriptは同期(Iterable)と非同期(AsyncIterable)の両方のデータソースを優雅に扱う統一モデルを実装しています。ストリーム生成中、データの流れと終了はコールバックメカニズムによって正確に制御され、これにより、ライブラリは例外的な優雅さを持って以下の処理を可能にします:
7
- - 確定的な制御を伴うリアルタイムデータストリーム(DOMイベント、WebSocket、インターバル)
8
- - メモリ効率の良い遅延パイプラインによる大規模データセット
9
- - 流暢で宣言的なAPIによる複雑なデータ変換
6
+ ### 概要
10
7
 
11
- このライブラリの革新的なアプローチは、開発者がデータのシーケンスとどのように対話するかを根本的に再構想し、単一のまとまりのあるパッケージの中で、前例のないパフォーマンス特性と開発者の人間工学の両方を提供します。
8
+ Semantic‑TypeScriptは、ストリーム処理における重要な進化を表しており、JavaScriptジェネレーター、Java Streams、MySQLスタイルのインデックス作成から最も効果的なパラダイムを優雅に**統合**しています。その基本理念は強力かつ意図的です:従来の力任せの反復処理ではなく、インテリジェントなインデックス作成を通じて、非常に効率的なデータ処理パイプラインを構築します。
12
9
 
13
- ## コア哲学:定義と実行の分離
14
- Semantic-TypeScriptの主要なアーキテクチャ的洞察は、ストリームの定義とその実行の明確な分離です:
15
- - **Semantic<E>**: データ変換パイプラインの不変で遅延的な青写真。どのような操作(フィルター、マップなど)が実行されるかを定義します。
16
- - **Collectable<E>**: ストリームの実体化された実行可能なビュー。Semanticから取得され、パイプラインを実行して結果を生成するためのすべての終端操作(collect、forEachなど)を提供します。
10
+ 従来のライブラリが同期ループや煩雑なPromiseチェーンを強いるのに対し、Semantic‑TypeScriptは、現代のアプリケーション開発の要求に特化して設計された、**完全非同期**、機能的に純粋、かつ厳密に型安全な体験を提供します。
17
11
 
18
- この分離は明確なメンタルモデルを強制し、最大速度のために不要なソートをスキップするためにUnorderedCollectableを選択するなどの強力な最適化を可能にします。
12
+ このモデルは洗練された制御フローを体現しています:データは、上流パイプラインが明示的に`accept`コールバックを呼び出す時だけ、下流のコンシューマーに渡されます。処理のタイミングについて、完全かつ細やかなコントロールを保持できます。処理は、必要とされる時、そしてその時にのみ正確に実行されます。
19
13
 
20
- ## なぜSemantic-TypeScriptを選ぶのか?
21
- データストリーム処理に適切なライブラリを選択することは、パフォーマンス、型安全性、表現力のバランスを取ることを伴います。Semantic-TypeScriptは、これらすべての次元で優れるように設計されています。
14
+ ---
22
15
 
23
- ### 1. すべてのデータシーケンスのための統一された型安全パラダイム
24
- 静的配列、リアルタイムイベント、非同期チャンクなど、あらゆるデータシーケンスを処理するための一貫した宣言的APIを提供し、エンドツーエンドの型安全性を確保するためにTypeScriptの完全な力を活用します。これにより、ランタイムエラーの全クラスを排除し、ストリーム操作を予測可能でコンパイラ検証済みのアクティビティに変えます。
16
+ ### 開発者がSemantic‑TypeScriptを選ぶ理由
25
17
 
26
- ### 2. インテリジェントな遅延性による妥協のないパフォーマンス
27
- 中核的には、このライブラリは遅延評価に基づいて構築されています。フィルター、マップ、flatMapなどの操作は単に処理パイプラインを構成するだけで、終端操作が呼び出されるまで実際の作業は行われません。これは、limit、anyMatch、またはカスタム中断コールバックを介した短絡評価機能と組み合わされ、処理を早期に停止させ、大規模または無限のストリームの効率を劇的に向上させます。
18
+ - **ボイラープレート不要のインデックス作成** 各要素は本来備わっている、またはカスタマイズされたインデックスを自然に保有し、手動での追跡を不要にします。
19
+ - **純粋関数型かつ型安全** – 不変な操作と共に、完全で慣用的なTypeScriptの型推論を享受できます。
20
+ - **メモリリーク防止のイベントストリーム** – `useSubscription`パターンは、リソースセキュリティを第一原則として設計されています。`limit(n)`、`sub(start, end)`、`takeWhile(predicate)`を使用して論理的な境界を定義するだけで、ライブラリが購読の完全なライフサイクルを管理します。これにより、残留リスナーやメモリリークは発生しません。
21
+ - **組み込み統計スイート** – 外部依存なしで、`number`および`bigint`ストリームに対する平均、中央値、最頻値、分散、歪度、尖度を含む包括的な分析機能にアクセスできます。
22
+ - **予測可能で調整可能なパフォーマンス** – 正確なパフォーマンスと順序要件に合わせて、順序付きまたは順序なしのコレクターを選択できます。
23
+ - **本質的にメモリ効率が良い** – ストリームは遅延評価され、メモリ負荷を軽減するため、要素はオンデマンドで処理されます。
24
+ - **未定義動作なし** – TypeScriptが完全な型安全性とnull安全性を保証します。コールバック関数内で明示的に変更しない限り、ソースデータは不変のままです。
28
25
 
29
- ### 3. `Collector<E, A, R>` パターンの力
30
- Javaに触発され、Collectorパターンは柔軟性のエンジンです。これは、ストリーム要素をどのように累積するかの仕様を、ストリーム自体の実行から分離します。ライブラリは日常業務のための豊富な組み込みコレクタ(toArray、groupBy、summateなど)を提供する一方、独自の複雑で再利用可能なリダクションロジックを実装することを簡単にします。これは、固定された終端メソッドのセットよりもはるかに強力で合成可能です。
26
+ ---
31
27
 
32
- ### 4. 現代のWebおよび非同期データへの第一級サポート
33
- Semantic-TypeScriptは、現代の開発のために設計されています。現代のWebソースに対するネイティブのファクトリメソッドを提供します:
34
- - 静的データのための `useFrom(iterable)`, `useRange()`
35
- - 時間ベースのストリームのための `useInterval()`, `useAnimationFrame()`
36
- - チャンク化されたバイナリデータ処理のための `useBlob()`
37
- - リアルタイムイベントストリームのための `useWebSocket()`, `useDocument()`, `useWindow()`
28
+ ### インストール
38
29
 
39
- ### 5. 基本的な集計を超えて:組み込み統計分析
40
- 単純な合計や平均を超えてください。このライブラリは専用のNumericStatisticsおよびBigIntStatisticsインターフェースを提供し、分散、標準偏差、中央値、歪度、尖度などの高度な統計尺度にストリームから直接アクセスできるようにします。これにより、複雑なデータ分析がワンライナーに変わります。
30
+ お好みのパッケージマネージャーを使用して、プロジェクトにSemantic‑TypeScriptを統合します:
41
31
 
42
- ### 6. 開発者の人間工学のために設計
43
- - **流暢で連鎖可能なAPI**: 複雑なデータパイプラインを読みやすい連続的なチェーンとして記述できます。
44
- - **包括的なユーティリティスイート**: 必須のガード(isFunction、isIterable)、ユーティリティ(useCompare、useTraverse)、および関数型インターフェースが含まれています。
45
- - **Optional<T> 統合**: 値の不在を安全にモデル化し、nullポインタの懸念を排除します。
46
- - **パフォーマンスガイダンス**: 速度のために順序なしコレクションを使用するタイミングと、シーケンスのために順序ありを使用するタイミングに関する明確なガイダンス。
47
-
48
- ## インストール
49
32
  ```bash
50
33
  npm install semantic-typescript
51
34
  ```
35
+ または
36
+ ```bash
37
+ yarn add semantic-typescript
38
+ ```
52
39
 
53
- ## 実践におけるコアコンセプト
40
+ ---
41
+
42
+ ### 実践的な紹介
43
+
44
+ 以下の例は、基本的な変換から実際のイベント処理までの核心概念を示しています。
54
45
 
55
- ### 1. ストリームの作成(Semantic)
56
- ファクトリ関数を使用してさまざまなソースからストリームを作成できます。
57
46
  ```typescript
58
- import { useFrom, useInterval, useDocument } from 'semantic-typescript';
47
+ import { useOf, useFrom, useRange, useSubscription, useText, useStringify } from "semantic-typescript";
48
+
49
+ // ====================================================================
50
+ // 例1: 基本的な操作と数値統計
51
+ // ====================================================================
52
+ // マッピング操作と終端統計操作を示します。変換後、パイプラインを統計コレクターに変換してから、`.summate()`などの終端メソッドを呼び出す必要があります。
53
+
54
+ const numericSum: number = useOf(10, 20, 30, 40)
55
+ .map((n: number): number => n * 2) // 各要素を2倍: [20, 40, 60, 80]
56
+ .toNumericStatistics() // 統計コレクターに変換
57
+ .summate(); // 終端操作: 200
58
+
59
+ // その他の統計メソッド(`.toNumericStatistics()`後に利用可能):
60
+ // .average(), .median(), .mode(), .variance(), .skewness(), .kurtosis()
61
+
62
+ // ====================================================================
63
+ // 例2: BigInt統計
64
+ // ====================================================================
65
+ // 数値統計と同様に動作しますが、BigIntデータ用に最適化されています。
66
+
67
+ const bigintSum: bigint = useOf(10n, 20n, 30n, 40n)
68
+ .map((n: bigint): bigint => n * 2n) // BigInt演算
69
+ .toBigIntStatistics() // BigInt統計コレクターに変換
70
+ .summate(); // 終端操作: 200n
71
+
72
+ // ====================================================================
73
+ // 例3: ストリーム反転のためのインデックス操作
74
+ // ====================================================================
75
+ // `.redirect()`メソッドを使用して、要素のインデックスを戦略的に再割り当てすることで要素を並べ替える方法を示し、反転などのカスタムパターンを可能にします。
76
+
77
+ const reversedArray: number[] = useFrom([1, 2, 3, 4, 5])
78
+ .redirect((_element: number, index: bigint): bigint => -index) // 負のインデックスにマッピング
79
+ .toOrdered() // 必須: 新しいインデックスでソートされた要素を収集
80
+ .toArray(); // 結果: [5, 4, 3, 2, 1]
81
+
82
+ // 単純な反転には、`.reverse()`も利用可能です。
83
+
84
+ // ====================================================================
85
+ // 例4: ストリームシャッフル
86
+ // ====================================================================
87
+ // インプレースシャッフルアルゴリズムを使用して、要素のインデックスをランダムに並べ替えます。
88
+
89
+ const shuffledArray: number[] = useFrom([1, 2, 3, 4, 5])
90
+ .shuffle() // インデックスをランダムに再割り当て
91
+ .toOrdered() // 新しいランダムなインデックスでソート
92
+ .toArray(); // 例: [2, 5, 1, 4, 3] (実行ごとに異なる)
93
+
94
+ // ====================================================================
95
+ // 例5: ストリームの循環ローテーション
96
+ // ====================================================================
97
+ // 要素を循環的にシフトします。正の値は右回転、負の値は左回転です。
98
+
99
+ // 右へ2ポジション回転
100
+ const rightRotated: number[] = useFrom([1, 2, 3, 4, 5])
101
+ .translate(2) // インデックスを右に2つシフト
102
+ .toOrdered()
103
+ .toArray(); // 結果: [4, 5, 1, 2, 3]
104
+
105
+ // ====================================================================
106
+ // 例6: 無限範囲での遅延評価
107
+ // ====================================================================
108
+ // 理論的に無限のストリームを遅延的に処理し、必要な時だけ要素を計算します。
109
+
110
+ const firstTenMultiples: bigint[] = useRange(0n, 1_000_000n)
111
+ .filter(n => n % 17n === 0n) // 17の倍数を保持
112
+ .limit(10n) // 重要: 10番目の一致後に停止
113
+ .toUnordered() // ソートは不要
114
+ .toArray(); // 結果: [0, 17, 34, 51, 68, 85, 102, 119, 136, 153]
115
+
116
+ // `.limit(10n)`がなければ、パイプラインは100万要素すべてを処理します。
117
+
118
+ // ====================================================================
119
+ // 例7: 複雑なパイプラインの構築
120
+ // ====================================================================
121
+ // 複数の操作を順次組み合わせる方法を示します。
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()
130
+ .toArray();
59
131
 
60
- // 静的配列から
61
- const staticStream = useFrom([1, 2, 3, 4, 5]);
132
+ // ====================================================================
133
+ // 例8: 管理されたDOMイベント購読
134
+ // ====================================================================
135
+ // 自動的でメモリリーク防止のクリーンアップ機能付きで、ブラウザイベントを監視します。
136
+ // `.limit(n)`の呼び出しは、リスナーの自動削除の境界を定義します。
137
+
138
+ // Windowターゲット用のサブスクライバーを定義
139
+ const windowSubscriber = {
140
+ mount: (target: Window): void => { /* セットアップロジック */ },
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 => { /* クリーンアップロジック */ }
148
+ };
149
+
150
+ useSubscription(window, windowSubscriber, "resize")
151
+ .limit(5n) // 5イベント後に自動的に購読解除
152
+ .toUnordered()
153
+ .forEach((ev: Event, idx) =>
154
+ console.log(`リサイズ #${idx}: ${(ev.target as Window).innerWidth}x${(ev.target as Window).innerHeight}`)
155
+ );
62
156
 
63
- // 非同期ジェネレーターから
64
- const asyncStream = useFrom(async function*() {
65
- yield 1;
66
- yield 2;
67
- });
157
+ // ====================================================================
158
+ // 例9: Unicodeコードポイントによる文字列処理
159
+ // ====================================================================
160
+ // マルチバイトUnicode文字を正しく処理しながら、文字列を反復処理します。
68
161
 
69
- // 時間ベースのストリーム
70
- const tickStream = useInterval(1000); // 毎秒発行
162
+ useText("My emotion now is: 😊, and semantic is 👍")
163
+ .toUnordered()
164
+ .log(); // 各文字(絵文字を含む)を改行して出力します。
71
165
 
72
- // DOMイベントストリーム(以下の重要な注意点を参照)
73
- const clickStream = useDocument('click');
74
- ```
166
+ // ====================================================================
167
+ // 例10: 循環参照を含むオブジェクトの安全な文字列化
168
+ // ====================================================================
169
+ // 循環参照を含むオブジェクトを安全にシリアライズします。
75
170
 
76
- ### 2. ストリームの変換(中間操作)
77
- 操作は遅延的に連鎖してパイプラインを定義します。
78
- ```typescript
79
- const processedStream = staticStream
80
- .filter(x => x % 2 === 0) // 偶数だけを保持
81
- .map(x => x * 10) // 10倍
82
- .flatMap(x => [x, x + 1]) // 各要素を2つに変換
83
- .distinct(); // 重複を削除
84
- // まだ何も実行されていません
85
- ```
171
+ const obj = {
172
+ a: 1,
173
+ b: "text"
174
+ };
175
+ (obj as any).c = [obj.a, obj.b, (obj as any).c]; // 循環参照を導入
86
176
 
87
- ### 3. ストリームの実行(終端操作)
88
- 結果を得るには、Collectableを取得し、終端操作を呼び出す必要があります。
89
- ```typescript
90
- // パフォーマンスのために順序なしcollectableを取得
91
- const resultArray = await processedStream.toUnordered().toArray();
92
- console.log(resultArray); // 例: [20, 21, 40, 41]
93
-
94
- // 組み込みコレクタを使用
95
- const sum = await processedStream.toUnordered().collect(useSummate());
96
- console.log(sum);
97
-
98
- // または汎用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
- );
177
+ // const text: string = JSON.stringify(obj); // エラーをスロー
178
+ const text: string = useStringify(obj); // 安全に `{a: 1, b: "text", c: []}` を生成
104
179
  ```
105
180
 
106
- ### 4. 重要:イベントストリームの操作
107
- イベントストリーム(useDocument、useWindow、useHTMLElement、useWebSocket)は本質的に無限です。イベントの収集を停止してストリームを完了するタイミングを定義するために、sub、takeWhile、limitなどの操作を使用する必要があります。そうしないと、終端操作は無期限に待機します。
108
- ```typescript
109
- import { useDocument } from 'semantic-typescript';
181
+ ---
110
182
 
111
- // 最初の5回のクリックだけを収集
112
- const first5Clicks = await useDocument('click')
113
- .limit(5) // <- 必須:ストリームを5つのイベントに制限
114
- .toUnordered()
115
- .toArray();
183
+ ### 核心概念
116
184
 
117
- // 10秒間のクリックを収集
118
- const clicksIn10s = await useDocument('click')
119
- .takeWhile((_, index, startTime = Date.now()) => Date.now() - startTime < 10000)
120
- .toUnordered()
121
- .toArray();
185
+ | 概念 | 目的 | 主な使用例 |
186
+ | :--- | :--- | :--- |
187
+ | `AsynchronousSemantic` | 非同期ストリーム、イベント、およびプッシュベースの遅延パイプラインのためのコアビルダー。 | リアルタイムイベント、WebSockets、DOMリスナー、または長時間実行/無限ストリーム。 |
188
+ | `SynchronousSemantic` | 同期、メモリ内、またはプルベースの即時評価パイプラインのビルダー。 | 静的データ、有限範囲、または即時の反復処理タスク。 |
189
+ | `toUnordered()` | 最速の終端コレクター。インデックス格納にMapを使用。 | 安定した順序が不要な性能重視のパス(時間・空間計算量 O(n))。 |
190
+ | `toOrdered()` | ソート済みでインデックスが安定した終端コレクター。 | 要素の順序を保持する必要がある場合、またはインデックスアクセスが必要な場合。 |
191
+ | `toNumericStatistics()` | `number`ストリームでの豊富な統計分析を可能にするコレクター。 | データ分析、メトリクス、統計計算。 |
192
+ | `toBigIntStatistics()` | `bigint`ストリームでの豊富な統計分析を可能にするコレクター。 | 大きな整数データセットの分析と統計。 |
193
+ | `toWindow()` | ストリームに対するスライディングおよびタンブリングウィンドウ操作を提供。 | 時系列分析、バッチ処理、ウィンドウ集計。 |
122
194
 
123
- // インデックス2から5(0ベース)のクリックを収集
124
- const specificClicks = await useDocument('click')
125
- .sub(2n, 6n) // <- インデックス2、3、4、5の要素を取得
126
- .toUnordered()
127
- .toArray();
128
- ```
195
+ ---
129
196
 
130
- **重要な洞察**: イベント(例:MouseEvent)とその連続的な発火インデックス(bigintとして)は、`accept(event, index)`コールバックを介してパイプラインを通して一緒に渡されます。
197
+ **必須の使用ルール**
131
198
 
132
- ### 5. 統計の活用
133
- ```typescript
134
- const numericStream = useFrom([10, 20, 30, 40, 50]).toNumeric();
135
- const average = await numericStream.average();
136
- const median = await numericStream.median();
137
- const standardDeviation = await numericStream.standardDeviation();
138
- const skewness = await numericStream.skewness();
139
- console.log(`平均: ${average}, 中央値: ${median}, 標準偏差: ${standardDeviation}`);
140
- ```
199
+ 1. **イベントストリーム**(`useSubscription`などのファクトリー経由で作成)は`AsynchronousSemantic`を返します。
200
+ → リスナーを終了させるために、`.limit(n)`、`.sub(start, end)`、`.takeWhile(predicate)`などの境界定義メソッドを**必ず**呼び出す必要があります。そうしないと、購読がアクティブなままになります。
141
201
 
142
- ## 主な機能
143
- - **デュアルストリームタイプ**: 同期(Iterable用)と非同期(AsyncIterableとイベント用)の両方のフルサポート
144
- - **豊富な操作セット**: filter, map, flatMap, concat, distinct, sorted, limit, skip, peek, reverse, shuffle
145
- - **柔軟な終端操作**: collect(カスタムコレクタ付き), toArray, toSet, toMap, forEach, reduce, findFirst, anyMatch, allMatch, count
146
- - **高度なコレクタ**: 連結、グループ化、分割、合計、平均、最大値、最小値のための組み込みコレクタ
147
- - **統計モジュール**: 数値/ bigintストリームに対する平均、中央値、最頻値、分散、標準偏差、範囲、分位数、歪度、尖度のためのすぐに使えるメソッド
148
- - **ユーティリティ関数**: 型ガード(isPromise、isAsyncIterable)、コンパレータ(useCompare)、トラバーサル(useTraverse)、変換フック
149
- - **Optional<T>**: null許容値のためのモナディックコンテナ。検索操作と統合されています。
150
-
151
- ## API概要
152
- ### コアクラス&インターフェース
153
- - `Semantic<E>` / `AsynchronousSemantic<E>`: 抽象ストリーム定義
154
- - `Collectable<E>` / `AsynchronousCollectable<E>`: 終端操作を持つ実行可能ストリーム
155
- - `OrderedCollectable<E>` / `UnorderedCollectable<E>`: 順序に敏感または順序に敏感でない操作に最適化された実体化バージョン
156
- - `Collector<E, A, R>`: 可変リダクション操作の抽象化
157
-
158
- ### ファクトリ関数(use*)
159
- - **ソースから**: useFrom, useRange, useFill, useEmpty
160
- - **時間から**: useInterval, useAnimationFrame
161
- - **Web APIから**: useBlob, useDocument, useWindow, useHTMLElement, useWebSocket
162
- - **コレクタ**: useToArray, useGroupBy, useSummate, useJoin など
163
-
164
- ## パフォーマンスに関する注意点
165
- - **遅延評価**: パイプラインは、終端操作が呼び出されるまで実行されずに構成されます
166
- - **短絡評価**: limit、anyMatch、findFirstなどの操作は、結果が決定するとすぐに要素の処理を停止します
167
- - **順序あり vs 順序なし**:
168
- - ソース要素の順序が結果に影響しない終端操作(例:合計、最大値、またはtoSet)の場合、`.toUnordered()`を使用します。これにより、高価なソートステップをスキップする内部最適化が可能になる場合があります
169
- - シーケンスが重要な場合(例:順序を保持する必要があるtoArray)には、`.toOrdered()`を使用します
170
-
171
- ## はじめの一歩の例
172
- ```typescript
173
- import { useFrom, useSummate, useGroupBy } from 'semantic-typescript';
174
-
175
- interface Transaction {
176
- id: number;
177
- amount: number;
178
- category: string;
179
- }
180
-
181
- const transactions: Transaction[] = [
182
- { id: 1, amount: 100, category: 'Food' },
183
- { id: 2, amount: 200, category: 'Electronics' },
184
- { id: 3, amount: 50, category: 'Food' },
185
- { id: 4, amount: 300, category: 'Electronics' },
186
- ];
187
-
188
- // カテゴリごとの合計金額を計算
189
- const totalsByCategory = await useFrom(transactions)
190
- .toUnordered()
191
- .collect(
192
- useGroupBy(
193
- t => t.category,
194
- t => t.amount,
195
- useSummate() // 値のためのコレクタ
196
- )
197
- );
202
+ 2. **終端操作**(`.toArray()`、`.count()`、`.forEach()`、`.findFirst()`など)は、パイプラインをコレクターに変換した**後にのみ**利用可能です:
203
+ ```typescript
204
+ .toUnordered() // 最大速度のため、順序は保証されません。
205
+ // または
206
+ .toOrdered() // 安定した、ソートされた出力のため。
207
+ // または
208
+ .toNumericStatistics() // 統計メソッドのため。
209
+ ```
198
210
 
199
- console.log(totalsByCategory); // Map { 'Food' => 150, 'Electronics' => 500 }
200
- ```
211
+ ---
212
+
213
+ ### パフォーマンス特性
214
+
215
+ | コレクター | 時間計算量 | 空間計算量 | 順序保証? | 理想的なシナリオ |
216
+ | :--- | :--- | :--- | :--- | :--- |
217
+ | `toUnordered()` | O(n) | O(n) | いいえ | 生のスループットが鍵。最終的な順序は重要でない。 |
218
+ | `toOrdered()` | O(n log n) | O(n) | はい(ソート済み) | 安定した順序、インデックスアクセス、または統計用の事前ソートが必要な場合。 |
219
+ | `toNumericStatistics()` | O(n log n) | O(n) | はい(内部ソート) | ソートされたデータを必要とする統計操作の実行。 |
220
+ | `toBigIntStatistics()` | O(n log n) | O(n) | はい(内部ソート) | BigIntデータでの統計操作。 |
221
+ | `toWindow()` | O(n log n) | O(n) | はい(内部ソート) | ソートされたインデックスから恩恵を受けるウィンドウ操作。 |
222
+
223
+ 絶対的な速度が最重要である場合は`toUnordered()`を選択してください。ロジックが要素の順序に依存する場合にのみ、`toOrdered()`または統計コレクターを選択してください。
224
+
225
+ ---
226
+
227
+ **現代ストリームライブラリとの比較分析**
228
+
229
+ | 機能 | Semantic‑TypeScript | RxJS | ネイティブ Async Iterators / Generators | Most.js |
230
+ | :--- | :--- | :--- | :--- | :--- |
231
+ | **TypeScript統合** | ファーストクラス、深い型付け、インデックス認識を内包。 | 優れているが、複雑なジェネリックチェーンを伴うことが多い。 | 良いが、手動の型注釈が必要。 | 強い、関数型ファーストの型付けスタイル。 |
232
+ | **組み込み統計分析** | `number`および`bigint`に対する包括的なネイティブサポート。 | ネイティブでは利用不可(カスタムオペレーターまたは他のライブラリが必要)。 | なし。 | なし。 |
233
+ | **インデックス作成と位置認識** | 各要素に対するネイティブで強力なBigIntインデックス作成。 | カスタムオペレーターが必要(例: `scan`、`withLatestFrom`)。 | 手動でのカウンター管理が必要。 | 基本的、組み込みのインデックスプロパティなし。 |
234
+ | **イベントストリーム管理** | 明示的で宣言的なライフサイクル制御を備えた、型安全な専用ファクトリー。 | 強力だが、メモリリークを防ぐためには注意深い手動購読管理が必要。 | イベントリスナーの手動登録とキャンセルトークンの管理。 | 良い`fromEvent`、一般的に軽量。 |
235
+ | **パフォーマンスとメモリ** | 卓越 – 最適化された`toUnordered()`および`toOrdered()`コレクターを提供。 | 非常に良いが、深いオペレーターチェーンはオーバーヘッドをもたらす可能性あり。 | 優れている(ネイティブオーバーヘッド最小限)。 | 優れている。 |
236
+ | **バンドルサイズ** | 非常に軽量。 | 大きい(ツリーシェイキング後でも)。 | ゼロ(言語のネイティブ機能)。 | 小さい。 |
237
+ | **API設計思想** | 明示的なインデックス意味論を持つ関数型コレクターパターン。 | リアクティブObservableパターン。 | 命令型Iterator / 宣言型Generatorパターン。 | 関数型、ポイントフリー構成。 |
238
+ | **フロー制御** | 明示的(`interrupt`、`.limit()`、`.takeWhile()`、`.sub()`)。 | 良い(`take`、`takeUntil`、`first`)。 | 手動(ループ内の`break`)。 | 良い(`take`、`until`)。 |
239
+ | **同期および非同期サポート** | 統一API – 両パラダイムに対するファーストクラスサポート。 | 主に非同期。 | 両方サポートされているが、手動ブリッジが必要。 | 主に非同期。 |
240
+ | **学習曲線** | 関数型およびインデックス付きコレクションパイプラインに慣れた開発者には穏やか。 | 急(オペレーター語彙が広範、Hot/Cold Observable概念)。 | 低から中程度。 | 中程度。 |
241
+
242
+ **Semantic‑TypeScriptの利点**
243
+
244
+ * **独自の能力:** 組み込みの統計およびインデックス作成機能により、手動の`reduce`操作や補助的なデータ分析ライブラリの必要性がなくなります。
245
+ * **予測可能なリソース管理:** イベントストリームに対する明示的な制御により、RxJSアプリケーションで発生しうる微妙なメモリリークを防止します。
246
+ * **統一された設計:** 同期および非同期ワークフロー両方の一貫したAPIにより、認知負荷とコード重複が減少します。
247
+
248
+ この比較は、従来のリアクティブフレームワークの複雑さなしに、高いパフォーマンス、堅牢な型安全性、および豊富なデータ処理機能を要求する現代のTypeScriptアプリケーションに、Semantic‑TypeScriptが特に適している理由を強調しています。
249
+
250
+ ---
251
+
252
+ ### 探求を始めよう
253
+
254
+ Semantic‑TypeScriptは、複雑なデータフローを読みやすく、構成可能で、高性能なパイプラインに変換します。リアルタイムUIイベントの処理、大規模データセットの処理、分析ダッシュボードの構築のいずれにおいても、データベースレベルのインデックス作成のパワーと関数型プログラミングのエレガンスを提供します。
255
+
256
+ **次のステップ:**
257
+
258
+ * IDE内で直接、完全に型付けされたAPIを探索してください(すべてのエクスポートはメインパッケージエントリーポイントから利用可能です)。
259
+ * 複雑な非同期イテレータやリアクティブチェーンを、明確で意図的なSemanticパイプラインに置き換えた開発者の成長するコミュニティに参加してください。
260
+
261
+ **Semantic‑TypeScript** – ストリームと構造が出会う場所。
262
+
263
+ 今日から構築を始め、考え抜かれたインデックス作成がもたらす明確な違いを体験してください。
201
264
 
202
- Semantic-TypeScriptは、厳密に設計された、型安全で高性能なストリーム処理ライブラリを求める開発者のために構築されています。これは、エンタープライズレベルのデータ変換パターンの力をTypeScriptエコシステムにもたらし、データ集約型のフロントエンドアプリケーション、Node.jsデータ処理、シーケンスのエレガントで効率的な処理が必要とされるあらゆるシナリオに最適です。
265
+ **明確さをもって構築し、自信をもって前進し、意図をもってデータを変換する。**
203
266
 
204
- [![GitHub](./GitHub.png)](https://github.com/eloyhere/semantic-typescript) [![NPM](./NPM.png)](https://www.npmjs.com/package/semantic-typescript)
267
+ MIT © Eloy Kim