semantic-typescript 0.5.3 → 0.6.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.
Files changed (42) hide show
  1. package/dist/asynchronous/collector.d.ts +231 -0
  2. package/dist/asynchronous/collector.js +800 -0
  3. package/dist/asynchronous/semantic.d.ts +257 -0
  4. package/dist/asynchronous/semantic.js +1853 -0
  5. package/dist/factory.d.ts +71 -37
  6. package/dist/factory.js +443 -262
  7. package/dist/guard.d.ts +24 -14
  8. package/dist/guard.js +73 -19
  9. package/dist/hook.d.ts +6 -6
  10. package/dist/hook.js +2 -2
  11. package/dist/index.d.ts +2 -2
  12. package/dist/index.js +2 -2
  13. package/dist/optional.d.ts +2 -2
  14. package/dist/symbol.d.ts +19 -10
  15. package/dist/symbol.js +19 -10
  16. package/dist/synchronous/collector.d.ts +232 -0
  17. package/dist/{collector.js → synchronous/collector.js} +160 -151
  18. package/dist/{semantic.d.ts → synchronous/semantic.d.ts} +111 -120
  19. package/dist/{semantic.js → synchronous/semantic.js} +299 -337
  20. package/dist/utility.d.ts +7 -1
  21. package/dist/utility.js +1 -0
  22. package/package.json +1 -1
  23. package/readme.cn.md +158 -697
  24. package/readme.de.md +163 -432
  25. package/readme.es.md +163 -433
  26. package/readme.fr.md +162 -444
  27. package/readme.jp.md +162 -442
  28. package/readme.kr.md +161 -430
  29. package/readme.md +157 -1009
  30. package/readme.ru.md +161 -426
  31. package/readme.tw.md +161 -436
  32. package/dist/collector.d.ts +0 -236
  33. package/dist/main.d.ts +0 -1
  34. package/dist/main.js +0 -4
  35. package/dist/map.d.ts +0 -76
  36. package/dist/map.js +0 -245
  37. package/dist/node.d.ts +0 -182
  38. package/dist/node.js +0 -918
  39. package/dist/set.d.ts +0 -19
  40. package/dist/set.js +0 -65
  41. package/dist/tree.d.ts +0 -82
  42. package/dist/tree.js +0 -257
package/readme.jp.md CHANGED
@@ -1,484 +1,204 @@
1
- # Semantic-TypeScript ストリーム処理ライブラリ
1
+ # Semantic-TypeScript: パラダイムを転換するストリーム処理ライブラリ
2
2
 
3
- ## 序論
3
+ ## はじめに
4
+ Semantic-TypeScriptは、ストリーム処理技術における大きな進歩を表しており、JavaScriptのジェネレーター関数、Javaストリーム、およびデータベースのインデックス作成パラダイムから最も効果的な概念を統合しています。その基本的な設計原則は、洗練された遅延評価とインテリジェントなインデックス作成を通じて、非常に効率的なデータ処理パイプラインを構築することに焦点を当てています。このライブラリは、現代のTypeScriptおよびJavaScript開発向けに特別に設計された、厳密に型安全で関数型的に純粋なストリーミング操作体験を提供します。
4
5
 
5
- Semantic-TypeScriptは、JavaScriptのGeneratorFunction、JavaのStream、MySQLのIndexに触発された現代的なストリーム処理ライブラリです。その中心的な設計哲学は、データインデックスを使用して効率的なデータ処理パイプラインを構築することに基づいており、フロントエンド開発のための型安全で関数型のストリーミング操作体験を提供します。
6
+ 従来の同期処理アーキテクチャとは対照的に、Semantic-TypeScriptは同期(Iterable)と非同期(AsyncIterable)の両方のデータソースを優雅に扱う統一モデルを実装しています。ストリーム生成中、データの流れと終了はコールバックメカニズムによって正確に制御され、これにより、ライブラリは例外的な優雅さを持って以下の処理を可能にします:
7
+ - 確定的な制御を伴うリアルタイムデータストリーム(DOMイベント、WebSocket、インターバル)
8
+ - メモリ効率の良い遅延パイプラインによる大規模データセット
9
+ - 流暢で宣言的なAPIによる複雑なデータ変換
6
10
 
