semantic-typescript 0.0.7 → 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/dist/semantic.d.ts +22 -5
- package/dist/semantic.js +106 -52
- package/package.json +53 -8
- package/readme.cn.md +360 -269
- package/readme.de.md +356 -264
- package/readme.es.md +357 -264
- package/readme.fr.md +357 -264
- package/readme.jp.md +362 -270
- package/readme.kr.md +361 -269
- package/readme.md +361 -270
- package/readme.ru.md +428 -0
- package/readme.tw.md +354 -263
package/readme.jp.md
CHANGED
|
@@ -1,335 +1,427 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Semantic-TypeScript ストリーム処理ライブラリ
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
コレクション、ストリーム、シーケンスを扱うための関数的スタイルの構成要素を提供し、ソート、フィルタリング、グループ化、統計分析などをサポートします。
|
|
3
|
+
## 概要
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
Semantic-TypeScriptは、JavaScript GeneratorFunction、Java Stream、MySQL Indexにインスパイアされたモダンなストリーム処理ライブラリです。このライブラリのコア設計は、データインデックスに基づいた効率的なデータ処理パイプラインの構築にあり、型安全で関数型スタイルのストリーム操作体験をフロントエンド開発者に提供します。
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
従来の同期処理とは異なり、Semanticは非同期処理モードを採用しています。データストリームを作成する際、端末がデータを受信するタイミングは、アップストリームが`accept`および`interrupt`コールバック関数をいつ呼び出すかに完全に依存します。この設計により、ライブラリはリアルタイムデータストリーム、大規模データセット、非同期データソースを優雅に処理できます。
|
|
9
8
|
|
|
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
|
-
## 📦 インストール
|
|
9
|
+
## インストール
|
|
25
10
|
|
|
26
11
|
```bash
|
|
27
12
|
npm install semantic-typescript
|
|
28
13
|
```
|
|
29
14
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
`null
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
|
41
|
-
|
|
42
|
-
| `
|
|
43
|
-
| `
|
|
44
|
-
| `
|
|
45
|
-
| `
|
|
46
|
-
| `
|
|
47
|
-
| `
|
|
48
|
-
| `
|
|
49
|
-
| `
|
|
50
|
-
| `
|
|
51
|
-
| `
|
|
52
|
-
|
|
53
|
-
|
|
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>` | ジェネレーター関数 |
|
|
54
46
|
|
|
55
47
|
```typescript
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const
|
|
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
|
|
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;
|
|
68
52
|
```
|
|
69
53
|
|
|
70
|
-
|
|
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) |
|
|
71
79
|
|
|
72
|
-
|
|
80
|
+
```typescript
|
|
81
|
+
// 型ガード使用例
|
|
82
|
+
const value: unknown = "hello";
|
|
73
83
|
|
|
74
|
-
|
|
84
|
+
if (isString(value)) {
|
|
85
|
+
console.log(value.length); // 型安全、valueはstringと推論
|
|
86
|
+
}
|
|
75
87
|
|
|
76
|
-
|
|
88
|
+
if (isOptional(someValue)) {
|
|
89
|
+
someValue.ifPresent(val => console.log(val));
|
|
90
|
+
}
|
|
91
|
+
```
|
|
77
92
|
|
|
78
|
-
|
|
93
|
+
## ユーティリティ関数
|
|
79
94
|
|
|
80
|
-
| 関数 | 説明 |
|
|
81
|
-
|
|
82
|
-
| `
|
|
83
|
-
| `
|
|
84
|
-
| `fill(element, count)` | 要素を N 回繰り返す | `fill('a', 3n)` |
|
|
85
|
-
| `iterate(gen)` | カスタムジェネレーター関数を使用 | `iterate(genFn)` |
|
|
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) |
|
|
86
99
|
|
|
87
|
-
|
|
100
|
+
```typescript
|
|
101
|
+
// ユーティリティ関数使用例
|
|
102
|
+
const numbers = [3, 1, 4, 1, 5];
|
|
103
|
+
numbers.sort(useCompare); // [1, 1, 3, 4, 5]
|
|
88
104
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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)` |
|
|
105
|
+
const randomNum = useRandom(42); // シードベースの乱数
|
|
106
|
+
const randomBigInt = useRandom(1000n); // BigInt乱数
|
|
107
|
+
```
|
|
104
108
|
|
|
105
|
-
|
|
109
|
+
## ファクトリメソッド
|
|
106
110
|
|
|
107
|
-
###
|
|
111
|
+
### Optionalファクトリメソッド
|
|
108
112
|
|
|
109
|
-
|
|
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) |
|
|
110
119
|
|
|
111
120
|
```typescript
|
|
112
|
-
|
|
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を出力
|
|
113
129
|
```
|
|
114
130
|
|
|
115
|
-
|
|
116
|
-
順序が関係なく、最大の速度が必要な場合に理想的です。
|
|
117
|
-
|
|
118
|
-
---
|
|
131
|
+
### Collectorファクトリメソッド
|
|
119
132
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
133
|
+
| メソッド | 説明 | 時間計算量 | 空間計算量 |
|
|
134
|
+
|---------|------|------------|------------|
|
|
135
|
+
| `Collector.full(identity, accumulator, finisher)` | 完全なコレクターを作成 | O(1) | O(1) |
|
|
136
|
+
| `Collector.shortable(identity, interruptor, accumulator, finisher)` | 中断可能なコレクターを作成 | O(1) | O(1) |
|
|
123
137
|
|
|
124
138
|
```typescript
|
|
125
|
-
|
|
126
|
-
const
|
|
127
|
-
|
|
139
|
+
// Collector使用例
|
|
140
|
+
const sumCollector = Collector.full(
|
|
141
|
+
() => 0,
|
|
142
|
+
(sum, num) => sum + num,
|
|
143
|
+
result => result
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
const numbers = from([1, 2, 3, 4, 5]);
|
|
147
|
+
const total = numbers.toUnoredered().collect(sumCollector); // 15
|
|
128
148
|
```
|
|
129
149
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
---
|
|
150
|
+
### Semanticファクトリメソッド
|
|
133
151
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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) |
|
|
139
162
|
|
|
140
163
|
```typescript
|
|
141
|
-
|
|
142
|
-
|
|
164
|
+
// Semanticファクトリメソッドの使用例
|
|
165
|
+
|
|
166
|
+
// Blobからストリームを作成(チャンク読み込み)
|
|
167
|
+
blob(someBlob, 1024n)
|
|
168
|
+
.toUnordered()
|
|
169
|
+
.write(WritableStream)
|
|
170
|
+
.then(callback) // ストリーム書き込み成功
|
|
171
|
+
.catch(writeFi); // ストリーム書き込み失敗
|
|
172
|
+
|
|
173
|
+
// 他のストリームと連結されるまで実行されない空ストリームを作成
|
|
174
|
+
empty<string>()
|
|
175
|
+
.toUnordered()
|
|
176
|
+
.join(); //[]
|
|
177
|
+
|
|
178
|
+
// 埋め尽くされたストリームを作成
|
|
179
|
+
const filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
180
|
+
|
|
181
|
+
// 初期遅延2秒、実行周期5秒の時系列ストリームを作成
|
|
182
|
+
// タイマーメカニズムで実装、システムスケジューリング制限による時間変動の可能性あり
|
|
183
|
+
const intervalStream = interval(5000, 2000);
|
|
184
|
+
|
|
185
|
+
// 反復可能オブジェクトからストリームを作成
|
|
186
|
+
const numberStream = from([1, 2, 3, 4, 5]);
|
|
187
|
+
const stringStream = from(new Set(["Alex", "Bob"]));
|
|
188
|
+
|
|
189
|
+
// 範囲ストリームを作成
|
|
190
|
+
const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
191
|
+
|
|
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)); // メッセージ受信
|
|
143
198
|
```
|
|
144
199
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
|
161
|
-
|
|
162
|
-
| `
|
|
163
|
-
| `
|
|
164
|
-
| `
|
|
165
|
-
| `
|
|
166
|
-
| `
|
|
167
|
-
| `
|
|
168
|
-
| `
|
|
169
|
-
| `
|
|
170
|
-
|
|
171
|
-
---
|
|
172
|
-
|
|
173
|
-
### 7. `OrderedCollectable<E>` – ソート済みデータ
|
|
174
|
-
|
|
175
|
-
要素を**自動的にソート**したい場合は、このクラスを使用してください。
|
|
176
|
-
|
|
177
|
-
**カスタム比較器**を受け入れるか、自然順を使用します。
|
|
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) |
|
|
178
225
|
|
|
179
226
|
```typescript
|
|
180
|
-
|
|
181
|
-
const
|
|
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(); // 配列に変換
|
|
182
244
|
```
|
|
183
245
|
|
|
184
|
-
|
|
246
|
+
## コレクター変換メソッド
|
|
185
247
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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) |
|
|
191
256
|
|
|
192
257
|
```typescript
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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
|
+
});
|
|
196
287
|
```
|
|
197
288
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
|
215
|
-
|
|
216
|
-
| `
|
|
217
|
-
| `
|
|
218
|
-
| `
|
|
219
|
-
| `
|
|
220
|
-
| `
|
|
221
|
-
| `
|
|
222
|
-
| `
|
|
223
|
-
| `standardDeviation()` | 標準偏差 | `.standardDeviation()` |
|
|
224
|
-
| `summate()` | 要素の合計 | `.summate()` |
|
|
225
|
-
| `quantile(q)` | q パーセンタイル(0–1)の値 | `.quantile(0.5)` → 中央値 |
|
|
226
|
-
| `frequency()` | 頻度マップ | `.frequency()` |
|
|
227
|
-
|
|
228
|
-
---
|
|
229
|
-
|
|
230
|
-
## 🧪 完全な例
|
|
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) |
|
|
231
314
|
|
|
232
315
|
```typescript
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
//
|
|
239
|
-
|
|
240
|
-
console.log(
|
|
241
|
-
|
|
242
|
-
//
|
|
243
|
-
|
|
244
|
-
console.log(
|
|
245
|
-
|
|
246
|
-
//
|
|
247
|
-
const
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
316
|
+
// Collectable操作例
|
|
317
|
+
const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
318
|
+
.filter(n => n % 2 === 0)
|
|
319
|
+
.toOrdered();
|
|
320
|
+
|
|
321
|
+
// 一致チェック
|
|
322
|
+
console.log(data.anyMatch(n => n > 5)); // true
|
|
323
|
+
console.log(data.allMatch(n => n < 20)); // true
|
|
324
|
+
|
|
325
|
+
// 検索操作
|
|
326
|
+
data.findFirst().ifPresent(n => console.log(n)); // 2
|
|
327
|
+
data.findAny().ifPresent(n => console.log(n)); // 任意の要素
|
|
328
|
+
|
|
329
|
+
// グループ化操作
|
|
330
|
+
const grouped = data.groupBy(
|
|
331
|
+
n => n > 5 ? "large" : "small",
|
|
332
|
+
n => n * 2
|
|
333
|
+
);
|
|
334
|
+
// {small: [4, 8], large: [12, 16, 20]}
|
|
335
|
+
|
|
336
|
+
// 縮約操作
|
|
337
|
+
const sum = data.reduce(0, (acc, n) => acc + n); // 30
|
|
338
|
+
|
|
339
|
+
// 出力操作
|
|
340
|
+
data.join(", "); // "2, 4, 6, 8, 10"
|
|
253
341
|
```
|
|
254
342
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
|
262
|
-
|
|
263
|
-
| `
|
|
264
|
-
| `
|
|
265
|
-
| `
|
|
266
|
-
| `
|
|
267
|
-
| `
|
|
268
|
-
| `
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
無限または制御されたデータストリーム用のカスタム**ジェネレーター**を作成できます:
|
|
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) |
|
|
275
361
|
|
|
276
362
|
```typescript
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
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
|
|
285
380
|
```
|
|
286
381
|
|
|
287
|
-
|
|
382
|
+
## パフォーマンス選択ガイド
|
|
288
383
|
|
|
384
|
+
### 非順序コレクターを選択(パフォーマンス優先)
|
|
289
385
|
```typescript
|
|
290
|
-
|
|
386
|
+
// 順序保証が不要な場合
|
|
387
|
+
const highPerformance = data
|
|
388
|
+
.filter(predicate)
|
|
389
|
+
.map(mapper)
|
|
390
|
+
.toUnoredered(); // 最高のパフォーマンス
|
|
291
391
|
```
|
|
292
392
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
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()` など |
|
|
393
|
+
### 順序付きコレクターを選択(順序が必要)
|
|
394
|
+
```typescript
|
|
395
|
+
// 要素の順序を維持する必要がある場合
|
|
396
|
+
const ordered = data.sorted(comparator);
|
|
397
|
+
```
|
|
318
398
|
|
|
319
|
-
|
|
399
|
+
### ウィンドウコレクターを選択(ウィンドウ操作)
|
|
400
|
+
```typescript
|
|
401
|
+
// ウィンドウ操作が必要な場合
|
|
402
|
+
const windowed = data
|
|
403
|
+
.toWindow()
|
|
404
|
+
.slide(5n, 2n); // スライディングウィンドウ
|
|
405
|
+
```
|
|
320
406
|
|
|
321
|
-
|
|
407
|
+
### 統計分析を選択(数値計算)
|
|
408
|
+
```typescript
|
|
409
|
+
// 統計分析が必要な場合
|
|
410
|
+
const stats = data
|
|
411
|
+
.toNumericStatistics(); // 数値統計
|
|
322
412
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
413
|
+
const bigIntStats = data
|
|
414
|
+
.toBigintStatistics(); // BigInt統計
|
|
415
|
+
```
|
|
326
416
|
|
|
327
|
-
|
|
417
|
+
[GitHub](https://github.com/eloyhere/semantic-typescript)
|
|
418
|
+
[NPMJS](https://www.npmjs.com/package/semantic-typescript)
|
|
328
419
|
|
|
329
|
-
|
|
420
|
+
## 重要な注意点
|
|
330
421
|
|
|
331
|
-
|
|
422
|
+
1. **ソート操作の影響**: 順序付きコレクターでは、`sorted()`操作が`redirect`, `translate`, `shuffle`, `reverse`の効果を上書きします
|
|
423
|
+
2. **パフォーマンス考慮**: 順序保証が不要な場合は、`toUnoredered()`を優先してより良いパフォーマンスを得てください
|
|
424
|
+
3. **メモリ使用量**: ソート操作にはO(n)の追加スペースが必要です
|
|
425
|
+
4. **リアルタイムデータ**: Semanticストリームはリアルタイムデータに適しており、非同期データソースをサポートします
|
|
332
426
|
|
|
333
|
-
|
|
334
|
-
- `toUnordered()` → **ソートなし、最速**
|
|
335
|
-
- その他すべて(例: `sorted()`、`toOrdered()`)→ **データをソート**
|
|
427
|
+
このライブラリは、TypeScript開発者に強力で柔軟なストリーム処理能力を提供し、関数型プログラミングの利点と型安全性を組み合わせています。
|