semantic-typescript 0.7.0 → 0.7.1
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/semantic.d.ts +4 -0
- package/dist/asynchronous/semantic.js +3 -0
- package/dist/factory.d.ts +24 -71
- package/dist/factory.js +161 -648
- package/dist/guard.d.ts +0 -3
- package/dist/guard.js +0 -19
- package/dist/hash.js +3 -0
- package/dist/synchronous/semantic.d.ts +4 -0
- package/dist/synchronous/semantic.js +4 -1
- package/package.json +1 -1
- package/readme.cn.md +185 -131
- package/readme.de.md +186 -132
- package/readme.es.md +186 -132
- package/readme.fr.md +188 -134
- package/readme.jp.md +185 -140
- package/readme.kr.md +184 -139
- package/readme.md +187 -130
- package/readme.ru.md +186 -143
- package/readme.tw.md +190 -146
- package/dist/main.d.ts +0 -1
- package/dist/main.js +0 -6
package/readme.kr.md
CHANGED
|
@@ -1,38 +1,34 @@
|
|
|
1
|
-
# Semantic
|
|
2
|
-
|
|
1
|
+
# **Semantic‑TypeScript**
|
|
2
|
+
**스트림 처리, 인덱싱.** 당신의 데이터를 정밀하게 제어합니다.
|
|
3
3
|
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
### 개요
|
|
7
7
|
|
|
8
|
-
Semantic
|
|
8
|
+
Semantic‑TypeScript는 스트림 처리 분야에서 중요한 진화를 나타내며, JavaScript 생성자, Java Streams, MySQL 스타일 인덱싱에서 가장 효과적인 패러다임을 우아하게 **통합**합니다. 그 기본 전제는 강력하면서도 신중하게 선택되었습니다: 기존의 무차별 반복이 아니라 지능적인 인덱싱을 통해 예외적으로 효율적인 데이터 처리 파이프라인을 구축합니다.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
일반적인 라이브러리가 동기 루프나 번거로운 Promise 체인을 강제하는 반면, Semantic‑TypeScript는 현대 애플리케이션 개발의 요구에 맞춰 설계된 **완전 비동기적**, 기능적으로 순수하며 엄격한 타입 안전성을 제공합니다.
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
이 모델은 세련된 제어 흐름을 구현합니다: 업스트림 파이프라인이 명시적으로 `accept` 콜백을 호출할 때만 데이터가 다운스트림 소비자에게 전달됩니다. 처리 타이밍에 대해 완전하고 세밀한 제어를 유지할 수 있습니다. 처리는 정확히 필요할 때, 그리고 오직 그때에만 발생합니다.
|
|
13
13
|
|
|
14
14
|
---
|
|
15
15
|
|
|
16
|
-
###
|
|
16
|
+
### 개발자가 Semantic‑TypeScript를 선택하는 이유
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
• **예측 가능한 성능** — 요구사항에 따라 정렬된 또는 비정렬 수집기(collector) 중 선택 가능.
|
|
27
|
-
|
|
28
|
-
• **메모리 효율적** — 스트림은 지연 평가(Lazy Evaluation) 방식으로 처리되며, 메모리 문제를 완화합니다.
|
|
29
|
-
|
|
30
|
-
• **정의되지 않은 동작 없음** — 타입스크립트가 타입 안전성과 null 가능성을 보장합니다. 콜백 함수 내에서 명시적으로 변경하지 않는 한, 입력 데이터는 수정되지 않습니다.
|
|
18
|
+
- **보일러플레이트 없는 인덱싱** – 각 요소는 고유의 자연스러운 또는 맞춤형 인덱스를 본질적으로 보유하여 수동 추적을 제거합니다.
|
|
19
|
+
- **순수 함수형 및 타입 안전** – 변경 불가능한 작업과 함께 완전하고 관용적인 TypeScript 타입 추론을 즐기세요.
|
|
20
|
+
- **메모리 누수 방지 이벤트 스트림** – `useSubscription` 패턴은 리소스 안전을 첫 번째 원칙으로 설계되었습니다. `limit(n)`, `sub(start, end)` 또는 `takeWhile(predicate)`를 사용하여 논리적 경계를 정의하면 라이브러리가 전체 구독 수명 주기를 관리합니다. 이는 잔여 리스너와 메모리 누수가 없음을 보장합니다.
|
|
21
|
+
- **내장 통계 제품군** – 외부 종속성 없이 `number` 및 `bigint` 스트림에 대한 평균, 중앙값, 최빈값, 분산, 왜도, 첨도를 포함한 포괄적인 분석에 접근할 수 있습니다.
|
|
22
|
+
- **예측 가능하고 조정 가능한 성능** – 정확한 성능 및 순서 요구 사항에 맞게 정렬된 또는 비정렬된 콜렉터를 선택하세요.
|
|
23
|
+
- **본질적으로 메모리 효율적** – 스트림은 지연 평가되어 메모리 부담을 줄이기 위해 요소를 필요할 때만 처리합니다.
|
|
24
|
+
- **정의되지 않은 동작 없음** – TypeScript는 완전한 타입 안전성과 null 안전성을 보장합니다. 콜백 함수 내에서 명시적으로 수정하지 않는 한 소스 데이터는 변경되지 않습니다.
|
|
31
25
|
|
|
32
26
|
---
|
|
33
27
|
|
|
34
28
|
### 설치
|
|
35
29
|
|
|
30
|
+
선호하는 패키지 관리자를 사용하여 프로젝트에 Semantic‑TypeScript를 통합하세요:
|
|
31
|
+
|
|
36
32
|
```bash
|
|
37
33
|
npm install semantic-typescript
|
|
38
34
|
```
|
|
@@ -43,180 +39,229 @@ yarn add semantic-typescript
|
|
|
43
39
|
|
|
44
40
|
---
|
|
45
41
|
|
|
46
|
-
###
|
|
42
|
+
### 실용적인 소개
|
|
43
|
+
|
|
44
|
+
다음 예제는 기본 변환부터 실제 이벤트 처리까지 핵심 개념을 보여줍니다.
|
|
47
45
|
|
|
48
46
|
```typescript
|
|
49
|
-
import { useOf, useFrom, useRange,
|
|
50
|
-
|
|
51
|
-
//
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
.
|
|
47
|
+
import { useOf, useFrom, useRange, useSubscription, useText, useStringify } from "semantic-typescript";
|
|
48
|
+
|
|
49
|
+
// ====================================================================
|
|
50
|
+
// 예제 1: 기본 연산 및 수치 통계
|
|
51
|
+
// ====================================================================
|
|
52
|
+
// 매핑 및 최종 통계 연산을 보여줍니다. 변환 후 파이프라인을 통계 콜렉터로 변환해야 `.summate()`와 같은 최종 메서드를 호출할 수 있습니다.
|
|
53
|
+
|
|
54
|
+
const numericSum: number = useOf(10, 20, 30, 40)
|
|
55
|
+
.map((n: number): number => n * 2) // 각 요소를 두 배로: [20, 40, 60, 80]
|
|
56
|
+
.toNumericStatistics() // 통계 콜렉터로 변환
|
|
57
|
+
.summate(); // 최종 연산: 200
|
|
58
|
+
|
|
59
|
+
// 기타 통계 메서드 (`.toNumericStatistics()` 이후 사용 가능):
|
|
60
|
+
// .average(), .median(), .mode(), .variance(), .skewness(), .kurtosis()
|
|
61
|
+
|
|
62
|
+
// ====================================================================
|
|
63
|
+
// 예제 2: BigInt 통계
|
|
64
|
+
// ====================================================================
|
|
65
|
+
// 수치 통계와 동일하게 작동하지만 BigInt 데이터에 최적화되어 있습니다.
|
|
66
|
+
|
|
67
|
+
const bigintSum: bigint = useOf(10n, 20n, 30n, 40n)
|
|
68
|
+
.map((n: bigint): bigint => n * 2n) // BigInt 산술
|
|
69
|
+
.toBigIntStatistics() // BigInt 통계 콜렉터로 변환
|
|
70
|
+
.summate(); // 최종 연산: 200n
|
|
71
|
+
|
|
72
|
+
// ====================================================================
|
|
73
|
+
// 예제 3: 스트림 반전을 위한 인덱스 조작
|
|
74
|
+
// ====================================================================
|
|
75
|
+
// `.redirect()` 메서드를 사용하여 요소의 인덱스를 전략적으로 재할당하여 요소를 재정렬하는 방법을 보여줍니다. 반전과 같은 맞춤형 패턴을 가능하게 합니다.
|
|
76
|
+
|
|
77
|
+
const reversedArray: number[] = useFrom([1, 2, 3, 4, 5])
|
|
78
|
+
.redirect((_element: number, index: bigint): bigint => -index) // 음수 인덱스에 매핑
|
|
79
|
+
.toOrdered() // 필수: 새로운 인덱스로 정렬된 요소 수집
|
|
80
|
+
.toArray(); // 결과: [5, 4, 3, 2, 1]
|
|
81
|
+
|
|
82
|
+
// 단순 반전의 경우 `.reverse()`도 사용 가능합니다.
|
|
83
|
+
|
|
84
|
+
// ====================================================================
|
|
85
|
+
// 예제 4: 스트림 셔플
|
|
86
|
+
// ====================================================================
|
|
87
|
+
// 제자리 셔플 알고리즘을 사용하여 요소 인덱스를 무작위로 순열합니다.
|
|
88
|
+
|
|
89
|
+
const shuffledArray: number[] = useFrom([1, 2, 3, 4, 5])
|
|
90
|
+
.shuffle() // 인덱스를 무작위로 재할당
|
|
91
|
+
.toOrdered() // 새로운 무작위 인덱스로 정렬
|
|
92
|
+
.toArray(); // 예: [2, 5, 1, 4, 3] (실행마다 다름)
|
|
93
|
+
|
|
94
|
+
// ====================================================================
|
|
95
|
+
// 예제 5: 스트림 순환 회전
|
|
96
|
+
// ====================================================================
|
|
97
|
+
// 요소를 순환적으로 이동합니다. 양수 값은 오른쪽으로 회전, 음수 값은 왼쪽으로 회전합니다.
|
|
98
|
+
|
|
99
|
+
// 오른쪽으로 2 위치 회전
|
|
100
|
+
const rightRotated: number[] = useFrom([1, 2, 3, 4, 5])
|
|
101
|
+
.translate(2) // 인덱스를 오른쪽으로 2 이동
|
|
72
102
|
.toOrdered()
|
|
73
|
-
.toArray();
|
|
103
|
+
.toArray(); // 결과: [4, 5, 1, 2, 3]
|
|
74
104
|
|
|
75
|
-
//
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
.toArray(); // [4, 5, 1, 2, 3]
|
|
105
|
+
// ====================================================================
|
|
106
|
+
// 예제 6: 무한 범위에서의 지연 평가
|
|
107
|
+
// ====================================================================
|
|
108
|
+
// 이론적으로 무한한 스트림을 지연 처리하여 필요할 때만 요소를 계산합니다.
|
|
80
109
|
|
|
81
|
-
|
|
82
|
-
.
|
|
83
|
-
.
|
|
84
|
-
.
|
|
110
|
+
const firstTenMultiples: bigint[] = useRange(0n, 1_000_000n)
|
|
111
|
+
.filter(n => n % 17n === 0n) // 17의 배수 유지
|
|
112
|
+
.limit(10n) // 중요: 10번째 일치 후 중지
|
|
113
|
+
.toUnordered() // 정렬 불필요
|
|
114
|
+
.toArray(); // 결과: [0, 17, 34, 51, 68, 85, 102, 119, 136, 153]
|
|
85
115
|
|
|
86
|
-
//
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
116
|
+
// `.limit(10n)` 없이는 파이프라인이 백만 개의 모든 요소를 처리합니다.
|
|
117
|
+
|
|
118
|
+
// ====================================================================
|
|
119
|
+
// 예제 7: 복잡한 파이프라인 구성
|
|
120
|
+
// ====================================================================
|
|
121
|
+
// 여러 연산의 순차적 구성을 보여줍니다.
|
|
122
|
+
|
|
123
|
+
const complexResult: number[] = useRange(1n, 100n)
|
|
124
|
+
.map(n => Number(n) * 2)
|
|
125
|
+
.filter(n => n > 50)
|
|
126
|
+
.shuffle()
|
|
127
|
+
.limit(5n)
|
|
128
|
+
.translate(2)
|
|
129
|
+
.toOrdered()
|
|
91
130
|
.toArray();
|
|
92
131
|
|
|
93
|
-
//
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
132
|
+
// ====================================================================
|
|
133
|
+
// 예제 8: 관리되는 DOM 이벤트 구독
|
|
134
|
+
// ====================================================================
|
|
135
|
+
// 자동적이고 메모리 누수 방지 정리 기능과 함께 브라우저 이벤트를 수신합니다.
|
|
136
|
+
// `.limit(n)` 호출은 리스너 자동 제거의 경계를 정의합니다.
|
|
137
|
+
|
|
138
|
+
// Window 대상에 대한 구독자 정의
|
|
139
|
+
const windowSubscriber = {
|
|
140
|
+
mount: (target: Window): void => { /* 설정 로직 */ },
|
|
141
|
+
subscribe: (target: Window, event: keyof WindowEventMap, handler: EventListener): void => {
|
|
142
|
+
target.addEventListener(event, handler);
|
|
143
|
+
},
|
|
144
|
+
unsubscribe: (target: Window, event: keyof WindowEventMap, handler: EventListener): void => {
|
|
145
|
+
target.removeEventListener(event, handler);
|
|
146
|
+
},
|
|
147
|
+
unmount: (): void => { /* 정리 로직 */ }
|
|
148
|
+
};
|
|
98
149
|
|
|
99
|
-
|
|
100
|
-
//
|
|
101
|
-
useHTMLElement("#input", "change")
|
|
102
|
-
.limit(1)
|
|
150
|
+
useSubscription(window, windowSubscriber, "resize")
|
|
151
|
+
.limit(5n) // 5개 이벤트 후 자동 구독 취소
|
|
103
152
|
.toUnordered()
|
|
104
|
-
.forEach((
|
|
153
|
+
.forEach((ev: Event, idx) =>
|
|
154
|
+
console.log(`크기 조정 #${idx}: ${(ev.target as Window).innerWidth}x${(ev.target as Window).innerHeight}`)
|
|
155
|
+
);
|
|
105
156
|
|
|
106
|
-
//
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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));
|
|
157
|
+
// ====================================================================
|
|
158
|
+
// 예제 9: 유니코드 코드 포인트별 문자열 처리
|
|
159
|
+
// ====================================================================
|
|
160
|
+
// 멀티바이트 유니코드 문자를 올바르게 처리하면서 문자열을 반복합니다.
|
|
121
161
|
|
|
122
|
-
// 문자열을 코드 포트(code point) 단위로 순회
|
|
123
162
|
useText("My emotion now is: 😊, and semantic is 👍")
|
|
124
163
|
.toUnordered()
|
|
125
|
-
.log(); //
|
|
164
|
+
.log(); // 각 문자(이모지 포함)를 새 줄에 출력합니다.
|
|
165
|
+
|
|
166
|
+
// ====================================================================
|
|
167
|
+
// 예제 10: 순환 참조 객체의 안전한 문자열화
|
|
168
|
+
// ====================================================================
|
|
169
|
+
// 순환 참조를 포함하는 객체를 안전하게 직렬화합니다.
|
|
126
170
|
|
|
127
|
-
|
|
128
|
-
let o = {
|
|
171
|
+
const obj = {
|
|
129
172
|
a: 1,
|
|
130
|
-
b: "text"
|
|
131
|
-
c: [o.a, o.b, o.c] // 순환 참조
|
|
173
|
+
b: "text"
|
|
132
174
|
};
|
|
133
|
-
|
|
134
|
-
|
|
175
|
+
(obj as any).c = [obj.a, obj.b, (obj as any).c]; // 순환 참조 도입
|
|
176
|
+
|
|
177
|
+
// const text: string = JSON.stringify(obj); // 오류 발생
|
|
178
|
+
const text: string = useStringify(obj); // 안전하게 `{a: 1, b: "text", c: []}` 생성
|
|
135
179
|
```
|
|
136
180
|
|
|
137
181
|
---
|
|
138
182
|
|
|
139
183
|
### 핵심 개념
|
|
140
184
|
|
|
141
|
-
| 개념 | 목적 |
|
|
185
|
+
| 개념 | 목적 | 주요 사용 사례 |
|
|
142
186
|
| :--- | :--- | :--- |
|
|
143
|
-
| `AsynchronousSemantic` | 비동기 스트림,
|
|
144
|
-
| `SynchronousSemantic` | 동기식, 메모리 내 또는
|
|
145
|
-
| `toUnordered()` | 가장 빠른 최종
|
|
146
|
-
| `toOrdered()` |
|
|
147
|
-
| `toNumericStatistics()` | 풍부한
|
|
148
|
-
| `toBigIntStatistics()` | 풍부한
|
|
149
|
-
| `toWindow()` | 슬라이딩 및 텀블링
|
|
187
|
+
| `AsynchronousSemantic` | 비동기 스트림, 이벤트 및 푸시 기반 지연 파이프라인을 위한 핵심 빌더. | 실시간 이벤트, WebSockets, DOM 리스너 또는 장기 실행/무한 스트림. |
|
|
188
|
+
| `SynchronousSemantic` | 동기식, 메모리 내 또는 풀 기반 즉시 평가 파이프라인을 위한 빌더. | 정적 데이터, 유한 범위 또는 즉시 반복 작업. |
|
|
189
|
+
| `toUnordered()` | 가장 빠른 최종 콜렉터. 인덱스 저장을 위해 Map 사용. | 안정적인 순서가 필요 없는 성능 중요 경로(시간 및 공간 복잡도 O(n)). |
|
|
190
|
+
| `toOrdered()` | 정렬되고 인덱스가 안정된 최종 콜렉터. | 요소 순서를 유지해야 하거나 인덱스 접근이 필요한 경우. |
|
|
191
|
+
| `toNumericStatistics()` | `number` 스트림에서 풍부한 통계 분석을 가능하게 하는 콜렉터. | 데이터 분석, 메트릭 및 통계 계산. |
|
|
192
|
+
| `toBigIntStatistics()` | `bigint` 스트림에서 풍부한 통계 분석을 가능하게 하는 콜렉터. | 큰 정수 데이터 세트의 분석 및 통계. |
|
|
193
|
+
| `toWindow()` | 스트림에 대한 슬라이딩 및 텀블링 창 작업을 제공합니다. | 시계열 분석, 일괄 처리 및 창 집계. |
|
|
150
194
|
|
|
151
195
|
---
|
|
152
196
|
|
|
153
|
-
|
|
197
|
+
**필수 사용 규칙**
|
|
154
198
|
|
|
155
|
-
1.
|
|
156
|
-
→
|
|
199
|
+
1. **이벤트 스트림** (`useSubscription`와 같은 팩토리를 통해 생성)은 `AsynchronousSemantic`을 반환합니다.
|
|
200
|
+
→ `.limit(n)`, `.sub(start, end)` 또는 `.takeWhile(predicate)`와 같은 경계 정의 메서드를 호출하여 리스너를 종료해야 합니다. 그렇지 않으면 구독이 계속 활성 상태로 유지됩니다.
|
|
157
201
|
|
|
158
|
-
2.
|
|
202
|
+
2. **최종 연산** (`.toArray()`, `.count()`, `.forEach()`, `.findFirst()` 등)은 파이프라인을 콜렉터로 변환한 **후에만** 사용 가능합니다:
|
|
159
203
|
```typescript
|
|
160
|
-
.toUnordered() //
|
|
204
|
+
.toUnordered() // 최대 속도를 위해, 순서는 보장되지 않음.
|
|
161
205
|
// 또는
|
|
162
|
-
.toOrdered() //
|
|
206
|
+
.toOrdered() // 안정적이고 정렬된 출력을 위해.
|
|
207
|
+
// 또는
|
|
208
|
+
.toNumericStatistics() // 통계 메서드를 위해.
|
|
163
209
|
```
|
|
164
210
|
|
|
165
211
|
---
|
|
166
212
|
|
|
167
213
|
### 성능 특성
|
|
168
214
|
|
|
169
|
-
|
|
|
215
|
+
| 콜렉터 | 시간 복잡도 | 공간 복잡도 | 순서 보장? | 이상적인 시나리오 |
|
|
170
216
|
| :--- | :--- | :--- | :--- | :--- |
|
|
171
|
-
| `toUnordered()` | O(n) | O(n) | 아니요 | 원시
|
|
172
|
-
| `toOrdered()` | O(
|
|
173
|
-
| `toNumericStatistics()` | O(
|
|
174
|
-
| `toBigIntStatistics()` | O(
|
|
175
|
-
| `toWindow()` | O(
|
|
217
|
+
| `toUnordered()` | O(n) | O(n) | 아니요 | 원시 처리량이 핵심. 최종 순서는 중요하지 않음. |
|
|
218
|
+
| `toOrdered()` | O(n log n) | O(n) | 예(정렬됨) | 안정적인 순서, 인덱스 접근 또는 통계를 위한 사전 정렬. |
|
|
219
|
+
| `toNumericStatistics()` | O(n log n) | O(n) | 예(내부 정렬) | 정렬된 데이터가 필요한 통계 연산 수행. |
|
|
220
|
+
| `toBigIntStatistics()` | O(n log n) | O(n) | 예(내부 정렬) | BigInt 데이터에 대한 통계 연산. |
|
|
221
|
+
| `toWindow()` | O(n log n) | O(n) | 예(내부 정렬) | 정렬된 인덱스에서 이점을 얻는 창 작업. |
|
|
176
222
|
|
|
177
|
-
속도가 가장 중요할 때는 `toUnordered()`를 선택하세요.
|
|
223
|
+
절대적인 속도가 가장 중요할 때는 `toUnordered()`를 선택하세요. 요소 순서에 로직이 의존하는 경우에만 `toOrdered()` 또는 통계 콜렉터를 선택하세요.
|
|
178
224
|
|
|
179
225
|
---
|
|
180
226
|
|
|
181
|
-
|
|
227
|
+
**현대 스트림 라이브러리와의 비교 분석**
|
|
182
228
|
|
|
183
|
-
| 기능 | Semantic
|
|
229
|
+
| 기능 | Semantic‑TypeScript | RxJS | 네이티브 Async Iterators / Generators | Most.js |
|
|
184
230
|
| :--- | :--- | :--- | :--- | :--- |
|
|
185
|
-
|
|
|
186
|
-
|
|
|
187
|
-
|
|
|
188
|
-
|
|
|
189
|
-
|
|
|
190
|
-
|
|
|
191
|
-
| API 설계
|
|
192
|
-
|
|
|
193
|
-
|
|
|
194
|
-
|
|
|
195
|
-
|
|
196
|
-
Semantic-TypeScript의 주요 장점
|
|
197
|
-
|
|
198
|
-
• 고유한 내장 통계 및 인덱싱 기능으로, 수동 `reduce` 또는 외부 라이브러리의 필요성을 없앱니다.
|
|
231
|
+
| **TypeScript 통합** | 일류, 깊은 타이핑, 인덱스 인식 내재. | 우수하지만 복잡한 제네릭 체인이 수반되는 경우가 많음. | 좋지만 수동 타입 주석이 필요. | 강력, 함수형-퍼스트 타이핑 스타일. |
|
|
232
|
+
| **내장 통계 분석** | `number` 및 `bigint`에 대한 포괄적인 네이티브 지원. | 네이티브로 사용 불가(사용자 정의 연산자 또는 다른 라이브러리 필요). | 없음. | 없음. |
|
|
233
|
+
| **인덱싱 및 위치 인식** | 각 요소에 대한 네이티브 강력한 BigInt 인덱싱. | 사용자 정의 연산자 필요(예: `scan`, `withLatestFrom`). | 수동 카운터 관리 필요. | 기본, 내장 인덱스 속성 없음. |
|
|
234
|
+
| **이벤트 스트림 관리** | 명시적이고 선언적인 수명 주기 제어를 갖춘 전용 타입 안전 팩토리. | 강력하지만 메모리 누수를 방지하려면 주의 깊은 수동 구독 관리 필요. | 이벤트 리스너 수동 부착 및 취소 토큰 관리. | 좋은 `fromEvent`, 일반적으로 가벼움. |
|
|
235
|
+
| **성능 및 메모리** | 탁월함 – 최적화된 `toUnordered()` 및 `toOrdered()` 콜렉터 제공. | 매우 좋지만 깊은 연산자 체인은 오버헤드를 초래할 수 있음. | 우수함(네이티브 오버헤드 최소). | 우수함. |
|
|
236
|
+
| **번들 크기** | 매우 가벼움. | 크기가 큼(트리 쉐이킹 후에도). | 제로(언어 네이티브 기능). | 작음. |
|
|
237
|
+
| **API 설계 철학** | 명시적 인덱스 의미론을 가진 함수형 콜렉터 패턴. | 반응형 Observable 패턴. | 명령형 Iterator / 선언형 Generator 패턴. | 함수형, 포인트 프리 구성. |
|
|
238
|
+
| **흐름 제어** | 명시적(`interrupt`, `.limit()`, `.takeWhile()`, `.sub()`). | 좋음(`take`, `takeUntil`, `first`). | 수동(루프 내 `break`). | 좋음(`take`, `until`). |
|
|
239
|
+
| **동기 및 비동기 지원** | 통합 API – 두 패러다임에 대한 일류 지원. | 주로 비동기. | 둘 다 지원되지만 수동 브리지 필요. | 주로 비동기. |
|
|
240
|
+
| **학습 곡선** | 함수형 및 인덱스된 컬렉션 파이프라인에 익숙한 개발자에게는 완만함. | 가파름(광범위한 연산자 어휘, 핫/콜드 Observable 개념). | 낮음에서 중간. | 중간. |
|
|
199
241
|
|
|
200
|
-
|
|
242
|
+
**Semantic‑TypeScript의 장점**
|
|
201
243
|
|
|
202
|
-
|
|
244
|
+
* **고유한 기능:** 내장 통계 및 인덱싱 기능으로 수동 `reduce` 작업 또는 보조 데이터 분석 라이브러리의 필요성이 제거됩니다.
|
|
245
|
+
* **예측 가능한 리소스 관리:** 이벤트 스트림에 대한 명시적 제어로 RxJS 애플리케이션에서 미묘하게 발생할 수 있는 메모리 누수를 방지합니다.
|
|
246
|
+
* **통합 설계:** 동기 및 비동기 워크플로우 모두에 대한 일관된 API로 인지 부하와 코드 중복이 감소합니다.
|
|
203
247
|
|
|
204
|
-
이 비교는
|
|
248
|
+
이 비교는 기존 반응형 프레임워크의 복잡성 없이 높은 성능, 견고한 타입 안전성 및 풍부한 데이터 처리 기능을 요구하는 현대 TypeScript 애플리케이션에 Semantic‑TypeScript가 특히 적합한 이유를 강조합니다.
|
|
205
249
|
|
|
206
250
|
---
|
|
207
251
|
|
|
208
|
-
###
|
|
252
|
+
### 탐험 시작하기
|
|
209
253
|
|
|
210
|
-
Semantic
|
|
254
|
+
Semantic‑TypeScript는 복잡한 데이터 흐름을 읽기 쉽고 구성 가능하며 고성능인 파이프라인으로 변환합니다. 실시간 UI 이벤트 처리, 대규모 데이터 세트 처리 또는 분석 대시보드 구축 중 어느 것이든 데이터베이스 수준 인덱싱의 힘과 함수형 프로그래밍의 우아함을 제공합니다.
|
|
211
255
|
|
|
212
|
-
|
|
256
|
+
**다음 단계:**
|
|
213
257
|
|
|
214
|
-
|
|
258
|
+
* IDE에서 직접 완전히 타이핑된 API를 탐색하세요(모든 내보내기는 기본 패키지 진입점에서 사용 가능).
|
|
259
|
+
* 복잡한 비동기 반복자 및 반응형 체인을 명확하고 의도적인 Semantic 파이프라인으로 대체한 개발자들의 성장하는 커뮤니티에 가입하세요.
|
|
215
260
|
|
|
216
|
-
|
|
261
|
+
**Semantic‑TypeScript** – 스트림과 구조가 만나는 곳.
|
|
217
262
|
|
|
218
|
-
|
|
263
|
+
오늘부터 구축을 시작하고 신중한 인덱싱 설계가 가져오는 실질적인 차이를 경험하세요.
|
|
219
264
|
|
|
220
|
-
|
|
265
|
+
**명확성으로 구축하고, 확신을 가지고 나아가며, 의도적으로 데이터를 변환하세요.**
|
|
221
266
|
|
|
222
|
-
|
|
267
|
+
MIT © Eloy Kim
|