7
- 従来の同期処理とは異なり、Semanticは非同期処理モデルを採用しています。データストリームを作成する際、ターミナルがデータを受信するタイミングは、アップストリームが`accept`と`interrupt`コールバック関数を呼び出すタイミングに完全に依存します。この設計により、ライブラリはリアルタイムデータストリーム、大規模なデータセット、非同期データソースを洗練された方法で処理することができます。
11
+ このライブラリの革新的なアプローチは、開発者がデータのシーケンスとどのように対話するかを根本的に再構想し、単一のまとまりのあるパッケージの中で、前例のないパフォーマンス特性と開発者の人間工学の両方を提供します。
8
12
 
9
- ## インストール
10
-
11
- ```bash
12
- npm install semantic-typescript
13
- ```
13
+ ## コア哲学:定義と実行の分離
14
+ Semantic-TypeScriptの主要なアーキテクチャ的洞察は、ストリームの定義とその実行の明確な分離です:
15
+ - **Semantic<E>**: データ変換パイプラインの不変で遅延的な青写真。どのような操作(フィルター、マップなど)が実行されるかを定義します。
16
+ - **Collectable<E>**: ストリームの実体化された実行可能なビュー。Semanticから取得され、パイプラインを実行して結果を生成するためのすべての終端操作(collect、forEachなど)を提供します。
14
17
 
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>` | ジェネレータ関数(コアと基盤) |
18
+ この分離は明確なメンタルモデルを強制し、最大速度のために不要なソートをスキップするためにUnorderedCollectableを選択するなどの強力な最適化を可能にします。
52
19
 
53
- ```typescript
54
- // 型の使用例
55
- let predicate: Predicate<number> = (n: number): boolean => n > 0;
56
- let mapper: Functional<string, number> = (text: string): number => text.length;
57
- let comparator: Comparator<number> = (a: number, b: number): number => a - b;
58
- ```
20
+ ## なぜSemantic-TypeScriptを選ぶのか?
21
+ データストリーム処理に適切なライブラリを選択することは、パフォーマンス、型安全性、表現力のバランスを取ることを伴います。Semantic-TypeScriptは、これらすべての次元で優れるように設計されています。
59
22
 
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) |
23
+ ### 1. すべてのデータシーケンスのための統一された型安全パラダイム
24
+ 静的配列、リアルタイムイベント、非同期チャンクなど、あらゆるデータシーケンスを処理するための一貫した宣言的APIを提供し、エンドツーエンドの型安全性を確保するためにTypeScriptの完全な力を活用します。これにより、ランタイムエラーの全クラスを排除し、ストリーム操作を予測可能でコンパイラ検証済みのアクティビティに変えます。
87
25
 
88
- ```typescript
89
- // 型ガードの使用例
90
- let value: unknown = "hello";
26
+ ### 2. インテリジェントな遅延性による妥協のないパフォーマンス
27
+ 中核的には、このライブラリは遅延評価に基づいて構築されています。フィルター、マップ、flatMapなどの操作は単に処理パイプラインを構成するだけで、終端操作が呼び出されるまで実際の作業は行われません。これは、limit、anyMatch、またはカスタム中断コールバックを介した短絡評価機能と組み合わされ、処理を早期に停止させ、大規模または無限のストリームの効率を劇的に向上させます。
91
28
 
92
- if (isString(value)) {
93
- console.log(value.length); // 型安全、valueはstringと推論される
94
- }
29
+ ### 3. `Collector<E, A, R>` パターンの力
30
+ Javaに触発され、Collectorパターンは柔軟性のエンジンです。これは、ストリーム要素をどのように累積するかの仕様を、ストリーム自体の実行から分離します。ライブラリは日常業務のための豊富な組み込みコレクタ(toArray、groupBy、summateなど)を提供する一方、独自の複雑で再利用可能なリダクションロジックを実装することを簡単にします。これは、固定された終端メソッドのセットよりもはるかに強力で合成可能です。
95
31
 
