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/dist/asynchronous/collector.d.ts +235 -0
- package/dist/asynchronous/collector.js +811 -0
- package/dist/asynchronous/semantic.d.ts +257 -0
- package/dist/asynchronous/semantic.js +1863 -0
- package/dist/factory.d.ts +79 -37
- package/dist/factory.js +534 -277
- package/dist/guard.d.ts +24 -14
- package/dist/guard.js +73 -19
- package/dist/hook.d.ts +11 -6
- package/dist/hook.js +22 -5
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/main.js +6 -4
- package/dist/optional.d.ts +2 -2
- package/dist/symbol.d.ts +19 -10
- package/dist/symbol.js +19 -10
- package/dist/synchronous/collector.d.ts +236 -0
- package/dist/{collector.js → synchronous/collector.js} +217 -193
- package/dist/{semantic.d.ts → synchronous/semantic.d.ts} +125 -130
- package/dist/{semantic.js → synchronous/semantic.js} +465 -574
- package/dist/utility.d.ts +7 -1
- package/dist/utility.js +1 -0
- package/package.json +3 -2
- package/readme.cn.md +213 -753
- package/readme.de.md +171 -441
- package/readme.es.md +171 -436
- package/readme.fr.md +170 -443
- package/readme.jp.md +177 -439
- package/readme.kr.md +177 -433
- package/readme.md +213 -1066
- package/readme.ru.md +174 -420
- package/readme.tw.md +175 -441
- package/dist/collector.d.ts +0 -236
- package/dist/map.d.ts +0 -76
- package/dist/map.js +0 -245
- package/dist/node.d.ts +0 -182
- package/dist/node.js +0 -918
- package/dist/set.d.ts +0 -19
- package/dist/set.js +0 -65
- package/dist/tree.d.ts +0 -82
- package/dist/tree.js +0 -257
package/readme.jp.md
CHANGED
|
@@ -1,484 +1,222 @@
|
|
|
1
|
-
# Semantic-TypeScript
|
|
1
|
+
# Semantic-TypeScript
|
|
2
|
+
フローにインデックスを。データを精密に制御。
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
---
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
### 概要
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
Semantic-TypeScriptは、JavaScriptの`GeneratorFunction`、Java Streams、MySQLスタイルのインデックスといった最も効果的な概念を統合し、ストリーム処理技術において大きな飛躍を遂げました。その中核にある哲学はシンプルかつ強力です。それは、力任せの反復処理ではなく、インテリジェントなインデックス付けを通じて、非常に効率的なデータ処理パイプラインを構築することです。
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
従来のライブラリが同期的なループや扱いにくいPromiseチェーンを強いる場面で、Semantic-TypeScriptは、モダンなフロントエンド開発の要求に応える、完全非同期、関数型的に純粋、厳密なタイプセーフを備えた体験を提供します。
|
|
10
11
|
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
116
|
-
// ユーティリティ関数の使用例
|
|
117
|
-
let numbers: Array<number> = [3, 1, 4, 1, 5];
|
|
118
|
-
numbers.sort(useCompare); // [1, 1, 3, 4, 5]
|
|
26
|
+
・**予測可能なパフォーマンス** — 要件に基づいて、順序付きまたは順序なしのコレクターを選択できます。
|
|
119
27
|
|
|
120
|
-
|
|
121
|
-
```
|
|
28
|
+
・**メモリ効率** — ストリームは遅延評価されるため、メモリの懸念を軽減します。
|
|
122
29
|
|
|
123
|
-
|
|
30
|
+
・**未定義動作なし** — TypeScriptが型安全性とnull安全性を保証します。入力データは、コールバック関数内で明示的に変更されない限り、変更されません。
|
|
124
31
|
|
|
125
|
-
|
|
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
|
-
```
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
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
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
//
|
|
162
|
-
let
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
//
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
)
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
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
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
155
|
+
1. イベントストリーム(`useWindow`、`useDocument`、`useHTMLElement`、`useWebSocket`、…)は `AsynchronousSemantic` を返します。
|
|
156
|
+
→ リスニングを停止するには、`.limit(n)`、`.sub(start, end)`、または `.takeWhile()` を呼び出す**必須**です。そうしないと、リスナーはアクティブなままになります。
|
|
287
157
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
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
|
-
|
|
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
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
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
|
-
|
|
451
|
-
```typescript
|
|
452
|
-
// 要素の順序を維持する必要がある場合、順序付けられたCollectorを使用します
|
|
453
|
-
let ordered = data.sorted(comparator);
|
|
454
|
-
```
|
|
196
|
+
**Semantic-TypeScriptの主な利点**
|
|
455
197
|
|
|
456
|
-
|
|
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
|
-
|
|
471
|
-
|
|
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
|
-
|
|
475
|
-
[NPMJS](https://www.npmjs.com/package/semantic-typescript)
|
|
216
|
+
・ 複雑な非同期イテレータをクリーンなSemanticパイプラインに置き換えた開発者の成長するコミュニティに参加してください。
|
|
476
217
|
|
|
477
|
-
|
|
218
|
+
Semantic-TypeScript — ストリームが構造と出会う場所。
|
|
478
219
|
|
|
479
|
-
|
|
480
|
-
2. **パフォーマンスの考慮**:順序の保証が不要な場合は、`toUnordered()`を使用してパフォーマンスを向上させることをお勧めします。
|
|
481
|
-
3. **メモリ使用量**:ソート操作には追加のO(n)のメモリが必要です。
|
|
482
|
-
4. **リアルタイムデータ**:Semanticストリームはリアルタイムデータの処理に適しており、非同期データソースをサポートしています。
|
|
220
|
+
今日から構築を始め、考え抜かれたインデックス付けがもたらす違いを体験してください。
|
|
483
221
|
|
|
484
|
-
|
|
222
|
+
明確さをもって構築し、確信をもって進み、意図をもってデータを変革しましょう。
|