semantic-typescript 0.0.8 → 0.1.4

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,529 +1,427 @@
1
- # Semantic-TypeScript ストリーム処理フレームワーク
1
+ # Semantic-TypeScript ストリーム処理ライブラリ
2
2
 
3
- ## はじめに
3
+ ## 概要
4
4
 
5
- Semantic-TypeScriptは、JavaScriptGeneratorFunction、Java Stream、およびMySQL Indexにインスパイアされたモダンなストリーム処理ライブラリです。コアの設計哲学は、データインデックスを通じた効率的なデータ処理パイプラインの構築に基づいており、フロントエンド開発に型安全で関数型スタイルのストリーミング操作体験を提供します。
5
+ Semantic-TypeScriptは、JavaScript GeneratorFunction、Java StreamMySQL Indexにインスパイアされたモダンなストリーム処理ライブラリです。このライブラリのコア設計は、データインデックスに基づいた効率的なデータ処理パイプラインの構築にあり、型安全で関数型スタイルのストリーム操作体験をフロントエンド開発者に提供します。
6
6
 
7
- 従来の同期処理とは異なり、Semanticは非同期処理モデルを採用しています。データストリームを作成する際、終端データの受信タイミングは、アップストリームが`accept`および`interrupt`コールバック関数を呼び出すタイミングに完全に依存します。この設計により、ライブラリはリアルタイムデータストリーム、大規模データセット、非同期データソースをエレガントに扱うことができます。
7
+ 従来の同期処理とは異なり、Semanticは非同期処理モードを採用しています。データストリームを作成する際、端末がデータを受信するタイミングは、アップストリームが`accept`および`interrupt`コールバック関数をいつ呼び出すかに完全に依存します。この設計により、ライブラリはリアルタイムデータストリーム、大規模データセット、非同期データソースを優雅に処理できます。
8
8
 
9
- ## コア機能
9
+ ## インストール
10
10
 
11
- | 機能 | 説明 | 利点 |
12
- |------|------|------|
13
- | **型安全ジェネリクス** | 完全なTypeScript型サポート | コンパイル時エラー検出、優れた開発体験 |
14
- | **関数型プログラミング** | 不変データ構造と純粋関数 | 予測可能なコード、テストと保守が容易 |
15
- | **遅延評価** | オンデマンド計算、パフォーマンス最適化 | 大規模データセット処理時の高いメモリ効率 |
16
- | **非同期ストリーム処理** | ジェネレータベースの非同期データストリーム | リアルタイムデータとイベント駆動シナリオに適応 |
17
- | **マルチパラダイムコレクター** | 順序付き、順序なし、統計的収集戦略 | 異なるシナリオに基づく最適な戦略選択 |
18
- | **統計分析** | 組み込みの完全な統計計算関数 | 統合データ分析とレポート生成 |
19
-
20
- ## パフォーマンスに関する考慮事項
21
-
22
- **重要な注意**: 以下のメソッドは、データを収集してソートするため、パフォーマンスを犠牲にして順序付きデータコレクションを生成します:
23
- - `toOrdered()`
24
- - `toWindow()`
25
- - `toNumericStatistics()`
26
- - `toBigIntStatistics()`
27
- - `sorted()`
28
- - `sorted(comparator)`
29
-
30
- 特に重要な注意点: `sorted()`および`sorted(comparator)`は、以下のメソッドの結果を上書きします:
31
- - `redirect(redirector)`
32
- - `translate(translator)`
33
- - `shuffle(mapper)`
34
-
35
- ## ファクトリメソッド
36
-
37
- ### ストリーム作成ファクトリ
11
+ ```bash
12
+ npm install semantic-typescript
13
+ ```
38
14
 
39
- | メソッド | シグネチャ | 説明 | 例 |
40
- |------|------|------|------|
41
- | `blob` | `(blob: Blob, chunk?: bigint) => Semantic<Uint8Array>` | Blobをバイトストリームに変換 | `blob(fileBlob, 1024n)` |
42
- | `empty` | `<E>() => Semantic<E>` | 空のストリームを作成 | `empty<number>()` |
43
- | `fill` | `<E>(element: E, count: bigint) => Semantic<E>` | 指定数の要素で埋め立て | `fill("hello", 5n)` |
44
- | `from` | `<E>(iterable: Iterable<E>) => Semantic<E>` | 反復可能オブジェクトからストリーム作成 | `from([1, 2, 3])` |
45
- | `range` | `<N extends number\|bigint>(start: N, end: N, step?: N) => Semantic<N>` | 数値範囲ストリームを作成 | `range(1, 10, 2)` |
46
- | `iterate` | `<E>(generator: Generator<E>) => Semantic<E>` | ジェネレータ関数からストリーム作成 | `iterate(myGenerator)` |
47
- | `websocket` | `(websocket: WebSocket) => Semantic<MessageEvent>` | WebSocketからイベントストリーム作成 | `websocket(socket)` |
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
+ | `Runnable` | パラメータなし、戻り値なしの関数 |
35
+ | `Supplier<R>` | パラメータなしでRを返す関数 |
36
+ | `Functional<T, R>` | 単一パラメータ変換関数 |
37
+ | `Predicate<T>` | 単一パラメータ述語関数 |
38
+ | `BiFunctional<T, U, R>` | 二重パラメータ変換関数 |
39
+ | `BiPredicate<T, U>` | 二重パラメータ述語関数 |
40
+ | `Comparator<T>` | 比較関数 |
41
+ | `TriFunctional<T, U, V, R>` | 三重パラメータ変換関数 |
42
+ | `Consumer<T>` | 単一パラメータ消費関数 |
43
+ | `BiConsumer<T, U>` | 二重パラメータ消費関数 |
44
+ | `TriConsumer<T, U, V>` | 三重パラメータ消費関数 |
45
+ | `Generator<T>` | ジェネレーター関数 |
48
46
 
49
- **コード例補足:**
50
47
  ```typescript
51
- import { from, range, fill, empty } from 'semantic-typescript';
52
-
53
- // 配列からストリーム作成
54
- const numberStream = from([1, 2, 3, 4, 5]);
55
-
56
- // 数値範囲ストリーム作成
57
- const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
58
-
59
- // 繰り返し要素で埋め立て
60
- const filledStream = fill("hello", 3n); // "hello", "hello", "hello"
61
-
62
- // 空のストリーム作成
63
- const emptyStream = empty<number>();
48
+ // 型使用例
49
+ const predicate: Predicate<number> = (n) => n > 0;
50
+ const mapper: Functional<string, number> = (str) => str.length;
51
+ const comparator: Comparator<number> = (a, b) => a - b;
64
52
  ```