96
- if (isOptional(someValue)) {
97
- someValue.ifPresent((value): void => console.log(val));
98
- }
32
+ ### 4. 現代のWebおよび非同期データへの第一級サポート
33
+ Semantic-TypeScriptは、現代の開発のために設計されています。現代のWebソースに対するネイティブのファクトリメソッドを提供します:
34
+ - 静的データのための `useFrom(iterable)`, `useRange()`
35
+ - 時間ベースのストリームのための `useInterval()`, `useAnimationFrame()`
36
+ - チャンク化されたバイナリデータ処理のための `useBlob()`
37
+ - リアルタイムイベントストリームのための `useWebSocket()`, `useDocument()`, `useWindow()`
99
38
 
100
- if(isIterable(value)){
101
- // 型安全、今やそれは反復可能なオブジェクトです。
102
- for(let item of value){
103
- console.log(item);
104
- }
105
- }
106
- ```
39
+ ### 5. 基本的な集計を超えて:組み込み統計分析
40
+ 単純な合計や平均を超えてください。このライブラリは専用のNumericStatisticsおよびBigIntStatisticsインターフェースを提供し、分散、標準偏差、中央値、歪度、尖度などの高度な統計尺度にストリームから直接アクセスできるようにします。これにより、複雑なデータ分析がワンライナーに変わります。
107
41
 
108
- ## ユーティリティ関数
42
+ ### 6. 開発者の人間工学のために設計
43
+ - **流暢で連鎖可能なAPI**: 複雑なデータパイプラインを読みやすい連続的なチェーンとして記述できます。
44
+ - **包括的なユーティリティスイート**: 必須のガード(isFunction、isIterable)、ユーティリティ(useCompare、useTraverse)、および関数型インターフェースが含まれています。
45
+ - **Optional<T> 統合**: 値の不在を安全にモデル化し、nullポインタの懸念を排除します。
46
+ - **パフォーマンスガイダンス**: 速度のために順序なしコレクションを使用するタイミングと、シーケンスのために順序ありを使用するタイミングに関する明確なガイダンス。
109
47
 
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) |
114
-
115
- ```typescript
116
- // ユーティリティ関数の使用例
117
- let numbers: Array<number> = [3, 1, 4, 1, 5];
118
- numbers.sort(useCompare); // [1, 1, 3, 4, 5]
119
-
120
- let randomNum = useRandom(42); // シードベースの乱数
121
- ```
122
-
123
- ## ファクトリメソッド
124
-
125
- ### Optionalのファクトリメソッド
126
-
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) |
133
-
134
- ```typescript
135
- // Optionalの使用例
136
- let empty: Optional<number> = Optional.empty();
137
- let present: Optional<number> = Optional.of(42);
138
- let nullable: Optional<string> = Optional.ofNullable<string>(null);
139
- let nonNull: Optional<string> = Optional.ofNonNull("hello");
140
-
141
- present.ifPresent((val: number): void => console.log(val)); // 42を出力
142
- console.log(emptyOpt.get(100)); // 100を出力
48
+ ## インストール
49
+ ```bash
50
+ npm install semantic-typescript
143
51
  ```
144
52
 
145
- ### Collectorのファクトリメソッド
146
-
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) |
53
+ ## 実践におけるコアコンセプト
151
54
 
