semantic-typescript 0.5.3 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/readme.jp.md CHANGED
@@ -1,484 +1,222 @@
1
- # Semantic-TypeScript ストリーム処理ライブラリ
1
+ # Semantic-TypeScript
2
+ フローにインデックスを。データを精密に制御。
2
3
 
3
- ## 序論
4
+ ---
4
5
 
5
- Semantic-TypeScriptは、JavaScriptのGeneratorFunction、JavaのStream、MySQLのIndexに触発された現代的なストリーム処理ライブラリです。その中心的な設計哲学は、データインデックスを使用して効率的なデータ処理パイプラインを構築することに基づいており、フロントエンド開発のための型安全で関数型のストリーミング操作体験を提供します。
6
+ ### 概要
6
7
 
7
- 従来の同期処理とは異なり、Semanticは非同期処理モデルを採用しています。データストリームを作成する際、ターミナルがデータを受信するタイミングは、アップストリームが`accept`と`interrupt`コールバック関数を呼び出すタイミングに完全に依存します。この設計により、ライブラリはリアルタイムデータストリーム、大規模なデータセット、非同期データソースを洗練された方法で処理することができます。
8
+ Semantic-TypeScriptは、JavaScriptの`GeneratorFunction`、Java Streams、MySQLスタイルのインデックスといった最も効果的な概念を統合し、ストリーム処理技術において大きな飛躍を遂げました。その中核にある哲学はシンプルかつ強力です。それは、力任せの反復処理ではなく、インテリジェントなインデックス付けを通じて、非常に効率的なデータ処理パイプラインを構築することです。
8
9
 
9
- ## インストール
10
+ 従来のライブラリが同期的なループや扱いにくいPromiseチェーンを強いる場面で、Semantic-TypeScriptは、モダンなフロントエンド開発の要求に応える、完全非同期、関数型的に純粋、厳密なタイプセーフを備えた体験を提供します。
10
11
 
11
- ```bash
12
- npm install semantic-typescript
13
- ```
12
+ その洗練されたモデルでは、データは上流のパイプラインが明示的に`accept`(およびオプションで`interrupt`)コールバックを呼び出した時にのみ、コンシューマーに到達します。必要な**正確なタイミング**において、完全な制御をあなたが握ります。
14
13
 
15
- ## 基本的な型
16
-
17
- | 型 | 説明 |
18
- |------|-------------|
19
- | `Invalid<T>` | `null`または`undefined`から派生した型 |
20
- | `Valid<T>` | `null`と`undefined`を除外した型 |
21
- | `MaybeInvalid<T>` | `null`または`undefined`である可能性がある型 |
22
- | `Primitive` | プリミティブ型の集合 |
23
- | `MaybePrimitive<T>` | プリミティブ型である可能性がある型 |
24
- | `OptionalSymbol` | `Optional`クラスのシンボル識別子 |
25
- | `SemanticSymbol` | `Semantic`クラスのシンボル識別子 |
26
- | `CollectorsSymbol` | `Collector`クラスのシンボル識別子 |
27
- | `CollectableSymbol` | `Collectable`クラスのシンボル識別子 |
28
- | `OrderedCollectableSymbol` | `OrderedCollectable`クラスのシンボル識別子 |
29
- | `WindowCollectableSymbol` | `WindowCollectable`クラスのシンボル識別子 |
30
- | `StatisticsSymbol` | `Statistics`クラスのシンボル識別子 |
31
- | `NumericStatisticsSymbol` | `NumericStatistics`クラスのシンボル識別子 |
32
- | `BigIntStatisticsSymbol` | `BigIntStatistics`クラスのシンボル識別子 |
33
- | `UnorderedCollectableSymbol` | `UnorderedCollectable`クラスのシンボル識別子 |
34
-
35
- ## 関数指向のインターフェース
36
-
37
- | インターフェース | 説明 |
38
- |-----------|-------------|
39
- | `Runnable` | パラメータがなく戻り値もない関数 |
40
- | `Supplier<R>` | パラメータがなく`R`を返す関数 |
41
- | `Functional<T, R>` | 単一パラメータの変換関数 |
42
- | `BiFunctional<T, U, R>` | 二つのパラメータの変換関数 |
43
- | `TriFunctional<T, U, V, R>` | 三つのパラメータの変換関数 |
44
- | `Predicate<T>` | 単一パラメータの述語関数 |
45
- | `BiPredicate<T, U>` | 二つのパラメータの述語関数 |
46
- | `TriPredicate<T, U, V>` | 三つのパラメータの述語関数 |
47
- | `Consumer<T>` | 単一パラメータのコンシューマ関数 |
48
- | `BiConsumer<T, U>` | 二つのパラメータのコンシューマ関数 |
49
- | `TriConsumer<T, U, V>` | 三つのパラメータのコンシューマ関数 |
50
- | `Comparator<T>` | 二つのパラメータの比較関数 |
51
- | `Generator<T>` | ジェネレータ関数(コアと基盤) |
14
+ ---
52
15
 
53
- ```typescript
54
- // 型の使用例
55
- let predicate: Predicate<number> = (n: number): boolean => n > 0;
56
- let mapper: Functional<string, number> = (text: string): number => text.length;
57
- let comparator: Comparator<number> = (a: number, b: number): number => a - b;
58
- ```
16
+ ### 開発者が選ぶ理由
59
17
 