65
53
 
66
- ### ユーティリティ関数ファクトリ
67
-
68
- | メソッド | シグネチャ | 説明 | |
69
- |------|------|------|------|
70
- | `validate` | `<T>(t: MaybeInvalid<T>) => t is T` | 値が有効か検証 | `validate(null)` `false` |
71
- | `invalidate` | `<T>(t: MaybeInvalid<T>) => t is null\|undefined` | 値が無効か検証 | `invalidate(0)` `false` |
72
- | `useCompare` | `<T>(t1: T, t2: T) => number` | 汎用比較関数 | `useCompare("a", "b")` `-1` |
73
- | `useRandom` | `<T = number\|bigint>(index: T) => T` | 擬似乱数生成器 | `useRandom(5)` 乱数 |
54
+ ## 型ガード
55
+
56
+ | 関数 | 説明 | 時間計算量 | 空間計算量 |
57
+ |------|------|------------|------------|
58
+ | `validate<T>(t: MaybeInvalid<T>): t is T` | 値がnullまたはundefinedでないことを検証 | O(1) | O(1) |
59
+ | `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | 値がnullまたはundefinedであることを検証 | O(1) | O(1) |
60
+ | `isBoolean(t: unknown): t is boolean` | ブーリアンかどうかチェック | O(1) | O(1) |
61
+ | `isString(t: unknown): t is string` | 文字列かどうかチェック | O(1) | O(1) |
62
+ | `isNumber(t: unknown): t is number` | 数値かどうかチェック | O(1) | O(1) |
63
+ | `isFunction(t: unknown): t is Function` | 関数かどうかチェック | O(1) | O(1) |
64
+ | `isObject(t: unknown): t is object` | オブジェクトかどうかチェック | O(1) | O(1) |
65
+ | `isSymbol(t: unknown): t is symbol` | シンボルかどうかチェック | O(1) | O(1) |
66
+ | `isBigint(t: unknown): t is bigint` | BigIntかどうかチェック | O(1) | O(1) |
67
+ | `isPrimitive(t: unknown): t is Primitive` | プリミティブ型かどうかチェック | O(1) | O(1) |
68
+ | `isIterable(t: unknown): t is Iterable<unknown>` | 反復可能かどうかチェック | O(1) | O(1) |
69
+ | `isOptional(t: unknown): t is Optional<unknown>` | Optionalインスタンスかどうかチェック | O(1) | O(1) |
70
+ | `isSemantic(t: unknown): t is Semantic<unknown>` | Semanticインスタンスかどうかチェック | O(1) | O(1) |
71
+ | `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Collectorインスタンスかどうかチェック | O(1) | O(1) |
72
+ | `isCollectable(t: unknown): t is Collectable<unknown>` | Collectableインスタンスかどうかチェック | O(1) | O(1) |
73
+ | `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | OrderedCollectableインスタンスかどうかチェック | O(1) | O(1) |
74
+ | `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | WindowCollectableインスタンスかどうかチェック | O(1) | O(1) |
75
+ | `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | UnorderedCollectableインスタンスかどうかチェック | O(1) | O(1) |
76
+ | `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Statisticsインスタンスかどうかチェック | O(1) | O(1) |
77
+ | `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | NumericStatisticsインスタンスかどうかチェック | O(1) | O(1) |
78
+ | `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | BigIntStatisticsインスタンスかどうかチェック | O(1) | O(1) |
74
79
 
75
- **コード例補足:**
76
80
  ```typescript
77
- import { validate, invalidate, useCompare, useRandom } from 'semantic-typescript';
81
+ // 型ガード使用例
82
+ const value: unknown = "hello";
78
83
 
79
- // データ有効性検証
80
- const data: string | null = "hello";
81
- if (validate(data)) {
82
- console.log(data.toUpperCase()); // validateがデータがnullでないことを保証するため安全な呼び出し
84
+ if (isString(value)) {
85
+ console.log(value.length); // 型安全、valueはstringと推論
83
86
  }
84
87
 
85
- const nullData: string | null = null;
86
- if (invalidate(nullData)) {
87
- console.log("データが無効です"); // invalidateがnullを検出したため実行される
88
+ if (isOptional(someValue)) {
89
+ someValue.ifPresent(val => console.log(val));
88
90
  }
89
-
90
- // 値の比較
91
- const comparison = useCompare("apple", "banana"); // -1
92
-
93
- // 乱数生成
94
- const randomNum = useRandom(42); // シード42に基づく乱数
95
91
  ```
96
92
 
97
- ## コアクラス詳細
98
-
99
- ### Optional<T> - 安全なnull値処理
100
-
101
- Optionalクラスは、nullまたはundefinedになる可能性のある値を安全に扱うための関数型アプローチを提供します。
93
+ ## ユーティリティ関数
102
94
 
103
- | メソッド | 戻り値の型 | 説明 | 時間計算量 |
104
- |------|----------|------|------------|
105
- | `filter(predicate: Predicate<T>)` | `Optional<T>` | 条件を満たす値をフィルタリング | O(1) |
106
- | `get()` | `T` | 値を取得、空の場合はエラーをスロー | O(1) |
107
- | `getOrDefault(defaultValue: T)` | `T` | 値またはデフォルト値を取得 | O(1) |
108
- | `ifPresent(action: Consumer<T>)` | `void` | 値が存在する場合にアクションを実行 | O(1) |
109
- | `isEmpty()` | `boolean` | 空かどうかチェック | O(1) |
110
- | `isPresent()` | `boolean` | 値が存在するかチェック | O(1) |
111
- | `map<R>(mapper: Functional<T, R>)` | `Optional<R>` | 値のマッピングと変換 | O(1) |
112
- | `static of<T>(value: MaybeInvalid<T>)` | `Optional<T>` | Optionalインスタンスを作成 | O(1) |
113
- | `static ofNullable<T>(value?)` | `Optional<T>` | null許容Optionalを作成 | O(1) |
114
- | `static ofNonNull<T>(value: T)` | `Optional<T>` | non-null Optionalを作成 | O(1) |
95
+ | 関数 | 説明 | 時間計算量 | 空間計算量 |
96
+ |------|------|------------|------------|
97
+ | `useCompare<T>(t1: T, t2: T): number` | 汎用比較関数 | O(1) | O(1) |
98
+ | `useRandom<T = number \| bigint>(index: T): T` | 擬似乱数生成器 | O(log n) | O(1) |
115
99
 