55
+ ### 1. ストリームの作成(Semantic)
56
+ ファクトリ関数を使用してさまざまなソースからストリームを作成できます。
152
57
  ```typescript
153
- // Collectorの変換例
154
- let numbers: Semantic<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
155
-
156
- // 性能優先: 未順序のCollectorを使用
157
- let unordered: UnorderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
158
- .filter((n: number): boolean => n > 3)
159
- .toUnordered(); // 最高の性能
160
-
161
- // 順序が必要: 順序付けられたCollectorを使用
162
- let ordered: OrderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
163
- .sorted();
164
-
165
- // 要素数をカウント
166
- let count: Collector<number, number, number> = Collector.full(
167
- (): number => 0, // 初期値
168
- (accumulator: number, element: number): number => accumulator + element, // 累積
169
- (accumulator: number): number => accumulator // 完了
170
- );
171
- count.collect(from([1,2,3,4,5])); // ストリームからカウント
172
- count.collect([1,2,3,4,5]); // 反復可能オブジェクトからカウント
173
-
174
- let find: Optional<number> = Collector.shortable(
175
- (): Optional<number> => Optional.empty(), // 初期値
176
- (element: number, index: bigint, accumulator: Optional<number>): Optional<number> => accumulator.isPresent(), // 中断
177
- (accumulator: Optional<number>, element: number, index: bigint): Optional<number> => Optional.of(element), // 累積
178
- (accumulator: Optional<number>): Optional<number> => accumulator // 完了
179
- );
180
- find.collect(from([1,2,3,4,5])); // 最初の要素を見つける
181
- find.collect([1,2,3,4,5]); // 最初の要素を見つける
182
- ```
58
+ import { useFrom, useInterval, useDocument } from 'semantic-typescript';
183
59
 
184
- ### Semanticのファクトリメソッド
60
+ // 静的配列から
61
+ const staticStream = useFrom([1, 2, 3, 4, 5]);
185
62
 
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) |
63
+ // 非同期ジェネレーターから
64
+ const asyncStream = useFrom(async function*() {
65
+ yield 1;
66
+ yield 2;
67
+ });
197
68
 
198
- ```typescript
199
- // Semanticのファクトリメソッドの使用例
200
-
201
- // 時間ベースのアニメーションフレームからストリームを作成
202
- animationFrame(1000)
203
- .toUnordered()
204
- .forEach(frame => console.log(frame));
205
-
206
- // Blobからストリームを作成(チャンク読み取り)
207
- blob(someBlob, 1024n)
208
- .toUnordered()
209
- .write(WritableStream)
210
- .then(callback) // ストリームの書き込み成功
211
- .catch(callback); // ストリームの書き込み失敗
212
-
213
- // 結合されるまで実行されない空のストリームを作成
214
- empty<string>()
215
- .toUnordered()
216
- .join(); // []
217
-
218
- // 埋められたストリームを作成
219
- let filledStream = fill("hello", 3); // "hello", "hello", "hello"
220
-
221
- // 初期遅延2秒、実行周期5秒の時間ベースのストリームを作成、タイマーメカニズムに基づいて実装されています。システムスケジュールの精度制限により時間のドリフトが発生する可能性があります。
222
- let intervalStream = interval(5000, 2000);
223
-
224
- // 反復可能オブジェクトからストリームを作成
225
- let numberStream = from([1, 2, 3, 4, 5]);
226
- let stringStream = from(new Set(["Alex", "Bob"]));
227
-
228
- // 数値範囲のストリームを作成
229
- let rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
230
-
231
- // WebSocketイベントストリーム
232
- let ws = new WebSocket("ws://localhost:8080");
233
- websocket(ws)
234
- .filter((event): boolean => event.type === "message") // メッセージイベントのみをリッスン
235
- .toUnordered() // イベントは通常順序付けられていません
236
- .forEach((event): void => receive(event)); // メッセージを受信
237
- ```
238
-
239
- ## Semanticクラスメソッド
240
-
241
- | メソッド | 説明 | 時間複雑度 | 空間複雑度 |
242
- |------|------|------------|------------|
243
- | `concat(other)` | 二つのストリームを結合 | O(n) | O(1) |
244
- | `distinct()` | 重複を削除 | O(n) | O(n) |
245
- | `distinct(comparator)` | 比較子を使用して重複を削除 | O(n²) | O(n) |
246
- | `dropWhile(predicate)` | 条件を満たす要素を破棄 | O(n) | O(1) |
247
- | `filter(predicate)` | 要素をフィルター | O(n) | O(1) |
248
- | `flat(mapper)` | フラットマッピング | O(n × m) | O(1) |
249
- | `flatMap(mapper)` | 新しい型にフラットマッピング | O(n × m) | O(1) |
250
- | `limit(n)` | 要素数を制限 | O(n) | O(1) |
251
- | `map(mapper)` | マッピング変換 | O(n) | O(1) |
252
- | `peek(consumer)` | 要素を覗く | O(n) | O(1) |
253
- | `redirect(redirector)` | インデックスをリダイレクト | O(n) | O(1) |
254
- | `reverse()` | ストリームを逆転 | O(n) | O(1) |
255
- | `shuffle()` | ランダムにシャッフル | O(n) | O(1) |
256
- | `shuffle(mapper)` | マッパーを使用してシャッフル | O(n) | O(1) |
257
- | `skip(n)` | 最初のn要素をスキップ | O(n) | O(1) |
258
- | `sorted()` | ソート | O(n log n) | O(n) |
259
- | `sorted(comparator)` | 比較子を使用してソート | O(n log n) | O(n) |
260
- | `sub(start, end)` | サブストリームを取得 | O(n) | O(1) |
261
- | `takeWhile(predicate)` | 条件を満たす要素を取得 | O(n) | O(1) |
262
- | `translate(offset)` | インデックスを変換 | O(n) | O(1) |
263
- | `translate(translator)` | 変換子を使用してインデックスを変換 | O(n) | O(1) |
69
+ // 時間ベースのストリーム
70
+ const tickStream = useInterval(1000); // 毎秒発行
264
71
 