60
- ## 型ガード
61
-
62
- | 関数 | 説明 | 時間複雑度 | 空間複雑度 |
63
- |------|------|------------|------------|
64
- | `validate<T>(t: MaybeInvalid<T>): t is T` | 値がnullまたはundefinedではないかを検証 | O(1) | O(1) |
65
- | `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | 値がnullまたはundefinedかを検証 | O(1) | O(1) |
66
- | `isBoolean(t: unknown): t is boolean` | 値がbooleanかをチェック | O(1) | O(1) |
67
- | `isString(t: unknown): t is string` | 値が文字列かをチェック | O(1) | O(1) |
68
- | `isNumber(t: unknown): t is number` | 値が数値かをチェック | O(1) | O(1) |
69
- | `isFunction(t: unknown): t is Function` | 値が関数かをチェック | O(1) | O(1) |
70
- | `isObject(t: unknown): t is object` | 値がオブジェクトかをチェック | O(1) | O(1) |
71
- | `isSymbol(t: unknown): t is symbol` | 値がシンボルかをチェック | O(1) | O(1) |
72
- | `isBigint(t: unknown): t is bigint` | 値がBigIntかをチェック | O(1) | O(1) |
73
- | `isPrimitive(t: unknown): t is Primitive` | 値がプリミティブ型かをチェック | O(1) | O(1) |
74
- | `isIterable(t: unknown): t is Iterable<unknown>` | 値が反復可能オブジェクトかをチェック | O(1) | O(1) |
75
- | `isOptional(t: unknown): t is Optional<unknown>` | 値がOptionalインスタンスかをチェック | O(1) | O(1) |
76
- | `isSemantic(t: unknown): t is Semantic<unknown>` | 値がSemanticインスタンスかをチェック | O(1) | O(1) |
77
- | `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | 値がCollectorインスタンスかをチェック | O(1) | O(1) |
78
- | `isCollectable(t: unknown): t is Collectable<unknown>` | 値がCollectableインスタンスかをチェック | O(1) | O(1) |
79
- | `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | 値がOrderedCollectableインスタンスかをチェック | O(1) | O(1) |
80
- | `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | 値がWindowCollectableインスタンスかをチェック | O(1) | O(1) |
81
- | `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | 値がUnorderedCollectableインスタンスかをチェック | O(1) | O(1) |
82
- | `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | 値がStatisticsインスタンスかをチェック | O(1) | O(1) |
83
- | `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | 値がNumericStatisticsインスタンスかをチェック | O(1) | O(1) |
84
- | `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | 値がBigIntStatisticsインスタンスかをチェック | O(1) | O(1) |
85
- | `isPromise(t: unknown): t is Promise<unknown>` | 値がPromiseオブジェクトかをチェック | O(1) | O(1) |
86
- | `isAsync(t: unknown): t is AsyncFunction` | 値がAsyncFunctionかをチェック | O(1) | O(1) |
18
+ ・**ボイラープレートなしのインデックス付け** — あらゆる要素が、自然または独自のインデックスを保持します。
87
19
 
88
- ```typescript
89
- // 型ガードの使用例
90
- let value: unknown = "hello";
91
-
92
- if (isString(value)) {
93
- console.log(value.length); // 型安全、valueはstringと推論される
94
- }
95
-
96
- if (isOptional(someValue)) {
97
- someValue.ifPresent((value): void => console.log(val));
98
- }
99
-
100
- if(isIterable(value)){
101
- // 型安全、今やそれは反復可能なオブジェクトです。
102
- for(let item of value){
103
- console.log(item);
104
- }
105
- }
106
- ```
20
+ ・**純粋関数型スタイル** — 完全なTypeScriptの型推論を伴います。
107
21
 
108
- ## ユーティリティ関数
22
+ ・**リーク対策済みイベントストリーム** — `useWindow`、`useDocument`、`useHTMLElement`、`useWebSocket`は安全性を考慮して構築されています。`limit(n)`、`sub(start, end)`、`takeWhile(predicate)`を使って境界を定義すれば、ライブラリがクリーンアップを管理します。残存するリスナーもメモリリークもありません。
109
23
 
110
- | 関数 | 説明 | 時間複雑度 | 空間複雑度 |
111
- |------|------|------------|------------|
112
- | `useCompare<T>(t1: T, t2: T): number` | 一般的な比較関数 | O(1) | O(1) |
113
- | `useRandom<T = number \| bigint>(index: T): T` | 疑似乱数生成器 | O(log n) | O(1) |
24
+ ・**組み込み統計機能** 平均、中央値、最頻値、分散、歪度、尖度を含む、包括的な数値(`number`/`bigint`)分析。
114
25
 
115
- ```typescript
116
- // ユーティリティ関数の使用例
117
- let numbers: Array<number> = [3, 1, 4, 1, 5];
118
- numbers.sort(useCompare); // [1, 1, 3, 4, 5]
26
+ ・**予測可能なパフォーマンス** — 要件に基づいて、順序付きまたは順序なしのコレクターを選択できます。
119
27
 
120
- let randomNum = useRandom(42); // シードベースの乱数
121
- ```
28
+ ・**メモリ効率** ストリームは遅延評価されるため、メモリの懸念を軽減します。
122
29
 
123
- ## ファクトリメソッド
30
+ ・**未定義動作なし** — TypeScriptが型安全性とnull安全性を保証します。入力データは、コールバック関数内で明示的に変更されない限り、変更されません。
124
31
 