116
- **コード例補足:**
117
100
  ```typescript
118
- import { Optional } from 'semantic-typescript';
101
+ // ユーティリティ関数使用例
102
+ const numbers = [3, 1, 4, 1, 5];
103
+ numbers.sort(useCompare); // [1, 1, 3, 4, 5]
119
104
 
120
- // Optionalインスタンス作成
121
- const optionalValue = Optional.ofNullable<string>(Math.random() > 0.5 ? "hello" : null);
105
+ const randomNum = useRandom(42); // シードベースの乱数
106
+ const randomBigInt = useRandom(1000n); // BigInt乱数
107
+ ```
122
108
 
123
- // チェーン操作
124
- const result = optionalValue
125
- .filter(val => val.length > 3) // 長さが3より大きい値をフィルタリング
126
- .map(val => val.toUpperCase()) // 大文字に変換
127
- .getOrDefault("default"); // 値またはデフォルト値を取得
109
+ ## ファクトリメソッド
128
110
 
129
- console.log(result); // "HELLO" または "default"
111
+ ### Optionalファクトリメソッド
130
112
 
131
- // 安全な操作
132
- optionalValue.ifPresent(val => {
133
- console.log(`値が存在します: ${val}`);
134
- });
113
+ | メソッド | 説明 | 時間計算量 | 空間計算量 |
114
+ |---------|------|------------|------------|
115
+ | `Optional.empty<T>()` | 空のOptionalを作成 | O(1) | O(1) |
116
+ | `Optional.of<T>(value)` | 値を持つOptionalを作成 | O(1) | O(1) |
117
+ | `Optional.ofNullable<T>(value)` | null許容Optionalを作成 | O(1) | O(1) |
118
+ | `Optional.ofNonNull<T>(value)` | 非nullOptionalを作成 | O(1) | O(1) |
135
119
 
136
- // ステータスチェック
137
- if (optionalValue.isPresent()) {
138
- console.log("値があります");
139
- } else if (optionalValue.isEmpty()) {
140
- console.log("空です");
141
- }
120
+ ```typescript
121
+ // Optional使用例
122
+ const emptyOpt = Optional.empty<number>();
123
+ const presentOpt = Optional.of(42);
124
+ const nullableOpt = Optional.ofNullable<string>(null);
125
+ const nonNullOpt = Optional.ofNonNull("hello");
126
+
127
+ presentOpt.ifPresent(val => console.log(val)); // 42を出力
128
+ console.log(emptyOpt.orElse(100)); // 100を出力
142
129
  ```
143
130
 
144
- ### Semantic<E> - 遅延データストリーム
145
-
146
- Semanticは、豊富なストリーム演算子を提供するコアのストリーム処理クラスです。
147
-
148
- #### ストリーム変換操作
149
-
150
- | メソッド | 戻り値の型 | 説明 | パフォーマンス影響 |
151
- |------|----------|------|----------|
152
- | `concat(other: Semantic<E>)` | `Semantic<E>` | 2つのストリームを連結 | O(n+m) |
153
- | `distinct()` | `Semantic<E>` | 重複を削除(Set使用) | O(n) |
154
- | `distinct(comparator)` | `Semantic<E>` | カスタム比較子で重複削除 | O(n²) |
155
- | `dropWhile(predicate)` | `Semantic<E>` | 条件を満たす先頭要素を破棄 | O(n) |
156
- | `filter(predicate)` | `Semantic<E>` | 要素をフィルタリング | O(n) |
157
- | `flat(mapper)` | `Semantic<E>` | ネストしたストリームを平坦化 | O(n×m) |
158
- | `flatMap(mapper)` | `Semantic<R>` | マッピングと平坦化 | O(n×m) |
159
- | `limit(n)` | `Semantic<E>` | 要素数を制限 | O(n) |
160
- | `map(mapper)` | `Semantic<R>` | 要素のマッピングと変換 | O(n) |
161
- | `peek(consumer)` | `Semantic<E>` | 要素を変更せずに閲覧 | O(n) |
162
- | `redirect(redirector)` | `Semantic<E>` | インデックスのリダイレクト | O(n) |
163
- | `reverse()` | `Semantic<E>` | ストリーム順序を反転 | O(n) |
164
- | `shuffle()` | `Semantic<E>` | ランダムにシャッフル | O(n) |
165
- | `shuffle(mapper)` | `Semantic<E>` | カスタムシャッフルロジック | O(n) |
166
- | `skip(n)` | `Semantic<E>` | 最初のn要素をスキップ | O(n) |
167
- | `sub(start, end)` | `Semantic<E>` | サブストリームを取得 | O(n) |
168
- | `takeWhile(predicate)` | `Semantic<E>` | 条件を満たす先頭要素を取得 | O(n) |
169
- | `translate(offset)` | `Semantic<E>` | インデックスの平行移動 | O(n) |
170
- | `translate(translator)` | `Semantic<E>` | カスタムインデックス変換 | O(n) |
171
-
172
- **コード例補足:**
173
- ```typescript
174
- import { from } from 'semantic-typescript';
131
+ ### Collectorファクトリメソッド
175
132
 
176
- const stream = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
133
+ | メソッド | 説明 | 時間計算量 | 空間計算量 |
134
+ |---------|------|------------|------------|
135
+ | `Collector.full(identity, accumulator, finisher)` | 完全なコレクターを作成 | O(1) | O(1) |
136
+ | `Collector.shortable(identity, interruptor, accumulator, finisher)` | 中断可能なコレクターを作成 | O(1) | O(1) |
177
137
 
178
- // ストリーム変換操作の例
179
- const processedStream = stream
180
- .filter(x => x % 2 === 0) // 偶数をフィルタリング
181
- .map(x => x * 2) // 各要素を2倍
182
- .distinct() // 重複を削除
183
- .limit(3) // 最初の3要素に制限
184
- .peek((val, index) => console.log(`インデックス${index}の要素${val}`)); // 要素を閲覧
138
+ ```typescript
139
+ // Collector使用例
140
+ const sumCollector = Collector.full(
141
+ () => 0,
142
+ (sum, num) => sum + num,
143
+ result => result
144
+ );
185
145
 