265
- ```typescript
266
- // Semantic操作の例
267
- let result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
268
- .filter((n: number): boolean => n % 2 === 0) // 偶数をフィルター
269
- .map((n: number): number => n * 2) // 2倍にする
270
- .skip(1) // 最初のものをスキップ
271
- .limit(3) // 3要素に制限
272
- .toUnordered() // 順序付けられていないCollectorに変換
273
- .toArray(); // 配列に変換
274
- // 結果: [8, 12, 20]
275
-
276
- // 複雑な操作の例
277
- let complexResult = range(1, 100, 1)
278
- .flatMap((n: number): Semantics<number> => from([n, n * 2])) // 各要素を二つにマッピング
279
- .distinct() // 重複を削除
280
- .shuffle() // 順序をシャッフル
281
- .takeWhile((n: number): boolean => n < 50) // 50未満の要素を取る
282
- .toOrdered() // 順序付けられたCollectorに変換
283
- .toArray(); // 配列に変換
72
+ // DOMイベントストリーム(以下の重要な注意点を参照)
73
+ const clickStream = useDocument('click');
284
74
  ```
285
75
 
286
- ## Semanticの変換メソッド
287
-
288
- | メソッド | 説明 | 時間複雑度 | 空間複雑度 |
289
- |------------|------------|------------|------------|
290
- | `sorted()` | 順序付けられたCollectorに変換 | O(n log n) | O(n) |
291
- | `toUnordered()` | 順序付けられていないCollectorに変換 | O(1) | O(1) |
292
- | `toOrdered()` | 順序付けられたCollectorに変換 | O(1) | O(1) |
293
- | `toNumericStatistics()` | 数値統計に変換 | O(n) | O(1) |
294
- | `toBigintStatistics()` | BigInt統計に変換 | O(n) | O(1) |
295
- | `toWindow()` | ウィンドウコレクターに変換 | O(1) | O(1) |
296
- | `toCollectable()` | `UnorderdCollectable`に変換 | O(n) | O(1) |
297
- | `toCollectable(mapper)` | カスタマイズされたCollectableに変換 | O(n) | O(1) |
298
-
76
+ ### 2. ストリームの変換(中間操作)
77
+ 操作は遅延的に連鎖してパイプラインを定義します。
299
78
  ```typescript
300
- // 昇順に並べ替えられた配列に変換
301
- from([6,4,3,5,2]) // ストリームを作成
302
- .sorted() // ストリームを昇順に並べ替え
303
- .toArray(); // [2, 3, 4, 5, 6]
304
-
305
- // 降順に並べ替えられた配列に変換
306
- from([6,4,3,5,2]) // ストリームを作成
307
- .soted((a: number, b: number): number => b - a) // ストリームを降順に並べ替え
308
- .toArray(); // [6, 5, 4, 3, 2]
309
-
310
- // 逆順の配列にリダイレクト
311
- from([6,4,3,5,2])
312
- .redirect((element, index): bigint => -index) // 逆順にリダイレクト
313
- .toOrderd() // リダイレクトされた順序を保持
314
- .toArray(); // [2, 5, 3, 4, 6]
315
-
316
- // リダイレクトを無視して逆順の配列を得る
317
- from([6,4,3,5,2])
318
- .redirect((element: number, index: bigint) => -index) // 逆順にリダイレクト
319
- .toUnorderd() // リダイレクトされた順序を無視します。この操作は`redirect`、`reverse`、`shuffle`、`translate`の操作を無視します
320
- .toArray(); // [2, 5, 3, 4, 6]
321
-
322
- // ストリームを逆順に配列に変換
323
- from([6, 4, 3, 5, 2])
324
- .reverse() // ストリームを逆順にする
325
- .toOrdered() // 逆順を保証する
326
- .toArray(); // [2, 5, 3, 4, 6]
327
-
328
- // シャッフルされたストリームを上書きして配列に変換
329
- from([6, 4, 3, 5, 2])
330
- .shuffle() // ストリームをシャッフルする
331
- .sorted() // シャッフルされた順序を上書きする。この操作は`redirect`、`reverse`、`shuffle`、`translate`の操作を上書きする
332
- .toArray(); // [2, 5, 3, 4, 6]
333
-
334
- // ウィンドウコレクターに変換
335
- from([6, 4, 3, 5, 2]).toWindow();
336
-
337
- // 数値統計に変換
338
- from([6, 4, 3, 5, 2]).toNumericStatistics();
339
-
340
- // BigInt統計に変換
341
- from([6n, 4n, 3n, 5n, 2n]).toBigintStatistics();
342
-
343
- // データ収集のためのカスタムコレクターを定義
344
- let customizedCollector = from([1, 2, 3, 4, 5])
345
- .toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
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
+ // まだ何も実行されていません
346
85
  ```
