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.kr.md
CHANGED
|
@@ -1,478 +1,222 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Semantic-TypeScript
|
|
2
|
+
Flow, Indexed. 당신의 데이터, 정밀한 제어 아래에.
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
---
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
### 개요
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
Semantic-TypeScript는 스트림 처리 기술의 중요한 도약을 의미하며, JavaScript `GeneratorFunction`, Java Streams, 그리고 MySQL 스타일 인덱싱에서 가장 효과적인 개념들을 종합합니다. 그 핵심 철학은 단순하면서도 강력합니다: 무차별 반복이 아닌, 지능적인 인덱싱을 통해 매우 효율적인 데이터 처리 파이프라인을 구축하는 것입니다.
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
기존 라이브러리들이 동기 루프나 다루기 힘든 프로미스 체인을 부과하는 곳에서, 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는 문자열로 추론됩니다.
|
|
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
|
+
• **순수 함수형 스타일** — 완전한 타입스크립트 타입 추론과 함께.
|
|
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
|
+
• **예측 가능한 성능** — 요구사항에 따라 정렬된 또는 비정렬 수집기(collector) 중 선택 가능.
|
|
119
27
|
|
|
120
|
-
|
|
121
|
-
```
|
|
28
|
+
• **메모리 효율적** — 스트림은 지연 평가(Lazy Evaluation) 방식으로 처리되며, 메모리 문제를 완화합니다.
|
|
122
29
|
|
|
123
|
-
|
|
30
|
+
• **정의되지 않은 동작 없음** — 타입스크립트가 타입 안전성과 null 가능성을 보장합니다. 콜백 함수 내에서 명시적으로 변경하지 않는 한, 입력 데이터는 수정되지 않습니다.
|
|
124
31
|
|
|
125
|
-
|
|
32
|
+
---
|
|
126
33
|
|
|
127
|
-
|
|
128
|
-
|------|------|------------|------------|
|
|
129
|
-
| `Optional.empty<T>()` | 빈 옵셔널을 생성 | O(1) | O(1) |
|
|
130
|
-
| `Optional.of<T>(value)` | 값을 포함하는 옵셔널을 생성 | O(1) | O(1) |
|
|
131
|
-
| `Optional.ofNullable<T>(value)` | 비어있을 수 있는 옵셔널을 생성 | O(1) | O(1) |
|
|
132
|
-
| `Optional.ofNonNull<T>(value)` | 비어있지 않은 옵셔널을 생성 | 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)` | 완전한 컬렉터를 생성 | O(1) | O(1) |
|
|
150
|
-
| `Collector.shortable(identity, interruptor, accumulator, finisher)` | 중단 가능한 컬렉터를 생성 | 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
|
-
|
|
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();
|
|
92
|
+
|
|
93
|
+
// 실시간 윈도우 크기 조정 이벤트 (5번 이벤트 후 자동 중지)
|
|
94
|
+
useWindow("resize")
|
|
95
|
+
.limit(5n) // 이벤트 스트림에 필수적
|
|
96
|
+
.toUnordered()
|
|
97
|
+
.forEach((ev, idx) => console.log(`Resize #${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
|
+
// 문자열을 코드 포트(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: []}` 반환
|
|
181
135
|
```
|
|
182
136
|
|
|
183
|
-
|
|
137
|
+
---
|
|
184
138
|
|
|
185
|
-
|
|
186
|
-
|------|------|------------|------------|
|
|
187
|
-
| `animationFrame(period: number, delay: number = 0)` | 시간 기반 애니메이션 프레임 스트림을 생성 | O(1)* | O(1) |
|
|
188
|
-
| `blob(blob, chunkSize)` | Blob에서 스트림을 생성 | O(n) | O(chunkSize) |
|
|
189
|
-
| `empty<E>()` | 빈 스트림을 생성 | O(1) | O(1) |
|
|
190
|
-
| `fill<E>(element, count)` | 채워진 스트림을 생성 | O(n) | O(1) |
|
|
191
|
-
| `from<E>(iterable)` | 반복 가능한 객체에서 스트림을 생성 | O(1) | O(1) |
|
|
192
|
-
| `interval(period, delay?)` | 시간 기반 인터벌 스트림을 생성 | O(1)* | O(1) |
|
|
193
|
-
| `iterate<E>(generator)` | 생성자에서 스트림을 생성 | O(1) | O(1) |
|
|
194
|
-
| `range(start, end, step)` | 숫자 범위 스트림을 생성 | O(n) | O(1) |
|
|
195
|
-
| `websocket(websocket)` | WebSocket에서 스트림을 생성 | O(1) | O(1) |
|
|
139
|
+
### 핵심 개념
|
|
196
140
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
// 빈 스트림을 생성, 다른 스트림과 연결될 때까지 실행되지 않음
|
|
208
|
-
empty<string>()
|
|
209
|
-
.toUnordered()
|
|
210
|
-
.join(); // []
|
|
211
|
-
|
|
212
|
-
// 채워진 스트림을 생성
|
|
213
|
-
const filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
214
|
-
|
|
215
|
-
// 초기 지연 2초, 실행 주기 5초의 시간 기반 스트림을 생성, 타이머 메커니즘에 기반하여 구현됩니다. 시스템 스케줄링의 정확도 제한으로 인해 시간 드리프트가 발생할 수 있습니다.
|
|
216
|
-
const intervalStream = interval(5000, 2000);
|
|
217
|
-
|
|
218
|
-
// 반복 가능한 객체에서 스트림을 생성
|
|
219
|
-
const numberStream = from([1, 2, 3, 4, 5]);
|
|
220
|
-
const stringStream = from(new Set(["Alex", "Bob"]));
|
|
221
|
-
|
|
222
|
-
// 숫자 범위 스트림을 생성
|
|
223
|
-
const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
224
|
-
|
|
225
|
-
// WebSocket 이벤트 스트림
|
|
226
|
-
const ws = new WebSocket("ws://localhost:8080");
|
|
227
|
-
websocket(ws)
|
|
228
|
-
.filter((event): boolean => event.type === "message") // 메시지 이벤트만 듣기
|
|
229
|
-
.toUnordered() // 이벤트는 일반적으로 순서가 없음
|
|
230
|
-
.forEach((event): void => receive(event)); // 메시지 받기
|
|
231
|
-
```
|
|
141
|
+
| 개념 | 목적 | 언제 사용하는가 |
|
|
142
|
+
| :--- | :--- | :--- |
|
|
143
|
+
| `AsynchronousSemantic` | 비동기 스트림, 이벤트, 지연 평가 파이프라인을 위한 핵심 빌더. | 실시간 이벤트, WebSocket, DOM 리스너, 장기 실행 또는 무한 스트림. |
|
|
144
|
+
| `SynchronousSemantic` | 동기식, 메모리 내 또는 루프 기반 스트림을 위한 빌더. | 정적 데이터, 범위, 즉시 반복. |
|
|
145
|
+
| `toUnordered()` | 가장 빠른 최종 수집기 (맵 기반 인덱싱). | 성능이 중요한 경로 (O(n) 시간 및 공간 복잡도, 정렬 없음). |
|
|
146
|
+
| `toOrdered()` | 정렬된, 인덱스 안정적인 수집기. | 안정적인 순서 또는 인덱싱된 접근이 필요할 때. |
|
|
147
|
+
| `toNumericStatistics()` | 풍부한 숫자 통계 분석 (평균, 중앙값, 분산, 왜도, 첨도 등). | 데이터 분석 및 통계 계산. |
|
|
148
|
+
| `toBigIntStatistics()` | 풍부한 bigint 통계 분석. | 큰 정수에 대한 데이터 분석 및 통계 계산. |
|
|
149
|
+
| `toWindow()` | 슬라이딩 및 텀블링 윈도우 지원. | 시계열 처리, 배치 처리, 윈도우 기반 연산. |
|
|
232
150
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
| 메소드 | 설명 | 시간 복잡도 | 공간 복잡도 |
|
|
236
|
-
|------|------|------------|------------|
|
|
237
|
-
| `concat(other)` | 두 개의 스트림을 연결 | O(n) | O(1) |
|
|
238
|
-
| `distinct()` | 중복을 제거 | O(n) | O(n) |
|
|
239
|
-
| `distinct(comparator)` | 비교자를 사용하여 중복을 제거 | O(n²) | O(n) |
|
|
240
|
-
| `dropWhile(predicate)` | 조건을 만족하는 요소를 버림 | O(n) | O(1) |
|
|
241
|
-
| `filter(predicate)` | 요소를 필터링 | O(n) | O(1) |
|
|
242
|
-
| `flat(mapper)` | 평탄화 맵 | O(n × m) | O(1) |
|
|
243
|
-
| `flatMap(mapper)` | 새로운 타입으로 평탄화 맵 | O(n × m) | O(1) |
|
|
244
|
-
| `limit(n)` | 요소 수 제한 | O(n) | O(1) |
|
|
245
|
-
| `map(mapper)` | 맵 변환 | O(n) | O(1) |
|
|
246
|
-
| `peek(consumer)` | 요소를 엿보기 | O(n) | O(1) |
|
|
247
|
-
| `redirect(redirector)` | 인덱스 리디렉션 | O(n) | O(1) |
|
|
248
|
-
| `reverse()` | 스트림 반전 | O(n) | O(1) |
|
|
249
|
-
| `shuffle()` | 무작위로 섞기 | O(n) | O(1) |
|
|
250
|
-
| `shuffle(mapper)` | 매퍼를 사용하여 섞기 | O(n) | O(1) |
|
|
251
|
-
| `skip(n)` | 처음 n개 요소 건너뛰기 | O(n) | O(1) |
|
|
252
|
-
| `sorted()` | 정렬 | O(n log n) | O(n) |
|
|
253
|
-
| `sorted(comparator)` | 비교자를 사용하여 정렬 | O(n log n) | O(n) |
|
|
254
|
-
| `sub(start, end)` | 서브스트림 가져오기 | O(n) | O(1) |
|
|
255
|
-
| `takeWhile(predicate)` | 조건을 만족하는 요소 가져오기 | O(n) | O(1) |
|
|
256
|
-
| `translate(offset)` | 인덱스 변환 | O(n) | O(1) |
|
|
257
|
-
| `translate(translator)` | 변환자를 사용하여 인덱스 변환 | O(n) | O(1) |
|
|
151
|
+
---
|
|
258
152
|
|
|
259
|
-
|
|
260
|
-
// 시맨틱 작업 예
|
|
261
|
-
const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
262
|
-
.filter((n: number): boolean => n % 2 === 0) // 짝수 필터링
|
|
263
|
-
.map((n: number): number => n * 2) // 2배
|
|
264
|
-
.skip(1) // 첫 번째 건너뛰기
|
|
265
|
-
.limit(3) // 3개 요소 제한
|
|
266
|
-
.toUnordered() // 순서가 보장되지 않는 컬렉터로 변환
|
|
267
|
-
.toArray(); // 배열로 변환
|
|
268
|
-
// 결과: [8, 12, 20]
|
|
269
|
-
|
|
270
|
-
// 복잡한 작업 예
|
|
271
|
-
const complexResult = range(1, 100, 1)
|
|
272
|
-
.flatMap((n: number): Semantics<number> => from([n, n * 2])) // 각 요소를 두 개로 매핑
|
|
273
|
-
.distinct() // 중복 제거
|
|
274
|
-
.shuffle() // 순서 섞기
|
|
275
|
-
.takeWhile((n: number): boolean => n < 50) // 50 미만 요소 가져오기
|
|
276
|
-
.toOrdered() // 순서가 보장되는 컬렉터로 변환
|
|
277
|
-
.toArray(); // 배열로 변환
|
|
278
|
-
```
|
|
153
|
+
중요 사용 규칙
|
|
279
154
|
|
|
280
|
-
|
|
155
|
+
1. 이벤트 스트림 (`useWindow`, `useDocument`, `useHTMLElement`, `useWebSocket`, …)은 `AsynchronousSemantic`을 반환합니다.
|
|
156
|
+
→ 청취를 중지하려면 `.limit(n)`, `.sub(start, end)`, 또는 `.takeWhile()`을 **반드시 호출해야 합니다.** 그렇지 않으면 리스너가 계속 활성 상태로 유지됩니다.
|
|
281
157
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
| `toBigintStatistics()` | BigInt 통계로 변환 | O(n) | O(1) |
|
|
289
|
-
| `toWindow()` | 윈도우 컬렉터로 변환 | O(1) | O(1) |
|
|
290
|
-
| `toCollectable()` | `UnorderdCollectable`로 변환 | O(n) | O(1) |
|
|
291
|
-
| `toCollectable(mapper)` | 커스텀 컬렉터로 변환 | O(n) | O(1) |
|
|
158
|
+
2. 최종 연산 (`.toArray()`, `.count()`, `.average()`, `.reduce()`, `.findFirst()` 등)은 수집기로 변환한 후에만 사용 가능합니다:
|
|
159
|
+
```typescript
|
|
160
|
+
.toUnordered() // O(n) 시간 및 공간 복잡도, 정렬 없음
|
|
161
|
+
// 또는
|
|
162
|
+
.toOrdered() // 정렬됨, 순서 유지
|
|
163
|
+
```
|
|
292
164
|
|
|
293
|
-
|
|
294
|
-
// 오름차순으로 정렬된 배열로 변환
|
|
295
|
-
from([6,4,3,5,2]) // 스트림 생성
|
|
296
|
-
.sorted() // 스트림을 오름차순으로 정렬
|
|
297
|
-
.toArray(); // [2, 3, 4, 5, 6]
|
|
298
|
-
|
|
299
|
-
// 내림차순으로 정렬된 배열로 변환
|
|
300
|
-
from([6,4,3,5,2]) // 스트림 생성
|
|
301
|
-
.soted((a: number, b: number): number => b - a) // 스트림을 내림차순으로 정렬
|
|
302
|
-
.toArray(); // [6, 5, 4, 3, 2]
|
|
303
|
-
|
|
304
|
-
// 역순의 배열로 리다이렉트
|
|
305
|
-
from([6,4,3,5,2])
|
|
306
|
-
.redirect((element, index): bigint => -index) // 역순으로 리다이렉트
|
|
307
|
-
.toOrderd() // 리다이렉트된 순서 유지
|
|
308
|
-
.toArray(); // [2, 5, 3, 4, 6]
|
|
309
|
-
|
|
310
|
-
// 리다이렉션을 무시하고 역순의 배열을 얻음
|
|
311
|
-
from([6,4,3,5,2])
|
|
312
|
-
.redirect((element: number, index: bigint) => -index) // 역순으로 리다이렉트
|
|
313
|
-
.toUnorderd() // 리다이렉션된 순서 무시. 이 작업은 `redirect`, `reverse`, `shuffle` 및 `translate` 작업을 무시합니다
|
|
314
|
-
.toArray(); // [2, 5, 3, 4, 6]
|
|
315
|
-
|
|
316
|
-
// 스트림을 역순으로 배열로 변환
|
|
317
|
-
from([6, 4, 3, 5, 2])
|
|
318
|
-
.reverse() // 스트림을 역순으로 함
|
|
319
|
-
.toOrdered() // 역순을 보장함
|
|
320
|
-
.toArray(); // [2, 5, 3, 4, 6]
|
|
321
|
-
|
|
322
|
-
// 섞인 스트림을 배열로 덮어쓰기
|
|
323
|
-
from([6, 4, 3, 5, 2])
|
|
324
|
-
.shuffle() // 스트림을 섞음
|
|
325
|
-
.sorted() // 섞인 순서를 덮어씀. 이 작업은 `redirect`, `reverse`, `shuffle` 및 `translate` 작업을 덮어씀
|
|
326
|
-
.toArray(); // [2, 5, 3, 4, 6]
|
|
327
|
-
|
|
328
|
-
// 윈도우 컬렉터로 변환
|
|
329
|
-
from([6, 4, 3, 5, 2]).toWindow();
|
|
330
|
-
|
|
331
|
-
// 숫자 통계로 변환
|
|
332
|
-
from([6, 4, 3, 5, 2]).toNumericStatistics();
|
|
333
|
-
|
|
334
|
-
// BigInt 통계로 변환
|
|
335
|
-
from([6n, 4n, 3n, 5n, 2n]).toBigintStatistics();
|
|
336
|
-
|
|
337
|
-
// 데이터 수집을 위한 커스텀 컬렉터 정의
|
|
338
|
-
let customizedCollector = from([1, 2, 3, 4, 5])
|
|
339
|
-
.toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
|
|
340
|
-
```
|
|
165
|
+
---
|
|
341
166
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
| 메소드 | 설명 | 시간 복잡도 | 공간 복잡도 |
|
|
345
|
-
|------|------|------------|------------|
|
|
346
|
-
| `anyMatch(predicate)` | 임의의 요소가 일치하는지 여부 | O(n) | O(1) |
|
|
347
|
-
| `allMatch(predicate)` | 모든 요소가 일치하는지 여부 | O(n) | O(1) |
|
|
348
|
-
| `count()` | 요소 수 | O(n) | O(1) |
|
|
349
|
-
| `isEmpty()` | 비어 있는지 여부 | O(1) | O(1) |
|
|
350
|
-
| `findAny()` | 임의의 요소 찾기 | O(n) | O(1) |
|
|
351
|
-
| `findFirst()` | 첫 번째 요소 찾기 | O(n) | O(1) |
|
|
352
|
-
| `findLast()` | 마지막 요소 찾기 | O(n) | O(1) |
|
|
353
|
-
| `forEach(action)` | 모든 요소 반복 | O(n) | O(1) |
|
|
354
|
-
| `group(classifier)` | 분류자로 그룹화 | O(n) | O(n) |
|
|
355
|
-
| `groupBy(keyExtractor, valueExtractor)` | 키-값 추출자로 그룹화 | O(n) | O(n) |
|
|
356
|
-
| `join()` | 문자열로 결합 | O(n) | O(n) |
|
|
357
|
-
| `join(delimiter)` | 구분자를 사용하여 결합 | O(n) | O(n) |
|
|
358
|
-
| `nonMatch(predicate)` | 일치하지 않는 요소가 있는지 여부 | O(n) | O(1) |
|
|
359
|
-
| `partition(count)` | 수로 분할 | O(n) | O(n) |
|
|
360
|
-
| `partitionBy(classifier)` | 분류자로 분할 | O(n) | O(n) |
|
|
361
|
-
| `reduce(accumulator)` | 축소 작업 | O(n) | O(1) |
|
|
362
|
-
| `reduce(identity, accumulator)` | 초기값을 가진 축소 | O(n) | O(1) |
|
|
363
|
-
| `toArray()` | 배열로 변환 | O(n) | O(n) |
|
|
364
|
-
| `toMap(keyExtractor, valueExtractor)` | 맵으로 변환 | O(n) | O(n) |
|
|
365
|
-
| `toSet()` | 세트로 변환 | O(n) | O(n) |
|
|
366
|
-
| `write(stream)` | 스트림에 쓰기 | O(n) | O(1) |
|
|
167
|
+
### 성능 특성
|
|
367
168
|
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
console.log(data.anyMatch((n: number): boolean => n > 5)); // true
|
|
376
|
-
console.log(data.allMatch((n: number): boolean => n < 20)); // true
|
|
377
|
-
|
|
378
|
-
// 찾기 작업
|
|
379
|
-
data.findFirst().ifPresent((n: number): void => console.log(n)); // 2
|
|
380
|
-
data.findAny().ifPresent((n: number): void => console.log(n)); // 임의의 요소
|
|
381
|
-
|
|
382
|
-
// 그룹화 작업
|
|
383
|
-
const grouped = data.groupBy(
|
|
384
|
-
(n: number): string => (n > 5 ? "큰" : "작은"),
|
|
385
|
-
(n: number): number => n * 2
|
|
386
|
-
); // {작은: [4, 8], 큰: [12, 16, 20]}
|
|
387
|
-
|
|
388
|
-
// 축소 작업
|
|
389
|
-
const sum = data.reduce(0, (acc, n) => acc + n); // 30
|
|
390
|
-
|
|
391
|
-
// 출력 작업
|
|
392
|
-
data.join(", "); // "[2, 4, 6, 8, 10]"
|
|
393
|
-
```
|
|
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) | 예 | 시간 기반 윈도우 연산. |
|
|
394
176
|
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
### NumericStatistics 메소드
|
|
398
|
-
|
|
399
|
-
| 메소드 | 설명 | 시간 복잡도 | 공간 복잡도 |
|
|
400
|
-
|------|------|------------|------------|
|
|
401
|
-
| `range()` | 범위 | O(n) | O(1) |
|
|
402
|
-
| `variance()` | 분산 | O(n) | O(1) |
|
|
403
|
-
| `standardDeviation()` | 표준 편차 | O(n) | O(1) |
|
|
404
|
-
| `mean()` | 평균 | O(n) | O(1) |
|
|
405
|
-
| `median()` | 중앙값 | O(n log n) | O(n) |
|
|
406
|
-
| `mode()` | 최빈값 | O(n) | O(n) |
|
|
407
|
-
| `frequency()` | 빈도 분포 | O(n) | O(n) |
|
|
408
|
-
| `summate()` | 합계 | O(n) | O(1) |
|
|
409
|
-
| `quantile(quantile)` | 사분위수 | O(n log n) | O(n) |
|
|
410
|
-
| `interquartileRange()` | 사분위수 범위 | O(n log n) | O(n) |
|
|
411
|
-
| `skewness()` | 왜도 | O(n) | O(1) |
|
|
412
|
-
| `kurtosis()` | 첨도 | O(n) | O(1) |
|
|
177
|
+
속도가 가장 중요할 때는 `toUnordered()`를 선택하세요. 안정적인 순서나 정렬된 데이터에 의존하는 통계 메서드가 필요할 때만 `toOrdered()`를 사용하세요.
|
|
413
178
|
|
|
414
|
-
|
|
415
|
-
// 통계 분석 예
|
|
416
|
-
let numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
417
|
-
.toNumericStatistics();
|
|
418
|
-
|
|
419
|
-
console.log("평균:", numbers.mean()); // 5.5
|
|
420
|
-
console.log("중앙값:", numbers.median()); // 5.5
|
|
421
|
-
console.log("표준 편차:", numbers.standardDeviation()); // ~2.87
|
|
422
|
-
console.log("합계:", numbers.summate()); // 55
|
|
423
|
-
|
|
424
|
-
// 매퍼를 사용한 통계 분석
|
|
425
|
-
const objects = from([
|
|
426
|
-
{ value: 10 },
|
|
427
|
-
{ value: 20 },
|
|
428
|
-
{ value: 30 }
|
|
429
|
-
]).toNumericStatistics();
|
|
430
|
-
console.log("매핑된 평균:", objects.mean(obj => obj.value)); // 20
|
|
431
|
-
```
|
|
179
|
+
---
|
|
432
180
|
|
|
433
|
-
|
|
181
|
+
다른 프론트엔드 스트림 프로세서와의 비교
|
|
434
182
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
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). | 낮음. | 중간. |
|
|
443
195
|
|
|
444
|
-
|
|
445
|
-
```typescript
|
|
446
|
-
// 요소의 순서를 유지해야 하는 경우, 순서가 보장되는 Collector 사용
|
|
447
|
-
let ordered = data.sorted(comparator);
|
|
448
|
-
```
|
|
196
|
+
Semantic-TypeScript의 주요 장점
|
|
449
197
|
|
|
450
|
-
|
|
451
|
-
```typescript
|
|
452
|
-
// 윈도우 작업이 필요한 경우
|
|
453
|
-
let windowed: WindowCollectable<number> = data
|
|
454
|
-
.toWindow()
|
|
455
|
-
.slide(5n, 2n); // 슬라이딩 윈도우
|
|
456
|
-
```
|
|
198
|
+
• 고유한 내장 통계 및 인덱싱 기능으로, 수동 `reduce` 또는 외부 라이브러리의 필요성을 없앱니다.
|
|
457
199
|
|
|
458
|
-
|
|
459
|
-
```typescript
|
|
460
|
-
// 통계 분석이 필요한 경우
|
|
461
|
-
let statistics: NumericStatistics<number> = data
|
|
462
|
-
.toNumericStatistics(); // 수치 통계
|
|
200
|
+
• 이벤트 스트림에 대한 명시적 제어로 RxJS에서 흔히 발생하는 메모리 누수를 방지합니다.
|
|
463
201
|
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
202
|
+
• 통합된 동기/비동기 설계로 다양한 사용 사례에 대해 단일하고 일관된 API를 제공합니다.
|
|
203
|
+
|
|
204
|
+
이 비교는 Semantic-TypeScript가 기존의 반응형 라이브러리의 번잡함 없이도 성능, 타입 안전성, 풍부한 분석 기능을 요구하는 현대 타입스크립트 프론트엔드 애플리케이션에 특히 적합한 이유를 보여줍니다.
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
### 탐구할 준비가 되셨나요?
|
|
209
|
+
|
|
210
|
+
Semantic-TypeScript는 복잡한 데이터 흐름을 가독성 있고 구성 가능하며 고성능 파이프라인으로 변환합니다. 실시간 UI 이벤트를 처리하든, 대규모 데이터 세트를 처리하든, 분석 대시보드를 구축하든, 데이터베이스 수준의 인덱싱의 힘과 함수형 프로그래밍의 우아함을 동시에 제공합니다.
|
|
211
|
+
|
|
212
|
+
다음 단계:
|
|
213
|
+
|
|
214
|
+
• IDE에서 완전한 타이핑된 API를 탐색하세요 (모든 내보내기는 메인 패키지에서 제공됩니다).
|
|
467
215
|
|
|
468
|
-
|
|
469
|
-
[NPMJS](https://www.npmjs.com/package/semantic-typescript)
|
|
216
|
+
• 복잡한 비동기 이터레이터를 깨끗한 Semantic 파이프라인으로 대체한 개발자 커뮤니티에 합류하세요.
|
|
470
217
|
|
|
471
|
-
|
|
218
|
+
Semantic-TypeScript — 스트림이 구조를 만나는 곳.
|
|
472
219
|
|
|
473
|
-
|
|
474
|
-
2. **성능 고려 사항**: 순서 보장이 필요하지 않은 경우, `toUnordered()`를 사용하여 성능을 향상시키는 것이 좋습니다.
|
|
475
|
-
3. **메모리 사용량**: 정렬 작업에는 추가적인 O(n)의 메모리가 필요합니다.
|
|
476
|
-
4. **실시간 데이터**: 시맨틱 스트림은 실시간 데이터 처리에 적합하며 비동기 데이터 소스를 지원합니다.
|
|
220
|
+
오늘부터 구축을 시작하고 사려 깊은 인덱싱이 제공하는 차이를 경험해 보세요.
|
|
477
221
|
|
|
478
|
-
|
|
222
|
+
명확하게 구축하고, 자신 있게 나아가며, 의도를 가지고 데이터를 변형하세요.
|