186
- // 注: ストリームはまだ実行されていない、終端操作のためにCollectableへの変換が必要
146
+ const numbers = from([1, 2, 3, 4, 5]);
147
+ const total = numbers.toUnoredered().collect(sumCollector); // 15
187
148
  ```
188
149
 
189
- #### ストリーム終端操作
150
+ ### Semanticファクトリメソッド
190
151
 
191
- | メソッド | 戻り値の型 | 説明 | パフォーマンス特性 |
192
- |------|----------|------|----------|
193
- | `toOrdered()` | `OrderedCollectable<E>` | 順序付きコレクションに変換 | ソート操作、パフォーマンス低い |
194
- | `toUnordered()` | `UnorderedCollectable<E>` | 順序なしコレクションに変換 | 最速、ソートなし |
195
- | `toWindow()` | `WindowCollectable<E>` | ウィンドウコレクションに変換 | ソート操作、パフォーマンス低い |
196
- | `toNumericStatistics()` | `Statistics<E, number>` | 数値統計分析 | ソート操作、パフォーマンス低い |
197
- | `toBigintStatistics()` | `Statistics<E, bigint>` | ビッグ整数統計分析 | ソート操作、パフォーマンス低い |
198
- | `sorted()` | `OrderedCollectable<E>` | 自然順ソート | リダイレクト結果を上書き |
199
- | `sorted(comparator)` | `OrderedCollectable<E>` | カスタムソート | リダイレクト結果を上書き |
152
+ | メソッド | 説明 | 時間計算量 | 空間計算量 |
153
+ |---------|------|------------|------------|
154
+ | `blob(blob, chunkSize)` | Blobからストリームを生成 | O(n) | O(chunkSize) |
155
+ | `empty<E>()` | 空のストリームを生成 | O(1) | O(1) |
156
+ | `fill<E>(element, count)` | 埋め尽くされたストリームを生成 | O(n) | O(1) |
157
+ | `from<E>(iterable)` | 反復可能オブジェクトからストリームを生成 | O(1) | O(1) |
158
+ | `interval(period, delay?)` | 定期的なインターバルストリームを生成 | O(1)* | O(1) |
159
+ | `iterate<E>(generator)` | ジェネレータからストリームを生成 | O(1) | O(1) |
160
+ | `range(start, end, step)` | 数値範囲ストリームを生成 | O(n) | O(1) |
161
+ | `websocket(websocket)` | WebSocketからストリームを生成 | O(1) | O(1) |
200
162
 
201
- **コード例補足:**
202
163
  ```typescript
203
- import { from } from 'semantic-typescript';
164
+ // Semanticファクトリメソッドの使用例
204
165
 
205
- const semanticStream = from([5, 2, 8, 1, 9, 3, 7, 4, 6]);
166
+ // Blobからストリームを作成(チャンク読み込み)
167
+ blob(someBlob, 1024n)
168
+ .toUnordered()
169
+ .write(WritableStream)
170
+ .then(callback) // ストリーム書き込み成功
171
+ .catch(writeFi); // ストリーム書き込み失敗
206
172
 
207
- // 順序付きコレクションに変換(パフォーマンス低い)
208
- const ordered = semanticStream.toOrdered();
173
+ // 他のストリームと連結されるまで実行されない空ストリームを作成
174
+ empty<string>()
175
+ .toUnordered()
176
+ .join(); //[]
209
177
 
210
- // 順序なしコレクションに変換(最速)
211
- const unordered = semanticStream.toUnordered();
178
+ // 埋め尽くされたストリームを作成
179
+ const filledStream = fill("hello", 3); // "hello", "hello", "hello"
212
180
 
213
- // 自然順ソート
214
- const sortedNatural = semanticStream.sorted();
181
+ // 初期遅延2秒、実行周期5秒の時系列ストリームを作成
182
+ // タイマーメカニズムで実装、システムスケジューリング制限による時間変動の可能性あり
183
+ const intervalStream = interval(5000, 2000);
215
184
 
216
- // カスタムソート
217
- const sortedCustom = semanticStream.sorted((a, b) => b - a); // 降順ソート
185
+ // 反復可能オブジェクトからストリームを作成
186
+ const numberStream = from([1, 2, 3, 4, 5]);
187
+ const stringStream = from(new Set(["Alex", "Bob"]));
218
188
 
219
- // 統計オブジェクトに変換
220
- const stats = semanticStream.toNumericStatistics();
189
+ // 範囲ストリームを作成
190
+ const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
221
191
 
222
- // 注: 上記メソッドはSemanticインスタンスを通じて呼び出し、Collectableを取得してから終端メソッドを使用する必要がある
192
+ // WebSocketイベントストリーム
193
+ const ws = new WebSocket("ws://localhost:8080");
194
+ websocket(ws)
195
+ .filter((event)=> event.type === "message") // メッセージイベントのみ監視
196
+ .toUnordered() // イベントは通常ソート不要
197
+ .forEach((event)=> receive(event)); // メッセージ受信
223
198
  ```
224
199
 
225
- ### Collector<E, A, R> - データコレクター
226
-
227
- コレクターは、ストリームデータを特定の構造に集約するために使用されます。
200
+ ## Semanticクラスメソッド
201
+
202
+ | メソッド | 説明 | 時間計算量 | 空間計算量 |
203
+ |---------|------|------------|------------|
204
+ | `concat(other)` | 二つのストリームを連結 | O(n) | O(1) |
205
+ | `distinct()` | 重複排除 | O(n) | O(n) |
206
+ | `distinct(comparator)` | コンパレーターを使用した重複排除 | O(n²) | O(n) |
207
+ | `dropWhile(predicate)` | 条件を満たす要素を破棄 | O(n) | O(1) |
208
+ | `filter(predicate)` | 要素のフィルタリング | O(n) | O(1) |
209
+ | `flat(mapper)` | フラットマッピング | O(n × m) | O(1) |
210
+ | `flatMap(mapper)` | 新しい型へのフラットマッピング | O(n × m) | O(1) |
211
+ | `limit(n)` | 要素数の制限 | O(n) | O(1) |
212
+ | `map(mapper)` | マッピング変換 | O(n) | O(1) |
213
+ | `peek(consumer)` | 要素の検査 | O(n) | O(1) |
214
+ | `redirect(redirector)` | インデックスのリダイレクト | O(n) | O(1) |
215
+ | `reverse()` | ストリームの反転 | O(n) | O(1) |
216
+ | `shuffle()` | ランダムシャッフル | O(n) | O(1) |
217
+ | `shuffle(mapper)` | マッパーを使用したシャッフル | O(n) | O(1) |
218
+ | `skip(n)` | 最初のn要素をスキップ | O(n) | O(1) |
219
+ | `sorted()` | ソート | O(n log n) | O(n) |
220
+ | `sorted(comparator)` | コンパレーターを使用したソート | O(n log n) | O(n) |
221
+ | `sub(start, end)` | サブストリームの取得 | O(n) | O(1) |
222
+ | `takeWhile(predicate)` | 条件を満たす要素を取得 | O(n) | O(1) |
223
+ | `translate(offset)` | インデックスの平行移動 | O(n) | O(1) |
224
+ | `translate(translator)` | トランスレーターを使用した平行移動 | O(n) | O(1) |
228
225
 
229
- | メソッド | 説明 | 使用シナリオ |
230
- |------|------|----------|
231
- | `collect(generator)` | データ収集を実行 | ストリーム終端操作 |
232
- | `static full(identity, accumulator, finisher)` | 完全なコレクターを作成 | 完全な処理が必要 |
233
- | `static shortable(identity, interruptor, accumulator, finisher)` | 中断可能なコレクターを作成 | 早期終了する可能性あり |
234
-
235
- **コード例補足:**
236
226
  ```typescript