347
86
 
348
- ## Collectableの集約メソッド
349
-
350
- | メソッド | 説明 | 時間複雑度 | 空間複雑度 |
351
- |------|------|------------|------------|
352
- | `anyMatch(predicate)` | 任意の要素が一致するかどうか | O(n) | O(1) |
353
- | `allMatch(predicate)` | すべての要素が一致するかどうか | O(n) | O(1) |
354
- | `count()` | 要素数 | O(n) | O(1) |
355
- | `isEmpty()` | 空かどうか | O(1) | O(1) |
356
- | `findAny()` | 任意の要素を見つける | O(n) | O(1) |
357
- | `findFirst()` | 最初の要素を見つける | O(n) | O(1) |
358
- | `findLast()` | 最後の要素を見つける | O(n) | O(1) |
359
- | `forEach(action)` | すべての要素を反復する | O(n) | O(1) |
360
- | `group(classifier)` | クラスファイヤーでグループ化 | O(n) | O(n) |
361
- | `groupBy(keyExtractor, valueExtractor)` | キー・バリュー抽出子でグループ化 | O(n) | O(n) |
362
- | `join()` | 文字列として結合 | O(n) | O(n) |
363
- | `join(delimiter)` | 区切り文字を使用して結合 | O(n) | O(n) |
364
- | `nonMatch(predicate)` | 一致しない要素があるかどうか | O(n) | O(1) |
365
- | `partition(count)` | 数でパーティション分割 | O(n) | O(n) |
366
- | `partitionBy(classifier)` | クラスファイヤーでパーティション分割 | O(n) | O(n) |
367
- | `reduce(accumulator)` | 減少操作 | O(n) | O(1) |
368
- | `reduce(identity, accumulator)` | 初期値を持つ減少 | O(n) | O(1) |
369
- | `toArray()` | 配列に変換 | O(n) | O(n) |
370
- | `toMap(keyExtractor, valueExtractor)` | Mapに変換 | O(n) | O(n) |
371
- | `toSet()` | Setに変換 | O(n) | O(n) |
372
- | `write(stream)` | ストリームに書き込む | O(n) | O(1) |
373
-
87
+ ### 3. ストリームの実行(終端操作)
88
+ 結果を得るには、Collectableを取得し、終端操作を呼び出す必要があります。
374
89
  ```typescript
375
- // Collectableの操作例
376
- const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
377
- .filter((n: number): boolean => n % 2 === 0)
378
- .toOrdered();
379
-
380
- // 一致チェック
381
- console.log(data.anyMatch((n: number): boolean => n > 5)); // true
382
- console.log(data.allMatch((n: number): boolean => n < 20)); // true
383
-
384
- // 検索操作
385
- data.findFirst().ifPresent((n: number): void => console.log(n)); // 2
386
- data.findAny().ifPresent((n: number): void => console.log(n)); // 任意の要素
387
-
388
- // グループ化操作
389
- const grouped = data.groupBy(
390
- (n: number): string => (n > 5 ? "大" : "小"),
391
- (n: number): number => n * 2
392
- ); // {小: [4, 8], 大: [12, 16, 20]}
393
-
394
- // 減少操作
395
- const sum = data.reduce(0, (acc, n) => acc + n); // 30
396
-
397
- // 出力操作
398
- data.join(", "); // "[2, 4, 6, 8, 10]"
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
+ );
399
104
  ```
