semantic-typescript 0.6.0 → 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 +62 -58
- package/dist/asynchronous/collector.js +16 -5
- package/dist/asynchronous/semantic.d.ts +2 -2
- package/dist/asynchronous/semantic.js +16 -6
- package/dist/factory.d.ts +8 -0
- package/dist/factory.js +112 -36
- package/dist/hook.d.ts +6 -1
- package/dist/hook.js +20 -3
- package/dist/main.d.ts +1 -0
- package/dist/main.js +6 -0
- package/dist/synchronous/collector.d.ts +8 -4
- package/dist/synchronous/collector.js +74 -59
- package/dist/synchronous/semantic.d.ts +27 -23
- package/dist/synchronous/semantic.js +215 -286
- package/package.json +3 -2
- package/readme.cn.md +213 -214
- package/readme.de.md +172 -173
- package/readme.es.md +177 -172
- package/readme.fr.md +181 -172
- package/readme.jp.md +187 -169
- package/readme.kr.md +182 -169
- package/readme.md +213 -214
- package/readme.ru.md +188 -169
- package/readme.tw.md +178 -169
package/readme.jp.md
CHANGED
|
@@ -1,204 +1,222 @@
|
|
|
1
|
-
# Semantic-TypeScript
|
|
1
|
+
# Semantic-TypeScript
|
|
2
|
+
フローにインデックスを。データを精密に制御。
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
Semantic-TypeScriptは、ストリーム処理技術における大きな進歩を表しており、JavaScriptのジェネレーター関数、Javaストリーム、およびデータベースのインデックス作成パラダイムから最も効果的な概念を統合しています。その基本的な設計原則は、洗練された遅延評価とインテリジェントなインデックス作成を通じて、非常に効率的なデータ処理パイプラインを構築することに焦点を当てています。このライブラリは、現代のTypeScriptおよびJavaScript開発向けに特別に設計された、厳密に型安全で関数型的に純粋なストリーミング操作体験を提供します。
|
|
4
|
+
---
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
- 確定的な制御を伴うリアルタイムデータストリーム(DOMイベント、WebSocket、インターバル)
|
|
8
|
-
- メモリ効率の良い遅延パイプラインによる大規模データセット
|
|
9
|
-
- 流暢で宣言的なAPIによる複雑なデータ変換
|
|
6
|
+
### 概要
|
|
10
7
|
|
|
11
|
-
|
|
8
|
+
Semantic-TypeScriptは、JavaScriptの`GeneratorFunction`、Java Streams、MySQLスタイルのインデックスといった最も効果的な概念を統合し、ストリーム処理技術において大きな飛躍を遂げました。その中核にある哲学はシンプルかつ強力です。それは、力任せの反復処理ではなく、インテリジェントなインデックス付けを通じて、非常に効率的なデータ処理パイプラインを構築することです。
|
|
12
9
|
|
|
13
|
-
|
|
14
|
-
Semantic-TypeScriptの主要なアーキテクチャ的洞察は、ストリームの定義とその実行の明確な分離です:
|
|
15
|
-
- **Semantic<E>**: データ変換パイプラインの不変で遅延的な青写真。どのような操作(フィルター、マップなど)が実行されるかを定義します。
|
|
16
|
-
- **Collectable<E>**: ストリームの実体化された実行可能なビュー。Semanticから取得され、パイプラインを実行して結果を生成するためのすべての終端操作(collect、forEachなど)を提供します。
|
|
10
|
+
従来のライブラリが同期的なループや扱いにくいPromiseチェーンを強いる場面で、Semantic-TypeScriptは、モダンなフロントエンド開発の要求に応える、完全非同期、関数型的に純粋、厳密なタイプセーフを備えた体験を提供します。
|
|
17
11
|
|
|
18
|
-
|
|
12
|
+
その洗練されたモデルでは、データは上流のパイプラインが明示的に`accept`(およびオプションで`interrupt`)コールバックを呼び出した時にのみ、コンシューマーに到達します。必要な**正確なタイミング**において、完全な制御をあなたが握ります。
|
|
19
13
|
|
|
20
|
-
|
|
21
|
-
データストリーム処理に適切なライブラリを選択することは、パフォーマンス、型安全性、表現力のバランスを取ることを伴います。Semantic-TypeScriptは、これらすべての次元で優れるように設計されています。
|
|
14
|
+
---
|
|
22
15
|
|
|
23
|
-
###
|
|
24
|
-
静的配列、リアルタイムイベント、非同期チャンクなど、あらゆるデータシーケンスを処理するための一貫した宣言的APIを提供し、エンドツーエンドの型安全性を確保するためにTypeScriptの完全な力を活用します。これにより、ランタイムエラーの全クラスを排除し、ストリーム操作を予測可能でコンパイラ検証済みのアクティビティに変えます。
|
|
16
|
+
### 開発者が選ぶ理由
|
|
25
17
|
|
|
26
|
-
|
|
27
|
-
中核的には、このライブラリは遅延評価に基づいて構築されています。フィルター、マップ、flatMapなどの操作は単に処理パイプラインを構成するだけで、終端操作が呼び出されるまで実際の作業は行われません。これは、limit、anyMatch、またはカスタム中断コールバックを介した短絡評価機能と組み合わされ、処理を早期に停止させ、大規模または無限のストリームの効率を劇的に向上させます。
|
|
18
|
+
・**ボイラープレートなしのインデックス付け** — あらゆる要素が、自然または独自のインデックスを保持します。
|
|
28
19
|
|
|
29
|
-
|
|
30
|
-
Javaに触発され、Collectorパターンは柔軟性のエンジンです。これは、ストリーム要素をどのように累積するかの仕様を、ストリーム自体の実行から分離します。ライブラリは日常業務のための豊富な組み込みコレクタ(toArray、groupBy、summateなど)を提供する一方、独自の複雑で再利用可能なリダクションロジックを実装することを簡単にします。これは、固定された終端メソッドのセットよりもはるかに強力で合成可能です。
|
|
20
|
+
・**純粋関数型スタイル** — 完全なTypeScriptの型推論を伴います。
|
|
31
21
|
|
|
32
|
-
|
|
33
|
-
Semantic-TypeScriptは、現代の開発のために設計されています。現代のWebソースに対するネイティブのファクトリメソッドを提供します:
|
|
34
|
-
- 静的データのための `useFrom(iterable)`, `useRange()`
|
|
35
|
-
- 時間ベースのストリームのための `useInterval()`, `useAnimationFrame()`
|
|
36
|
-
- チャンク化されたバイナリデータ処理のための `useBlob()`
|
|
37
|
-
- リアルタイムイベントストリームのための `useWebSocket()`, `useDocument()`, `useWindow()`
|
|
22
|
+
・**リーク対策済みイベントストリーム** — `useWindow`、`useDocument`、`useHTMLElement`、`useWebSocket`は安全性を考慮して構築されています。`limit(n)`、`sub(start, end)`、`takeWhile(predicate)`を使って境界を定義すれば、ライブラリがクリーンアップを管理します。残存するリスナーもメモリリークもありません。
|
|
38
23
|
|
|
39
|
-
|
|
40
|
-
単純な合計や平均を超えてください。このライブラリは専用のNumericStatisticsおよびBigIntStatisticsインターフェースを提供し、分散、標準偏差、中央値、歪度、尖度などの高度な統計尺度にストリームから直接アクセスできるようにします。これにより、複雑なデータ分析がワンライナーに変わります。
|
|
24
|
+
・**組み込み統計機能** — 平均、中央値、最頻値、分散、歪度、尖度を含む、包括的な数値(`number`/`bigint`)分析。
|
|
41
25
|
|
|
42
|
-
|
|
43
|
-
- **流暢で連鎖可能なAPI**: 複雑なデータパイプラインを読みやすい連続的なチェーンとして記述できます。
|
|
44
|
-
- **包括的なユーティリティスイート**: 必須のガード(isFunction、isIterable)、ユーティリティ(useCompare、useTraverse)、および関数型インターフェースが含まれています。
|
|
45
|
-
- **Optional<T> 統合**: 値の不在を安全にモデル化し、nullポインタの懸念を排除します。
|
|
46
|
-
- **パフォーマンスガイダンス**: 速度のために順序なしコレクションを使用するタイミングと、シーケンスのために順序ありを使用するタイミングに関する明確なガイダンス。
|
|
26
|
+
・**予測可能なパフォーマンス** — 要件に基づいて、順序付きまたは順序なしのコレクターを選択できます。
|
|
47
27
|
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
npm install semantic-typescript
|
|
51
|
-
```
|
|
28
|
+
・**メモリ効率** — ストリームは遅延評価されるため、メモリの懸念を軽減します。
|
|
52
29
|
|
|
53
|
-
|
|
30
|
+
・**未定義動作なし** — TypeScriptが型安全性とnull安全性を保証します。入力データは、コールバック関数内で明示的に変更されない限り、変更されません。
|
|
54
31
|
|
|
55
|
-
|
|
56
|
-
ファクトリ関数を使用してさまざまなソースからストリームを作成できます。
|
|
57
|
-
```typescript
|
|
58
|
-
import { useFrom, useInterval, useDocument } from 'semantic-typescript';
|
|
59
|
-
|
|
60
|
-
// 静的配列から
|
|
61
|
-
const staticStream = useFrom([1, 2, 3, 4, 5]);
|
|
62
|
-
|
|
63
|
-
// 非同期ジェネレーターから
|
|
64
|
-
const asyncStream = useFrom(async function*() {
|
|
65
|
-
yield 1;
|
|
66
|
-
yield 2;
|
|
67
|
-
});
|
|
32
|
+
---
|
|
68
33
|
|
|
69
|
-
|
|
70
|
-
const tickStream = useInterval(1000); // 毎秒発行
|
|
34
|
+
### インストール
|
|
71
35
|
|
|
72
|
-
|
|
73
|
-
|
|
36
|
+
```bash
|
|
37
|
+
npm install semantic-typescript
|
|
74
38
|
```
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
```typescript
|
|
79
|
-
const processedStream = staticStream
|
|
80
|
-
.filter(x => x % 2 === 0) // 偶数だけを保持
|
|
81
|
-
.map(x => x * 10) // 10倍
|
|
82
|
-
.flatMap(x => [x, x + 1]) // 各要素を2つに変換
|
|
83
|
-
.distinct(); // 重複を削除
|
|
84
|
-
// まだ何も実行されていません
|
|
39
|
+
または
|
|
40
|
+
```bash
|
|
41
|
+
yarn add semantic-typescript
|
|
85
42
|
```
|
|
86
43
|
|
|
87
|
-
|
|
88
|
-
結果を得るには、Collectableを取得し、終端操作を呼び出す必要があります。
|
|
89
|
-
```typescript
|
|
90
|
-
// パフォーマンスのために順序なしcollectableを取得
|
|
91
|
-
const resultArray = await processedStream.toUnordered().toArray();
|
|
92
|
-
console.log(resultArray); // 例: [20, 21, 40, 41]
|
|
93
|
-
|
|
94
|
-
// 組み込みコレクタを使用
|
|
95
|
-
const sum = await processedStream.toUnordered().collect(useSummate());
|
|
96
|
-
console.log(sum);
|
|
97
|
-
|
|
98
|
-
// または汎用collectメソッドを使用
|
|
99
|
-
const customResult = await processedStream.toOrdered().collect(
|
|
100
|
-
() => new Map<number, number>(),
|
|
101
|
-
(map, element, index) => map.set(index, element),
|
|
102
|
-
map => map
|
|
103
|
-
);
|
|
104
|
-
```
|
|
44
|
+
---
|
|
105
45
|
|
|
106
|
-
###
|
|
107
|
-
イベントストリーム(useDocument、useWindow、useHTMLElement、useWebSocket)は本質的に無限です。イベントの収集を停止してストリームを完了するタイミングを定義するために、sub、takeWhile、limitなどの操作を使用する必要があります。そうしないと、終端操作は無期限に待機します。
|
|
108
|
-
```typescript
|
|
109
|
-
import { useDocument } from 'semantic-typescript';
|
|
46
|
+
### クイックスタート
|
|
110
47
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
48
|
+
```typescript
|
|
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要素で停止
|
|
114
90
|
.toUnordered()
|
|
115
91
|
.toArray();
|
|
116
92
|
|
|
117
|
-
//
|
|
118
|
-
|
|
119
|
-
.
|
|
93
|
+
// リアルタイムウィンドウリサイズ (5イベント後に自動停止)
|
|
94
|
+
useWindow("resize")
|
|
95
|
+
.limit(5n) // イベントストリームでは重要
|
|
120
96
|
.toUnordered()
|
|
121
|
-
.
|
|
97
|
+
.forEach((ev, idx) => console.log(`リサイズ #${idx}`));
|
|
122
98
|
|
|
123
|
-
//
|
|
124
|
-
|
|
125
|
-
|
|
99
|
+
// HTML要素のリスニング
|
|
100
|
+
// <input id="input" type="text"/>
|
|
101
|
+
useHTMLElement("#input", "change")
|
|
102
|
+
.limit(1)
|
|
126
103
|
.toUnordered()
|
|
127
|
-
.
|
|
128
|
-
```
|
|
104
|
+
.forEach((event: Event) => submit(event));
|
|
129
105
|
|
|
130
|
-
|
|
106
|
+
// 複数要素とイベントのリスニング
|
|
107
|
+
useHTMLElement("input", ["change", "keyup"])
|
|
108
|
+
.takeWhile((event: Event): boolean => validate(event))
|
|
109
|
+
.toUnordered()
|
|
110
|
+
.forEach((event: Event) => submit(event));
|
|
131
111
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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));
|
|
141
121
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
- **豊富な操作セット**: filter, map, flatMap, concat, distinct, sorted, limit, skip, peek, reverse, shuffle
|
|
145
|
-
- **柔軟な終端操作**: collect(カスタムコレクタ付き), toArray, toSet, toMap, forEach, reduce, findFirst, anyMatch, allMatch, count
|
|
146
|
-
- **高度なコレクタ**: 連結、グループ化、分割、合計、平均、最大値、最小値のための組み込みコレクタ
|
|
147
|
-
- **統計モジュール**: 数値/ bigintストリームに対する平均、中央値、最頻値、分散、標準偏差、範囲、分位数、歪度、尖度のためのすぐに使えるメソッド
|
|
148
|
-
- **ユーティリティ関数**: 型ガード(isPromise、isAsyncIterable)、コンパレータ(useCompare)、トラバーサル(useTraverse)、変換フック
|
|
149
|
-
- **Optional<T>**: null許容値のためのモナディックコンテナ。検索操作と統合されています。
|
|
150
|
-
|
|
151
|
-
## API概要
|
|
152
|
-
### コアクラス&インターフェース
|
|
153
|
-
- `Semantic<E>` / `AsynchronousSemantic<E>`: 抽象ストリーム定義
|
|
154
|
-
- `Collectable<E>` / `AsynchronousCollectable<E>`: 終端操作を持つ実行可能ストリーム
|
|
155
|
-
- `OrderedCollectable<E>` / `UnorderedCollectable<E>`: 順序に敏感または順序に敏感でない操作に最適化された実体化バージョン
|
|
156
|
-
- `Collector<E, A, R>`: 可変リダクション操作の抽象化
|
|
157
|
-
|
|
158
|
-
### ファクトリ関数(use*)
|
|
159
|
-
- **ソースから**: useFrom, useRange, useFill, useEmpty
|
|
160
|
-
- **時間から**: useInterval, useAnimationFrame
|
|
161
|
-
- **Web APIから**: useBlob, useDocument, useWindow, useHTMLElement, useWebSocket
|
|
162
|
-
- **コレクタ**: useToArray, useGroupBy, useSummate, useJoin など
|
|
163
|
-
|
|
164
|
-
## パフォーマンスに関する注意点
|
|
165
|
-
- **遅延評価**: パイプラインは、終端操作が呼び出されるまで実行されずに構成されます
|
|
166
|
-
- **短絡評価**: limit、anyMatch、findFirstなどの操作は、結果が決定するとすぐに要素の処理を停止します
|
|
167
|
-
- **順序あり vs 順序なし**:
|
|
168
|
-
- ソース要素の順序が結果に影響しない終端操作(例:合計、最大値、またはtoSet)の場合、`.toUnordered()`を使用します。これにより、高価なソートステップをスキップする内部最適化が可能になる場合があります
|
|
169
|
-
- シーケンスが重要な場合(例:順序を保持する必要があるtoArray)には、`.toOrdered()`を使用します
|
|
170
|
-
|
|
171
|
-
## はじめの一歩の例
|
|
172
|
-
```typescript
|
|
173
|
-
import { useFrom, useSummate, useGroupBy } from 'semantic-typescript';
|
|
174
|
-
|
|
175
|
-
interface Transaction {
|
|
176
|
-
id: number;
|
|
177
|
-
amount: number;
|
|
178
|
-
category: string;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
const transactions: Transaction[] = [
|
|
182
|
-
{ id: 1, amount: 100, category: 'Food' },
|
|
183
|
-
{ id: 2, amount: 200, category: 'Electronics' },
|
|
184
|
-
{ id: 3, amount: 50, category: 'Food' },
|
|
185
|
-
{ id: 4, amount: 300, category: 'Electronics' },
|
|
186
|
-
];
|
|
187
|
-
|
|
188
|
-
// カテゴリごとの合計金額を計算
|
|
189
|
-
const totalsByCategory = await useFrom(transactions)
|
|
122
|
+
// 文字列をコードポイントでイテレート
|
|
123
|
+
useText("My emotion now is: 😊, and semantic is 👍")
|
|
190
124
|
.toUnordered()
|
|
191
|
-
.
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
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: []}` を生成
|
|
200
135
|
```
|
|
201
136
|
|
|
202
|
-
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
### コアコンセプト
|
|
140
|
+
|
|
141
|
+
| 概念 | 目的 | 使用する場面 |
|
|
142
|
+
| :--- | :--- | :--- |
|
|
143
|
+
| `AsynchronousSemantic` | 非同期ストリーム、イベント、遅延パイプラインのためのコアビルダー。 | リアルタイムイベント、WebSockets、DOMリスナー、長時間実行または無限ストリーム。 |
|
|
144
|
+
| `SynchronousSemantic` | 同期、インメモリ、ループベースのストリームのビルダー。 | 静的なデータ、レンジ、即時イテレーション。 |
|
|
145
|
+
| `toUnordered()` | 最速の終端コレクター(マップベースのインデックス付け)。 | パフォーマンスが重要なパス(O(n) 時間 & 空間、ソートなし)。 |
|
|
146
|
+
| `toOrdered()` | ソート済み、インデックス安定のコレクター。 | 安定した順序付けまたはインデックス付きアクセスが必要な場合。 |
|
|
147
|
+
| `toNumericStatistics()` | 豊富な数値統計分析(平均、中央値、分散、歪度、尖度など)。 | データ分析と統計計算。 |
|
|
148
|
+
| `toBigIntStatistics()` | 豊富なbigint統計分析。 | 大きな整数に対するデータ分析と統計計算。 |
|
|
149
|
+
| `toWindow()` | スライディングおよびタンブリングウィンドウのサポート。 | 時系列処理、バッチ処理、ウィンドウ操作。 |
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
重要な使用ルール
|
|
154
|
+
|
|
155
|
+
1. イベントストリーム(`useWindow`、`useDocument`、`useHTMLElement`、`useWebSocket`、…)は `AsynchronousSemantic` を返します。
|
|
156
|
+
→ リスニングを停止するには、`.limit(n)`、`.sub(start, end)`、または `.takeWhile()` を呼び出す**必須**です。そうしないと、リスナーはアクティブなままになります。
|
|
157
|
+
|
|
158
|
+
2. 終端操作(`.toArray()`、`.count()`、`.average()`、`.reduce()`、`.findFirst()` など)は、コレクターに変換した後にのみ利用可能です:
|
|
159
|
+
```typescript
|
|
160
|
+
.toUnordered() // O(n) 時間 & 空間、ソートなし
|
|
161
|
+
// または
|
|
162
|
+
.toOrdered() // ソート済み、順序を維持
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
### パフォーマンス特性
|
|
168
|
+
|
|
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) | はい | 時間ベースのウィンドウ操作。 |
|
|
176
|
+
|
|
177
|
+
速度が最優先の場合は `toUnordered()` を選択してください。安定した順序付けやソート済みデータに依存する統計メソッドが必要な場合にのみ `toOrdered()` を使用してください。
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
他のフロントエンドストリームプロセッサとの比較
|
|
182
|
+
|
|
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オブザーバブル)。 | 低い。 | 中程度。 |
|
|
195
|
+
|
|
196
|
+
**Semantic-TypeScriptの主な利点**
|
|
197
|
+
|
|
198
|
+
・ 独自の組み込み統計およびインデックス機能により、手動での `reduce` や外部ライブラリが不要。
|
|
199
|
+
|
|
200
|
+
・ イベントストリームに対する明示的な制御により、RxJSで一般的なメモリリークを防止。
|
|
201
|
+
|
|
202
|
+
・ 統一された同期/非同期設計により、多様なユースケースに対して単一で一貫したAPIを提供。
|
|
203
|
+
|
|
204
|
+
この比較は、伝統的なリアクティブライブラリの煩雑さなしに、パフォーマンス、型安全性、豊富な分析機能を要求するモダンなTypeScriptフロントエンドアプリケーションに、Semantic-TypeScriptが特に適している理由を示しています。
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
### 探求を始めましょうか?
|
|
209
|
+
|
|
210
|
+
Semantic-TypeScriptは、複雑なデータフローを、読みやすく、合成可能で、高性能なパイプラインへと変えます。リアルタイムUIイベントの処理、大規模データセットの処理、分析ダッシュボードの構築のいずれにおいても、データベースレベルのインデックス付けの力を関数型プログラミングのエレガンスと共に提供します。
|
|
211
|
+
|
|
212
|
+
次のステップ:
|
|
213
|
+
|
|
214
|
+
・ IDE内で完全に型付けされたAPIを参照してください(すべてのエクスポートはメインパッケージから)。
|
|
215
|
+
|
|
216
|
+
・ 複雑な非同期イテレータをクリーンなSemanticパイプラインに置き換えた開発者の成長するコミュニティに参加してください。
|
|
217
|
+
|
|
218
|
+
Semantic-TypeScript — ストリームが構造と出会う場所。
|
|
219
|
+
|
|
220
|
+
今日から構築を始め、考え抜かれたインデックス付けがもたらす違いを体験してください。
|
|
203
221
|
|
|
204
|
-
|
|
222
|
+
明確さをもって構築し、確信をもって進み、意図をもってデータを変革しましょう。
|