237
- import { Collector } from 'semantic-typescript';
238
-
239
- // カスタムコレクター作成
240
- const sumCollector = Collector.full(
241
- () => 0, // 初期値
242
- (acc, value) => acc + value, // アキュムレータ
243
- result => result // フィニッシャー関数
244
- );
245
-
246
- // コレクター使用(SemanticからCollectableへの変換が最初に必要)
247
- const numbers = from([1, 2, 3, 4, 5]);
248
- const sum = numbers.toUnordered().collect(sumCollector); // 15
227
+ // Semantic操作例
228
+ const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
229
+ .filter(n => n % 2 === 0) // 偶数のフィルタリング
230
+ .map(n => n * 2) // 2倍に変換
231
+ .skip(1) // 最初の要素をスキップ
232
+ .limit(3) // 3要素に制限
233
+ .toArray(); // 配列に変換
234
+ // 結果: [8, 12, 20]
235
+
236
+ // 複雑な操作例
237
+ const complexResult = range(1, 100, 1)
238
+ .flatMap(n => from([n, n * 2])) // 各要素を2要素にマッピング
239
+ .distinct() // 重複排除
240
+ .shuffle() // ランダムシャッフル
241
+ .takeWhile(n => n < 50) // 50未満の要素を取得
242
+ .toOrdered() // 順序付きコレクターに変換
243
+ .toArray(); // 配列に変換
249
244
  ```
250
245
 
251
- ### Collectable<E> - 収集可能データ抽象クラス
252
-
253
- 豊富なデータ集約および変換メソッドを提供します。**注: 最初にSemanticインスタンスを通じてsorted()、toOrdered()などを呼び出してCollectableインスタンスを取得してから、以下のメソッドを使用する必要があります。**
246
+ ## コレクター変換メソッド
254
247
 
255
- #### データクエリ操作
248
+ | メソッド | 説明 | 時間計算量 | 空間計算量 |
249
+ |---------|------|------------|------------|
250
+ | `toUnoredered()` | 非順序コレクターに変換(パフォーマンス優先) | O(1) | O(1) |
251
+ | `toOrdered()` | 順序付きコレクターに変換 | O(1) | O(1) |
252
+ | `sorted()` | ソートして順序付きコレクターに変換 | O(n log n) | O(n) |
253
+ | `toWindow()` | ウィンドウコレクターに変換 | O(1) | O(1) |
254
+ | `toNumericStatistics()` | 数値統計に変換 | O(1) | O(1) |
255
+ | `toBigintStatistics()` | BigInt統計に変換 | O(1) | O(1) |
256
256
 
257
- | メソッド | 戻り値の型 | 説明 | 例 |
258
- |------|----------|------|------|
259
- | `anyMatch(predicate)` | `boolean` | いずれかの要素が条件に一致するか | `anyMatch(x => x > 0)` |
260
- | `allMatch(predicate)` | `boolean` | すべての要素が条件に一致するか | `allMatch(x => x > 0)` |
261
- | `count()` | `bigint` | 要素数の統計 | `count()` → `5n` |
262
- | `isEmpty()` | `boolean` | ストリームが空かどうか | `isEmpty()` |
263
- | `findAny()` | `Optional<E>` | 任意の要素を検索 | `findAny()` |
264
- | `findFirst()` | `Optional<E>` | 最初の要素を検索 | `findFirst()` |
265
- | `findLast()` | `Optional<E>` | 最後の要素を検索 | `findLast()` |
266
-
267
- **コード例補足:**
268
257
  ```typescript