400
105
 
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) |
419
-
106
+ ### 4. 重要:イベントストリームの操作
107
+ イベントストリーム(useDocument、useWindow、useHTMLElement、useWebSocket)は本質的に無限です。イベントの収集を停止してストリームを完了するタイミングを定義するために、sub、takeWhile、limitなどの操作を使用する必要があります。そうしないと、終端操作は無期限に待機します。
420
108
  ```typescript
421
- // 統計分析の例
422
- let numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
423
- .toNumericStatistics();
424
-
425
- console.log("平均:", numbers.mean()); // 5.5
426
- console.log("中央値:", numbers.median()); // 5.5
427
- console.log("標準偏差:", numbers.standardDeviation()); // ~2.87
428
- console.log("合計:", numbers.summate()); // 55
429
-
430
- // マッパーを使用した統計分析
431
- const objects = from([
432
- { value: 10 },
433
- { value: 20 },
434
- { value: 30 }
435
- ]).toNumericStatistics();
436
- console.log("マッピングされた平均:", objects.mean(obj => obj.value)); // 20
109
+ import { useDocument } from 'semantic-typescript';
110
+
111
+ // 最初の5回のクリックだけを収集
112
+ const first5Clicks = await useDocument('click')
113
+ .limit(5) // <- 必須:ストリームを5つのイベントに制限
114
+ .toUnordered()
115
+ .toArray();
116
+
117
+ // 10秒間のクリックを収集
118
+ const clicksIn10s = await useDocument('click')
119
+ .takeWhile((_, index, startTime = Date.now()) => Date.now() - startTime < 10000)
120
+ .toUnordered()
121
+ .toArray();
122
+
123
+ // インデックス2から5(0ベース)のクリックを収集
124
+ const specificClicks = await useDocument('click')
125
+ .sub(2n, 6n) // <- インデックス2、3、4、5の要素を取得
126
+ .toUnordered()
127
+ .toArray();
437
128
  ```
438
129
 
439
- ## パフォーマンス選択ガイド
130
+ **重要な洞察**: イベント(例:MouseEvent)とその連続的な発火インデックス(bigintとして)は、`accept(event, index)`コールバックを介してパイプラインを通して一緒に渡されます。
440
131
 
