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.kr.md
CHANGED
|
@@ -1,209 +1,222 @@
|
|
|
1
|
-
# Semantic-TypeScript
|
|
1
|
+
# Semantic-TypeScript
|
|
2
|
+
Flow, Indexed. 당신의 데이터, 정밀한 제어 아래에.
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
Semantic-TypeScript는 스트림 처리 기술의 중요한 발전을 나타내며, JavaScript GeneratorFunctions, Java Streams, 데이터베이스 인덱싱 패러다임의 가장 효과적인 개념들을 종합했습니다. 그 핵심 설계 원칙은 정교한 지연 평가(lazy evaluation)와 지능형 인덱싱을 통해 매우 효율적인 데이터 처리 파이프라인을 구축하는 데 중점을 두고 있습니다. 이 라이브러리는 현대적인 TypeScript 및 JavaScript 개발을 위해 특별히 설계된 엄격한 타입 안전성과 함수형 순수성을 갖춘 스트리밍 작업 경험을 제공합니다.
|
|
4
|
+
---
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
- 결정론적 제어가 가능한 실시간 데이터 스트림(DOM 이벤트, WebSockets, 간격)
|
|
8
|
-
- 메모리 효율적이고 지연 평가되는 파이프라인을 통한 대규모 데이터셋
|
|
9
|
-
- 유창하고 선언적인 API를 통한 복잡한 데이터 변환
|
|
6
|
+
### 개요
|
|
10
7
|
|
|
11
|
-
|
|
8
|
+
Semantic-TypeScript는 스트림 처리 기술의 중요한 도약을 의미하며, JavaScript `GeneratorFunction`, Java Streams, 그리고 MySQL 스타일 인덱싱에서 가장 효과적인 개념들을 종합합니다. 그 핵심 철학은 단순하면서도 강력합니다: 무차별 반복이 아닌, 지능적인 인덱싱을 통해 매우 효율적인 데이터 처리 파이프라인을 구축하는 것입니다.
|
|
12
9
|
|
|
13
|
-
|
|
14
|
-
Semantic-TypeScript의 중요한 아키텍처적 통찰은 스트림의 정의와 실행을 명확하게 분리하는 것입니다:
|
|
15
|
-
- **Semantic<E>**: 데이터 변환 파이프라인의 불변(immutable)하고 지연 평가(lazy)되는 설계도입니다. 어떤 연산(filter, map 등)이 수행될지 정의합니다.
|
|
16
|
-
- **Collectable<E>**: 스트림의 구체화되고 실행 가능한 뷰입니다. Semantic에서 얻어지며, 파이프라인을 실행하고 결과를 생성하기 위한 모든 최종 연산(collect, forEach 등)을 제공합니다.
|
|
10
|
+
기존 라이브러리들이 동기 루프나 다루기 힘든 프로미스 체인을 부과하는 곳에서, 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
|
-
핵심은 지연 평가에 기반합니다. filter, map, flatMap과 같은 연산은 단지 처리 파이프라인을 구성할 뿐이며, 최종 연산이 호출될 때까지 어떤 작업도 수행되지 않습니다. 이는 제한(limit), anyMatch 또는 사용자 정의 중단(interrupt) 콜백을 통한 단락 평가(short-circuiting) 기능과 결합되어 처리를 조기에 중지할 수 있게 하여, 크거나 무한한 스트림에 대한 효율성을 극적으로 향상시킵니다.
|
|
18
|
+
• **보일러플레이트 없는 인덱싱** — 모든 요소가 고유 또는 맞춤형 인덱스를 가지고 있습니다.
|
|
28
19
|
|
|
29
|
-
|
|
30
|
-
Java에서 영감을 받은 Collector 패턴은 유연성의 엔진입니다. 이는 스트림 요소를 누적하는 방법의 사양을 스트림 자체의 실행으로부터 분리합니다. 라이브러리는 일상 작업을 위한 다양한 내장 컬렉터(toArray, groupBy, summate 등)를 제공하면서도, 복잡하고 재사용 가능한 축소(reduction) 로직을 직접 구현하는 것을 간단하게 만듭니다. 이는 고정된 최종 메서드 세트보다 훨씬 더 강력하고 구성 가능합니다.
|
|
20
|
+
• **순수 함수형 스타일** — 완전한 타입스크립트 타입 추론과 함께.
|
|
31
21
|
|
|
32
|
-
|
|
33
|
-
Semantic-TypeScript는 현대적 개발을 위해 설계되었습니다. 최신 웹 소스에 대한 기본(native) 팩토리 메서드를 제공합니다:
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
26
|
+
• **예측 가능한 성능** — 요구사항에 따라 정렬된 또는 비정렬 수집기(collector) 중 선택 가능.
|
|
27
|
+
|
|
28
|
+
• **메모리 효율적** — 스트림은 지연 평가(Lazy Evaluation) 방식으로 처리되며, 메모리 문제를 완화합니다.
|
|
29
|
+
|
|
30
|
+
• **정의되지 않은 동작 없음** — 타입스크립트가 타입 안전성과 null 가능성을 보장합니다. 콜백 함수 내에서 명시적으로 변경하지 않는 한, 입력 데이터는 수정되지 않습니다.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
### 설치
|
|
47
35
|
|
|
48
|
-
## 설치
|
|
49
36
|
```bash
|
|
50
37
|
npm install semantic-typescript
|
|
51
38
|
```
|
|
39
|
+
또는
|
|
40
|
+
```bash
|
|
41
|
+
yarn add semantic-typescript
|
|
42
|
+
```
|
|
52
43
|
|
|
53
|
-
|
|
44
|
+
---
|
|
54
45
|
|
|
55
|
-
###
|
|
56
|
-
팩토리 함수를 사용하여 다양한 소스로부터 스트림을 생성할 수 있습니다.
|
|
46
|
+
### 빠른 시작
|
|
57
47
|
|
|
58
48
|
```typescript
|
|
59
|
-
import { useFrom,
|
|
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
|
+
// 스트림 섞기(Shuffle)
|
|
70
|
+
useFrom([1, 2, 3, 4, 5])
|
|
71
|
+
.shuffle()
|
|
72
|
+
.toOrdered()
|
|
73
|
+
.toArray(); // 예: [2, 5, 1, 4, 3]
|
|
74
|
+
|
|
75
|
+
// 스트림 내 요소 이동(Translate)
|
|
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();
|
|
60
92
|
|
|
61
|
-
//
|
|
62
|
-
|
|
93
|
+
// 실시간 윈도우 크기 조정 이벤트 (5번 이벤트 후 자동 중지)
|
|
94
|
+
useWindow("resize")
|
|
95
|
+
.limit(5n) // 이벤트 스트림에 필수적
|
|
96
|
+
.toUnordered()
|
|
97
|
+
.forEach((ev, idx) => console.log(`Resize #${idx}`));
|
|
63
98
|
|
|
64
|
-
//
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
99
|
+
// HTML 요소 청취
|
|
100
|
+
// <input id="input" type="text"/>
|
|
101
|
+
useHTMLElement("#input", "change")
|
|
102
|
+
.limit(1)
|
|
103
|
+
.toUnordered()
|
|
104
|
+
.forEach((event: Event) => submit(event));
|
|
69
105
|
|
|
70
|
-
//
|
|
71
|
-
|
|
106
|
+
// 여러 요소 및 이벤트 청취
|
|
107
|
+
useHTMLElement("input", ["change", "keyup"])
|
|
108
|
+
.takeWhile((event: Event): boolean => validate(event))
|
|
109
|
+
.toUnordered()
|
|
110
|
+
.forEach((event: Event) => submit(event));
|
|
72
111
|
|
|
73
|
-
//
|
|
74
|
-
|
|
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
|
+
// 문자열을 코드 포트(code point) 단위로 순회
|
|
123
|
+
useText("My emotion now is: 😊, and semantic is 👍")
|
|
124
|
+
.toUnordered()
|
|
125
|
+
.log(); // 문자열을 출력
|
|
126
|
+
|
|
127
|
+
// 순환 참조가 있는 객체를 안전하게 문자열로 변환(Stringify)
|
|
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: []}` 반환
|
|
75
135
|
```
|
|
76
136
|
|
|
77
|
-
|
|
78
|
-
연산은 지연 평가되며 파이프라인을 정의하기 위해 체인으로 연결됩니다.
|
|
137
|
+
---
|
|
79
138
|
|
|
80
|
-
|
|
81
|
-
const processedStream = staticStream
|
|
82
|
-
.filter(x => x % 2 === 0) // 짝수만 유지
|
|
83
|
-
.map(x => x * 10) // 10 곱하기
|
|
84
|
-
.flatMap(x => [x, x + 1]) // 각 요소를 두 개로 변환
|
|
85
|
-
.distinct(); // 중복 제거
|
|
139
|
+
### 핵심 개념
|
|
86
140
|
|
|
87
|
-
|
|
88
|
-
|
|
141
|
+
| 개념 | 목적 | 언제 사용하는가 |
|
|
142
|
+
| :--- | :--- | :--- |
|
|
143
|
+
| `AsynchronousSemantic` | 비동기 스트림, 이벤트, 지연 평가 파이프라인을 위한 핵심 빌더. | 실시간 이벤트, WebSocket, DOM 리스너, 장기 실행 또는 무한 스트림. |
|
|
144
|
+
| `SynchronousSemantic` | 동기식, 메모리 내 또는 루프 기반 스트림을 위한 빌더. | 정적 데이터, 범위, 즉시 반복. |
|
|
145
|
+
| `toUnordered()` | 가장 빠른 최종 수집기 (맵 기반 인덱싱). | 성능이 중요한 경로 (O(n) 시간 및 공간 복잡도, 정렬 없음). |
|
|
146
|
+
| `toOrdered()` | 정렬된, 인덱스 안정적인 수집기. | 안정적인 순서 또는 인덱싱된 접근이 필요할 때. |
|
|
147
|
+
| `toNumericStatistics()` | 풍부한 숫자 통계 분석 (평균, 중앙값, 분산, 왜도, 첨도 등). | 데이터 분석 및 통계 계산. |
|
|
148
|
+
| `toBigIntStatistics()` | 풍부한 bigint 통계 분석. | 큰 정수에 대한 데이터 분석 및 통계 계산. |
|
|
149
|
+
| `toWindow()` | 슬라이딩 및 텀블링 윈도우 지원. | 시계열 처리, 배치 처리, 윈도우 기반 연산. |
|
|
89
150
|
|
|
90
|
-
|
|
91
|
-
결과를 얻으려면 Collectable을 얻고 최종 연산을 호출해야 합니다.
|
|
151
|
+
---
|
|
92
152
|
|
|
93
|
-
|
|
94
|
-
// 성능을 위한 비정렬(unordered) collectable 얻기
|
|
95
|
-
const resultArray = await processedStream.toUnordered().toArray();
|
|
96
|
-
console.log(resultArray); // 예: [20, 21, 40, 41]
|
|
97
|
-
|
|
98
|
-
// 내장 컬렉터 사용
|
|
99
|
-
const sum = await processedStream.toUnordered().collect(useSummate());
|
|
100
|
-
console.log(sum);
|
|
101
|
-
|
|
102
|
-
// 또는 일반 collect 메서드 사용
|
|
103
|
-
const customResult = await processedStream.toOrdered().collect(
|
|
104
|
-
() => new Map<number, number>(),
|
|
105
|
-
(map, element, index) => map.set(index, element),
|
|
106
|
-
map => map
|
|
107
|
-
);
|
|
108
|
-
```
|
|
153
|
+
중요 사용 규칙
|
|
109
154
|
|
|
110
|
-
|
|
111
|
-
|
|
155
|
+
1. 이벤트 스트림 (`useWindow`, `useDocument`, `useHTMLElement`, `useWebSocket`, …)은 `AsynchronousSemantic`을 반환합니다.
|
|
156
|
+
→ 청취를 중지하려면 `.limit(n)`, `.sub(start, end)`, 또는 `.takeWhile()`을 **반드시 호출해야 합니다.** 그렇지 않으면 리스너가 계속 활성 상태로 유지됩니다.
|
|
112
157
|
|
|
113
|
-
|
|
114
|
-
|
|
158
|
+
2. 최종 연산 (`.toArray()`, `.count()`, `.average()`, `.reduce()`, `.findFirst()` 등)은 수집기로 변환한 후에만 사용 가능합니다:
|
|
159
|
+
```typescript
|
|
160
|
+
.toUnordered() // O(n) 시간 및 공간 복잡도, 정렬 없음
|
|
161
|
+
// 또는
|
|
162
|
+
.toOrdered() // 정렬됨, 순서 유지
|
|
163
|
+
```
|
|
115
164
|
|
|
116
|
-
|
|
117
|
-
const first5Clicks = await useDocument('click')
|
|
118
|
-
.limit(5) // <- 필수: 스트림을 5개의 이벤트로 제한
|
|
119
|
-
.toUnordered()
|
|
120
|
-
.toArray();
|
|
165
|
+
---
|
|
121
166
|
|
|
122
|
-
|
|
123
|
-
const clicksIn10s = await useDocument('click')
|
|
124
|
-
.takeWhile((_, index, startTime = Date.now()) => Date.now() - startTime < 10000)
|
|
125
|
-
.toUnordered()
|
|
126
|
-
.toArray();
|
|
167
|
+
### 성능 특성
|
|
127
168
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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) | 예 | 시간 기반 윈도우 연산. |
|
|
134
176
|
|
|
135
|
-
|
|
177
|
+
속도가 가장 중요할 때는 `toUnordered()`를 선택하세요. 안정적인 순서나 정렬된 데이터에 의존하는 통계 메서드가 필요할 때만 `toOrdered()`를 사용하세요.
|
|
136
178
|
|
|
137
|
-
|
|
138
|
-
```typescript
|
|
139
|
-
const numericStream = useFrom([10, 20, 30, 40, 50]).toNumeric();
|
|
140
|
-
const average = await numericStream.average();
|
|
141
|
-
const median = await numericStream.median();
|
|
142
|
-
const standardDeviation = await numericStream.standardDeviation();
|
|
143
|
-
const skewness = await numericStream.skewness();
|
|
144
|
-
console.log(`평균: ${average}, 중앙값: ${median}, 표준편차: ${standardDeviation}`);
|
|
145
|
-
```
|
|
179
|
+
---
|
|
146
180
|
|
|
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
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
const transactions: Transaction[] = [
|
|
187
|
-
{ id: 1, amount: 100, category: 'Food' },
|
|
188
|
-
{ id: 2, amount: 200, category: 'Electronics' },
|
|
189
|
-
{ id: 3, amount: 50, category: 'Food' },
|
|
190
|
-
{ id: 4, amount: 300, category: 'Electronics' },
|
|
191
|
-
];
|
|
192
|
-
|
|
193
|
-
// 카테고리별 총액 계산
|
|
194
|
-
const totalsByCategory = await useFrom(transactions)
|
|
195
|
-
.toUnordered()
|
|
196
|
-
.collect(
|
|
197
|
-
useGroupBy(
|
|
198
|
-
t => t.category,
|
|
199
|
-
t => t.amount,
|
|
200
|
-
useSummate() // 값에 대한 컬렉터
|
|
201
|
-
)
|
|
202
|
-
);
|
|
203
|
-
|
|
204
|
-
console.log(totalsByCategory); // Map { 'Food' => 150, 'Electronics' => 500 }
|
|
205
|
-
```
|
|
181
|
+
다른 프론트엔드 스트림 프로세서와의 비교
|
|
182
|
+
|
|
183
|
+
| 기능 | Semantic-TypeScript | RxJS | 네이티브 Async Iterators / Generators | Most.js |
|
|
184
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
185
|
+
| 타입스크립트 통합 | 일급, 네이티브 인덱스 인식과 함께 깊은 타입 지원. | 뛰어나나, 복잡한 제네릭이 포함됨. | 좋음, 수동 타이핑 필요. | 강함, 함수형 우선 스타일. |
|
|
186
|
+
| 내장 통계 분석 | `number` 및 `bigint`에 대한 포괄적인 네이티브 지원. | 네이티브로 사용 불가 (사용자 정의 연산자 필요). | 없음. | 없음. |
|
|
187
|
+
| 인덱싱 & 위치 인식 | 네이티브, 모든 요소에 강력한 bigint 인덱싱. | 사용자 정의 연산자 필요 (`scan`, `withLatestFrom`). | 수동 카운터 필요. | 기본적, 내장 인덱스 없음. |
|
|
188
|
+
| 이벤트 스트림 관리 | 명시적인 조기 중단 제어와 함께 전용, 타입 안전 팩토리. | 강력하지만 수동 구독 관리 필요. | 수동 이벤트 리스너 + 취소. | 좋은 `fromEvent`, 경량. |
|
|
189
|
+
| 성능 & 메모리 효율성 | 뛰어남 – 최적화된 `toUnordered()` 및 `toOrdered()` 수집기. | 매우 좋음, 하지만 연산자 체인이 오버헤드 추가. | 탁월함 (오버헤드 없음). | 탁월함. |
|
|
190
|
+
| 번들 크기 | 매우 가벼움. | 큼 (트리 쉐이킹 사용 시에도). | 제로 (네이티브). | 작음. |
|
|
191
|
+
| API 설계 철학 | 명시적 인덱싱을 가진 함수형 수집기 패턴. | 반응형 Observable 패턴. | Iterator / Generator 패턴. | 함수형, 포인트 프리(Point-free). |
|
|
192
|
+
| 조기 종료 및 제어 | 명시적 (`interrupt`, `.limit()`, `.takeWhile()`, `.sub()`). | 좋음 (`take`, `takeUntil`, `first`). | 수동 (`for await…of` 안의 `break`). | 좋음 (`take`, `until`). |
|
|
193
|
+
| 동기 및 비동기 지원 | 통합 API – 양쪽 모두에 대한 일급 지원. | 주로 비동기. | 둘 다, 그러나 수동. | 주로 비동기. |
|
|
194
|
+
| 학습 곡선 | 함수형 및 인덱싱된 파이프라인에 익숙한 개발자에게 완만함. | 가파름 (많은 연산자, 핫/콜드 Observable). | 낮음. | 중간. |
|
|
195
|
+
|
|
196
|
+
Semantic-TypeScript의 주요 장점
|
|
197
|
+
|
|
198
|
+
• 고유한 내장 통계 및 인덱싱 기능으로, 수동 `reduce` 또는 외부 라이브러리의 필요성을 없앱니다.
|
|
199
|
+
|
|
200
|
+
• 이벤트 스트림에 대한 명시적 제어로 RxJS에서 흔히 발생하는 메모리 누수를 방지합니다.
|
|
201
|
+
|
|
202
|
+
• 통합된 동기/비동기 설계로 다양한 사용 사례에 대해 단일하고 일관된 API를 제공합니다.
|
|
203
|
+
|
|
204
|
+
이 비교는 Semantic-TypeScript가 기존의 반응형 라이브러리의 번잡함 없이도 성능, 타입 안전성, 풍부한 분석 기능을 요구하는 현대 타입스크립트 프론트엔드 애플리케이션에 특히 적합한 이유를 보여줍니다.
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
### 탐구할 준비가 되셨나요?
|
|
209
|
+
|
|
210
|
+
Semantic-TypeScript는 복잡한 데이터 흐름을 가독성 있고 구성 가능하며 고성능 파이프라인으로 변환합니다. 실시간 UI 이벤트를 처리하든, 대규모 데이터 세트를 처리하든, 분석 대시보드를 구축하든, 데이터베이스 수준의 인덱싱의 힘과 함수형 프로그래밍의 우아함을 동시에 제공합니다.
|
|
211
|
+
|
|
212
|
+
다음 단계:
|
|
213
|
+
|
|
214
|
+
• IDE에서 완전한 타이핑된 API를 탐색하세요 (모든 내보내기는 메인 패키지에서 제공됩니다).
|
|
215
|
+
|
|
216
|
+
• 복잡한 비동기 이터레이터를 깨끗한 Semantic 파이프라인으로 대체한 개발자 커뮤니티에 합류하세요.
|
|
217
|
+
|
|
218
|
+
Semantic-TypeScript — 스트림이 구조를 만나는 곳.
|
|
206
219
|
|
|
207
|
-
|
|
220
|
+
오늘부터 구축을 시작하고 사려 깊은 인덱싱이 제공하는 차이를 경험해 보세요.
|
|
208
221
|
|
|
209
|
-
|
|
222
|
+
명확하게 구축하고, 자신 있게 나아가며, 의도를 가지고 데이터를 변형하세요.
|