269
- import { from } from 'semantic-typescript';
270
-
271
- const numbers = from([1, 2, 3, 4, 5]);
272
-
273
- // 終端メソッドを使用する前にCollectableに変換する必要がある
274
- const collectable = numbers.toUnordered();
275
-
276
- // データクエリ操作
277
- const hasEven = collectable.anyMatch(x => x % 2 === 0); // true
278
- const allPositive = collectable.allMatch(x => x > 0); // true
279
- const count = collectable.count(); // 5n
280
- const isEmpty = collectable.isEmpty(); // false
281
- const firstElement = collectable.findFirst(); // Optional.of(1)
282
- const anyElement = collectable.findAny(); // 任意の要素
258
+ // コレクター変換例
259
+ const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
260
+
261
+ // パフォーマンス優先:非順序コレクターを使用
262
+ const unordered = numbers
263
+ .filter(n => n > 3)
264
+ .toUnoredered();
265
+
266
+ // ソート必要:順序付きコレクターを使用
267
+ const ordered = numbers
268
+ .sorted()
269
+ .toOrdered();
270
+
271
+ // 統計分析:統計コレクターを使用
272
+ const stats = numbers
273
+ .toNumericStatistics();
274
+
275
+ console.log(stats.mean()); // 平均値
276
+ console.log(stats.median()); // 中央値
277
+ console.log(stats.standardDeviation()); // 標準偏差
278
+
279
+ // ウィンドウ操作
280
+ const windowed = numbers
281
+ .toWindow()
282
+ .tumble(3n); // 3要素ごとのウィンドウ
283
+
284
+ windowed.forEach(window => {
285
+ console.log(window.toArray()); // 各ウィンドウの内容
286
+ });
283
287
  ```
284
288
 
285
- #### データ集約操作
286
-
287
- | メソッド | 戻り値の型 | 説明 | 計算量 |
288
- |------|----------|------|--------|
289
- | `group(classifier)` | `Map<K, E[]>` | 分類子でグループ化 | O(n) |
290
- | `groupBy(keyExtractor, valueExtractor)` | `Map<K, V[]>` | キー値抽出器でグループ化 | O(n) |
291
- | `join()` | `string` | 文字列として結合 | O(n) |
292
- | `join(delimiter)` | `string` | 区切り文字で結合 | O(n) |
293
- | `partition(count)` | `E[][]` | カウントで分割 | O(n) |
294
- | `partitionBy(classifier)` | `E[][]` | 分類子で分割 | O(n) |
295
- | `reduce(accumulator)` | `Optional<E>` | 縮約操作 | O(n) |
296
- | `reduce(identity, accumulator)` | `E` | 識別子付き縮約 | O(n) |
297
- | `toArray()` | `E[]` | 配列に変換 | O(n) |
298
- | `toMap(keyExtractor, valueExtractor)` | `Map<K, V>` | Mapに変換 | O(n) |
299
- | `toSet()` | `Set<E>` | Setに変換 | O(n) |
300
-
301
- **コード例補足:**
289
+ ## Collectable収集メソッド
290
+
291
+ | メソッド | 説明 | 時間計算量 | 空間計算量 |
292
+ |---------|------|------------|------------|
293
+ | `anyMatch(predicate)` | 一致する要素が存在するかチェック | O(n) | O(1) |
294
+ | `allMatch(predicate)` | すべての要素が一致するかチェック | O(n) | O(1) |
295
+ | `count()` | 要素のカウント | O(n) | O(1) |
296
+ | `isEmpty()` | 空かどうかチェック | O(1) | O(1) |
297
+ | `findAny()` | 任意の要素を検索 | O(n) | O(1) |
298
+ | `findFirst()` | 最初の要素を検索 | O(n) | O(1) |
299
+ | `findLast()` | 最後の要素を検索 | O(n) | O(1) |
300
+ | `forEach(action)` | 全要素の反復処理 | O(n) | O(1) |
301
+ | `group(classifier)` | 分類器によるグループ化 | O(n) | O(n) |
302
+ | `groupBy(keyExtractor, valueExtractor)` | キー値抽出器によるグループ化 | O(n) | O(n) |
303
+ | `join()` | 文字列への結合 | O(n) | O(n) |
304
+ | `join(delimiter)` | 区切り文字を使用した結合 | O(n) | O(n) |
305
+ | `nonMatch(predicate)` | 一致する要素がないかチェック | O(n) | O(1) |
306
+ | `partition(count)` | 数量による分割 | O(n) | O(n) |
307
+ | `partitionBy(classifier)` | 分類器による分割 | O(n) | O(n) |
308
+ | `reduce(accumulator)` | 縮約操作 | O(n) | O(1) |
309
+ | `reduce(identity, accumulator)` | 初期値付き縮約 | O(n) | O(1) |
310
+ | `toArray()` | 配列への変換 | O(n) | O(n) |
311
+ | `toMap(keyExtractor, valueExtractor)` | Mapへの変換 | O(n) | O(n) |
312
+ | `toSet()` | Setへの変換 | O(n) | O(n) |
313
+ | `write(stream)` | ストリームへの書き込み | O(n) | O(1) |
314
+
302
315
  ```typescript
303
- import { from } from 'semantic-typescript';
316
+ // Collectable操作例
317
+ const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
318
+ .filter(n => n % 2 === 0)
319
+ .toOrdered();
304
320
 
305
- const people = from([
306
- { name: "Alice", age: 25, city: "New York" },
307
- { name: "Bob", age: 30, city: "London" },
308
- { name: "Charlie", age: 25, city: "New York" }
309
- ]);
321
+ // 一致チェック
322
+ console.log(data.anyMatch(n => n > 5)); // true
323
+ console.log(data.allMatch(n => n < 20)); // true
310
324
 
311
- // 集約操作を使用する前にCollectableに変換する必要がある
312
- const collectable = people.toUnordered();
325
+ // 検索操作
326
+ data.findFirst().ifPresent(n => console.log(n)); // 2
327
+ data.findAny().ifPresent(n => console.log(n)); // 任意の要素
313
328
 
314
329
  // グループ化操作