441
- ### 順序を保証しないCollectorを選択(パフォーマンス優先)
132
+ ### 5. 統計の活用
442
133
  ```typescript
443
- // 順序の保証が不要な場合、最高のパフォーマンスを得るために順序付けられていないCollectorを使用します
444
- let highPerformance = data
445
- .filter(predicate)
446
- .map(mapper)
447
- .toUnordered(); // 最高のパフォーマンス
134
+ const numericStream = useFrom([10, 20, 30, 40, 50]).toNumeric();
135
+ const average = await numericStream.average();
136
+ const median = await numericStream.median();
137
+ const standardDeviation = await numericStream.standardDeviation();
138
+ const skewness = await numericStream.skewness();
139
+ console.log(`平均: ${average}, 中央値: ${median}, 標準偏差: ${standardDeviation}`);
448
140
  ```
449
141
 
450
- ### 順序が必要なCollectorを選択(順序が必要)
142
+ ## 主な機能
143
+ - **デュアルストリームタイプ**: 同期(Iterable用)と非同期(AsyncIterableとイベント用)の両方のフルサポート
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
+ ## はじめの一歩の例
451
172
  ```typescript
452
- // 要素の順序を維持する必要がある場合、順序付けられたCollectorを使用します
453
- let ordered = data.sorted(comparator);
454
- ```
173
+ import { useFrom, useSummate, useGroupBy } from 'semantic-typescript';
455
174
 
456
- ### ウィンドウ操作が必要なCollectorを選択(ウィンドウ操作)
457
- ```typescript
458
- // ウィンドウ操作が必要な場合
459
- let window: WindowCollectable<number> = data
460
- .toWindow()
461
- .slide(5n, 2n); // スライディングウィンドウ
462
- ```
463
-
464
- ### 数値計算が必要な統計分析を選択(統計分析)
465
- ```typescript
466
- // 統計分析が必要な場合
467
- let statistics: NumericStatistics<number> = data
468
- .toNumericStatistics(); // 数値統計
175
+ interface Transaction {
176
+ id: number;
177
+ amount: number;
178
+ category: string;
179
+ }
469
180
 
470
- let bigIntStatistics: BigintStatistics<bigint> = data
471
- .toBigintStatistics(); // 大きな整数統計
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)
190
+ .toUnordered()
191
+ .collect(
192
+ useGroupBy(
193
+ t => t.category,
194
+ t => t.amount,
195
+ useSummate() // 値のためのコレクタ
196
+ )
197
+ );
198
+
199
+ console.log(totalsByCategory); // Map { 'Food' => 150, 'Electronics' => 500 }
472
200
  ```
473
201
 
474
- [GitHub](https://github.com/eloyhere/semantic-typescript)
475
- [NPMJS](https://www.npmjs.com/package/semantic-typescript)
476
-
477
- ## 重要な注意事項
478
-
479
- 1. **ソート操作の影響**:順序付けられたCollectorでは、`sorted()`操作は`redirect`、`translate`、`shuffle`、`reverse`の効果を上書きします。
480
- 2. **パフォーマンスの考慮**:順序の保証が不要な場合は、`toUnordered()`を使用してパフォーマンスを向上させることをお勧めします。
481
- 3. **メモリ使用量**:ソート操作には追加のO(n)のメモリが必要です。
482
- 4. **リアルタイムデータ**:Semanticストリームはリアルタイムデータの処理に適しており、非同期データソースをサポートしています。
202
+ Semantic-TypeScriptは、厳密に設計された、型安全で高性能なストリーム処理ライブラリを求める開発者のために構築されています。これは、エンタープライズレベルのデータ変換パターンの力をTypeScriptエコシステムにもたらし、データ集約型のフロントエンドアプリケーション、Node.jsデータ処理、シーケンスのエレガントで効率的な処理が必要とされるあらゆるシナリオに最適です。
483
203
 
484
- このライブラリは、TypeScript開発者に強力で柔軟なストリーミング機能を提供し、関数型プログラミングの利点と型安全性の保証を組み合わせています。
204
+ [![GitHub](./GitHub.png)](https://github.com/eloyhere/semantic-typescript) [![NPM](./NPM.png)](https://www.npmjs.com/package/semantic-typescript)