125
- ### Optionalのファクトリメソッド
32
+ ---
126
33
 
127
- | メソッド | 説明 | 時間複雑度 | 空間複雑度 |
128
- |------|------|------------|------------|
129
- | `Optional.empty<T>()` | 空のOptionalを作成 | O(1) | O(1) |
130
- | `Optional.of<T>(value)` | 値を含むOptionalを作成 | O(1) | O(1) |
131
- | `Optional.ofNullable<T>(value)` | 可能に空のOptionalを作成 | O(1) | O(1) |
132
- | `Optional.ofNonNull<T>(value)` | nullでないOptionalを作成 | O(1) | O(1) |
34
+ ### インストール
133
35
 
134
- ```typescript
135
- // Optionalの使用例
136
- let empty: Optional<number> = Optional.empty();
137
- let present: Optional<number> = Optional.of(42);
138
- let nullable: Optional<string> = Optional.ofNullable<string>(null);
139
- let nonNull: Optional<string> = Optional.ofNonNull("hello");
140
-
141
- present.ifPresent((val: number): void => console.log(val)); // 42を出力
142
- console.log(emptyOpt.get(100)); // 100を出力
36
+ ```bash
37
+ npm install semantic-typescript
38
+ ```
39
+ または
40
+ ```bash
41
+ yarn add semantic-typescript
143
42
  ```
144
43
 
145
- ### Collectorのファクトリメソッド
44
+ ---
146
45
 
147
- | メソッド | 説明 | 時間複雑度 | 空間複雑度 |
148
- |------|------|------------|------------|
149
- | `Collector.full(identity, accumulator, finisher)` | 完全なCollectorを作成 | O(1) | O(1) |
150
- | `Collector.shortable(identity, interruptor, accumulator, finisher)` | 中断可能なCollectorを作成 | O(1) | O(1) |
46
+ ### クイックスタート
151
47
 
152
48
  ```typescript