315
- const byCity = collectable.group(person => person.city);
316
- // Map { "New York" => [{name: "Alice", ...}, {name: "Charlie", ...}], "London" => [{name: "Bob", ...}] }
317
-
318
- const byAge = collectable.groupBy(
319
- person => person.age,
320
- person => person.name
330
+ const grouped = data.groupBy(
331
+ n => n > 5 ? "large" : "small",
332
+ n => n * 2
321
333
  );
322
- // Map { 25 => ["Alice", "Charlie"], 30 => ["Bob"] }
323
-
324
- // コレクションに変換
325
- const array = collectable.toArray(); // 元の配列
326
- const set = collectable.toSet(); // Setコレクション
327
- const map = collectable.toMap(
328
- person => person.name,
329
- person => person.age
330
- ); // Map { "Alice" => 25, "Bob" => 30, "Charlie" => 25 }
334
+ // {small: [4, 8], large: [12, 16, 20]}
331
335
 
332
336
  // 縮約操作
333
- const totalAge = collectable.reduce(0, (acc, person) => acc + person.age); // 80
334
- const oldest = collectable.reduce((a, b) => a.age > b.age ? a : b); // Optional.of({name: "Bob", age: 30, ...})
335
- ```
337
+ const sum = data.reduce(0, (acc, n) => acc + n); // 30
336
338
 
337
- ### 特定のコレクター実装
338
-
339
- #### UnorderedCollectable<E>
340
- - **特性**: 最速のコレクター、ソートなし
341
- - **使用シナリオ**: 順序が重要でない、最大のパフォーマンスが望まれる場合
342
- - **メソッド**: すべてのCollectableメソッドを継承
343
-
344
- #### OrderedCollectable<E>
345
- - **特性**: 要素の順序を保証、パフォーマンスは低い
346
- - **使用シナリオ**: ソートされた結果が必要な場合
347
- - **特殊メソッド**: すべてのメソッドを継承、内部ソート状態を維持
339
+ // 出力操作
340
+ data.join(", "); // "2, 4, 6, 8, 10"
341
+ ```
348
342
 
349
- #### WindowCollectable<E>
350
- - **特性**: スライディングウィンドウ操作をサポート
351
- - **使用シナリオ**: 時系列データ分析
352
- - **特殊メソッド**:
353
- - `slide(size, step)` - スライディングウィンドウ
354
- - `tumble(size)` - タンブリングウィンドウ
343
+ ## 統計分析メソッド
344
+
345
+ ### NumericStatisticsメソッド
346
+
347
+ | メソッド | 説明 | 時間計算量 | 空間計算量 |
348
+ |---------|------|------------|------------|
349
+ | `range()` | 範囲 | O(n) | O(1) |
350
+ | `variance()` | 分散 | O(n) | O(1) |
351
+ | `standardDeviation()` | 標準偏差 | O(n) | O(1) |
352
+ | `mean()` | 平均値 | O(n) | O(1) |
353
+ | `median()` | 中央値 | O(n log n) | O(n) |
354
+ | `mode()` | 最頻値 | O(n) | O(n) |
355
+ | `frequency()` | 度数分布 | O(n) | O(n) |
356
+ | `summate()` | 合計 | O(n) | O(1) |
357
+ | `quantile(quantile)` | 分位数 | O(n log n) | O(n) |
358
+ | `interquartileRange()` | 四分位範囲 | O(n log n) | O(n) |
359
+ | `skewness()` | 歪度 | O(n) | O(1) |
360
+ | `kurtosis()` | 尖度 | O(n) | O(1) |
355
361
 
356
- **コード例補足:**
357
362
  ```typescript
358
- import { from } from 'semantic-typescript';
359
-
360
- const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
361
-
362
- // 順序なしコレクター(最速)
363
- const unordered = data.toUnordered();
364
- const unorderedArray = unordered.toArray(); // 元の順序を維持する可能性あり [1, 2, 3, ...]
365
-
366
- // 順序付きコレクター
367
- const ordered = data.toOrdered();
368
- const orderedArray = ordered.toArray(); // ソートが保証される [1, 2, 3, ...]
363
+ // 統計分析例
364
+ const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
365
+ .toNumericStatistics();
366
+
367
+ console.log("平均値:", numbers.mean()); // 5.5
368
+ console.log("中央値:", numbers.median()); // 5.5
369
+ console.log("標準偏差:", numbers.standardDeviation()); // ~2.87
370
+ console.log("合計:", numbers.summate()); // 55
371
+
372
+ // マッパーを使用した統計分析
373
+ const objects = from([
374
+ { value: 10 },
375
+ { value: 20 },
376
+ { value: 30 }
377
+ ]).toNumericStatistics();
378
+
379
+ console.log("マップされた平均値:", objects.mean(obj => obj.value)); // 20
380
+ ```
369
381
 
370
- // ウィンドウコレクター
371
- const windowed = data.toWindow();
372
- const slidingWindows = windowed.slide(3n, 2n); // ウィンドウサイズ3、ステップ2
373
- // ウィンドウ1: [1, 2, 3], ウィンドウ2: [3, 4, 5], ウィンドウ3: [5, 6, 7], ...
382
+ ## パフォーマンス選択ガイド
374
383
 
375
- const tumblingWindows = windowed.tumble(4n); // タンブリングウィンドウサイズ4
376
- // ウィンドウ1: [1, 2, 3, 4], ウィンドウ2: [5, 6, 7, 8], ...
384
+ ### 非順序コレクターを選択(パフォーマンス優先)
385
+ ```typescript
386
+ // 順序保証が不要な場合
387
+ const highPerformance = data
388
+ .filter(predicate)
389
+ .map(mapper)
390
+ .toUnoredered(); // 最高のパフォーマンス
377
391
  ```
378
392
 
379
- ### Statistics<E, D> - 統計分析
380
-
381
- 統計分析の基底クラスで、豊富な統計計算メソッドを提供します。**注: 最初にSemanticインスタンスを通じてtoNumericStatistics()またはtoBigIntStatistics()を呼び出してStatisticsインスタンスを取得してから、以下のメソッドを使用する必要があります。**
382
-
383
- #### 統計計算操作
384
-
385
- | メソッド | 戻り値の型 | 説明 | アルゴリズム計算量 |
386
- |------|----------|------|------------|
387
- | `maximum()` | `Optional<E>` | 最大値 | O(n) |
388
- | `minimum()` | `Optional<E>` | 最小値 | O(n) |
389
- | `range()` | `D` | 範囲(最大-最小) | O(n) |
390
- | `variance()` | `D` | 分散 | O(n) |
391
- | `standardDeviation()` | `D` | 標準偏差 | O(n) |
392
- | `mean()` | `D` | 平均値 | O(n) |
393
- | `median()` | `D` | 中央値 | O(n log n) |
394
- | `mode()` | `D` | 最頻値 | O(n) |
395
- | `frequency()` | `Map<D, bigint>` | 度数分布 | O(n) |
396
- | `summate()` | `D` | 合計 | O(n) |
397
- | `quantile(quantile)` | `D` | 分位数 | O(n log n) |
398
- | `interquartileRange()` | `D` | 四分位範囲 | O(n log n) |
399
- | `skewness()` | `D` | 歪度 | O(n) |
400
- | `kurtosis()` | `D` | 尖度 | O(n) |
401
-
402
- **コード例補足:**
393
+ ### 順序付きコレクターを選択(順序が必要)
403
394
  ```typescript
404
- import { from } from 'semantic-typescript';
405
-
406
- const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
407
-
408
- // 統計メソッドを使用する前に統計オブジェクトに変換する必要がある
409
- const stats = numbers.toNumericStatistics();
410
-
411
- // 基本統計
412
- const count = stats.count(); // 10n
413
- const max = stats.maximum(); // Optional.of(10)
414
- const min = stats.minimum(); // Optional.of(1)
415
- const range = stats.range(); // 9
416
- const mean = stats.mean(); // 5.5
417
- const median = stats.median(); // 5.5
418
- const sum = stats.summate(); // 55
419
-
420
- // 高度な統計
421
- const variance = stats.variance(); // 8.25
422
- const stdDev = stats.standardDeviation(); // 2.872
423
- const mode = stats.mode(); // 任意の値(すべて1回ずつ出現するため)
424
- const q1 = stats.quantile(0.25); // 3.25
425
- const q3 = stats.quantile(0.75); // 7.75
426
- const iqr = stats.interquartileRange(); // 4.5
427
-
428
- // 度数分布
429
- const freq = stats.frequency(); // Map {1 => 1n, 2 => 1n, ...}
395
+ // 要素の順序を維持する必要がある場合
396
+ const ordered = data.sorted(comparator);
430
397
  ```
431
398
 
432
- #### 特定の統計実装クラス
433
-
434
- **NumericStatistics<E>**
435
- - number型の統計分析を処理
436
- - すべての統計計算はnumber型を返す
437
-
438
- **BigIntStatistics<E>**
439
- - bigint型の統計分析を処理
440
- - すべての統計計算はbigint型を返す
441
-
442
- **コード例補足:**
399
+ ### ウィンドウコレクターを選択(ウィンドウ操作)
443
400
  ```typescript
444
- import { from } from 'semantic-typescript';
445
-
446
- // 数値統計
447
- const numberData = from([10, 20, 30, 40, 50]);
448
- const numericStats = numberData.toNumericStatistics();
449
-
450
- console.log(numericStats.mean()); // 30
451
- console.log(numericStats.summate()); // 150
452
-
453
- // ビッグ整数統計
454
- const bigintData = from([100n, 200n, 300n, 400n, 500n]);
455
- const bigintStats = bigintData.toBigIntStatistics();
456
-
457
- console.log(bigintStats.mean()); // 300n
458
- console.log(bigintStats.summate()); // 1500n
401
+ // ウィンドウ操作が必要な場合
402
+ const windowed = data
403
+ .toWindow()
404
+ .slide(5n, 2n); // スライディングウィンドウ
405
+ ```
459
406
 
460
- // マッパー関数を使用した統計
461
- const objectData = from([
462
- { value: 15 },
463
- { value: 25 },
464
- { value: 35 },
465
- { value: 45 }
466
- ]);
407
+ ### 統計分析を選択(数値計算)
408
+ ```typescript
409
+ // 統計分析が必要な場合
410
+ const stats = data
411
+ .toNumericStatistics(); // 数値統計
467
412
 
468
- const objectStats = objectData.toNumericStatistics();
469
- const meanWithMapper = objectStats.mean(obj => obj.value); // 30
470
- const sumWithMapper = objectStats.summate(obj => obj.value); // 120
413
+ const bigIntStats = data
414
+ .toBigintStatistics(); // BigInt統計
471
415
  ```
472
416
 
473
- ## 完全な使用例
417
+ [GitHub](https://github.com/eloyhere/semantic-typescript)
418
+ [NPMJS](https://www.npmjs.com/package/semantic-typescript)
474
419
 
475
- ```typescript
476
- import { from, validate, invalidate } from 'semantic-typescript';
477
-
478
- // 1. データストリーム作成
479
- const rawData = [5, 2, 8, 1, null, 9, 3, undefined, 7, 4, 6];
480
- const semanticStream = from(rawData);
481
-
482
- // 2. ストリーム処理パイプライン
483
- const processedStream = semanticStream
484
- .filter(val => validate(val)) // nullとundefinedをフィルタリング
485
- .map(val => val! * 2) // 各値を2倍(!を使用、validateが空でないことを保証するため)
486
- .distinct(); // 重複を削除
487
-
488
- // 3. Collectableに変換して終端操作を使用
489
- const collectable = processedStream.toUnordered();
490
-
491
- // 4. データ検証と使用
492
- if (!collectable.isEmpty()) {
493
- const results = collectable
494
- .filter(x => x > 5) // 再度フィルタリング
495
- .toArray(); // 配列に変換
496
-
497
- console.log("処理結果:", results); // [16, 18, 14, 8, 12]
498
-
499
- // 統計情報
500
- const stats = processedStream.toNumericStatistics();
501
- console.log("平均値:", stats.mean()); // 11.2
502
- console.log("合計:", stats.summate()); // 56
503
- }
420
+ ## 重要な注意点
504
421
 
505
- // 5. 潜在的に無効なデータの処理
506
- const potentiallyInvalidData: Array<number | null> = [1, null, 3, 4, null];
507
- const validData = potentiallyInvalidData.filter(validate);
508
- const invalidData = potentiallyInvalidData.filter(invalidate);
509
-
510
- console.log("有効なデータ:", validData); // [1, 3, 4]
511
- console.log("無効なデータ:", invalidData); // [null, null]
512
- ```
422
+ 1. **ソート操作の影響**: 順序付きコレクターでは、`sorted()`操作が`redirect`, `translate`, `shuffle`, `reverse`の効果を上書きします
423
+ 2. **パフォーマンス考慮**: 順序保証が不要な場合は、`toUnoredered()`を優先してより良いパフォーマンスを得てください
424
+ 3. **メモリ使用量**: ソート操作にはO(n)の追加スペースが必要です
425
+ 4. **リアルタイムデータ**: Semanticストリームはリアルタイムデータに適しており、非同期データソースをサポートします
513
426
 
514
- ## 重要な使用ルールのまとめ
515
-
516
- 1. **ストリーム作成**: `from()`、`range()`、`fill()`などのファクトリメソッドを使用してSemanticインスタンスを作成
517
- 2. **ストリーム変換**: Semanticインスタンスで`map()`、`filter()`、`distinct()`などのメソッドを呼び出し
518
- 3. **Collectableへの変換**: Semanticインスタンスを通じて以下のいずれかのメソッドを呼び出す必要があります:
519
- - `toOrdered()` - 順序付きコレクター
520
- - `toUnordered()` - 順序なしコレクター(最速)
521
- - `toWindow()` - ウィンドウコレクター
522
- - `toNumericStatistics()` - 数値統計
523
- - `toBigIntStatistics()` - ビッグ整数統計
524
- - `sorted()` - 自然順ソート
525
- - `sorted(comparator)` - カスタムソート
526
- 4. **終端操作**: Collectableインスタンスで`toArray()`、`count()`、`summate()`などの終端メソッドを呼び出し
527
- 5. **データ検証**: `validate()`を使用してデータがnull/undefinedでないことを保証、`invalidate()`を使用して無効なデータをチェック
528
-
529
- この設計は、型安全性とパフォーマンス最適化を確保しながら、豊富なストリーム処理機能を提供します。
427
+ このライブラリは、TypeScript開発者に強力で柔軟なストリーム処理能力を提供し、関数型プログラミングの利点と型安全性を組み合わせています。