153
- // Collectorの変換例
154
- let numbers: Semantic<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
155
-
156
- // 性能優先: 未順序のCollectorを使用
157
- let unordered: UnorderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
158
- .filter((n: number): boolean => n > 3)
159
- .toUnordered(); // 最高の性能
160
-
161
- // 順序が必要: 順序付けられたCollectorを使用
162
- let ordered: OrderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
163
- .sorted();
164
-
165
- // 要素数をカウント
166
- let count: Collector<number, number, number> = Collector.full(
167
- (): number => 0, // 初期値
168
- (accumulator: number, element: number): number => accumulator + element, // 累積
169
- (accumulator: number): number => accumulator // 完了
170
- );
171
- count.collect(from([1,2,3,4,5])); // ストリームからカウント
172
- count.collect([1,2,3,4,5]); // 反復可能オブジェクトからカウント
173
-
174
- let find: Optional<number> = Collector.shortable(
175
- (): Optional<number> => Optional.empty(), // 初期値
176
- (element: number, index: bigint, accumulator: Optional<number>): Optional<number> => accumulator.isPresent(), // 中断
177
- (accumulator: Optional<number>, element: number, index: bigint): Optional<number> => Optional.of(element), // 累積
178
- (accumulator: Optional<number>): Optional<number> => accumulator // 完了
179
- );
180
- find.collect(from([1,2,3,4,5])); // 最初の要素を見つける
181
- find.collect([1,2,3,4,5]); // 最初の要素を見つける
49
+ import { useOf, useFrom, useRange, useWindow, useHTMLElement, useWebSocket, useText, useStringify } from "semantic-typescript";
50
+
51
+ // 数値の統計
52
+ let summate: number = useOf(10, 20, 30, 40)
53
+ .map((n: number): number => n * 2)
54
+ .toNumericStatistics() // 終端操作の前に必須
55
+ .summate(); // 200
56
+
57
+ // Bigintの統計
58
+ let summate: bigint = useOf(10n, 20n, 30n, 40n)
59
+ .map((n: bigint): bigint => n * 2)
60
+ .toBigIntStatistics() // 終端操作の前に必須
61
+ .summate(); // 200n
62
+
63
+ // インデックスでストリームを逆順に
64
+ useFrom([1, 2, 3, 4, 5])
65
+ .redirect((element: E, index: bigint): bigint => -index) // 負のインデックスで逆順
66
+ .toOrdered() // toOrdered() を呼び出してインデックス順を維持
67
+ .toArray(); // [5, 4, 3, 2, 1]
68
+
69
+ // ストリームをシャッフル
70
+ useFrom([1, 2, 3, 4, 5])
71
+ .shuffle()
72
+ .toOrdered()
73
+ .toArray(); // 例: [2, 5, 1, 4, 3]
74
+
75
+ // ストリーム内の要素を平行移動
76
+ useFrom([1, 2, 3, 4, 5])
77
+ .translate(2) // 要素を2位置右にシフト
78
+ .toOrdered()
79
+ .toArray(); // [4, 5, 1, 2, 3]
80
+
81
+ useFrom([1, 2, 3, 4, 5])
82
+ .translate(-2) // 要素を2位置左にシフト
83
+ .toOrdered()
84
+ .toArray(); // [3, 4, 5, 1, 2]
85
+
86
+ // 早期終了付きの無限レンジ
87
+ useRange(0n, 1_000_000n)
88
+ .filter(n => n % 17n === 0n)
89
+ .limit(10n) // 10要素で停止
90
+ .toUnordered()
91
+ .toArray();
92
+
93
+ // リアルタイムウィンドウリサイズ (5イベント後に自動停止)
94
+ useWindow("resize")
95
+ .limit(5n) // イベントストリームでは重要
96
+ .toUnordered()
97
+ .forEach((ev, idx) => console.log(`リサイズ #${idx}`));
98
+
99
+ // HTML要素のリスニング
100
+ // <input id="input" type="text"/>
101
+ useHTMLElement("#input", "change")
102
+ .limit(1)
103
+ .toUnordered()
104
+ .forEach((event: Event) => submit(event));
105
+
106
+ // 複数要素とイベントのリスニング
107
+ useHTMLElement("input", ["change", "keyup"])
108
+ .takeWhile((event: Event): boolean => validate(event))
109
+ .toUnordered()
110
+ .forEach((event: Event) => submit(event));
111
+
112
+ // WebSocketのリスニング
113
+ let webSocket = new WebSocket("ws://localhost:8080");
114
+ webSocket.addEventListener("close", (): void => {
115
+ webSocket.close(); // WebSocketのライフサイクルは手動で管理
116
+ });
117
+ useWebSocket(webSocket, "message")
118
+ .limit(1)
119
+ .toUnordered()
120
+ .forEach((message: MessageEvent) => console.log(message.data));
121
+
122
+ // 文字列をコードポイントでイテレート
123
+ useText("My emotion now is: 😊, and semantic is 👍")
124
+ .toUnordered()
125
+ .log(); // 文字列を出力
126
+
127
+ // 循環参照を含むオブジェクトを安全に文字列化
128
+ let o = {
129
+ a: 1,
130
+ b: "text",
131
+ c: [o.a, o.b, o.c] // 循環参照
132
+ };
133
+ // let text: string = JSON.stringify(o); // エラーをスロー
134
+ let text: string = useStringify(o); // 安全に `{a: 1, b: "text", c: []}` を生成
182
135
  ```
183
136
 
184
- ### Semanticのファクトリメソッド
137
+ ---
185
138
 
186
- | メソッド | 説明 | 時間複雑度 | 空間複雑度 |
187
- |------|------|------------|------------|
188
- | `animationFrame(period: number, delay: number = 0)` | 時間ベースのアニメーションフレームストリームを作成 | O(1)* | O(1) |
189
- | `blob(blob, chunkSize)` | Blobからストリームを作成 | O(n) | O(chunkSize) |
190
- | `empty<E>()` | 空のストリームを作成 | O(1) | O(1) |
191
- | `fill<E>(element, count)` | 埋められたストリームを作成 | O(n) | O(1) |
192
- | `from<E>(iterable)` | 反復可能オブジェクトからストリームを作成 | O(1) | O(1) |
193
- | `interval(period, delay?)` | 時間ベースのインターバルストリームを作成 | O(1)* | O(1) |
194
- | `iterate<E>(generator)` | ジェネレータからストリームを作成 | O(1) | O(1) |
195
- | `range(start, end, step)` | 数値範囲のストリームを作成 | O(n) | O(1) |
196
- | `websocket(websocket)` | WebSocketからストリームを作成 | O(1) | O(1) |
139
+ ### コアコンセプト
197
140
 
198
- ```typescript
199
- // Semanticのファクトリメソッドの使用例
200
-
201
- // 時間ベースのアニメーションフレームからストリームを作成
202
- animationFrame(1000)
203
- .toUnordered()
204
- .forEach(frame => console.log(frame));
205
-
206
- // Blobからストリームを作成(チャンク読み取り)
207
- blob(someBlob, 1024n)
208
- .toUnordered()
209
- .write(WritableStream)
210
- .then(callback) // ストリームの書き込み成功
211
- .catch(callback); // ストリームの書き込み失敗
212
-
213
- // 結合されるまで実行されない空のストリームを作成
214
- empty<string>()
215
- .toUnordered()
216
- .join(); // []
217
-
218
- // 埋められたストリームを作成
219
- let filledStream = fill("hello", 3); // "hello", "hello", "hello"
220
-
221
- // 初期遅延2秒、実行周期5秒の時間ベースのストリームを作成、タイマーメカニズムに基づいて実装されています。システムスケジュールの精度制限により時間のドリフトが発生する可能性があります。
222
- let intervalStream = interval(5000, 2000);
223
-
224
- // 反復可能オブジェクトからストリームを作成
225
- let numberStream = from([1, 2, 3, 4, 5]);
226
- let stringStream = from(new Set(["Alex", "Bob"]));
227
-
228
- // 数値範囲のストリームを作成
229
- let rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
230
-
231
- // WebSocketイベントストリーム
232
- let ws = new WebSocket("ws://localhost:8080");
233
- websocket(ws)
234
- .filter((event): boolean => event.type === "message") // メッセージイベントのみをリッスン
235
- .toUnordered() // イベントは通常順序付けられていません
236
- .forEach((event): void => receive(event)); // メッセージを受信
237
- ```
141
+ | 概念 | 目的 | 使用する場面 |
142
+ | :--- | :--- | :--- |
143
+ | `AsynchronousSemantic` | 非同期ストリーム、イベント、遅延パイプラインのためのコアビルダー。 | リアルタイムイベント、WebSockets、DOMリスナー、長時間実行または無限ストリーム。 |
144
+ | `SynchronousSemantic` | 同期、インメモリ、ループベースのストリームのビルダー。 | 静的なデータ、レンジ、即時イテレーション。 |
145
+ | `toUnordered()` | 最速の終端コレクター(マップベースのインデックス付け)。 | パフォーマンスが重要なパス(O(n) 時間 & 空間、ソートなし)。 |
146
+ | `toOrdered()` | ソート済み、インデックス安定のコレクター。 | 安定した順序付けまたはインデックス付きアクセスが必要な場合。 |
147
+ | `toNumericStatistics()` | 豊富な数値統計分析(平均、中央値、分散、歪度、尖度など)。 | データ分析と統計計算。 |
148
+ | `toBigIntStatistics()` | 豊富なbigint統計分析。 | 大きな整数に対するデータ分析と統計計算。 |
149
+ | `toWindow()` | スライディングおよびタンブリングウィンドウのサポート。 | 時系列処理、バッチ処理、ウィンドウ操作。 |
238
150
 
239
- ## Semanticクラスメソッド
240
-
241
- | メソッド | 説明 | 時間複雑度 | 空間複雑度 |
242
- |------|------|------------|------------|
243
- | `concat(other)` | 二つのストリームを結合 | O(n) | O(1) |
244
- | `distinct()` | 重複を削除 | O(n) | O(n) |
245
- | `distinct(comparator)` | 比較子を使用して重複を削除 | O(n²) | O(n) |
246
- | `dropWhile(predicate)` | 条件を満たす要素を破棄 | O(n) | O(1) |
247
- | `filter(predicate)` | 要素をフィルター | O(n) | O(1) |
248
- | `flat(mapper)` | フラットマッピング | O(n × m) | O(1) |
249
- | `flatMap(mapper)` | 新しい型にフラットマッピング | O(n × m) | O(1) |
250
- | `limit(n)` | 要素数を制限 | O(n) | O(1) |
251
- | `map(mapper)` | マッピング変換 | O(n) | O(1) |
252
- | `peek(consumer)` | 要素を覗く | O(n) | O(1) |
253
- | `redirect(redirector)` | インデックスをリダイレクト | O(n) | O(1) |
254
- | `reverse()` | ストリームを逆転 | O(n) | O(1) |
255
- | `shuffle()` | ランダムにシャッフル | O(n) | O(1) |
256
- | `shuffle(mapper)` | マッパーを使用してシャッフル | O(n) | O(1) |
257
- | `skip(n)` | 最初のn要素をスキップ | O(n) | O(1) |
258
- | `sorted()` | ソート | O(n log n) | O(n) |
259
- | `sorted(comparator)` | 比較子を使用してソート | O(n log n) | O(n) |
260
- | `sub(start, end)` | サブストリームを取得 | O(n) | O(1) |
261
- | `takeWhile(predicate)` | 条件を満たす要素を取得 | O(n) | O(1) |
262
- | `translate(offset)` | インデックスを変換 | O(n) | O(1) |
263
- | `translate(translator)` | 変換子を使用してインデックスを変換 | O(n) | O(1) |
151
+ ---
264
152
 
265
- ```typescript
266
- // Semantic操作の例
267
- let result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
268
- .filter((n: number): boolean => n % 2 === 0) // 偶数をフィルター
269
- .map((n: number): number => n * 2) // 2倍にする
270
- .skip(1) // 最初のものをスキップ
271
- .limit(3) // 3要素に制限
272
- .toUnordered() // 順序付けられていないCollectorに変換
273
- .toArray(); // 配列に変換
274
- // 結果: [8, 12, 20]
275
-
276
- // 複雑な操作の例
277
- let complexResult = range(1, 100, 1)
278
- .flatMap((n: number): Semantics<number> => from([n, n * 2])) // 各要素を二つにマッピング
279
- .distinct() // 重複を削除
280
- .shuffle() // 順序をシャッフル
281
- .takeWhile((n: number): boolean => n < 50) // 50未満の要素を取る
282
- .toOrdered() // 順序付けられたCollectorに変換
283
- .toArray(); // 配列に変換
284
- ```
153
+ 重要な使用ルール
285
154
 
286
- ## Semanticの変換メソッド
155
+ 1. イベントストリーム(`useWindow`、`useDocument`、`useHTMLElement`、`useWebSocket`、…)は `AsynchronousSemantic` を返します。
156
+ → リスニングを停止するには、`.limit(n)`、`.sub(start, end)`、または `.takeWhile()` を呼び出す**必須**です。そうしないと、リスナーはアクティブなままになります。
287
157
 
288
- | メソッド | 説明 | 時間複雑度 | 空間複雑度 |
289
- |------------|------------|------------|------------|
290
- | `sorted()` | 順序付けられたCollectorに変換 | O(n log n) | O(n) |
291
- | `toUnordered()` | 順序付けられていないCollectorに変換 | O(1) | O(1) |
292
- | `toOrdered()` | 順序付けられたCollectorに変換 | O(1) | O(1) |
293
- | `toNumericStatistics()` | 数値統計に変換 | O(n) | O(1) |
294
- | `toBigintStatistics()` | BigInt統計に変換 | O(n) | O(1) |
295
- | `toWindow()` | ウィンドウコレクターに変換 | O(1) | O(1) |
296
- | `toCollectable()` | `UnorderdCollectable`に変換 | O(n) | O(1) |
297
- | `toCollectable(mapper)` | カスタマイズされたCollectableに変換 | O(n) | O(1) |
158
+ 2. 終端操作(`.toArray()`、`.count()`、`.average()`、`.reduce()`、`.findFirst()` など)は、コレクターに変換した後にのみ利用可能です:
159
+ ```typescript
160
+ .toUnordered() // O(n) 時間 & 空間、ソートなし
161
+ // または
162
+ .toOrdered() // ソート済み、順序を維持
163
+ ```
298
164
 
299
- ```typescript
300
- // 昇順に並べ替えられた配列に変換
301
- from([6,4,3,5,2]) // ストリームを作成
302
- .sorted() // ストリームを昇順に並べ替え
303
- .toArray(); // [2, 3, 4, 5, 6]
304
-
305
- // 降順に並べ替えられた配列に変換
306
- from([6,4,3,5,2]) // ストリームを作成
307
- .soted((a: number, b: number): number => b - a) // ストリームを降順に並べ替え
308
- .toArray(); // [6, 5, 4, 3, 2]
309
-
310
- // 逆順の配列にリダイレクト
311
- from([6,4,3,5,2])
312
- .redirect((element, index): bigint => -index) // 逆順にリダイレクト
313
- .toOrderd() // リダイレクトされた順序を保持
314
- .toArray(); // [2, 5, 3, 4, 6]
315
-
316
- // リダイレクトを無視して逆順の配列を得る
317
- from([6,4,3,5,2])
318
- .redirect((element: number, index: bigint) => -index) // 逆順にリダイレクト
319
- .toUnorderd() // リダイレクトされた順序を無視します。この操作は`redirect`、`reverse`、`shuffle`、`translate`の操作を無視します
320
- .toArray(); // [2, 5, 3, 4, 6]
321
-
322
- // ストリームを逆順に配列に変換
323
- from([6, 4, 3, 5, 2])
324
- .reverse() // ストリームを逆順にする
325
- .toOrdered() // 逆順を保証する
326
- .toArray(); // [2, 5, 3, 4, 6]
327
-
328
- // シャッフルされたストリームを上書きして配列に変換
329
- from([6, 4, 3, 5, 2])
330
- .shuffle() // ストリームをシャッフルする
331
- .sorted() // シャッフルされた順序を上書きする。この操作は`redirect`、`reverse`、`shuffle`、`translate`の操作を上書きする
332
- .toArray(); // [2, 5, 3, 4, 6]
333
-
334
- // ウィンドウコレクターに変換
335
- from([6, 4, 3, 5, 2]).toWindow();
336
-
337
- // 数値統計に変換
338
- from([6, 4, 3, 5, 2]).toNumericStatistics();
339
-
340
- // BigInt統計に変換
341
- from([6n, 4n, 3n, 5n, 2n]).toBigintStatistics();
342
-
343
- // データ収集のためのカスタムコレクターを定義
344
- let customizedCollector = from([1, 2, 3, 4, 5])
345
- .toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
346
- ```
165
+ ---
347
166
 
348
- ## Collectableの集約メソッド
349
-
350
- | メソッド | 説明 | 時間複雑度 | 空間複雑度 |
351
- |------|------|------------|------------|
352
- | `anyMatch(predicate)` | 任意の要素が一致するかどうか | O(n) | O(1) |
353
- | `allMatch(predicate)` | すべての要素が一致するかどうか | O(n) | O(1) |
354
- | `count()` | 要素数 | O(n) | O(1) |
355
- | `isEmpty()` | 空かどうか | O(1) | O(1) |
356
- | `findAny()` | 任意の要素を見つける | O(n) | O(1) |
357
- | `findFirst()` | 最初の要素を見つける | O(n) | O(1) |
358
- | `findLast()` | 最後の要素を見つける | O(n) | O(1) |
359
- | `forEach(action)` | すべての要素を反復する | O(n) | O(1) |
360
- | `group(classifier)` | クラスファイヤーでグループ化 | O(n) | O(n) |
361
- | `groupBy(keyExtractor, valueExtractor)` | キー・バリュー抽出子でグループ化 | O(n) | O(n) |
362
- | `join()` | 文字列として結合 | O(n) | O(n) |
363
- | `join(delimiter)` | 区切り文字を使用して結合 | O(n) | O(n) |
364
- | `nonMatch(predicate)` | 一致しない要素があるかどうか | O(n) | O(1) |
365
- | `partition(count)` | 数でパーティション分割 | O(n) | O(n) |
366
- | `partitionBy(classifier)` | クラスファイヤーでパーティション分割 | O(n) | O(n) |
367
- | `reduce(accumulator)` | 減少操作 | O(n) | O(1) |
368
- | `reduce(identity, accumulator)` | 初期値を持つ減少 | O(n) | O(1) |
369
- | `toArray()` | 配列に変換 | O(n) | O(n) |
370
- | `toMap(keyExtractor, valueExtractor)` | Mapに変換 | O(n) | O(n) |
371
- | `toSet()` | Setに変換 | O(n) | O(n) |
372
- | `write(stream)` | ストリームに書き込む | O(n) | O(1) |
167
+ ### パフォーマンス特性
373
168
 
374
- ```typescript
375
- // Collectableの操作例
376
- const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
377
- .filter((n: number): boolean => n % 2 === 0)
378
- .toOrdered();
379
-
380
- // 一致チェック
381
- console.log(data.anyMatch((n: number): boolean => n > 5)); // true
382
- console.log(data.allMatch((n: number): boolean => n < 20)); // true
383
-
384
- // 検索操作
385
- data.findFirst().ifPresent((n: number): void => console.log(n)); // 2
386
- data.findAny().ifPresent((n: number): void => console.log(n)); // 任意の要素
387
-
388
- // グループ化操作
389
- const grouped = data.groupBy(
390
- (n: number): string => (n > 5 ? "大" : "小"),
391
- (n: number): number => n * 2
392
- ); // {小: [4, 8], 大: [12, 16, 20]}
393
-
394
- // 減少操作
395
- const sum = data.reduce(0, (acc, n) => acc + n); // 30
396
-
397
- // 出力操作
398
- data.join(", "); // "[2, 4, 6, 8, 10]"
399
- ```
169
+ | コレクター | 時間計算量 | 空間計算量 | ソート済み? | 最適な用途 |
170
+ | :--- | :--- | :--- | :--- | :--- |
171
+ | `toUnordered()` | O(n) | O(n) | いいえ | 生の速度、順序が不要な場合。 |
172
+ | `toOrdered()` | O(2n) | O(n) | はい | 安定した順序付け、インデックス付きアクセス、分析。 |
173
+ | `toNumericStatistics()` | O(2n) | O(n) | はい | ソート済みデータを必要とする統計操作。 |
174
+ | `toBigIntStatistics()` | O(2n) | O(n) | はい | bigintに対する統計操作。 |
175
+ | `toWindow()` | O(2n) | O(n) | はい | 時間ベースのウィンドウ操作。 |
400
176
 
401
- ## 統計分析メソッド
402
-
403
- ### NumericStatisticsメソッド
404
-
405
- | メソッド | 説明 | 時間複雑度 | 空間複雑度 |
406
- |------|------|------------|------------|
407
- | `range()` | 範囲 | O(n) | O(1) |
408
- | `variance()` | 分散 | O(n) | O(1) |
409
- | `standardDeviation()` | 標準偏差 | O(n) | O(1) |
410
- | `mean()` | 平均 | O(n) | O(1) |
411
- | `median()` | 中央値 | O(n log n) | O(n) |
412
- | `mode()` | 最頻値 | O(n) | O(n) |
413
- | `frequency()` | 頻度分布 | O(n) | O(n) |
414
- | `summate()` | 合計 | O(n) | O(1) |
415
- | `quantile(quantile)` | 分位数 | O(n log n) | O(n) |
416
- | `interquartileRange()` | 四分位範囲 | O(n log n) | O(n) |
417
- | `skewness()` | 歪度 | O(n) | O(1) |
418
- | `kurtosis()` | 尖度 | O(n) | O(1) |
177
+ 速度が最優先の場合は `toUnordered()` を選択してください。安定した順序付けやソート済みデータに依存する統計メソッドが必要な場合にのみ `toOrdered()` を使用してください。
419
178
 
420
- ```typescript
421
- // 統計分析の例
422
- let numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
423
- .toNumericStatistics();
424
-
425
- console.log("平均:", numbers.mean()); // 5.5
426
- console.log("中央値:", numbers.median()); // 5.5
427
- console.log("標準偏差:", numbers.standardDeviation()); // ~2.87
428
- console.log("合計:", numbers.summate()); // 55
429
-
430
- // マッパーを使用した統計分析
431
- const objects = from([
432
- { value: 10 },
433
- { value: 20 },
434
- { value: 30 }
435
- ]).toNumericStatistics();
436
- console.log("マッピングされた平均:", objects.mean(obj => obj.value)); // 20
437
- ```
179
+ ---
438
180
 
439
- ## パフォーマンス選択ガイド
181
+ 他のフロントエンドストリームプロセッサとの比較
440
182
 
441
- ### 順序を保証しないCollectorを選択(パフォーマンス優先)
442
- ```typescript
443
- // 順序の保証が不要な場合、最高のパフォーマンスを得るために順序付けられていないCollectorを使用します
444
- let highPerformance = data
445
- .filter(predicate)
446
- .map(mapper)
447
- .toUnordered(); // 最高のパフォーマンス
448
- ```
183
+ | 特徴 | Semantic-TypeScript | RxJS | ネイティブ非同期イテレータ/ジェネレータ | Most.js |
184
+ | :--- | :--- | :--- | :--- | :--- |
185
+ | **TypeScript統合** | 第一級、ネイティブなインデックス認識を伴う深い型付け。 | 優れているが、複雑なジェネリクスを伴う。 | 良好、手動での型付けが必要。 | 強い、関数型ファーストスタイル。 |
186
+ | **組み込み統計分析** | `number` と `bigint` に対する包括的なネイティブサポート。 | ネイティブでは利用不可(カスタムオペレータが必要)。 | なし。 | なし。 |
187
+ | **インデックス付け & 位置認識** | ネイティブ、あらゆる要素に対する強力なbigintインデックス付け。 | カスタムオペレータが必要(`scan`、`withLatestFrom`)。 | 手動のカウンタが必要。 | 基本的、組み込みインデックスなし。 |
188
+ | **イベントストリーム管理** | 明示的な早期停止制御を備えた、専用の型安全ファクトリ。 | 強力だが、手動のサブスクリプション管理が必要。 | 手動イベントリスナー + キャンセル。 | 良好な `fromEvent`、軽量。 |
189
+ | **パフォーマンス & メモリ効率** | 卓越 – 最適化された `toUnordered()` および `toOrdered()` コレクター。 | 非常に良好、だがオペレータチェーンはオーバーヘッドを加える。 | 卓越(オーバーヘッドゼロ)。 | 卓越。 |
190
+ | **バンドルサイズ** | 非常に軽量。 | 大きい(ツリーシェイキング後も)。 | ゼロ(ネイティブ)。 | 小さい。 |
191
+ | **API設計思想** | 明示的なインデックス付けを伴う関数型コレクターパターン。 | リアクティブObservableパターン。 | イテレータ/ジェネレータパターン。 | 関数型、ポイントフリー。 |
192
+ | **早期終了 & 制御** | 明示的(`interrupt`、`.limit()`、`.takeWhile()`、`.sub()`)。 | 良好(`take`、`takeUntil`、`first`)。 | 手動(`for await…of` 内の `break`)。 | 良好(`take`、`until`)。 |
193
+ | **同期 & 非同期サポート** | 統一されたAPI – 両方を第一級サポート。 | 主に非同期。 | 両方、だが手動。 | 主に非同期。 |
194
+ | **学習曲線** | 関数型およびインデックス付きパイプラインに慣れた開発者にとって緩やか。 | 急(多くのオペレータ、hot/coldオブザーバブル)。 | 低い。 | 中程度。 |
449
195
 
450
- ### 順序が必要なCollectorを選択(順序が必要)
451
- ```typescript
452
- // 要素の順序を維持する必要がある場合、順序付けられたCollectorを使用します
453
- let ordered = data.sorted(comparator);
454
- ```
196
+ **Semantic-TypeScriptの主な利点**
455
197
 
456
- ### ウィンドウ操作が必要なCollectorを選択(ウィンドウ操作)
457
- ```typescript
458
- // ウィンドウ操作が必要な場合
459
- let window: WindowCollectable<number> = data
460
- .toWindow()
461
- .slide(5n, 2n); // スライディングウィンドウ
462
- ```
198
+ ・ 独自の組み込み統計およびインデックス機能により、手動での `reduce` や外部ライブラリが不要。
463
199
 
464
- ### 数値計算が必要な統計分析を選択(統計分析)
465
- ```typescript
466
- // 統計分析が必要な場合
467
- let statistics: NumericStatistics<number> = data
468
- .toNumericStatistics(); // 数値統計
200
+ ・ イベントストリームに対する明示的な制御により、RxJSで一般的なメモリリークを防止。
469
201
 
470
- let bigIntStatistics: BigintStatistics<bigint> = data
471
- .toBigintStatistics(); // 大きな整数統計
472
- ```
202
+ ・ 統一された同期/非同期設計により、多様なユースケースに対して単一で一貫したAPIを提供。
203
+
204
+ この比較は、伝統的なリアクティブライブラリの煩雑さなしに、パフォーマンス、型安全性、豊富な分析機能を要求するモダンなTypeScriptフロントエンドアプリケーションに、Semantic-TypeScriptが特に適している理由を示しています。
205
+
206
+ ---
207
+
208
+ ### 探求を始めましょうか?
209
+
210
+ Semantic-TypeScriptは、複雑なデータフローを、読みやすく、合成可能で、高性能なパイプラインへと変えます。リアルタイムUIイベントの処理、大規模データセットの処理、分析ダッシュボードの構築のいずれにおいても、データベースレベルのインデックス付けの力を関数型プログラミングのエレガンスと共に提供します。
211
+
212
+ 次のステップ:
213
+
214
+ ・ IDE内で完全に型付けされたAPIを参照してください(すべてのエクスポートはメインパッケージから)。
473
215
 
474
- [GitHub](https://github.com/eloyhere/semantic-typescript)
475
- [NPMJS](https://www.npmjs.com/package/semantic-typescript)
216
+ ・ 複雑な非同期イテレータをクリーンなSemanticパイプラインに置き換えた開発者の成長するコミュニティに参加してください。
476
217
 
477
- ## 重要な注意事項
218
+ Semantic-TypeScript — ストリームが構造と出会う場所。
478
219
 
479
- 1. **ソート操作の影響**:順序付けられたCollectorでは、`sorted()`操作は`redirect`、`translate`、`shuffle`、`reverse`の効果を上書きします。
480
- 2. **パフォーマンスの考慮**:順序の保証が不要な場合は、`toUnordered()`を使用してパフォーマンスを向上させることをお勧めします。
481
- 3. **メモリ使用量**:ソート操作には追加のO(n)のメモリが必要です。
482
- 4. **リアルタイムデータ**:Semanticストリームはリアルタイムデータの処理に適しており、非同期データソースをサポートしています。
220
+ 今日から構築を始め、考え抜かれたインデックス付けがもたらす違いを体験してください。
483
221
 
484
- このライブラリは、TypeScript開発者に強力で柔軟なストリーミング機能を提供し、関数型プログラミングの利点と型安全性の保証を組み合わせています。
222
+ 明確さをもって構築し、確信をもって進み、意図をもってデータを変革しましょう。